static char sccsid
[] = "@(#)rwhod.c 4.1 82/04/02";
struct sockaddr_in sin
= { AF_INET
, IPPORT_WHOSERVER
};
char *localnet
= "localnet";
int s
, utmpf
, kmemf
= -1;
char *strcpy(), *sprintf();
(void) signal(SIGHUP
, getkmem
);
fprintf(stderr
, "not super user\n");
fprintf(stderr
, "no localnet for whod\n");
sin
.sin_addr
.s_addr
= addr
;
if (rhost(&myname
) == -1) {
fprintf(stderr
, "don't know my name\n");
strncpy(mywd
.wd_hostname
, myname
, sizeof (mywd
.wd_hostname
) - 1);
utmpf
= open("/etc/utmp", 0);
(void) close(creat("/etc/utmp", 0644));
utmpf
= open("/etc/utmp", 0);
sin
.sin_port
= htons(sin
.sin_port
);
if ((s
= socket(SOCK_DGRAM
, 0, &sin
, 0)) < 0) {
cc
= receive(s
, &from
, (char *)&wd
, sizeof (struct whod
));
if (cc
< 0 && errno
!= EINTR
)
from
.sin_port
= ntohs(from
.sin_port
);
if (from
.sin_port
!= IPPORT_WHOSERVER
) {
printf("bad from port %d\n", from
.sin_port
);
if (rhost(&wd.wd_hostname) == -1) {
printf("unknown host %s\n", wd.wd_hostname);
(void) sprintf(path
, "/etc/whod.%s", wd
.wd_hostname
);
whod
= creat(path
, 0666);
printf("can't create %s\n", path
);
(void) time(&wd
.wd_recvtime
);
(void) write(whod
, (char *)&wd
, cc
);
register struct whoent
*we
= mywd
.wd_we
;
if (alarmcount
% 10 == 0)
(void) fstat(utmpf
, &stb
);
if (stb
.st_mtime
!= utmptime
) {
(void) lseek(utmpf
, (long)0, 0);
cc
= read(utmpf
, (char *)utmp
, sizeof (utmp
));
utmpent
= cc
/ sizeof (struct utmp
);
for (i
= 0; i
< utmpent
; i
++)
if (utmp
[i
].ut_name
[0]) {
utmpent
= we
- mywd
.wd_we
;
for (i
= 0; i
< utmpent
; i
++) {
if (stat(we
->we_utmp
.ut_line
, &stb
) >= 0)
we
->we_idle
= now
- stb
.st_atime
;
(void) lseek(kmemf
, (long)nl
[NL_AVENRUN
].n_value
, 0);
(void) read(kmemf
, (char *)avenrun
, sizeof (avenrun
));
mywd
.wd_loadav
[i
] = avenrun
[i
] * 100;
cc
= (char *)we
- (char *)&mywd
;
(void) time(&mywd
.wd_sendtime
);
send(s
, &sin
, (char *)&mywd
, cc
);
for (nlp
= &nl
[sizeof (nl
) / sizeof (nl
[0])]; --nlp
>= nl
; ) {
if (nl
[0].n_value
== 0) {
fprintf(stderr
, "/vmunix namelist botch\n");
kmemf
= open("/dev/kmem", 0);
(void) lseek(kmemf
, (long)nl
[NL_BOOTIME
].n_value
, 0);
(void) read(kmemf
, (char *)&mywd
.wd_bootime
, sizeof (mywd
.wd_bootime
));