Files
2024-02-19 00:25:23 -05:00

97 lines
2.0 KiB
C

/* who - see who is logged in Author: Terrence W. Holm */
/*
* The user log-in name, terminal port and log-in time
* are displayed for all current users, or restricted
* to the specified <USER>, <DEVICE> or the current user.
*
* Usage: who
* who <USER>
* who <DEVICE>
* who am i
*
* Version: 1.5 01/09/90
*
* Author: Terrence W. Holm June 1988
* revised for UTMP use Feb 1989
*
* Fred van Kempen, October 1989
* Fred van Kempen, December 1989
* Fred van Kempen, January 1990
*/
#include <sys/types.h>
#include <fcntl.h>
#include <time.h>
#include <utmp.h>
#include <stdio.h>
static char *Version = "@(#) WHO 1.5 (01/09/90)";
extern char *ttyname();
void usage()
{
fprintf(stderr, "Usage: who [USER | DEVICE | am i]\n");
exit(-1);
}
main(argc, argv)
int argc;
char *argv[];
{
struct utmp entry;
struct tm *tm;
char *fmt = "%02.2d:%02.2d:%02.2d";
char logstr[16], actstr[16];
char *arg, *sp;
long login, active;
int fd, size, found;
switch (argc) {
case 1:
arg = NULL; break;
case 2:
arg = argv[1]; break;
case 3:
if (!strcmp(argv[1], "am") && (!strcmp(argv[2], "i") ||
!strcmp(argv[2], "I")))
arg = ttyname(0) + 5;
else
usage();
break;
default:
usage();
}
size = sizeof(struct utmp);
found = 0;
if ((fd = open(UTMP, O_RDONLY)) < 0) {
fprintf(stderr, "%s: user-accouting is not active.\n", argv[0]);
exit(0);
}
while (read(fd, &entry, size) == size) {
if (entry.ut_type == USER_PROCESS) {
if (found == 0) {
found++;
printf("USER LINE TIME ACTIVE PID\n");
}
login = entry.ut_time;
tm = localtime(&login);
sprintf(logstr, fmt, tm->tm_hour, tm->tm_min, tm->tm_sec);
time(&active);
active -= login;
tm = localtime(&active);
sprintf(actstr, fmt, tm->tm_hour, tm->tm_min, tm->tm_sec);
printf("%-8.8s %-8.8s %-8.8s %-8.8s %d\n",
entry.ut_name, entry.ut_line, logstr,
actstr, entry.ut_pid);
}
}
close(fd);
if (found == 0) printf("No active users.\n");
exit(0);
}