"Fossies" - the Fresh Open Source Software archive 
Member "dbox-2.41/prearc/alpha.C" of archive dbox-2.41.tgz:
/*
DBOX Module
Copyright (C) 1994-2000 Daniel Kroening <kroening@handshake.de>
Purpose:
*/
#include <string.h>
#include <ctype.h>
#include <dblib/os_dep_file.h>
#include <dbox.h>
#include <tools.h>
#include <mtoolzc.h>
#include <spoolp.h>
#include <userdb.h>
#include <log_serv.h>
#include <config.h>
#include <dboxpath.h>
#include <netdefs.h>
#include <lock.h>
#include <dboxversion.h>
#include "prearc.h"
#include "alpha.h"
#define MAXSYSTEMS 10
#define MAXBRETTER 1000
#define MAXZCALLOWED 100
#define MAXDOMAINS 100
static char /*site[100]="",*/
defaultzcdomain[100]="ZER",
defaultalphadomain[100]="",
alphagate[9]="UUCP";
static char *domains[MAXDOMAINS*2];
static char *zcallowed[MAXZCALLOWED];
static char *bretter[MAXBRETTER];
static int readline(FILE *f, char *s, dword maxlen)
{
char ch, *starts=s;
schleife:
if(fread(&ch, 1, 1, f)==0) return TRUE;
if(ch=='\n')
{
*s=0;
while(s!=starts && *(s-1)==' ') *(--s)=0;
return FALSE;
}
else if(ch!='\r')
{
if(maxlen!=0)
{
maxlen--;
*(s++)=ch;
}
}
goto schleife;
}
static char *strendistr(char *s1, char *s2)
{
int l1, l2;
char *tptr;
l1=strlen(s1);
l2=strlen(s2);
if(l2>l1) return (char *)NULL;
tptr=s1+l1-l2;
if(stricmp(tptr, s2)!=0) return (char *)NULL;
return tptr;
}
static int filetextcopy(FILE *file, FILE *target, dword size)
{
dword buffersize, bytestocopy, bytestocopy2;
word count;
byte *buffer;
buffersize=64000l;
if((buffer=(byte *)malloc(buffersize))==NULL) return 1;
bytestocopy=size;
while(bytestocopy!=0)
{
bytestocopy2=bytestocopy>buffersize?buffersize:bytestocopy;
fread(buffer, 1, bytestocopy2, file);
for(count=0; count<bytestocopy2; count++)
{
if(buffer[count]<' ' && buffer[count]!='\r' && buffer[count]!='\n')
buffer[count]=' ';
}
fwrite(buffer, 1, bytestocopy2, target);
bytestocopy-=bytestocopy2;
}
free(buffer);
return 0;
}
static void alphamidtozcmid(char *alphamid, char *zcmid)
{
char *tptr;
strcpy(zcmid, alphamid);
tptr=zcmid+strlen(zcmid)-1;
while(tptr!=zcmid-1 && *tptr==' ') *(tptr--)=0;
tptr=zcmid;
while(*tptr!=0)
{
if(*tptr==' ') *tptr='-';
tptr++;
}
if(zcmid[0]==0) return;
if(strendistr(zcmid, ".de")!=NULL || strendistr(zcmid, ".sub.org")!=NULL)
return;
strcat(zcmid, ".");
strcat(zcmid, defaultalphadomain);
}
static int alphatozc(FILE *infile, FILE *outfilemail, FILE *outfilenews)
{
char line[300], bet[TEXTLEN], filename[100]="";
dword laenge;
FILE *outfile;
if(readline(infile, line, 299)) return FALSE;
if(line[0]!=1) return TRUE;
{
char net[300], box[300], user[300], *tptr;
int i;
if(readline(infile, net, 299)) return TRUE;
if(readline(infile, box, 299)) return TRUE;
if(readline(infile, user, 299)) return TRUE;
if(strchr(net, '@')==NULL)
{
if(net[0]=='-')
{
if(net[1]!=0)
{
log_serv.printf("alphatozc", "Gateadresse ignoriert: "
"\"%s\" \"%s\" \"%s\"", net+1, box, user);
}
if(alphagate[0]!=0 && stricmp(box, alphagate)==0)
{
tptr=strrchr(user, '%');
if(tptr!=NULL)
{
*(tptr++)=0;
strmaxcpy(box, tptr, 299);
}
}
if(strchr(box, '.')==NULL)
{
strcat(box, ".");
strcat(box, defaultzcdomain);
}
tptr=user;
while(*tptr!=0)
{
if(*tptr==' ') *tptr='_';
tptr++;
}
outfile=outfilemail;
fprintf(outfile, "EMP:\t%s@%s\r\n", user, box);
}
else
{
outfile=outfilenews;
i=0;
while(bretter[i]!=NULL && stricmp(bretter[i], net)!=0) i+=2;
if(bretter[i]==0)
fprintf(outfile, "EMP:\t/ALPHA/%s\r\n", net);
else
fprintf(outfile, "EMP:\t%s\r\n", bretter[i+1]);
}
}
else
{
outfile=outfilemail;
log_serv.printf("alphatozc", "Warnung: Neue Adresse: "
"\"%s\" \"%s\" \"%s\"", net, box, user);
fprintf(outfile, "EMP:\t%s\r\n", net);
}
}
{
char net[300], box[300], user[300], realname[300], *tptr;
if(readline(infile, net, 299)) return TRUE;
if(readline(infile, box, 299)) return TRUE;
if(readline(infile, user, 299)) return TRUE;
if(readline(infile, realname, 299)) return TRUE;
if(strchr(net, '@')==NULL)
{
if(net[0]!=0)
log_serv.printf("alphatozc", "Gateadresse ignoriert: \"%s\"", net);
tptr=box;
while(*tptr!=0)
{
if(*tptr==' ') *tptr='_';
tptr++;
}
tptr=user;
while(*tptr!=0)
{
if(*tptr==' ') *tptr='_';
tptr++;
}
{
char domain[TEXTLEN];
int i=0;
strmaxcpy(domain, defaultalphadomain, TEXTLEN-1);
while(domains[i]!=NULL && stricmp(domains[i], box)!=0) i+=2;
if(domains[i]!=NULL) strmaxcpy(domain, domains[i+1], TEXTLEN-1);
fprintf(outfile, "ABS:\t%s@%s.%s", user, box, domain);
if(realname[0]==0)
fprintf(outfile, "\r\n");
else
fprintf(outfile, " (%s)\r\n", realname);
}
}
else
{
log_serv.printf("alphatozc", "Warnung: Neue Adresse: "
"\"%s\" \"%s\" \"%s\"", net, box, user);
fprintf(outfile, "ABS:\t%s", net);
if(realname[0]==0)
fprintf(outfile, "\r\n");
else
fprintf(outfile, " (%s)\r\n", realname);
}
}
if(readline(infile, bet, TEXTLEN-1)) return TRUE;
{
char mid[300];
if(readline(infile, line, 299)) return TRUE;
if(line[0]!=0)
{
alphamidtozcmid(line, mid);
fprintf(outfile, "MID:\t%s\r\n", mid);
}
}
{
char bez[300];
if(readline(infile, line, 299)) return TRUE;
if(line[0]!=0)
{
alphamidtozcmid(line, bez);
if(bez[0]!=0) fprintf(outfile, "BEZ:\t%s\r\n", bez);
}
}
if(readline(infile, line, 299)) return TRUE;
line[12]=0;
fprintf(outfile, "EDA:\t19%sS+2\r\n", line);
if(readline(infile, line, 299)) return TRUE;
fprintf(outfile, "ROT:\t%s\r\n", defaultalphadomain);
{
if(readline(infile, line, 299)) return TRUE;
laenge=atol(line);
fprintf(outfile, "LEN:\t%lu\r\n", laenge);
}
if(readline(infile, line, 299)) return TRUE;
if(line[0]!='T')
{
char tempstr[TEXTLEN], *tptr;
fprintf(outfile, "TYP:\tBIN\r\n");
filename[12]=0;
strncpy(filename, bet, 12);
tptr=strchr(filename, ' ');
if(tptr!=NULL) *tptr=0;
strmaxcpy(tempstr, bet+12, TEXTLEN-1);
strmaxcpy(bet, filename, TEXTLEN-1);
if(bet[0]!=0) strcat(bet, " - ");
strcat(bet, tempstr);
}
do
{
if(readline(infile, line, 299)) return TRUE;
}
while(line[0]!=2);
do
{
if(readline(infile, line, 299)) return TRUE;
switch((byte)line[0])
{
case 255:
fprintf(outfile, "EB:\r\n");
break;
case 251:
if(line[1]!=0) fprintf(outfile, "MAILER:\t%s\r\n", line+1);
break;
case 249:
line[99]=0;
if(line[1]!=0) strcpy(filename, line+1);
break;
}
}
while(line[0]!=3);
if(filename[0]!=0) fprintf(outfile, "FILE:\t%s\r\n", filename);
fprintf(outfile, "BET:\t%s\r\n", bet);
fprintf(outfile, "GATE:\tALPHA/DBOX %s.%s [Alphaboxgate/DBOX]\r\n",
config.boxname, config.domain);
fprintf(outfile, "\r\n");
if(filecopy(infile, outfile, laenge)!=0)
{
log_serv.printf("alphatozc", "Fehler beim Kopieren!");
return TRUE;
}
return FALSE;
}
static int zctoalpha(FILE *infile, FILE *outfile)
{
char emps[20][100], bet[100]="", bez[100]="", abs[100]="", wab[100]="",
eda[30]="", mid[100]="", file[100]="",
mailer[100]="ALPHA vom " DBOXVERSION " by Daniel Kroening", *emp;
char tempstr[300], *tptr;
int binaer=FALSE, anzemp=0, empnr;
dword laenge=0xffffffff;
byte eb=FALSE;
do
{
if(readline(infile, tempstr, 100))
return FALSE;
if(tempstr[0]!=0)
{
tptr=strchr(tempstr, ':');
if(tptr==NULL) goto error;
*(tptr++)=0;
while(*tptr=='\t' || *tptr==' ') tptr++;
tptr[98]=0;
if(stricmp(tempstr, "ABS")==0)
strcpy(abs, tptr);
else if(stricmp(tempstr, "BET")==0)
strcpy(bet, tptr);
else if(stricmp(tempstr, "BEZ")==0)
strcpy(bez, tptr);
else if(stricmp(tempstr, "EB")==0)
eb=TRUE;
else if(stricmp(tempstr, "EDA")==0)
{
tptr[28]=0;
strcpy(eda, tptr);
}
else if(stricmp(tempstr, "EMP")==0 && anzemp!=19)
{
char *tptr2;
if((tptr2=strchr(tptr, ' '))!=NULL) *tptr2=0;
strcpy(emps[anzemp++], tptr);
}
else if(stricmp(tempstr, "FILE")==0)
strcpy(file, tptr);
else if(stricmp(tempstr, "LEN")==0)
laenge=atol(tptr);
else if(stricmp(tempstr, "MID")==0)
strcpy(mid, tptr);
else if(stricmp(tempstr, "MAILER")==0)
strcpy(mailer, tptr);
else if(stricmp(tempstr, "TYP")==0)
binaer=TRUE;
else if(stricmp(tempstr, "WAB")==0)
strcpy(wab, tptr);
}
}
while(tempstr[0]!=0);
if(wab[0]!=0) strcpy(abs, wab);
if(laenge==0xffffffff || abs[0]==0 || eda[0]==0 || anzemp==0 || mid[0]==0)
{
error:
log_serv.printf("zctoalpha", "Pufferdatei defekt, die Datei wurde nicht vollst„ndig konvertiert.");
return TRUE;
}
if(zcallowed[0]!=NULL)
{
word i;
char tempabs[100], *tptr;
strmaxcpy(tempabs, abs, 99);
tptr=strchr(tempabs, ' ');
if(tptr!=0) *tptr=0;
tptr=strchr(tempabs, '@');
if(tptr==NULL)
{
illegalabs:
log_serv.printf("zctoalpha", "Illegaler Absender: Nachricht von \"%s\""
" an \"%s\" ignoriert!", abs, emps[0]);
fseek(infile, laenge, SEEK_CUR);
return FALSE;
}
else
{
tptr++;
i=0;
while(zcallowed[i]!=NULL &&
stricmp(zcallowed[i], tptr)!=0) i++;
if(zcallowed[i]==NULL) goto illegalabs;
}
}
if(bet[0]=='#' && bet[1]=='#')
{
eb=TRUE;
strcpy(tempstr, bet+2);
strcpy(bet, tempstr);
}
char abs1[100]="ZNETZ", abs2[100]="", abs3[100]="", abs4[100]="";
{
char *tptr;
int i;
tptr=strstr(abs, " (");
if(tptr!=NULL)
{
*tptr=0;
tptr+=2;
i=strlen(tptr)-1;
if(tptr[i]==')')
{
tptr[i]=0;
strcpy(abs4, tptr);
}
}
tptr=strchr(abs, '@');
if(tptr==NULL) goto error;
*tptr=0;
strcpy(abs3, abs);
*tptr='@';
tptr++;
if(alphagate[0]!=0)
{
strcat(abs3, "%");
strcat(abs3, tptr);
upstring(abs3);
strcpy(abs2, alphagate);
}
else
{
strcpy(abs2, tptr);
tptr=strchr(abs2, '.');
if(tptr==NULL) goto error;
*tptr=0;
upstring(abs2);
upstring(abs3);
}
}
mid[39]=0;
bez[39]=0;
eda[14]=0;
if(binaer)
{
char tempstr[300], filename[13]="FILENAME.EXT", *tptr1, *tptr2;
int i;
if(file[0]!=0)
{
tptr1=file;
tptr2=filename;
i=0;
while(i!=8 && (isdigit(*tptr1) || isalpha(*tptr1) || *tptr1=='_'))
{
*(tptr2++)=*(tptr1++);
i++;
}
tptr1=strchr(tptr1, '.');
if(tptr1!=NULL)
{
*(tptr2++)=*(tptr1++);
i=0;
while(i!=3 && (isdigit(*tptr1) || isalpha(*tptr1) || *tptr1=='_'))
{
*(tptr2++)=*(tptr1++);
i++;
}
}
*tptr2=0;
upstring(filename);
for(i=strlen(filename); i<11; i++) filename[i]=' ';
}
strcpy(tempstr, bet);
sprintf(bet, "%s%s", filename, tempstr);
}
for(empnr=0; empnr<anzemp; empnr++)
{
char emp1[100]="", emp2[100]="", emp3[100]="";
int i;
if(empnr!=0) fseek(infile, -laenge, SEEK_CUR);
emp=emps[empnr];
if(emp[0]=='/')
{
i=0;
while(bretter[i]!=NULL && stricmp(bretter[i+1], emp)!=0) i+=2;
if(bretter[i]==0) goto dump;
strcpy(emp1, bretter[i]);
}
else
{
char *tptr;
strcpy(emp1, "-");
tptr=strchr(emp, '@');
if(tptr==NULL) goto dump;
*(tptr++)=0;
if(stricmp(tptr, "blindnet.sb.sub.de")==0 ||
stricmp(tptr, "blindnet.zer.sub.org")==0 ||
stricmp(tptr, "blindnet.zer")==0)
{
tptr=strchr(emp, '%');
if(tptr==NULL) goto dump;
(*tptr++)=0;
strcpy(emp2, tptr);
strcpy(emp3, emp);
}
else
{
strcpy(emp3, emp);
strcpy(emp2, tptr);
tptr=strchr(emp2, '.');
if(*tptr!=0) *tptr=0;
//if(stricmp(emp2, SYSTEMNAME)==0) emp2[0]=0;
}
upstring(emp2);
upstring(emp3);
tptr=emp3;
while(*tptr!=0)
{
if(*tptr=='_') *tptr=' ';
tptr++;
}
}
fprintf(outfile, "\1\r\n");
fprintf(outfile, "%s\r\n%s\r\n%s\r\n", emp1, emp2, emp3);
fprintf(outfile, "%s\r\n%s\r\n%s\r\n%s\r\n", abs1, abs2, abs3, abs4);
fprintf(outfile, "%s\r\n", bet);
fprintf(outfile, "%s\r\n", mid);
fprintf(outfile, "%s\r\n", bez);
fprintf(outfile, "%s\r\n", eda+2);
fprintf(outfile, "\r\n");
fprintf(outfile, "%ld\r\n", laenge);
fprintf(outfile, "%c\r\n", binaer?'B':'T');
fprintf(outfile, "\2\r\n");
if(eb) fprintf(outfile, "%c\r\n", 255);
if(mailer[0]!=0) fprintf(outfile, "%c%s\r\n", 251, mailer);
if(file[0]!=0) fprintf(outfile, "%c%s\r\n", 249, file);
fprintf(outfile, "\3\r\n");
if(binaer)
{
if(filecopy(infile, outfile, laenge)!=0)
{
log_serv.printf("zctoalpha", "Fehler beim Kopieren!");
return TRUE;
}
}
else
{
if(filetextcopy(infile, outfile, laenge)!=0)
{
log_serv.printf("zctoalpha", "Fehler beim Kopieren!");
return TRUE;
}
}
/*
for(count=0; count<laenge; count++)
{
data=fgetc(infile);
if(data=='\r' || data=='\n' || data>=32)
fputc(data, outfile);
else
fputc(' ', outfile);
}*/
goto weiter;
dump:
log_serv.printf("zctoalpha", "Nachricht von \"%s\" an \"%s\""
" ignoriert!", abs, emp);
fseek(infile, laenge, SEEK_CUR);
weiter:;
}
return FALSE;
}
static void readbretter()
{
char tempstr1[500], tempstr2[500], filename[DIRLEN];
FILE *infile;
int i;
sprintf(filename, DBOXSYSTEMDIR "alpha.bl", config.dboxdir);
if((infile=fopen(filename, "rt"))==NULL)
{
log_serv.printf("readbretter", "alpha.bl konnte nicht ge”ffnet werden!");
return;
}
i=0;
schleife:
switch(readconfigline(infile, tempstr1, tempstr2, 400))
{
case 0:
if((bretter[i]=(char *)malloc(strlen(tempstr1)+1))==NULL) abort();
strcpy(bretter[i], tempstr1);
i++;
if((bretter[i]=(char *)malloc(strlen(tempstr2)+1))==NULL) abort();
strcpy(bretter[i], tempstr2);
i++;
if(i>=MAXBRETTER)
{
log_serv.printf("readbretter", "Zu viele Bretter!");
fclose(infile);
return;
}
goto schleife;
case 1:
break;
default:
log_serv.printf("readbretter", "Die Brettinformationsdatei ist ungltig!");
fclose(infile);
return;
}
bretter[i]=(char *)NULL;
fclose(infile);
}
static void freebretter()
{
int i;
i=0;
while(bretter[i]!=NULL)
free(bretter[i++]);
}
static void readconfig()
{
char *tptr, tempstr1[500], tempstr2[500], filename[DIRLEN];
FILE *infile;
word anzzcallowed=0, anzdomains=0;
sprintf(filename, DBOXSYSTEMDIR "alpha.cfg", config.dboxdir);
if((infile=fopen(filename, "rt"))==NULL)
{
log_serv.printf("readconfig", "alpha.cfg konnte nicht ge”ffnet werden!");
return;
}
schleife:
switch(readconfigline(infile, tempstr1, tempstr2, 400))
{
case 0:
if(stricmp(tempstr1, "defaultalphadomain")==0)
{
tptr=tempstr2;
if(tptr[0]=='.') tptr++;
strmaxcpy(defaultalphadomain, tptr, 50);
}
else if(stricmp(tempstr1, "defaultzcdomain")==0)
{
tptr=tempstr2;
if(tptr[0]=='.') tptr++;
strmaxcpy(defaultzcdomain, tptr, 50);
}
else if(stricmp(tempstr1, "domains")==0)
{
if(anzdomains==MAXDOMAINS)
{
fprintf(stderr, "Warnung: Zu viele Domains!\n");
}
else
{
tptr=tempstr2;
while(*tptr!=0 && *tptr!=' ' && *tptr!='\t' && *tptr!=',' &&
*tptr!=';' && *tptr!='.')
tptr++;
if(*tptr==0) goto error;
*tptr=0;
upstring(tempstr2);
tptr++;
while(*tptr==' ' || *tptr=='\t' || *tptr==',' ||
*tptr==';' || *tptr=='.') tptr++;
domains[anzdomains*2]=(char *)malloc(strlen(tempstr2)+1);
if(domains[anzdomains*2]==NULL)
{
fprintf(stderr, "FATAL: Zu wenig RAM!\n");
abort();
}
strcpy(domains[anzdomains*2], tempstr2);
domains[anzdomains*2+1]=(char *)malloc(strlen(tptr)+1);
if(domains[anzdomains*2+1]==NULL)
{
fprintf(stderr, "FATAL: Zu wenig RAM!\n");
abort();
}
strcpy(domains[anzdomains*2+1], tptr);
anzdomains++;
}
}
else if(stricmp(tempstr1, "alphagate")==0)
{
tptr=strchr(tempstr2, '.');
if(tptr!=NULL) *tptr=0;
strmaxcpy(alphagate, tempstr2, 8);
upstring(alphagate);
}
else if(stricmp(tempstr1, "zcallowed")==0)
{
if(anzzcallowed==MAXZCALLOWED)
{
fprintf(stderr, "Warnung: Zu viele Systeme!\n");
}
else
{
zcallowed[anzzcallowed]=(char *)malloc(strlen(tempstr2)+1);
if(zcallowed[anzzcallowed]==NULL)
{
fprintf(stderr, "FATAL: Zu wenig RAM!\n");
abort();
}
strcpy(zcallowed[anzzcallowed], tempstr2);
anzzcallowed++;
}
}
else
{
error:
fprintf(stderr, "Fehler in alpha.cfg!\n");
fclose(infile);
return;
}
goto schleife;
case 1:
break;
default:
goto error;
}
fclose(infile);
if(defaultalphadomain[0]==0 || defaultzcdomain[0]==0)
{
log_serv.printf("readconfig", "alpha.cfg unvollst„ndig!");
}
zcallowed[anzzcallowed]=(char *)NULL;
domains[anzdomains*2]=(char *)NULL;
}
static void freeconfig()
{
int i;
i=0;
while(domains[i]!=NULL)
free(domains[i++]);
i=0;
while(zcallowed[i]!=NULL)
free(zcallowed[i++]);
}
static void showconfig()
{
int i;
printf("Eingene Box: \"%s\"\n", config.boxname);
printf("Voller Name: \"%s.%s\"\n", config.boxname, config.domain);
printf("Standarddomain Alphabox: \"%s\"\n", defaultalphadomain);
printf("Standarddomain ZConnect: \"%s\"\n", defaultzcdomain);
printf("\n");
if(domains[0]!=NULL || zcallowed[0]!=NULL)
{
if(domains[0]!=NULL)
{
printf("Domainzuordnungen:\n");
i=0;
while(domains[i]!=NULL)
{
printf(" %s = %s.%s\n", domains[i], domains[i], domains[i+1]);
i+=2;
}
printf("\n");
}
if(zcallowed[0]!=NULL)
{
printf("Zugelassene ZConnect-Systeme:\n");
i=0;
while(zcallowed[i]!=NULL)
{
printf(" %s\n", zcallowed[i]);
i++;
}
printf("\n");
}
}
printf("Eingetragene Bretter:\n");
i=0;
while(bretter[i]!=NULL)
{
printf(" %s = %s\n", bretter[i], bretter[i+1]);
i+=2;
}
}
void doshowalphaconfig()
{
readconfig();
readbretter();
showconfig();
freebretter();
freeconfig();
}
void alpha2zc(userpt *up, const char *infilename,
const char *outfilenamemail, const char *outfilenamenews)
{
FILE *infile, *outfilemail, *outfilenews;
infile=fopen(infilename, "rb");
if(infile==NULL)
{
log_serv.printf("alpha2zc", "Fatal: Failed to open \"%s\"!", infilename);
return;
}
outfilemail=fopen(outfilenamemail, "ab");
if(outfilemail==NULL)
{
log_serv.printf("alpha2zc", "Fatal: Failed to open \"%s\"!", outfilenamemail);
fclose(infile);
return;
}
outfilenews=fopen(outfilenamenews, "ab");
if(outfilenews==NULL)
{
log_serv.printf("alpha2zc", "Fatal: Failed to open \"%s\"!", outfilenamenews);
fclose(infile);
fclose(outfilemail);
return;
}
while(!feof(infile))
{
if(alphatozc(infile, outfilemail, outfilenews)!=0)
{
log_serv.printf("alpha2zc", "Fatal: alphatozc failed!");
break;
}
}
fclose(infile);
fclose(outfilemail);
fclose(outfilenews);
}
void zc2alpha(userpt *up, const char *infilename,
const char *outfilename)
{
FILE *infile, *outfile;
infile=fopen(infilename, "rb");
if(infile==NULL)
{
log_serv.printf("zc2alpha", "Fatal: Failed to open \"%s\"!", infilename);
return;
}
outfile=fopen(outfilename, "ab");
if(outfile==NULL)
{
log_serv.printf("zc2alpha", "Fatal: Failed to open \"%s\"!", outfilename);
fclose(infile);
return;
}
while(!feof(infile))
{
if(zctoalpha(infile, outfile)!=0)
{
log_serv.printf("zc2alpha", "Fatal: zctoalpha failed!");
break;
}
}
fclose(infile);
fclose(outfile);
}
void alpha2zc(userpt *up, const char *dirname)
{
DIR *dir;
struct dirent *ent;
char tempstr[DIRLEN];
sprintf(tempstr, "%s.", dirname);
if((dir=opendir(tempstr))==NULL)
{
console.printf("opendir() failed!\r\n");
log_serv.printf("alpha2zc", "Fatal: opendir(\"%s\") failed!", tempstr);
return;
}
while((ent=readdir(dir))!=NULL)
{
if(ent->d_name[0]!='.')
{
char oldfilename[DIRLEN],
newfilenamemail[DIRLEN],
newfilenamenews[DIRLEN];
sprintf(oldfilename, "%s%s", dirname, ent->d_name);
sprintf(newfilenamemail, DBOXTEMPDIR "prearc.%d.alphamail", config.dboxdir, getpid());
sprintf(newfilenamenews, DBOXTEMPDIR "prearc.%d.alphanews", config.dboxdir, getpid());
alpha2zc(up, oldfilename, newfilenamemail, newfilenamenews);
spool_zc_puffer_mail(newfilenamemail, up->name);
spool_zc_puffer_news(newfilenamenews, up->name);
}
}
closedir(dir);
}
void doprearcalphaunpack(userpt *up)
{
DIR *dir;
struct dirent *ent;
char dirname[DIRLEN];
sprintf(dirname, BOXSPOOLDIR ".", config.boxdir, up->name);
if((dir=opendir(dirname))==NULL)
{
console.printf("opendir() failed!\r\n");
log_serv.printf("doprearcalphaunpack", "Fatal: opendir(\"%s\") failed!", dirname);
return;
}
while((ent=readdir(dir))!=NULL)
{
if(strnicmp(ent->d_name, "in_", 3)==0)
{
char filename[DIRLEN];
sprintf(filename, BOXSPOOLDIR "%s",
config.boxdir, up->name, ent->d_name);
if(filelength(filename)<10)
{
console.printf("Datei zu klein: %s\r\n", filename);
log_serv.printf("doprearcalphaunpack", "Datei zu klein: %s", filename);
remove(filename);
}
else
{
char tempdir[DIRLEN];
snprintf(tempdir, DIRLEN-1, DBOXSPOOLTEMPDIR, config.dboxdir);
if(unpack(getpacker(up), filename, tempdir))
{
log_serv.printf("doprearcalphaunpack", "unpack(\"%s\") failed!", filename);
}
else
{
remove(filename);
alpha2zc(up, tempdir);
}
}
}
}
closedir(dir);
}
void doprearcalphapack(userpt *up)
{
char filename[DIRLEN], tempstr[DIRLEN], directory[DIRLEN];
dword packetcount;
byte packer;
sprintf(directory, BOXSPOOLDIR, config.boxdir, up->name);
packetcount=time((time_t *)NULL)%100000000;
packer=getpacker(up);
if(packer==PACKER_INTERN ||
packer==PACKER_NONE || //TODO!
packer==PACKER_ZOO ||
packer==PACKER_ARJ)
return;
if(!checkpack(up)) return;
if(locksystem(up)) return;
sprintf(tempstr, BOXSPOOLDIR "%s.prv",
config.boxdir, up->name, up->name);
if(access(tempstr, 00)==0)
{
packetcount++;
packetcount%=100000000;
sprintf(filename, BOXSPOOLDIR "%lu.BUF",
config.boxdir, up->name, packetcount);
while(lock("puffer.prv", up->name, config.boxname, "doprearcalphapack"))
{
console.printf("%s is locked... ", up->name);
sleep(10);
}
zc2alpha(up, tempstr, filename);
remove(tempstr);
unlock("puffer.prv", up->name, config.boxname);
sprintf(tempstr, BOXSPOOLDIR "%s.%s",
config.boxdir, up->name, up->name, packerextentions[packer]);
pack(packer, tempstr, filename, directory);
remove(filename);
}
sprintf(tempstr, BOXSPOOLDIR "%s.brt",
config.boxdir, up->name, up->name);
if(access(tempstr, 00)==0)
{
packetcount++;
packetcount%=100000000;
sprintf(filename, BOXSPOOLDIR "%lu.BUF",
config.boxdir, up->name, packetcount);
zc2alpha(up, tempstr, filename);
remove(tempstr);
sprintf(tempstr, BOXSPOOLDIR "%s.%s",
config.boxdir, up->name, up->name, packerextentions[packer]);
pack(packer, tempstr, filename, directory);
remove(filename);
}
unlocksystem(up);
}
void doprearcalpha(userpt *up)
{
readconfig();
readbretter();
doprearcalphaunpack(up);
if(!onlyunpack)
doprearcalphapack(up);
freeconfig();
freebretter();
}