/* T-Mail Data Structur Manager by Wolfgang Zweygart Start of Project: 24.12.1993 Version: see VERSION */ /* History: 0.01a 24.12.1993 Where it all starts.... 0.02 20.02.1994 Address statement added 0.03 04.04.1994 Commandline options and Help added */ #define VERSION "0.03" #include #include #include #include #include #include #include #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) #define EOS '\0' /* end-of-string indicator */ enum _bool { FALSE, TRUE }; typedef enum _bool boolean; const char **envi; /* noch ein Environment-pointer */ #define MAX_SIG 10 struct DOM_ADR { int Zone; int Net; int Node; int Point; char Outbound[40]; }; struct Q_ARC { char name[3]; char path[50]; char para_ext[20]; char para_add[20]; }; struct SIG_S { char name[24]; long level; char description[45]; }; struct AREA_S { char filename[50]; char Tagname[14]; char description[50]; long access; long flags; char Area_header[285]; boolean found; }; struct TML_BODY { int total_mes; int total_mail; int bbs_type; long echos_sig; char sysop_name[32]; char led_point[52]; char ProtInbound[52]; char KnownInbound[52]; char Inbound[52]; char NetMail[52]; int qwk_confs; long system_flags; long write_access; int inacti_days; char temp_file[52]; char log_file[52]; char transfer[52]; int gate_zone; int gate_net; int gate_node; int gate_point; int inet_zone; int inet_net; int inet_node; int inet_point; struct DOM_ADR domains[12]; char NetMail_menu[285]; char SIGs_menu[285]; char Echo_menu[285]; char Qmail_menu[285]; /* char reserved[10]; */ int Q_max_packet; int Q_max_mes; char Q_phone[15]; char Q_short_name[9]; char Q_location[24]; char Q_work_dir[40]; char Q_system_name[28]; struct Q_ARC Q_archivers[5]; struct SIG_S SIGs[MAX_SIG]; }; struct TML_BODY tml_body; struct AREA_S *areas; char tmail_path[128]; char areas_path[128]; boolean save_data = FALSE; boolean cross_check = FALSE; char exclude_groups[40]; char to_add_groups[40]; long dev_access; char dev_description[50]; long dev_flags; int swap_dest; int swap_source; boolean swap_flag = FALSE; struct AREA_T { char *origin; char group; char *randorigin; char *path; char *name; boolean found; }; struct AREA_T areabb[500]; char *main_origin; int msgareas; int users; /* # of users in Tmail.ptr */ struct S_P { char new_name[25]; char group[10]; long level; char description[45]; }; struct S_P sig_preset[MAX_SIG]; boolean loging = FALSE; char *logfile; FILE *logf; boolean info = FALSE; struct ADR { int Zone; int Net; int Node; int Point; char *Outbound; char adr_flag; }; struct ADR new_adr[12]; int cur_adr = 0; boolean dcd = FALSE; /* carrier detect */ void cd_check(void) { long old_stack; char *gpip; char test; gpip=(char *)0xFFFFFA01L; old_stack = Super(0L); test= *gpip; Super((void *) old_stack); if (test & 2) dcd=FALSE; else dcd=TRUE; } int printf(const char *format, ...) { va_list arg_point; char temp[255]; char *s; char c; int chs; va_start(arg_point, format); chs=vsprintf(temp, format, arg_point); if(loging && logf!=NULL) fputs(temp,logf); cd_check(); s=temp; while ((c = *s++) !=0) { if(dcd) if(Bcostat(1)==0) break; if(c == 10) /* LF */ { if(dcd) Bconout(1,13); Bconout(2,13); } if(dcd) Bconout(1,(int)c); Bconout(2,(int)c); } va_end(arg_point); return(chs); } void read_tml_area(FILE *fp, int i) { fread(&areas[i].filename,50,1,fp); fread(&areas[i].Tagname,12,1,fp); fread(&areas[i].description,50,1,fp); fread(&areas[i].access,4,2,fp); fread(&areas[i].Area_header,285,1,fp); } void write_tml_area(FILE *fp, int i) { fwrite(&areas[i].filename,50,1,fp); fwrite(&areas[i].Tagname,12,1,fp); fwrite(&areas[i].description,50,1,fp); fwrite(&areas[i].access,4,2,fp); fwrite(&areas[i].Area_header,285,1,fp); } void read_tml_dat(void) { FILE *fp; int i; char file[128]; strcpy(file,tmail_path); strcat(file,"TMAIL.DAT"); memset(&tml_body,0,sizeof(tml_body)); fp=fopen(file,"rb"); if(fp==NULL) return; fread(&tml_body,2,3,fp); fread(&(tml_body.echos_sig),4,1,fp); fread(&tml_body.sysop_name,31,1,fp); fread(&tml_body.led_point,50,1,fp); fread(&tml_body.ProtInbound,50,1,fp); fread(&tml_body.KnownInbound,50,1,fp); fread(&tml_body.Inbound,50,1,fp); fread(&tml_body.NetMail,50,1,fp); fread(&tml_body.qwk_confs,2,1,fp); fread(&tml_body.system_flags,4,2,fp); fread(&tml_body.inacti_days,2,1,fp); fread(&tml_body.temp_file,50,1,fp); fread(&tml_body.log_file,50,1,fp); fread(&tml_body.transfer,50,1,fp); fread(&tml_body.gate_zone,2,8,fp); fread(&tml_body.domains[0],48,12,fp); fread(&tml_body.NetMail_menu,1140,1,fp); fread(&tml_body.Q_max_packet,2,2,fp); fread(&tml_body.Q_phone,13,1,fp); fread(&tml_body.Q_short_name,8,1,fp); fread(&tml_body.Q_location,22,1,fp); fread(&tml_body.Q_work_dir,40,1,fp); fread(&tml_body.Q_system_name,27,1,fp); for(i=0; i<5; i++) fread(&tml_body.Q_archivers[i],93,1,fp); for(i=0; i=MAX_SIG) return; p = skip_blanks(p); if(!*p) return; for (q = temp; *p && !isspace(*p); *q++ = *p++); *q = EOS; strcpy(sig_preset[i].new_name,temp); p = skip_blanks(p); for (q = temp; *p && !isspace(*p); *q++ = *p++); *q = EOS; if(!*p) continue; strncpy(sig_preset[i].group,temp,9); p = skip_blanks(p); for (q = temp; *p && !isspace(*p); *q++ = *p++); *q = EOS; if(!*p) { sig_preset[i].level = -1; continue; } sig_preset[i].level = atol(temp); p = skip_blanks(p); if(!*p) continue; strncpy(sig_preset[i].description,p,44); sig_preset[i].description[44]=EOS; continue; } if(!strnicmp(p, "swapsigs", 8)) { p = skip_blanks(&p[8]); for (q = temp; *p && !isspace(*p); *q++ = *p++); *q = EOS; swap_dest = atoi(temp); if(swap_dest<0 || swap_dest>=MAX_SIG) return; p = skip_blanks(p); if(!*p) return; swap_source = atoi(p); if(swap_source<0 || swap_source>=MAX_SIG) return; swap_flag = TRUE; continue; } if (!strnicmp(p, "logfile", 7)) { logfile = ctl_string(&p[7]); loging = TRUE; continue; } if(!strnicmp(p,"info",4)) { info = TRUE; continue; } if(!strnicmp(p,"address",7)) { if(cur_adr>=12) continue; p = skip_blanks(&p[7]); for (q = temp; *p && !isspace(*p); *q++ = *p++); new_adr[cur_adr].adr_flag = temp[0]; p = skip_blanks(p); for (q = temp; *p && !isspace(*p); *q++ = *p++); *q = EOS; address_4d(temp, &new_adr[cur_adr].Zone, &new_adr[cur_adr].Net, &new_adr[cur_adr].Node, &new_adr[cur_adr].Point); new_adr[cur_adr].Outbound = ctl_string(p); cur_adr++; continue; } printf("Unknown Command in line %d\n",line); } if(loging) { logf = fopen(logfile,"a"); if(logf == NULL) loging = FALSE; } } void read_areas(void) { char buffer[512], temp[130], file[130], *q, *p; FILE *fd; int i; msgareas =0; areabb[msgareas].origin = NULL; areabb[msgareas].group =' '; areabb[msgareas].randorigin = NULL; areabb[msgareas].path = NULL; areabb[msgareas].name = NULL; areabb[msgareas].found = FALSE; strcpy(file,areas_path); strcat(file,"AREAS.BBS"); if ((fd=fopen(file,"r")) == NULL) { return; } while(fgets(buffer,511,fd)) { p = skip_blanks(buffer); if (*p == ';') continue; if ((i = (int)strlen(p)) < 3) continue; p = &p[--i]; *p = EOS; if ((p = strchr(buffer,';')) != NULL) *p = EOS; p = skip_blanks(buffer); if (*p) { main_origin = ctl_string(p); break; } else continue; } while(fgets(buffer,511,fd)) { p = skip_blanks(buffer); if (*p == ';') continue; if ((i = (int)strlen(p)) < 3) continue; p = &p[--i]; *p = EOS; if ((p = strchr(buffer, ';')) != NULL) *p = EOS; p = skip_blanks(buffer); if (!*p) continue; if (*p == '-') { switch (toupper(*++p)) { case 'O': /* Origin line */ p = skip_to_blank(p); areabb[msgareas].origin = ctl_string(p); break; case 'G': p = skip_to_blank(p); p = skip_blanks(p); if (*p) { if (isalnum(*p)) areabb[msgareas].group = *p; } break; case 'F': p = skip_to_blank(p); p = skip_blanks(p); if (!*p) break; areabb[msgareas].randorigin = ctl_file(p); break; } continue; } for (q = temp; *p && !isspace(*p); *q++ = *p++); *q = EOS; areabb[msgareas].path = ctl_string(temp); p = skip_blanks(p); for (q = temp; *p && !isspace(*p); *q++ = *p++); *q = EOS; areabb[msgareas].name = ctl_string(temp); /* p = skip_blanks(p); */ if((!stricmp(temp, "mail")) || (!stricmp(temp, "trasharea")) || (!stricmp(temp, "dupe_area")) || (!stricmp(temp, "privateboxarea")) || (!stricmp(temp, "privatemailbox")) || (!stricmp(temp, "privatemail"))) areabb[msgareas].group = (char)-1; if(areabb[msgareas].origin == NULL) areabb[msgareas].origin = ctl_string(main_origin); msgareas++; areabb[msgareas].origin = NULL; areabb[msgareas].group =' '; areabb[msgareas].randorigin = NULL; areabb[msgareas].path = NULL; areabb[msgareas].name = NULL; areabb[msgareas].found = FALSE; } fclose(fd); } void free_areabb(void) { int i; for(i=0; i 0 && areabb[i].path != NULL) if(stricmp(areas[j].filename,areabb[i].path) == 0) { areabb[i].found = TRUE; areas[j].found = TRUE; } } } for(i=0; i0) { for(j=0; j 0) printf("Warning! Area: %s not found!\n",areas[j].Tagname); } } void check_preset(void) { int j; printf("Special Interest Grouping\n"); for(j=0; j0) strcpy(tml_body.SIGs[j].name,sig_preset[j].new_name); if(sig_preset[j].level <=0) sig_preset[j].level=tml_body.SIGs[j].level; else tml_body.SIGs[j].level=sig_preset[j].level; if(sig_preset[j].description[0] == '*' || strlen(sig_preset[j].description) ==0) strcpy(sig_preset[j].description,tml_body.SIGs[j].description); else strcpy(tml_body.SIGs[j].description,sig_preset[j].description); if(strlen(tml_body.SIGs[j].name)==0) continue; printf("(%2d) %-22s :%6ld : %s\n",j,tml_body.SIGs[j].name, tml_body.SIGs[j].level,tml_body.SIGs[j].description); } printf("\n"); } void do_swap_sigs(void) { int i,j,k; struct AREA_S *temp_areas; struct SIG_S temp_sig; FILE *fp; char file[128]; long offs; long seek1,seek2; char *temp1; char *temp2; strcpy(file,tmail_path); strcat(file,"TMAIL.PTR"); fp=fopen(file,"rb+"); if(fp==NULL) exit(-2); temp1 = malloc(5L*tml_body.echos_sig); if(temp1==NULL) exit(-2); temp2 = malloc(5L*tml_body.echos_sig); if(temp2==NULL) exit(-2); printf("Swapping Sig's\n(%d) %s <--> (%d) %s\n", swap_source,tml_body.SIGs[swap_source].name, swap_dest,tml_body.SIGs[swap_dest].name); i=swap_source * (int)tml_body.echos_sig; temp_areas=calloc(tml_body.echos_sig, sizeof(struct AREA_S)); if(temp_areas==NULL) return; memcpy(temp_areas,&areas[i], sizeof(struct AREA_S)*(int)tml_body.echos_sig); j=swap_dest * (int)tml_body.echos_sig; memcpy(&areas[i],&areas[j], sizeof(struct AREA_S)*(int)tml_body.echos_sig); memcpy(&areas[j],temp_areas, sizeof(struct AREA_S)*(int)tml_body.echos_sig); free(temp_areas); memcpy(&temp_sig,&tml_body.SIGs[swap_source],sizeof(struct SIG_S)); memcpy(&tml_body.SIGs[swap_source],&tml_body.SIGs[swap_dest], sizeof(struct SIG_S)); memcpy(&tml_body.SIGs[swap_dest],&temp_sig,sizeof(struct SIG_S)); printf("One moment .... Updating PTR File\n"); for(k=0; k\n"); printf("AreasPath \nLogFile \n"); printf("Info\nCrossCheck\nAutoAdd [Group-id][Group-id][..]\n"); printf("Exclude [Group-id][Group-id][..]\nAccess \n"); printf("Description \n"); printf("Flags [flag]\nSaveData\n"); printf("Sig [number] [group-id] [level] \n"); printf("SwapSigs [number] [number]\n"); printf("Address [flag] <4D-Address> \n flag is:\n"); printf(" + for adding a new Address and Outbound\n"); printf(" - for removing a Address\n"); printf(" c for change Outbound-Path of existing Address\n\n"); } void do_info(void) { int i; printf("Information taken from %sTMAIL.DAT\n",tmail_path); if(tml_body.bbs_type == 0) printf("\\\\\\TurboBoard BBS\n"); else if(tml_body.bbs_type == 1) printf("QBBS\n"); else if(tml_body.bbs_type == 2) printf("Other BBS\n"); printf("Max %ld echos per SIG\n",tml_body.echos_sig); printf("Sysop is %s\n",tml_body.sysop_name); printf("Path to LED: %s\n",tml_body.led_point); printf("Inbound: %s\n",tml_body.Inbound); printf("KnownInbound: %s\n",tml_body.KnownInbound); printf("ProtInbound: %s\n",tml_body.ProtInbound); printf("NetMail: %s\n",tml_body.NetMail); printf("Num. of QWK confs %d\n",tml_body.qwk_confs); printf("Min write access level %d\n",tml_body.write_access); printf("QWK prepack inactivity days %d\n",tml_body.inacti_days); printf("Temp File: %s\n",tml_body.temp_file); printf("Log File: %s\n",tml_body.log_file); printf("Transfer : %s\n",tml_body.transfer); printf("Gateway is %d:%d/%d.%d\n",tml_body.gate_zone,tml_body.gate_net, tml_body.gate_node,tml_body.gate_point); printf("Internet gate %d:%d/%d.%d\n",tml_body.inet_zone, tml_body.inet_net,tml_body.inet_node,tml_body.inet_point); for(i=0; i<12; i++) { if(tml_body.domains[i].Zone == 0) continue; printf("Address: %d:%d/%d.%d with %s\n", tml_body.domains[i].Zone,tml_body.domains[i].Net, tml_body.domains[i].Node,tml_body.domains[i].Point, tml_body.domains[i].Outbound); } printf("\n"); } int main(int argc, char **argv, const char *envp[] ) { char cmdline[129]; int i; envi = envp; read_cfg(); if (argc > 1) strcpy(cmdline,argv[1]); for(i=2; i < argc; i++) { strcat(cmdline," "); strcat(cmdline,argv[i]); } i = 0; if (cmdline[i] == '-') { while(cmdline[i+1] != EOS) { i++; switch(toupper(cmdline[i])) { case ' ': case '-': i++; break; case 'C': cross_check = TRUE; break; case 'I': info = TRUE; break; case 'H': give_help(); exit(0); break; case 'S': save_data = TRUE; break; default: printf("\nDon't know option -%c. Try -H for Help.\n", cmdline[i]); break; } } } printf("\nT-Mail Data Structur Manager\nby Wolfgang Zweygart\n"); printf("Version: %s\n\n",VERSION); read_tml_dat(); read_tml_ptr(); if(info) do_info(); check_preset(); read_areas(); if(cross_check) do_cross_check(); if(swap_flag && save_data) do_swap_sigs(); if(cur_adr>0) do_check_adr(); if(save_data) write_tml_dat(); free_areabb(); if(loging) fclose(logf); return(0); }