summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/rwhod/rwhod.812
-rw-r--r--usr.sbin/rwhod/rwhod.c131
2 files changed, 90 insertions, 53 deletions
diff --git a/usr.sbin/rwhod/rwhod.8 b/usr.sbin/rwhod/rwhod.8
index a63d41b3001..6db1eea3278 100644
--- a/usr.sbin/rwhod/rwhod.8
+++ b/usr.sbin/rwhod/rwhod.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: rwhod.8,v 1.11 2000/03/19 17:57:14 aaron Exp $
+.\" $OpenBSD: rwhod.8,v 1.12 2001/02/08 15:03:19 deraadt Exp $
.\"
.\" Copyright (c) 1983, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -32,13 +32,14 @@
.\" SUCH DAMAGE.
.\"
.\" from: @(#)rwhod.8 8.2 (Berkeley) 12/11/93
-.\" $OpenBSD: rwhod.8,v 1.11 2000/03/19 17:57:14 aaron Exp $
+.\" $OpenBSD: rwhod.8,v 1.12 2001/02/08 15:03:19 deraadt Exp $
.\"
.Dd December 11, 1993
.Dt RWHOD 8
.Os
.Sh NAME
.Nm rwhod
+.Op Ar d
.Nd system status server
.Sh SYNOPSIS
.Nm rwhod
@@ -64,6 +65,13 @@ servers' status messages, validating them, then recording
them in a collection of files located in the directory
.Pa /var/rwho .
.Pp
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl d
+Turn on debug mode.
+.El
+.Pp
The server transmits and receives messages at the port indicated
in the ``who'' service specification; see
.Xr services 5 .
diff --git a/usr.sbin/rwhod/rwhod.c b/usr.sbin/rwhod/rwhod.c
index d4d753e3bc7..24af776cfed 100644
--- a/usr.sbin/rwhod/rwhod.c
+++ b/usr.sbin/rwhod/rwhod.c
@@ -39,7 +39,7 @@ static char copyright[] =
#ifndef lint
/*static char sccsid[] = "@(#)rwhod.c 8.1 (Berkeley) 6/6/93";*/
-static char rcsid[] = "$OpenBSD: rwhod.c,v 1.15 2001/01/11 23:41:42 deraadt Exp $";
+static char rcsid[] = "$OpenBSD: rwhod.c,v 1.16 2001/02/08 15:03:20 deraadt Exp $";
#endif /* not lint */
#include <sys/param.h>
@@ -54,6 +54,7 @@ static char rcsid[] = "$OpenBSD: rwhod.c,v 1.15 2001/01/11 23:41:42 deraadt Exp
#include <net/route.h>
#include <netinet/in.h>
#include <protocols/rwhod.h>
+#include <arpa/inet.h>
#include <ctype.h>
#include <errno.h>
@@ -76,6 +77,8 @@ static char rcsid[] = "$OpenBSD: rwhod.c,v 1.15 2001/01/11 23:41:42 deraadt Exp
char myname[MAXHOSTNAMELEN];
+int debug;
+
/*
* We communicate with each neighbor in a list constructed at the time we're
* started up. Neighbors are currently directly connected via a hardware
@@ -84,7 +87,7 @@ char myname[MAXHOSTNAMELEN];
struct neighbor {
struct neighbor *n_next;
char *n_name; /* interface name */
- struct sockaddr *n_addr; /* who to send to */
+ struct sockaddr *n_addr; /* who to send to */
int n_addrlen; /* size of address */
int n_flags; /* should forward?, interface flags */
};
@@ -106,11 +109,9 @@ void quit __P((char *));
void rt_xaddrs __P((caddr_t, caddr_t, struct rt_addrinfo *));
int verify __P((char *));
void handleread __P((int s));
-#ifdef DEBUG
+int Sendto __P((int, const void *, size_t, int,
+ const struct sockaddr *, socklen_t));
char *interval __P((int, char *));
-void Sendto __P((int, char *, int, int, char *, int));
-#define sendto Sendto
-#endif
void
hup(signo)
@@ -119,16 +120,33 @@ hup(signo)
gothup = 1;
}
+void
+usage(void)
+{
+ fprintf(stderr, "usage: rwhod [-d]\n");
+ exit(1);
+}
+
int
main(argc, argv)
int argc;
- char argv[];
+ char *argv[];
{
+ struct timeval start, next, delta, now;
+ struct sockaddr_in sin;
struct pollfd pfd[1];
- int on = 1;
+ int on = 1, ch;
char *cp;
- struct sockaddr_in sin;
- struct timeval start, next, delta, now;
+
+ while ((ch = getopt(argc, argv, "d")) != -1) {
+ switch (ch) {
+ case 'd':
+ debug = 1;
+ break;
+ default:
+ usage();
+ }
+ }
if (getuid()) {
fprintf(stderr, "rwhod: not super user\n");
@@ -139,9 +157,9 @@ main(argc, argv)
fprintf(stderr, "rwhod: udp/who: unknown service\n");
exit(1);
}
-#ifndef DEBUG
- daemon(1, 0);
-#endif
+ if (!debug)
+ daemon(1, 0);
+
if (chdir(_PATH_RWHODIR) < 0) {
(void)fprintf(stderr, "rwhod: %s: %s\n",
_PATH_RWHODIR, strerror(errno));
@@ -175,6 +193,7 @@ main(argc, argv)
exit(1);
}
memset(&sin, 0, sizeof(sin));
+ sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_family = AF_INET;
sin.sin_port = sp->s_port;
if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
@@ -191,21 +210,21 @@ main(argc, argv)
timeradd(&start, &delta, &next);
pfd[0].fd = s;
- pfd[0].revents = POLLIN;
+ pfd[0].events = POLLIN;
for (;;) {
int n;
n = poll(pfd, 1, 1000);
+ if (n == 1)
+ handleread(s);
+
if (gothup) {
gothup = 0;
getboottime();
}
- if (n == 1)
- handleread(s);
-
gettimeofday(&now, NULL);
if (timercmp(&now, &next, >)) {
timer();
@@ -248,6 +267,9 @@ handleread(s)
inet_ntoa(from.sin_addr));
return;
}
+ if (debug)
+ printf("host %s\n", wd.wd_hostname);
+
(void) snprintf(path, sizeof path, "whod.%s", wd.wd_hostname);
/*
* Rather than truncating and growing the file each time,
@@ -399,12 +421,12 @@ timer()
for (i = 0; i < 3; i++)
mywd.wd_loadav[i] = htonl((u_long)(avenrun[i] * 100));
cc = (char *)we - (char *)&mywd;
+printf("sending cc = %d\n", cc);
mywd.wd_sendtime = htonl(time(0));
mywd.wd_vers = WHODVERSION;
mywd.wd_type = WHODTYPE_STATUS;
for (np = neighbors; np != NULL; np = np->n_next)
- (void)sendto(s, (char *)&mywd, cc, 0,
- np->n_addr, np->n_addrlen);
+ (void)Sendto(s, &mywd, cc, 0, np->n_addr, np->n_addrlen);
if (utmpent && chdir(_PATH_RWHODIR)) {
syslog(LOG_ERR, "chdir(%s): %m", _PATH_RWHODIR);
exit(1);
@@ -537,45 +559,53 @@ configure(s)
return (1);
}
-#ifdef DEBUG
-void
+int
Sendto(s, buf, cc, flags, to, tolen)
int s;
- char *buf;
- int cc, flags;
- char *to;
- int tolen;
+ const void *buf;
+ size_t cc;
+ int flags;
+ const struct sockaddr *to;
+ socklen_t tolen;
{
register struct whod *w = (struct whod *)buf;
register struct whoent *we;
struct sockaddr_in *sin = (struct sockaddr_in *)to;
-
- printf("sendto %s.%d\n", inet_ntoa(sin->sin_addr),
- ntohs(sin->sin_port));
- printf("hostname %s %s\n", w->wd_hostname,
- interval(ntohl(w->wd_sendtime) - ntohl(w->wd_boottime), " up"));
- printf("load %4.2f, %4.2f, %4.2f\n",
- ntohl(w->wd_loadav[0]) / 100.0, ntohl(w->wd_loadav[1]) / 100.0,
- ntohl(w->wd_loadav[2]) / 100.0);
- cc -= WHDRSIZE;
- for (we = w->wd_we, cc /= sizeof(struct whoent); cc > 0; cc--, we++) {
- time_t t = ntohl(we->we_utmp.out_time);
- printf("%-8.8s %s:%s %.12s",
- we->we_utmp.out_name,
- w->wd_hostname, we->we_utmp.out_line,
- ctime(&t)+4);
- we->we_idle = ntohl(we->we_idle) / 60;
- if (we->we_idle) {
- if (we->we_idle >= 100*60)
- we->we_idle = 100*60 - 1;
- if (we->we_idle >= 60)
- printf(" %2d", we->we_idle / 60);
- else
- printf(" ");
- printf(":%02d", we->we_idle % 60);
+ int ret;
+
+ ret = sendto(s, buf, cc, flags, to, tolen);
+ if (debug) {
+ printf("sendto %s.%d\n", inet_ntoa(sin->sin_addr),
+ ntohs(sin->sin_port));
+ printf("hostname %s %s\n", w->wd_hostname,
+ interval(ntohl(w->wd_sendtime) - ntohl(w->wd_boottime),
+ " up"));
+ printf("load %4.2f, %4.2f, %4.2f\n",
+ ntohl(w->wd_loadav[0]) / 100.0,
+ ntohl(w->wd_loadav[1]) / 100.0,
+ ntohl(w->wd_loadav[2]) / 100.0);
+ cc -= WHDRSIZE;
+ for (we = w->wd_we, cc /= sizeof(struct whoent); cc > 0;
+ cc--, we++) {
+ time_t t = ntohl(we->we_utmp.out_time);
+ printf("%-8.8s %s:%s %.12s",
+ we->we_utmp.out_name,
+ w->wd_hostname, we->we_utmp.out_line,
+ ctime(&t)+4);
+ we->we_idle = ntohl(we->we_idle) / 60;
+ if (we->we_idle) {
+ if (we->we_idle >= 100*60)
+ we->we_idle = 100*60 - 1;
+ if (we->we_idle >= 60)
+ printf(" %2d", we->we_idle / 60);
+ else
+ printf(" ");
+ printf(":%02u", we->we_idle % 60);
+ }
+ printf("\n");
}
- printf("\n");
}
+ return (ret);
}
char *
@@ -602,4 +632,3 @@ interval(time, updown)
"%s %2d:%02d", updown, hours, minutes);
return (resbuf);
}
-#endif