#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <dirent.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>


/* Puffergroesse fuer Mailadresse */
#define MAIL_ADDR_LEN       64

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


/******************************************************************************
 * printjob: Informationen zu Auftrag auf Standardausgabe ausgeben            *
 ******************************************************************************
 * Eingabe: cf_filename: Name der cf-Datei (ohne Pfad)                        *
 * Ausgabe: (auf Standardausgabe) Auftragsnummer, Empfaengeradresse,          *
 *          Auftragsdatum und Zeit                                            *
 ******************************************************************************/

void printjob(char *cf_filename)
{
  char         cf_filepath[JOB_FILEPATH_LEN];
  FILE        *cf_fileptr;
  char         empfaenger[MAIL_ADDR_LEN];
  struct stat  stat_info;
  struct tm   *aenderungszeit;
  int          ret;
  int          job_num;


  /* Auftragsnummer aus Dateiname ermitteln */
  ret = sscanf(cf_filename, "cf%d", &job_num);
  if(ret != 1) /* Fehler bei der Konvertierung */
  {
    printf("printjob: ungueltige Datei \"%s\" im spool-Verzeichnis\n", cf_filename);
    printf("Datei wird ignoriert\n");
    return;
  }


  /* cf-Dateiname um Pfadangabe ergaenzen */
  sprintf(cf_filepath, "spool/%s", cf_filename);


  /* Empfaengeradresse einlesen */

  /* cf-Datei oeffnen */
  cf_fileptr = fopen(cf_filepath, "r");
  if(cf_fileptr == NULL)
  {
    perror("printjob: open cffile");
    exit(EXIT_FAILURE);
  }

  /* Empfaenferadresse einlesen, cf-Datei schliessen */
  fscanf(cf_fileptr, "%s", empfaenger);
  fclose(cf_fileptr);


  /* Dateisystem-Informationen zur cf-Datei ermitteln */
  if(stat(cf_filepath, &stat_info) != 0)
  {
    perror("printjob: stat");
    exit(EXIT_FAILURE);
  }

  /* Zeit des letzten Schreibzugriffs fuer Ausgabe konvertieren */
  aenderungszeit = localtime(&(stat_info.st_mtime));
  if(aenderungszeit == NULL)
  {
    perror("printjob: localtime");
    exit(EXIT_FAILURE);
  }


  /* Job-Nr. und Empfaengeradresse ausgeben */
  printf("%04d    %-25s   ", job_num, empfaenger);

  /* Datum im Format JJJJ-MM-TT ausgeben */
  printf("%04d-%02d-%02d   ", (aenderungszeit->tm_year + 1900),
                         (aenderungszeit->tm_mon + 1), aenderungszeit->tm_mday);

  /* Zeit im Format HH:MM:SS ausgeben */
  printf("%02d:%02d:%02d\n", aenderungszeit->tm_hour, aenderungszeit->tm_min,
                                                        aenderungszeit->tm_sec);
}


/******************************************************************************
 * blist: Informationen zu Auftraegen im "spool"-Verzeichnis ausgeben         *
 ******************************************************************************/

void blist()
{
  DIR           *dir;
  struct dirent *entry;


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


  /* Spaltenueberschrift */
  printf("Jobnr   Empfaenger                  Auftragszeit\n");


  /* In Schleife Verzeichniseintraege auslesen */
  while(1)
  {
    /* Naechsten Verzeichniseintrag ermitteln
       s.a. Modul "newjob", Funktion "get_next_number" */
    errno = 0;
    entry = readdir(dir);
    if(entry == NULL) /* Fehler? */
    {
      if(errno != 0)
      {
        perror("blist: readdir");
        exit(EXIT_FAILURE);
      }
      else break; /* Kein Fehler, Verzeichnis ausgelesen */
    }

    if(entry->d_name[0] != 'c') continue; /* Keine c...-Datei */

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

    printjob(entry->d_name); /* Informationen zum Auftrag ausgeben*/
  }


  /* Verzeichnis schliessen */
  closedir(dir);
}
