/* wtmpxcut */

/*----------------------------------------------------------------------*
 *                                                                      *
 * Description: Source du fichier exec. /equipe/sysadmin/bin/wtmpxcut   *
 *              qui permet de reduire le fichier /var/adm/wtmpx en enle-*
 *              vant toutes les entrees plus vieilles qu'une certaine   *
 *              date specifiee en parametre. Si aucun parametre n'est   *
 *              specifie, on utilise une valeur par defaut (DELAIS).    *
 *                                                                      *
 *----------------------------------------------------------------------*/

#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <utmpx.h>
#include <time.h>
#include <errno.h>

#define DELAIS  (time_t) (30)                           /* en jour */

int main(argc, argv)
int argc;
char **argv;
{
  struct  utmpx wtmpx_rec;
  int     old_fd, new_fd;
  int     wtmpx_rec_sz = sizeof(wtmpx_rec);
  time_t  periode, temps_limite;

  if (argc > 1)
      periode = (time_t) atoi(argv[1]);
  else
      periode = DELAIS;

  /*
  * Copie de /var/adm/wtmpx dans /tmp/wtmpx
  */
  putenv("IFS=' \t\n'");                        /* Securite */
  putenv("PATH=/usr/bin");                      /* Securite */
  if (system("cp /var/adm/wtmpx /tmp/wtmpx") < 0) {
    fprintf(stderr,"%s: Erreur en copiant wtmpx dans /tmp.\nBye.\n",argv[0]);
    exit(1);
  } /* if */

  /*
   *  Calcule du temps limite en time_t  
   */
  temps_limite = time(NULL) - (periode * 24 * 3600);
  fprintf(stdout,
  "\n%s: la date limite est %s\n", argv[0], asctime(localtime(&temps_limite)));

  /*
   *  Ouvre le nouveau wtmp en ecriture
   */
  if ((new_fd = open("/var/adm/wtmpx", O_WRONLY | O_TRUNC)) < 0) {
    fprintf(stderr, "%s: Erreur %d d'ouverture de /var/adm/wtmpx.\nBye.\n",
            argv[0], errno);
    exit(1);
  } /* if */

  /*
   *  Ouvre la copie de wtmp en lecture
   */
  if ((old_fd = open("/tmp/wtmpx", O_RDONLY)) < 0) {
    fprintf(stderr, "%s: Erreur %d d'ouverture de /tmp/wtmpx.\nBye.\n",
            argv[0], errno);
    exit(1);
  } /* if */

  /*
   * En partant du debut du fichier, on compare les dates
   * et si elles sont trop vieilles, on les oublies.
   * Lorsqu'elles sont dans la periode, on les garde dans
   * le fichier /var/adm/wtmpx.
   */
  while (read(old_fd, &wtmpx_rec, wtmpx_rec_sz) == wtmpx_rec_sz) {
    if (wtmpx_rec.ut_xtime >= temps_limite) {
      do {
        if (write(new_fd, &wtmpx_rec, wtmpx_rec_sz) != wtmpx_rec_sz) {
          fprintf(stderr, "%s: Erreur %d d'ecriture du record.\nBye.", 
                  argv[0], errno);
          exit(1);
        } /* if */
      } while (read(old_fd, &wtmpx_rec, wtmpx_rec_sz) == wtmpx_rec_sz );
    } /* if */
  } /* while */

  exit(0);                                      /* Sortie elegante */

} /* main() */



