|
|
researchv9-SUN3(old)
/*
* who
*/
#include <stdio.h>
#include <utmp.h>
#include <pwd.h>
#include <sys/types.h>
#include <sys/stat.h>
struct utmp utmp;
struct passwd *pw;
struct passwd *getpwuid();
int idleflg;
char *cttyname(), *rindex(), *ctime(), *strcpy(), *index(), *getlogin();
long time();
main(argc, argv)
char **argv;
{
register char *tp, *s;
register FILE *fi;
char *myname = getlogin();
s = "/etc/utmp";
if (argc>1 && strcmp(argv[1], "-i")==0) {
idleflg++;
argc--;
argv++;
}
if(argc == 2)
s = argv[1];
tp = cttyname(0);
if (tp)
tp = index(tp+1, '/') + 1;
else
tp = "tty??";
if ((fi = fopen(s, "r")) == NULL) {
fprintf(stderr, "who: cannot open %s\n", s);
exit(1);
}
while (fread((char *)&utmp, sizeof(utmp), 1, fi) == 1) {
if(argc==3) {
if (strncmp(utmp.ut_line, tp, sizeof(utmp.ut_line)))
continue;
strcpy(utmp.ut_name, myname);
putline();
exit(0);
}
if(utmp.ut_name[0] == '\0' && argc==1)
continue;
putline();
}
if (argc==3) {
strcpy(utmp.ut_name, myname);
strcpy(utmp.ut_line, tp);
time(&utmp.ut_time);
putline();
}
exit(0);
}
putline()
{
struct stat statb;
char tname[64];
printf("%-8.8s %-8.8s %.12s",
utmp.ut_name, utmp.ut_line, 4+ctime(&utmp.ut_time));
if (idleflg) {
long t = time(0);
strcpy(tname, "/dev/");
strncat(tname, utmp.ut_line, 8);
if (stat(tname, &statb)>=0
&& t > statb.st_atime+600) {
t -= statb.st_atime;
t /= 60;
printf("%5.0d:%.2d", (int)t/60, (int)t%60);
}
}
printf("\n");
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.