Reading files in /var/spool/rwho/whod.*

Fredrik Normann fredrin at ifi.uio.no
Tue Jun 28 11:54:41 CEST 2005


Fredrik Normann wrote:
> Hello,
> 
> I'm trying to read the binary files under /var/spool/rwho/ so I'm 
> wondering if anyone has done that before or could give me some clues on 
> how to read those files. I've tried to use the binascii module without 
> any luck.

A friend of mine made this C-program, that does the trick :)

#include <protocols/rwhod.h>
#include <stdio.h>
#include <unistd.h>
#include <strings.h>

#include <time.h>
#include <sys/time.h>

#include <sys/types.h>
#include <netinet/in.h>
#include <inttypes.h>

#ifdef SOL
#include <stddef.h>
#else
#include <linux/stddef.h>
#endif

int main (int argc, char **argv)
{

   char *filename, *binary;
   FILE *fp;
   struct whod entry;
   struct outmp who;
   size_t ret;
   size_t cnt = 0;
   char *user = (char*) malloc (8);
   char *timestr = (char*) malloc (512);
   char *hostname = (char*) malloc (512);
   int hostlen, ulen;
   size_t prefix, we_len;

   hostlen = 0;
   ulen = 0;

   struct timeval now;
   struct tm *tptr;
   time_t t;

   binary = *argv;
   ret = gettimeofday (&now, 0);
   if (ret < 0) {
     perror ("Error getting time of day");
     exit (2);
   }

   if (argc < 2) {
     printf ("%s: ERROR, no whod file specified\n", binary);
     exit (1);
   }

   filename = *(argv + 1);

   fp = fopen (filename, "r");
   if (fp == NULL) {
     perror ("Error opening file");
     exit (3);
   }

#ifdef SOL
   ret = fread (&entry, 1, sizeof (entry), fp);
#else
   ret = fread_unlocked (&entry, 1, sizeof (entry), fp);
#endif
   if (ret < 0) {
     perror ("Error reading file");
     exit (4);
   }

   prefix = offsetof (struct whod, wd_we) / sizeof (struct whoent);
   we_len = ret / sizeof (struct whoent) - prefix;

   /* Find lengths of strings */
   for (cnt = 0; cnt < we_len; cnt++) {
     who = entry.wd_we[cnt].we_utmp;
     strncpy (user, who.out_name, 8);
     if (strlen (user) > ulen)
       ulen = strlen (user);
     if ((strlen (entry.wd_hostname) + strlen (who.out_line) + 1) > hostlen)
       hostlen = strlen (entry.wd_hostname) + strlen (who.out_line) + 1;
   }

   for (cnt = 0; cnt < we_len; cnt++) {
     who = entry.wd_we[cnt].we_utmp;
     strncpy (user, who.out_name, 8);
     strncpy (hostname, entry.wd_hostname, 512);
     strcat (hostname, ":");
     strncat (hostname, who.out_line, 8);

     t = now.tv_sec - ntohl (entry.wd_we[cnt].we_idle);

     entry.wd_we[cnt].we_idle = ntohl (entry.wd_we[cnt].we_idle) / 60;

     printf ("%-*s %-*s",
	    ulen, user,
	    hostlen, hostname);
     if (entry.wd_we[cnt].we_idle >= 0) {
       tptr = localtime (&t);
       strftime (timestr, 512, "%a %b %d %H:%m", tptr);

       printf (" %s ", timestr);
       printf ("%5d:%02d",
	      entry.wd_we[cnt].we_idle / 60,
	      entry.wd_we[cnt].we_idle % 60);
     }
     printf ("\n");
   }

   fclose (fp);
}



More information about the Python-list mailing list