static char sccsid
[] = "@(#)rwhod.c 4.7 82/12/24";
struct sockaddr_in sin
= { AF_INET
};
char *localnet
= "localnet";
int s
, utmpf
, kmemf
= -1;
char *strcpy(), *sprintf();
sp
= getservbyname("who", "udp");
fprintf(stderr
, "rwhod: udp/who: unknown service\n");
(void) signal(SIGHUP
, getkmem
);
fprintf(stderr
, "rwhod: not super user\n");
fprintf(stderr
, "rwhod: no localnet\n");
sin
.sin_addr
.s_addr
= addr
;
if (rhost(&myname
) == -1) {
fprintf(stderr
, "rwhod: don't know \"myname\"\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);
perror("rwhod: /etc/utmp");
sin
.sin_port
= sp
->s_port
;
if ((s
= socket(AF_INET
, SOCK_DGRAM
, 0, 0)) < 0) {
if (bind(s
, &sin
, sizeof (sin
), 0) < 0) {
int cc
, whod
, len
=sizeof (from
);
cc
= recvfrom(s
, (char *)&wd
, sizeof (struct whod
), 0, &from
, &len
);
if (cc
< 0 && errno
!= EINTR
)
if (from
.sin_port
!= sp
->s_port
) {
fprintf(stderr
, "rwhod: %d: bad from port\n",
if (gethostbyname(wd
.wd_hostname
) == 0) {
fprintf(stderr
, "rwhod: %s: unknown host\n",
if (!verify(wd
.wd_hostname
)) {
fprintf(stderr
, "rwhod: malformed host name from %x\n",
(void) sprintf(path
, "%s/whod.%s", RWHODIR
, wd
.wd_hostname
);
whod
= creat(path
, 0666);
fprintf(stderr
, "rwhod: ");
(void) time(&wd
.wd_recvtime
);
(void) write(whod
, (char *)&wd
, cc
);
* Check out host name for unprintables
* and other funnies before allowing a file
* to be created. Sorry, but blanks aren't allowed.
if (!isascii(*name
) || !isalnum(*name
))
register struct whoent
*we
= mywd
.wd_we
, *wlast
;
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
));
wlast
= &mywd
.wd_we
[(1024 / sizeof (struct whoent
)) - 1];
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
);
(void) sendto(s
, (char *)&mywd
, cc
, 0, &sin
, sizeof (sin
));
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_BOOTTIME
].n_value
, 0);
(void) read(kmemf
, (char *)&mywd
.wd_boottime
, sizeof (mywd
.wd_boottime
));