diff options
author | 1996-09-22 08:41:32 +0000 | |
---|---|---|
committer | 1996-09-22 08:41:32 +0000 | |
commit | 5b7e5d64776a7700872ad96b7c61f986580e53dd (patch) | |
tree | ac1179aba7c8a27248c47f469b8b84d98dac2f3a | |
parent | Always use private utmp structure definition; don't depend on host system (diff) | |
download | wireguard-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.c | 85 | ||||
-rw-r--r-- | libexec/rpc.rusersd/rusersd.c | 8 |
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"); |