User Tools

Site Tools


user:jbrant:systems:who3
/*who3.c - a first version of the who program
 *           open read UTMP file, and show results
 */
#include    <stdio.h>
#include    <stdlib.h>
#include    <utmp.h>
#include    <fcntl.h>
#include    <unistd.h>
#include    <time.h>

#define SHOWHOST    /* include remote machine on output */
void showtime(time_t);
void show_info(struct utmp *);

int main()
{
        struct utmp  *utbufp,   /* holds pointer to next rec     */
                     *utmp_next();  /* returns pointer to next   */

        if ( utmp_open(UTMP_FILE) == -1)
        {
                perror( UTMP_FILE );    /* UTMP_FILE is in  utmp.h */
                exit(1);
        }
        while ( (utbufp = utmp_next() ) != ((struct utmp *) NULL))
                show_info( utbufp );
        utmp_close();
        return 0;      /* went ok */
}

/*
 * show info()
 *      displays contents of the utmp struct in human readable form
 */
void show_info( struct utmp *utbufp )
{
        if ( utbufp -> ut_type != USER_PROCESS )
                return;

        printf("%-8.8s", utbufp->ut_name);
        printf(" ");
        printf("%-8.8s", utbufp->ut_line);
        printf(" ");
        printf("%10ld", utbufp->ut_time);
        printf(" ");

#ifdef SHOWHOST
        if (utbufp->ut_host[0] != '\0' )
                printf(" (%s) ", utbufp->ut_host);/* the host */

#endif
        printf("\n");
}

void showtime( long timeval )
/*
 * displays time in a format fit for human consumption
 * uses ctime to build a string then picks parts out of it
 * Note: %12.12s prints a string 12 chars wide and LIMITS
 * it to 12chars.
 */
{
        char    *cp;                      /*  to hold address of time   */
        char     cp = ctime(&timeval);    /*  convert time to sting     */




        printf("%12.12s", cp+4 ); /* pick 12  chars form pos 4 */
}
* utmplib.c -  functions to buffer reads from utmp file
 *
 * functoins are
 *          utmp_open (filename ) - open file
 *                  returns -1 on error
 *          utmp_next ()        -returns pointer to next struct
 *                returns NULL on eof
 *          utmp_close()               -close file
 *
 *          read NRECS per read and the doles them out from the buffer
 */
 #include <stdio.h>
 #include <fcntl.h>
 #include <sys/types.h>
 #include <utmp.h>
 #include <stdlib.h>

 #define NRECS 16
 #define NULLUT ((struct utmp *)NULL)
 #define UTSIZE (sizeof(struct utmp))

 static char  utmpbuf[NRECS * UTSIZE];
 static int   num_recs;
 static int   cur_rec;
 static int   fd_utmp = -1;

 utmp_open ( char *filename )
{
        fd_utmp =  open( filename, O_RDONLY);
        cur_rec =  num_recs = 0;
        return fd_utmp;
}

struct utmp *utmp_next()
{
        struct utmp *recp;
        if ( fd_utmp == -1 )
                return NULLUT;
        if ( cur_rec==num_recs && utmp_reload()==0)
                return NULLUT;
                                /* get address of next record */
        recp = ( struct utmp *) &utmpbuf[cur_rec * UTSIZE];
        cur_rec++;
        return recp;
}

int utmp_reload()
/*
 *     read next bunch of records into buffer
 */
{
       int amt_read;

       amt_read =  read( fd_utmp, utmpbuf, NRECS * UTSIZE);
                                                /* how many did we get? */
       num_recs  =  amt_read/UTSIZE;
                                                /* reset pointer        */
       cur_rec = 0;
       return num_recs;
}

void  utmp_close()

{
        if ( fd_utmp != -1)             /* don't close if not */
               close (fd_utmp);         /* open               */
}
user/jbrant/systems/who3.txt · Last modified: 2010/11/29 11:12 by jbrant