home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
bbs
/
tmlman03
/
tml_man.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-13
|
26KB
|
1,069 lines
/* 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <tos.h>
#include <ext.h>
#include <ctype.h>
#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; i++) fread(&tml_body.SIGs[i],73,1,fp);
areas=calloc(tml_body.echos_sig * MAX_SIG, sizeof(struct AREA_S));
if(areas==NULL) return;
for(i=0; i<(int)tml_body.echos_sig * MAX_SIG; i++) read_tml_area(fp,i);
fclose(fp);
}
void write_tml_dat(void)
{
FILE *fp;
int i;
char file[128];
strcpy(file,tmail_path);
strcat(file,"TMAIL.DAT");
fp=fopen(file,"wb");
if(fp==NULL) return;
fwrite(&tml_body,2,3,fp);
fwrite(&(tml_body.echos_sig),4,1,fp);
fwrite(&tml_body.sysop_name,31,1,fp);
fwrite(&tml_body.led_point,50,1,fp);
fwrite(&tml_body.ProtInbound,50,1,fp);
fwrite(&tml_body.KnownInbound,50,1,fp);
fwrite(&tml_body.Inbound,50,1,fp);
fwrite(&tml_body.NetMail,50,1,fp);
fwrite(&tml_body.qwk_confs,2,1,fp);
fwrite(&tml_body.system_flags,4,2,fp);
fwrite(&tml_body.inacti_days,2,1,fp);
fwrite(&tml_body.temp_file,50,1,fp);
fwrite(&tml_body.log_file,50,1,fp);
fwrite(&tml_body.transfer,50,1,fp);
fwrite(&tml_body.gate_zone,2,8,fp);
fwrite(&tml_body.domains[0],48,12,fp);
fwrite(&tml_body.NetMail_menu,1140,1,fp);
fwrite(&tml_body.Q_max_packet,2,2,fp);
fwrite(&tml_body.Q_phone,13,1,fp);
fwrite(&tml_body.Q_short_name,8,1,fp);
fwrite(&tml_body.Q_location,22,1,fp);
fwrite(&tml_body.Q_work_dir,40,1,fp);
fwrite(&tml_body.Q_system_name,27,1,fp);
for(i=0; i<5; i++) fwrite(&tml_body.Q_archivers[i],93,1,fp);
for(i=0; i<MAX_SIG; i++) fwrite(&tml_body.SIGs[i],73,1,fp);
for(i=0; i<(int)tml_body.echos_sig * MAX_SIG; i++) write_tml_area(fp,i);
fclose(fp);
}
void read_tml_ptr(void)
{
FILE *fp;
char file[128];
long filesi;
strcpy(file,tmail_path);
strcat(file,"TMAIL.PTR");
fp=fopen(file,"rb");
if(fp==NULL) exit(-2);
fseek(fp,0,SEEK_END);
filesi = ftell(fp);
users = (int) ((filesi - 5L)/(5L*MAX_SIG*(tml_body.echos_sig+1L)));
fclose(fp);
}
char *skip_after_blanks(char *string)
{
char *q = &string[strlen(string)-1];
while (isspace(*q)) q--;
*++q = EOS;
return(string);
}
char *skip_blanks(char *string)
{
while (*string && isspace(*string)) string++;
return(string);
}
char *skip_to_blank(char *string)
{
while (*string && !isspace(*string)) string++;
return(string);
}
char *ctl_string(char *string)
{
char *p = skip_blanks(string),
*d = (char *) malloc(strlen(p)+1);
if (d == NULL)
{
printf("String allocation failed.\n");
return("");
}
p = skip_after_blanks(p);
strcpy(d, p);
return(d);
}
char *ctl_file(char *str)
{
char *q;
str = skip_blanks(str);
for (q = str; *q && !isspace(*q); q++);
*q = EOS;
return(ctl_string(str));
}
void address_4d(char *s, int *zone, int *net, int *node, int *point)
{
char *p = s,
n[9],
have = 0;
int i = 0;
if (!s) return;
*zone = 0;
*net = 0;
*node = 0;
*point = 0;
do
{
while (*p != ':' && *p != '/' && *p != '.' && *p != EOS &&
*p != ' ' && *p != '\t' && *p !='@') n[i++] = *p++;
n[i] = EOS;
if (!strlen(n))
{
if (*p == EOS) return;
p = skip_blanks(++p);
continue;
}
if (!isdigit(n[0])) return;
if (!have && *p == ':') *zone = atoi(n);
else if (have == 1 || *p == '/')
{
*net = atoi(n);
have = 1;
}
else if (have == 2) *node = atoi(n);
else if (have == 3) *point = atoi(n);
have++;
if (*p == EOS) return;
p = skip_blanks(++p);
i = 0;
} while (*p != '\r', have < 4);
}
void read_cfg(void)
{
FILE *fd;
char buffer[256];
char temp[256];
char *p,*q;
int line =0;
int i;
memset(sig_preset,0,sizeof(sig_preset));
if((fd = fopen("TML_MAN.CFG","r")) == NULL)
{
printf("No TML_MAN.CFG -file found!\n");
return;
}
while((fgets(buffer,255,fd)))
{
line++;
p = skip_blanks(buffer);
if (*p == ';') continue;
if ((i = (int)strlen(p)) < 3) continue;
if ((p = strchr(buffer, ';')) != NULL) *p = EOS;
p = &buffer[--i];
if (*p == '\r' || *p == '\n') *p = EOS;
p = skip_blanks(buffer);
if(!strnicmp(p, "tmailpath", 9))
{
p = skip_blanks(&p[9]);
p = skip_after_blanks(p);
strncpy(tmail_path, p, 127);
tmail_path[127] = EOS;
continue;
}
if(!strnicmp(p, "areaspath", 9))
{
p = skip_blanks(&p[9]);
p = skip_after_blanks(p);
strncpy(areas_path, p, 127);
areas_path[127] = EOS;
continue;
}
if(!strnicmp(p,"savedata",8))
{
save_data = TRUE;
continue;
}
if(!strnicmp(p,"crosscheck",10))
{
cross_check = TRUE;
continue;
}
if(!strnicmp(p, "exclude", 7))
{
p = skip_blanks(&p[7]);
p = skip_after_blanks(p);
strncpy(exclude_groups, p, 39);
exclude_groups[39] = EOS;
continue;
}
if(!strnicmp(p, "autoadd", 7))
{
p = skip_blanks(&p[7]);
p = skip_after_blanks(p);
strncpy(to_add_groups, p, 39);
to_add_groups[39] = EOS;
continue;
}
if(!strnicmp(p, "access", 6))
{
p = skip_blanks(&p[6]);
dev_access = atol(p);
continue;
}
if(!strnicmp(p, "description", 11))
{
p = skip_blanks(&p[11]);
strncpy(dev_description, p, 49);
dev_description[49] = EOS;
continue;
}
if(!strnicmp(p, "flags", 5))
{
p = skip_blanks(&p[5]);
dev_flags = atol(p);
continue;
}
if(!strnicmp(p, "sig", 3))
{
p = skip_blanks(&p[3]);
for (q = temp; *p && !isspace(*p); *q++ = *p++);
*q = EOS;
i = atoi(temp);
if(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<msgareas; i++)
{
if(areabb[i].origin!=NULL)
{
free(areabb[i].origin);
areabb[i].origin = NULL;
}
if(areabb[i].randorigin!=NULL)
{
free(areabb[i].randorigin);
areabb[i].randorigin = NULL;
}
if(areabb[i].path!=NULL)
{
free(areabb[i].path);
areabb[i].path = NULL;
}
if(areabb[i].name!=NULL)
{
free(areabb[i].name);
areabb[i].name = NULL;
}
}
}
void add_area(int group, int sig)
{
int i,j;
i=sig * (int)tml_body.echos_sig;
j=(sig+1) * (int)tml_body.echos_sig;
for( ; i<j; i++) if(strlen(areas[i].filename)==0) break;
if(i==j)
{
printf("No room left. No add. No save!\n");
exit(-2);
}
strncpy(areas[i].filename,areabb[group].path,49);
areas[i].filename[49]='\0';
strncpy(areas[i].Tagname,areabb[group].name,13);
areas[i].Tagname[13]='\0';
areas[i].access = dev_access;
areas[i].flags = dev_flags;
strncpy(areas[i].description,dev_description,49);
areas[i].description[49]='\0';
printf("Area %s with Path %s\n allowed for level %ld Users\n\n",
areas[i].Tagname,areas[i].filename,areas[i].access);
areas[i].found = TRUE;
}
void do_check_adr(void)
{
int i,j,k;
for(i=0; i<cur_adr; i++)
{
if(new_adr[i].adr_flag=='+')
{
for(j=0; j<11 && tml_body.domains[j].Zone!=0; j++)
if(j==11)
{
printf("Address statements full!\n");
continue;
}
tml_body.domains[j].Zone = new_adr[i].Zone;
tml_body.domains[j].Net = new_adr[i].Net;
tml_body.domains[j].Node = new_adr[i].Node;
tml_body.domains[j].Point = new_adr[i].Point;
strncpy(tml_body.domains[j].Outbound,new_adr[i].Outbound,39);
printf("Address: %d:%d/%d.%d with %s added.\n",
tml_body.domains[j].Zone,tml_body.domains[j].Net,
tml_body.domains[j].Node,tml_body.domains[j].Point,
tml_body.domains[j].Outbound);
} else
if(new_adr[i].adr_flag=='-')
{
for(j=0; j<12; j++)
if(tml_body.domains[j].Zone == new_adr[i].Zone &&
tml_body.domains[j].Net == new_adr[i].Net &&
tml_body.domains[j].Node == new_adr[i].Node &&
tml_body.domains[j].Point == new_adr[i].Point) break;
if(j==12) continue;
printf("Removing Address: %d:%d/%d.%d\n",
tml_body.domains[j].Zone,tml_body.domains[j].Net,
tml_body.domains[j].Node,tml_body.domains[j].Point);
for(k=j+1; k<12; k++)
{
tml_body.domains[k-1].Zone = tml_body.domains[k].Zone;
tml_body.domains[k-1].Net = tml_body.domains[k].Net;
tml_body.domains[k-1].Node = tml_body.domains[k].Node;
tml_body.domains[k-1].Point = tml_body.domains[k].Point;
strncpy(tml_body.domains[k-1].Outbound,
tml_body.domains[k].Outbound,39);
}
} else
if(new_adr[i].adr_flag=='c')
{
for(j=0; j<12; j++)
if(tml_body.domains[j].Zone == new_adr[i].Zone &&
tml_body.domains[j].Net == new_adr[i].Net &&
tml_body.domains[j].Node == new_adr[i].Node &&
tml_body.domains[j].Point == new_adr[i].Point) break;
if(j==12) continue;
strncpy(tml_body.domains[j].Outbound,new_adr[i].Outbound,39);
printf("Address: %d:%d/%d.%d with %s changed.\n",
tml_body.domains[j].Zone,tml_body.domains[j].Net,
tml_body.domains[j].Node,tml_body.domains[j].Point,
tml_body.domains[j].Outbound);
}
}
}
void do_cross_check(void)
{
int i,j,k;
boolean do_exclude;
for(i=0; i<msgareas; i++)
{
for(j=0; j<(int)tml_body.echos_sig * MAX_SIG; j++)
{
if(strlen(areas[j].filename) > 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; i<msgareas; i++)
{
if((!areabb[i].found) && areabb[i].group!=-1)
{
printf("Warning! Area: %s not found in TMail.DAT\n",areabb[i].name);
do_exclude = FALSE;
for(j=0; j<strlen(exclude_groups); j++)
if(areabb[i].group == exclude_groups[j])
{
printf("Area %s excluded.\n",areabb[i].name);
do_exclude=TRUE;
break;
}
if(!do_exclude && strlen(to_add_groups)>0)
{
for(j=0; j<strlen(to_add_groups); j++)
if(areabb[i].group == to_add_groups[j] && j<=MAX_SIG)
{
for(j=0; j<MAX_SIG; j++)
for(k=0; k<strlen(sig_preset[j].group); k++)
if(sig_preset[j].group[k] == areabb[i].group)
{
printf("Adding Area to Group %c : %s\n",
sig_preset[j].group[k],
tml_body.SIGs[j].name);
add_area(i,j);
}
}
}
}
}
printf("\n\n");
for(j=0; j<(int)tml_body.echos_sig * MAX_SIG; j++)
{
if((!areas[j].found) && strlen(areas[j].filename) > 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; j<MAX_SIG; j++)
{
if(sig_preset[j].new_name[0] == '*')
strcpy(sig_preset[j].new_name,tml_body.SIGs[j].name);
else if(strlen(sig_preset[j].new_name)>0)
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<users; k++) /* Users loop */
{
offs = (5L*MAX_SIG*(tml_body.echos_sig+1L) * k) + 5L;
seek1 = offs + (tml_body.echos_sig*5*swap_source);
seek2 = offs + (tml_body.echos_sig*5*swap_dest);
fseek(fp,seek1,SEEK_SET);
fread(temp1,1,tml_body.echos_sig*5,fp);
fseek(fp,seek2,SEEK_SET);
fread(temp2,1,tml_body.echos_sig*5,fp);
fseek(fp,seek2,SEEK_SET);
fwrite(temp1,1,tml_body.echos_sig*5,fp);
fseek(fp,seek1,SEEK_SET);
fwrite(temp2,1,tml_body.echos_sig*5,fp);
}
fclose(fp);
free(temp1);
free(temp2);
}
void give_help(void)
{
printf("\nT-Mail Data Structur Manager\nby Wolfgang Zweygart\n");
printf("Usage: tml_man -[C] -[I] -[H] -[S]\n");
printf("-C : check TMAIL.DAT against AREAS.BBS\n");
printf("-I : print information from TMAIL.DAT\n");
printf("-H : this mini help\n-S : save data (TMAIL.DAT) to disk\n\n");
printf("The file TML_MAN.CFG has the following keywords:\n");
printf("TmailPath <path to TMAIL.DAT and TMAIL.PTR>\n");
printf("AreasPath <path to AREAS.BBS>\nLogFile <Name of Logfile>\n");
printf("Info\nCrossCheck\nAutoAdd [Group-id][Group-id][..]\n");
printf("Exclude [Group-id][Group-id][..]\nAccess <Level>\n");
printf("Description <description for new areas>\n");
printf("Flags [flag]\nSaveData\n");
printf("Sig [number] <name of sig> [group-id] [level] <description>\n");
printf("SwapSigs [number] [number]\n");
printf("Address [flag] <4D-Address> <Outbound-Path>\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);
}