Overflowing wtmp


Mon Jan 28 11:00:01 AEST 1991


Since quite a few people have requested it, and because it isn't too long,
I'll just throw my flavor of fwtmp up here:

---[ cut here ]----------------------------------------------------------------

/*      @(#)fwtmp.c     1.1     90/02/16        convert utmp to ascii and back
        written by Michael Stefanik

        This program is for public consumption and is therefore a "user
        supported" program.  The buck stops with you.

        This program was written to act similarly to the fwtmp(1) on our
        AIX machine.  It can be installed anywhere, I prefer /etc myself.
        Fwtmp(1) has a few simple uses: to trim down growing /etc/wtmp files,
        and to expand /etc/utmp for whatever reasons.

        Without the -ic switch, fwtmp assumes stdin is in utmp format, and
        writes ascii to stdout; with the -ic switch, the assumption is reversed
*/

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <utmp.h>

#define UTSIZE  (sizeof(struct utmp))

char    *image;

main(argc,argv)
int     argc;
char    *argv[];
{
        image = argv[0];

        if ( argc == 2 && strcmp(argv[1],"-ic") == 0 ) 
                toutmp();
        else if ( argc == 1 )
                fromutmp();
        else {
                fprintf(stderr,"Usage: %s [-ic] <file >file\n",image);
                return(1);
                }
        return(0);
}

toutmp()
{
char            buf[128], *ptr, *strtok();
struct utmp     u;

        while ( gets(buf) != NULL ) {
                strncpy(u.ut_user,strtok(buf," "),8);
                strncpy(u.ut_id,strtok(NULL," "),4);
                strncpy(u.ut_line,strtok(NULL," "),12);
                u.ut_pid = (short)atoi(strtok(NULL," "));
                u.ut_type = (short)atoi(strtok(NULL," "));
                u.ut_exit.e_termination = (short)atoi(strtok(NULL," "));
                u.ut_exit.e_exit = (short)atoi(strtok(NULL," "));
                u.ut_time = (time_t)atol(strtok(NULL," "));
                if ( write(1,&u,UTSIZE) != UTSIZE ) {
                        fprintf(stderr,"%s: write failed\n",image);
                        exit(1);
                        }
                }
}

fromutmp()
{
int             bytes;
struct utmp     u;

        while ( (bytes = read(0,&u,UTSIZE)) == UTSIZE )
                printf("%s %s %s %d %d %d %d %ld\n",
                        u.ut_user, u.ut_id, u.ut_line,
                        (int)u.ut_pid, (int)u.ut_type,
                        (int)u.ut_exit.e_termination,
                        (int)u.ut_exit.e_exit, u.ut_time);

        if ( bytes != 0 ) {
                fprintf(stderr,"%s: corrupt utmp file\n",image);
                exit(1);
                }
}
-------------------------------------------------------------------------------

Hope this helps keep you in your efforts to keep your disk on a low-fat
diet. :-)

-- 
Michael Stefanik, Systems Engineer (JOAT), Briareus Corporation
UUCP: ...!uunet!bria!mike
--
technoignorami (tek'no-ig'no-ram`i) a group of individuals that are constantly
found to be saying things like "Well, it works on my DOS machine ..."



More information about the Comp.unix.admin mailing list