/* * argus - tell when people login and when they logout * * original fido (logins only) by don hopkins (a2deh@mit-mc.arpa) * argus by andrew scott beals (bandy@lll-crg.arpa) * wakeup detection by paul rubin (phr@ernie.berkeley.edu) * */ #include #include #include #include #include #include #ifndef DEBUG #define NAPTIME 1800 #else #define NAPTIME 5 #endif #define TRUE 1 #define FALSE 0 char *calloc(), *getlogin(); struct utmp utmp; char **Argv; int *loggedin, *wasloggedin; int Argc; main (argc, argv) int argc; char **argv; { int pid; char error[128]; #ifndef DEBUG if ((pid = fork ()) == -1) { sprintf(error, "%s: can't fork", *argv); perror (error); exit (-1); } if (pid) /* parent boogies out */ exit (0); signal(SIGTTOU, SIG_IGN); #endif Argc = argc; GetNames(argv); loggedin = (int *) calloc(Argc, sizeof (int)); wasloggedin = (int *) calloc(Argc, sizeof (int)); if (argc == 1) { printf ("\r\nusage: %s user ...\r\n", *Argv); exit (0); } prowl (); for (;;) { if(getlogin() == NULL) exit(0); sleep (10); prowl (); } } /* GetNames - copy argv array to Argv and hide original */ GetNames(argv) char **argv; { int i, n = 0; char *buf; for (i = 0; i < Argc; i++) n += strlen(argv[i]) + 1; Argv = (char **) calloc(Argc, sizeof (char *)); buf = (char *) malloc(n+1); for (i = 0; i < Argc; i++) { strcpy(buf, argv[i]); Argv[i] = buf; buf += strlen(argv[i]) + 1; while (*argv[i] != '\0') *(argv[i]++) = '\0'; } } prowl () { static char ut[] = { "/etc/utmp" }; register j; register FILE * fi; if ((fi = fopen (ut, "r")) == NULL) { printf ("\r\n\007[%s: cannot open utmp! Yargh! Bye!]\r\n", *Argv); exit (-1); } for(j=1;j= 0) { #ifdef DEBUG printf("stat %s succeeded...\n", buf); loggedin[i] = sbuf.st_mtime; #else loggedin[i] = sbuf.st_atime; #endif if (loggedin[i] - wasloggedin[i] > NAPTIME && !barked) bark("%s woke up!"); } return; } } } } smellslike(sample, person, len) char *sample, *person; int len; { int i; char c1, c2; for (i = 0; i < len; i++) { if (person[i] == '\0' && sample[i] == '\0') return TRUE; c1 = isupper(person[i]) ? tolower(person[i]) : person[i]; c2 = isupper(sample[i]) ? tolower(sample[i]) : sample[i]; if (c1 != c2) return FALSE; } return TRUE; } bark (format) char *format; { char buf[100], buf2[200]; printf("\r\n\7[%s: ", *Argv); if(*utmp.ut_host) sprintf(buf, "%.8s@%s", utmp.ut_name, utmp.ut_host); else sprintf(buf, "%.8s", utmp.ut_name); sprintf(buf2, format, buf); printf("%s]\n", buf2); }