summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortholo <tholo@openbsd.org>1996-09-22 08:41:32 +0000
committertholo <tholo@openbsd.org>1996-09-22 08:41:32 +0000
commit5b7e5d64776a7700872ad96b7c61f986580e53dd (patch)
treeac1179aba7c8a27248c47f469b8b84d98dac2f3a
parentAlways use private utmp structure definition; don't depend on host system (diff)
downloadwireguard-openbsd-5b7e5d64776a7700872ad96b7c61f986580e53dd.tar.xz
wireguard-openbsd-5b7e5d64776a7700872ad96b7c61f986580e53dd.zip
Make this work properly with corrected rnusers.x
Also implement protocol version 1 while at it
-rw-r--r--libexec/rpc.rusersd/rusers_proc.c85
-rw-r--r--libexec/rpc.rusersd/rusersd.c8
2 files changed, 88 insertions, 5 deletions
diff --git a/libexec/rpc.rusersd/rusers_proc.c b/libexec/rpc.rusersd/rusers_proc.c
index e08e3fbea45..eb504f25192 100644
--- a/libexec/rpc.rusersd/rusers_proc.c
+++ b/libexec/rpc.rusersd/rusers_proc.c
@@ -27,7 +27,7 @@
*/
#ifndef lint
-static char rcsid[] = "$Id: rusers_proc.c,v 1.2 1995/12/16 13:50:46 deraadt Exp $";
+static char rcsid[] = "$Id: rusers_proc.c,v 1.3 1996/09/22 08:41:32 tholo Exp $";
#endif /* not lint */
#include <signal.h>
@@ -79,6 +79,8 @@ typedef char ut_host_t[UT_HOSTSIZE];
struct rusers_utmp utmps[MAXUSERS];
struct utmpidle *utmp_idlep[MAXUSERS];
struct utmpidle utmp_idle[MAXUSERS];
+struct ru_utmp *ru_utmpp[MAXUSERS];
+struct ru_utmp ru_utmp[MAXUSERS];
ut_line_t line[MAXUSERS];
ut_name_t name[MAXUSERS];
ut_host_t host[MAXUSERS];
@@ -307,9 +309,12 @@ do_names_2(int all)
usr.ut_time;
utmp_idle[nusers].ui_idle =
getidle(usr.ut_line, usr.ut_host);
- strncpy(utmp_idle[nusers].ui_utmp.ut_line, usr.ut_line, sizeof(utmp_idle[nusers].ui_utmp.ut_line));
- strncpy(utmp_idle[nusers].ui_utmp.ut_name, usr.ut_name, sizeof(utmp_idle[nusers].ui_utmp.ut_name));
- strncpy(utmp_idle[nusers].ui_utmp.ut_host, usr.ut_host, sizeof(utmp_idle[nusers].ui_utmp.ut_host));
+ utmp_idle[nusers].ui_utmp.ut_line = line[nusers];
+ strncpy(line[nusers], usr.ut_line, sizeof(line[nusers]));
+ utmp_idle[nusers].ui_utmp.ut_name = name[nusers];
+ strncpy(name[nusers], usr.ut_name, sizeof(name[nusers]));
+ utmp_idle[nusers].ui_utmp.ut_host = host[nusers];
+ strncpy(host[nusers], usr.ut_host, sizeof(host[nusers]));
nusers++;
}
@@ -334,6 +339,65 @@ rusersproc_allnames_2_svc(arg, rqstp)
return (do_names_2(1));
}
+static struct utmparr *
+do_names_1(int all)
+{
+ static struct utmparr ut;
+ struct utmp usr;
+ int nusers = 0;
+
+ bzero((char *)&ut, sizeof(ut));
+ ut.uta_arr = ru_utmpp;
+ ut.uta_cnt = 0;
+
+ ufp = fopen(_PATH_UTMP, "r");
+ if (!ufp) {
+ syslog(LOG_ERR, "%m");
+ return (NULL);
+ }
+
+ /* only entries with both name and line fields */
+ while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1 &&
+ nusers < MAXUSERS)
+ if (*usr.ut_name && *usr.ut_line &&
+ strncmp(usr.ut_name, IGNOREUSER,
+ sizeof(usr.ut_name))
+#ifdef OSF
+ && usr.ut_type == USER_PROCESS
+#endif
+ ) {
+ ru_utmpp[nusers] = &ru_utmp[nusers];
+ ru_utmp[nusers].ut_time = usr.ut_time;
+ ru_utmp[nusers].ut_line = line[nusers];
+ strncpy(line[nusers], usr.ut_line, sizeof(line[nusers]));
+ ru_utmp[nusers].ut_name = name[nusers];
+ strncpy(name[nusers], usr.ut_name, sizeof(name[nusers]));
+ ru_utmp[nusers].ut_host = host[nusers];
+ strncpy(host[nusers], usr.ut_host, sizeof(host[nusers]));
+ nusers++;
+ }
+
+ ut.uta_cnt = nusers;
+ fclose(ufp);
+ return (&ut);
+}
+
+struct utmparr *
+rusersproc_names_1_svc(arg, rqstp)
+ void *arg;
+ struct svc_req *rqstp;
+{
+ return (do_names_1(0));
+}
+
+struct utmparr *
+rusersproc_allnames_1_svc(arg, rqstp)
+ void *arg;
+ struct svc_req *rqstp;
+{
+ return (do_names_1(1));
+}
+
void
rusers_service(rqstp, transp)
struct svc_req *rqstp;
@@ -357,6 +421,7 @@ rusers_service(rqstp, transp)
switch (rqstp->rq_vers) {
case RUSERSVERS_3:
case RUSERSVERS_IDLE:
+ case RUSERSVERS_ORIG:
local = (char *(*) __P((void *, struct svc_req *)))
rusers_num_svc;
break;
@@ -382,6 +447,12 @@ rusers_service(rqstp, transp)
rusersproc_names_2_svc;
break;
+ case RUSERSVERS_ORIG:
+ xdr_result = (xdrproc_t)xdr_utmpidlearr;
+ local = (char *(*) __P((void *, struct svc_req *)))
+ rusersproc_names_1_svc;
+ break;
+
default:
svcerr_progvers(transp, RUSERSVERS_IDLE, RUSERSVERS_3);
goto leave;
@@ -404,6 +475,12 @@ rusers_service(rqstp, transp)
rusersproc_allnames_2_svc;
break;
+ case RUSERSVERS_ORIG:
+ xdr_result = (xdrproc_t)xdr_utmpidlearr;
+ local = (char *(*) __P((void *, struct svc_req *)))
+ rusersproc_allnames_1_svc;
+ break;
+
default:
svcerr_progvers(transp, RUSERSVERS_IDLE, RUSERSVERS_3);
goto leave;
diff --git a/libexec/rpc.rusersd/rusersd.c b/libexec/rpc.rusersd/rusersd.c
index ce681345ca0..6c97b71abc9 100644
--- a/libexec/rpc.rusersd/rusersd.c
+++ b/libexec/rpc.rusersd/rusersd.c
@@ -27,7 +27,7 @@
*/
#ifndef lint
-static char rcsid[] = "$Id: rusersd.c,v 1.1.1.1 1995/10/18 08:43:21 deraadt Exp $";
+static char rcsid[] = "$Id: rusersd.c,v 1.2 1996/09/22 08:41:33 tholo Exp $";
#endif /* not lint */
#include <stdio.h>
@@ -46,6 +46,7 @@ cleanup()
{
(void) pmap_unset(RUSERSPROG, RUSERSVERS_3);
(void) pmap_unset(RUSERSPROG, RUSERSVERS_IDLE);
+ (void) pmap_unset(RUSERSPROG, RUSERSVERS_ORIG);
exit(0);
}
@@ -74,6 +75,7 @@ main(argc, argv)
(void) pmap_unset(RUSERSPROG, RUSERSVERS_3);
(void) pmap_unset(RUSERSPROG, RUSERSVERS_IDLE);
+ (void) pmap_unset(RUSERSPROG, RUSERSVERS_ORIG);
(void) signal(SIGINT, cleanup);
(void) signal(SIGTERM, cleanup);
@@ -95,6 +97,10 @@ main(argc, argv)
syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_IDLE, %s).", proto?"udp":"(inetd)");
exit(1);
}
+ if (!svc_register(transp, RUSERSPROG, RUSERSVERS_ORIG, rusers_service, proto)) {
+ syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_ORIG, %s).", proto?"udp":"(inetd)");
+ exit(1);
+ }
svc_run();
syslog(LOG_ERR, "svc_run returned");