#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <dirent.h>
#include <string.h>


/* Puffergroesse fuer cf / df-Dateiname mit Pfadangabe "spool/" */
#define JOB_FILEPATH_LEN    32


/******************************************************************************
 * get_next_number: Naechste zu vergebene Auftragsnummer ermitteln            *
 ******************************************************************************
 * Rueckgabewert: naechste Auftragsnummer                                     *
 ******************************************************************************/

int get_next_number()
{
  int curr_num;      /* Nummer des momentan betrachteten Auftrags */
  int next_num = 1;  /* Naechste zu vergebende Auftragsnummer */
  int ret;

  DIR           *dir;
  struct dirent *entry;


  /* Spool-Verzeichnis oeffnen */
  dir = opendir("spool");
  if(dir == NULL)
  {
    perror("get_next_number: opendir");
    exit(EXIT_FAILURE);
  }


  /* Spool-Verzeichnis durchlaufen */
  while(1)
  {
    /* readdir liefert als Rueckgabewert NULL, wenn das Verzeichnis aus-
       gelesen wurde ODER ein Fehler aufgetreten ist. Um dies zu unter-
       scheiden wird vor jedem readdir-Aufruf errno auf 0 gesetzt.
       Im Fehlerfall ist der Rueckgabewert NULL und errno != 0. */
    errno = 0;
    entry = readdir(dir);
    if(entry == NULL)
    {
      if(errno != 0)
      {
        /* Fehler bei readdir */
        perror("get_next_number: readdir");
        exit(EXIT_FAILURE);
      }
      else break; /* Verzeichnis ausgelesen, while Schleife verlassen */
    }

    /* Nur cfxxxx-Dateien bei Ermittlung der Auftragsnummer beruecksichtigen */
    if(entry->d_name[0] != 'c') continue; /* Keine c... -Datei */

    if(strlen(entry->d_name) != 6) continue; /* Keine cfxxxx-Datei */


    /* Nummer aus Dateiname ermitteln */
    ret = sscanf(entry->d_name, "cf%d", &curr_num);
    if(ret != 1)
    {
      /* Nummer konnte nicht aus Zeichenkette konvertiert werden */
      printf("Ungueltige Datei \"%s\" im spool-Verzeichnis!\n", entry->d_name);
      printf("Datei wird ignoriert!\n");
    }
    else
    {
      /* Naechster Auftrag bekommt groesste gefundene Nummer + 1 */
      if(curr_num >= next_num) next_num = curr_num + 1;
    }
  }

  closedir(dir);

  return next_num;
}


/******************************************************************************
 * newjob: Auftrag anlegen                                                    *
 ******************************************************************************
 * Eingabe: empfaenger: Empfaengeradresse                                     *
 *          mailinhalt: Eingabekanal mit Mailinhalt                           *
 ******************************************************************************/

void newjob(char *empfaenger, FILE *mailinhalt)
{
  int   c;
  FILE *cf_fileptr;  /* Handle fuer anzulegende cf-Datei */
  FILE *df_fileptr;  /* Handle fuer anzulegende df-Datei */

  int   job_num;     /* Auftragsnummer */

  /* Dateinamen fuer cf- und df-Datei, fortlaufend nummeriert,
     inkl. Pfadangabe "spool/" */
  char  cffile[JOB_FILEPATH_LEN];
  char  dffile[JOB_FILEPATH_LEN];


  /* Naechste Job-Nummer ermitteln */
  job_num = get_next_number();


  /* Mailadresse in Datei spool/cf<job_num> ablegen */

  /* cf-Datei erstellen */
  sprintf(cffile, "spool/cf%04d", job_num);
  cf_fileptr = fopen(cffile, "w");
  if(cf_fileptr == NULL) /* Fehler ? */
  {
    perror("newjob: create cffile");
    exit(EXIT_FAILURE);
  }

  /* Mailadresse in Datei schreiben */
  fprintf(cf_fileptr, empfaenger);
  fclose(cf_fileptr);


  /* Mailinhalt nach Datei spool/df<job-num> kopieren */

  /* df-Zieldatei anlegen */
  sprintf(dffile, "spool/df%04d", job_num);
  df_fileptr = fopen(dffile, "w");
  if(df_fileptr == NULL) /* Fehler ? */
  {
    perror("newjob: create dffile");
    exit(EXIT_FAILURE);
  }

  /* Mailinhalt kopieren */
  while((c = getc(mailinhalt)) != EOF)
  {
    putc(c, df_fileptr);
  }

  /* df-Zieldatei schliessen */
  fclose(df_fileptr);

  printf("Auftrag Nr. %04d erfolgreich angelegt!\n\n", job_num);
}
