"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();
 }