/*----------------------------------------------------------------------* * * * 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 #include #include #include #include #include #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() */