ftp.nice.ch/pub/next/tools/workspace/MOTD.NI.bs.tar.gz#/MOTD/trimwtmp.c

This is trimwtmp.c in view mode; [Download] [Up]

/* Program: trimwtmp.c - Utility to prune Unix wtmp log files.
 *
 * Usage: trimwtmp [days] [wtmpfile]
 *
 * Defaults: 30 days "/usr/adm/wtmp"
 *
 * Compile: cc -o trimwtmp trimwtmp.c
 *
 * "mike" (Mike Macgirvin)         Mike_Macgirvin@MED.Stanford.EDU
 * Unix Server Administrator       CAMIS Computer Project
 *
 * Modified for NeXT & ANSI-C by:
 *
 * Christopher Lane (Christopher_Lane@Med.Stanford.EDU)
 * Symbolic Systems Resources Group, Knowledge Systems Laboratory
 *
 * Stanford University
 */
 
#include <c.h>
#include <libc.h>
#include <utmp.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

#define TRIM_TIME 30
#define PATH_WTMP "/usr/adm/wtmp"
#define SECONDS_DAY (60 * 60 * 24)

typedef enum {PROGRAM = 0, DAYS, FILENAME, ARGC} ARGUMENTS;

void main(int argc, char *argv[])
{
	int days;
	time_t when;
	struct utmp ut;
	FILE *fin, *fout;
	char filename[MAXPATHLEN], temp_filename[MAXPATHLEN];
  
	if(argc > ARGC) {
		(void) fprintf(stderr, "usage: %s [days] [wtmpfile]\n", argv[PROGRAM]);
		exit(EXIT_FAILURE);
		}
		
	(void) strcpy(filename, (argc > FILENAME) ? argv[FILENAME] : PATH_WTMP);

	if(argc <= DAYS || (days = atoi(argv[1])) <= 0) days = TRIM_TIME;
	
	when = time(NULL) - (days * SECONDS_DAY);
	
	(void) sprintf(temp_filename, "%s%d", filename, getpid());
#ifdef DEBUG
	(void) fprintf(stderr, "using \"%s\", \"%s\", trimming %d days\n", filename, temp_filename, days);
#endif
	if((fout = fopen(temp_filename, "w")) == NULL) {
		(void) fprintf(stderr, "%s: Can't open temporary file for write: %s\n", argv[PROGRAM], temp_filename);
		exit(EXIT_FAILURE);
		}

	if((fin = fopen(filename, "r")) == NULL) {
		(void) fprintf(stderr, "%s: Can't open wtmp file for read: %s\n", argv[PROGRAM], filename);
		exit(EXIT_FAILURE);
		}

	while(fread(&ut, sizeof(struct utmp), 1, fin) != 0)
		if((time_t) ut.ut_time > when) (void) fwrite(&ut, sizeof(struct utmp), 1, fout);
	
	(void) fclose(fin);
	(void) fclose(fout);
#ifndef DEBUG
	if(unlink(filename) != CERROR) (void) rename(temp_filename, filename);
#endif
	exit(EXIT_SUCCESS);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.