Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F144559266
D45988.1775465429.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
14 KB
Referenced Files
None
Subscribers
None
D45988.1775465429.diff
View Options
diff --git a/libexec/rpc.rusersd/.rusers_proc.c.kate-swp b/libexec/rpc.rusersd/.rusers_proc.c.kate-swp
new file mode 100644
index 0000000000000000000000000000000000000000..153ca04a6c2f66ae279ca1f055b5b36ae2aaa32e
GIT binary patch
literal 53
zc${NkU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?Vnd7tbOY_#2Oz09V#ln*Oc9=X72crG}U
Jfq}8W6#$=N5kdd}
literal 0
Hc$@<O00001
diff --git a/libexec/rpc.rusersd/rusers_proc.c b/libexec/rpc.rusersd/rusers_proc.c
--- a/libexec/rpc.rusersd/rusers_proc.c
+++ b/libexec/rpc.rusersd/rusers_proc.c
@@ -52,6 +52,7 @@
#define _PATH_DEV "/dev"
#endif
+static rusers_utmp rusers_utmps[MAXUSERS];
static utmpidle utmp_idle[MAXUSERS];
static utmp old_utmp[MAXUSERS];
static struct utmpx utmp_list[MAXUSERS];
@@ -147,6 +148,42 @@
return(idle);
}
+static utmp_array *
+do_names_3(void)
+{
+ static utmp_array ut;
+ struct utmpx *usr;
+ int nusers = 0;
+
+ memset(&ut, 0, sizeof(ut));
+ ut.utmp_array_val = &rusers_utmps[0];
+
+ setutxent();
+ while ((usr = getutxent()) != NULL && nusers < MAXUSERS) {
+ if (usr->ut_type != USER_PROCESS)
+ continue;
+
+ memcpy(&utmp_list[nusers], usr, sizeof(*usr));
+ rusers_utmps[nusers].ut_time = usr->ut_tv.tv_sec;
+ rusers_utmps[nusers].ut_idle =
+ getidle(usr->ut_line, usr->ut_host);
+ rusers_utmps[nusers].ut_line =
+ utmp_list[nusers].ut_line;
+ rusers_utmps[nusers].ut_user =
+ utmp_list[nusers].ut_user;
+ rusers_utmps[nusers].ut_host =
+ utmp_list[nusers].ut_host;
+ rusers_utmps[nusers].ut_type =
+ utmp_list[nusers].ut_type;
+
+ nusers++;
+ }
+ endutxent();
+
+ ut.utmp_array_len = nusers;
+ return(&ut);
+}
+
static utmpidlearr *
do_names_2(void)
{
@@ -220,6 +257,18 @@
return(&ut);
}
+utmp_array *
+rusersproc_names_3_svc(void *argp __unused, struct svc_req *rqstp __unused)
+{
+ return (do_names_3());
+}
+
+utmp_array *
+rusersproc_allnames_3_svc(void *argp __unused, struct svc_req *rqstp __unused)
+{
+ return (do_names_3());
+}
+
utmpidlearr *
rusersproc_names_2_svc(void *argp __unused, struct svc_req *rqstp __unused)
{
@@ -281,6 +330,10 @@
case RUSERSVERS_IDLE:
local = (rusersproc_t)rusersproc_names_2_svc;
break;
+ case RUSERSVERS_3:
+ local = (rusersproc_t)rusersproc_names_3_svc;
+ xdr_result = (xdrproc_t)xdr_utmp_array;
+ break;
default:
svcerr_progvers(transp, RUSERSVERS_ORIG, RUSERSVERS_IDLE);
goto leave;
@@ -298,6 +351,9 @@
case RUSERSVERS_IDLE:
local = (rusersproc_t)rusersproc_allnames_2_svc;
break;
+ case RUSERSVERS_3:
+ local = (rusersproc_t)rusersproc_allnames_3_svc;
+ break;
default:
svcerr_progvers(transp, RUSERSVERS_ORIG, RUSERSVERS_IDLE);
goto leave;
@@ -310,6 +366,7 @@
goto leave;
}
bzero(&argument, sizeof(argument));
+
if (!svc_getargs(transp, (xdrproc_t)xdr_argument, &argument)) {
svcerr_decode(transp);
goto leave;
diff --git a/libexec/rpc.rusersd/rusersd.c b/libexec/rpc.rusersd/rusersd.c
--- a/libexec/rpc.rusersd/rusersd.c
+++ b/libexec/rpc.rusersd/rusersd.c
@@ -35,6 +35,7 @@
#include <signal.h>
#include <syslog.h>
#include <rpcsvc/rnusers.h>
+#include <netconfig.h>
#include "extern.h"
@@ -43,6 +44,7 @@
static void
cleanup(int sig __unused)
{
+ (void) rpcb_unset(RUSERSPROG, RUSERSVERS_3, NULL);
(void) rpcb_unset(RUSERSPROG, RUSERSVERS_IDLE, NULL);
(void) rpcb_unset(RUSERSPROG, RUSERSVERS_ORIG, NULL);
exit(0);
@@ -52,9 +54,10 @@
main(int argc __unused, char *argv[] __unused)
{
SVCXPRT *transp = NULL; /* Keep compiler happy. */
- int ok;
+ struct netconfig *nconf;
struct sockaddr_storage from;
socklen_t fromlen;
+ void* handle;
/*
* See if inetd started us
@@ -67,6 +70,7 @@
if (!from_inetd) {
daemon(0, 0);
+ (void) rpcb_unset(RUSERSPROG, RUSERSVERS_3, NULL);
(void) rpcb_unset(RUSERSPROG, RUSERSVERS_IDLE, NULL);
(void) rpcb_unset(RUSERSPROG, RUSERSVERS_ORIG, NULL);
@@ -78,29 +82,45 @@
openlog("rpc.rusersd", LOG_CONS|LOG_PID, LOG_DAEMON);
if (from_inetd) {
- transp = svc_tli_create(0, NULL, NULL, 0, 0);
- if (transp == NULL) {
- syslog(LOG_ERR, "cannot create udp service.");
+ if ((handle = setnetconfig()) == NULL) {
+ syslog(LOG_ERR, "setnetconfig failed.");
+ exit(1);
+ }
+
+ while ((nconf = getnetconfig(handle)) != NULL) {
+ transp = svc_tli_create(0, nconf, NULL, 0, 0);
+ if (transp == NULL) {
+ syslog(LOG_ERR, "cannot create %s service.", nconf->nc_proto);
+ exit(1);
+ }
+
+ if (!svc_reg(transp, RUSERSPROG, RUSERSVERS_3, rusers_service, NULL)) {
+ syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_3, (inetd)");
+ exit(1);
+ }
+ if (!svc_reg(transp, RUSERSPROG, RUSERSVERS_IDLE, rusers_service, NULL)) {
+ syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_IDLE, (inetd)");
+ exit(1);
+ }
+ if (!svc_reg(transp, RUSERSPROG, RUSERSVERS_ORIG, rusers_service, NULL)) {
+ syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_ORIG, (inetd)");
+ exit(1);
+ }
+ }
+ freenetconfigent(nconf);
+ } else {
+ if (!svc_create(rusers_service, RUSERSPROG, RUSERSVERS_3, "netpath")){
+ syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_3, netpath");
+ exit(1);
+ }
+ if (!svc_create(rusers_service, RUSERSPROG, RUSERSVERS_IDLE, "netpath")){
+ syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_IDLE, netpath");
+ exit(1);
+ }
+ if (!svc_create(rusers_service, RUSERSPROG, RUSERSVERS_ORIG, "netpath")){
+ syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_ORIG, netpath");
exit(1);
}
- ok = svc_reg(transp, RUSERSPROG, RUSERSVERS_IDLE,
- rusers_service, NULL);
- } else
- ok = svc_create(rusers_service,
- RUSERSPROG, RUSERSVERS_IDLE, "udp");
- if (!ok) {
- syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_IDLE, %s)", (!from_inetd)?"udp":"(inetd)");
- exit(1);
- }
- if (from_inetd)
- ok = svc_reg(transp, RUSERSPROG, RUSERSVERS_ORIG,
- rusers_service, NULL);
- else
- ok = svc_create(rusers_service,
- RUSERSPROG, RUSERSVERS_ORIG, "udp");
- if (!ok) {
- syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_ORIG, %s)", (!from_inetd)?"udp":"(inetd)");
- exit(1);
}
svc_run();
diff --git a/usr.bin/rusers/rusers.c b/usr.bin/rusers/rusers.c
--- a/usr.bin/rusers/rusers.c
+++ b/usr.bin/rusers/rusers.c
@@ -37,6 +37,7 @@
#include <sys/types.h>
#include <sys/socket.h>
+#include <rpc/clnt_stat.h>
#include <rpc/rpc.h>
#include <rpc/pmap_clnt.h>
#include <rpcsvc/rnusers.h>
@@ -60,11 +61,11 @@
static struct host_list {
struct host_list *next;
- struct in_addr addr;
+ struct netbuf addr;
} *hosts;
static int
-search_host(struct in_addr addr)
+search_host(struct netbuf addr)
{
struct host_list *hp;
@@ -72,49 +73,153 @@
return (0);
for (hp = hosts; hp != NULL; hp = hp->next) {
- if (hp->addr.s_addr == addr.s_addr)
+ if (hp->addr.len == addr.len &&
+ memcmp(hp->addr.buf, addr.buf, addr.len) == 0)
return (1);
}
return (0);
}
static void
-remember_host(struct in_addr addr)
+remember_host(struct netbuf addr)
{
struct host_list *hp;
if ((hp = (struct host_list *)malloc(sizeof(struct host_list))) == NULL)
errx(1, "no memory");
- hp->addr.s_addr = addr.s_addr;
+ hp->addr.len = addr.len;
+ hp->addr.maxlen = addr.maxlen;
+ if ((hp->addr.buf = malloc(addr.maxlen)) == NULL)
+ errx(1, "no memory");
+ memcpy(hp->addr.buf, addr.buf, addr.len);
hp->next = hosts;
hosts = hp;
}
static int
-rusers_reply(void *replyp, struct sockaddr_in *raddrp)
+rusers_reply_3(void *replyp, struct netbuf *raddrp, struct netconfig *_unused)
{
+ struct sockaddr *sa;
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
unsigned int x;
int idle;
char date[32], idle_time[64], remote[64];
- struct hostent *hp;
- utmpidlearr *up, u;
- char *host;
+ utmp_array *up;
+ char *host, host_buf[NI_MAXHOST];
int days, hours, minutes, seconds;
- up = &u;
- memcpy(up, replyp, sizeof(*up));
- if (search_host(raddrp->sin_addr))
+ (void)_unused;
+ up = (utmp_array *)replyp;
+ if (search_host(*raddrp))
return (0);
- if (!allopt && up->utmpidlearr_len == 0)
+ if (!allopt && up->utmp_array_len == 0)
+ return (0);
+
+ sa = (struct sockaddr *)raddrp->buf;
+ if (getnameinfo(sa, raddrp->len, host_buf, sizeof(host_buf),
+ NULL, 0, NI_NAMEREQD) == 0) {
+ host = host_buf;
+ }
+ else if (sa->sa_family == AF_INET) {
+ memcpy(&sin, sa, sa->sa_len);
+ inet_ntop(AF_INET, &sin.sin_addr, host_buf, sizeof(host_buf));
+ }
+ else {
+ memcpy(&sin6, sa, sa->sa_len);
+ inet_ntop(AF_INET6, &sin6.sin6_addr, host_buf, sizeof(host_buf));
+ }
+ host = host_buf;
+
+ if (!longopt)
+ printf("%-*s ", HOST_WIDTH, host);
+
+ for (x = 0; x < up->utmp_array_len; x++) {
+ time_t t = _int_to_time(up->utmp_array_val[x].ut_time);
+ strncpy(date, &(ctime(&t)[4]), sizeof(date) - 1);
+
+ idle = up->utmp_array_val[x].ut_idle;
+ sprintf(idle_time, " :%02d", idle);
+ if (idle == MAX_INT)
+ strcpy(idle_time, "??");
+ else if (idle == 0)
+ strcpy(idle_time, "");
+ else {
+ seconds = idle;
+ days = seconds / (60 * 60 * 24);
+ seconds %= (60 * 60 * 24);
+ hours = seconds / (60 * 60);
+ seconds %= (60 * 60);
+ minutes = seconds / 60;
+ seconds %= 60;
+ if (idle > 60)
+ sprintf(idle_time, "%d:%02d", minutes, seconds);
+ if (idle >= (60 * 60))
+ sprintf(idle_time, "%d:%02d:%02d",
+ hours, minutes, seconds);
+ if (idle >= (24 * 60 * 60))
+ sprintf(idle_time, "%d days, %d:%02d:%02d",
+ days, hours, minutes, seconds);
+ }
+
+ strncpy(remote, up->utmp_array_val[x].ut_host,
+ sizeof(remote) - 1);
+ if (strlen(remote) != 0)
+ sprintf(remote, "(%.16s)",
+ up->utmp_array_val[x].ut_host);
+
+ if (longopt)
+ printf("%-8.8s %*s:%-*.*s %-12.12s %6s %.18s\n",
+ up->utmp_array_val[x].ut_user,
+ HOST_WIDTH, host, LINE_WIDTH, LINE_WIDTH,
+ up->utmp_array_val[x].ut_line, date,
+ idle_time, remote );
+ else
+ printf("%s ",
+ up->utmp_array_val[x].ut_user);
+ }
+ if (!longopt)
+ putchar('\n');
+
+ remember_host(*raddrp);
+ return (0);
+}
+
+static int
+rusers_reply(void *replyp, struct netbuf *raddrp, struct netconfig *_unused)
+{
+ struct sockaddr *sa;
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
+ unsigned int x;
+ int idle;
+ char date[32], idle_time[64], remote[64];
+ utmpidlearr *up;
+ char *host, host_buf[NI_MAXHOST];
+ int days, hours, minutes, seconds;
+
+ (void)_unused;
+ up = (utmpidlearr *)replyp;
+ if (search_host(*raddrp))
return (0);
- hp = gethostbyaddr((char *)&raddrp->sin_addr.s_addr,
- sizeof(struct in_addr), AF_INET);
- if (hp != NULL)
- host = hp->h_name;
- else
- host = inet_ntoa(raddrp->sin_addr);
+ if (!allopt && up->utmpidlearr_len == 0)
+ return (0);
+ sa = (struct sockaddr *)raddrp->buf;
+ if (getnameinfo(sa, raddrp->len, host_buf, sizeof(host_buf),
+ NULL, 0, NI_NAMEREQD) == 0) {
+ host = host_buf;
+ }
+ else if (sa->sa_family == AF_INET) {
+ memcpy(&sin, sa, sa->sa_len);
+ inet_ntop(AF_INET, &sin.sin_addr, host_buf, sizeof(host_buf));
+ }
+ else {
+ memcpy(&sin6, sa, sa->sa_len);
+ inet_ntop(AF_INET6, &sin6.sin6_addr, host_buf, sizeof(host_buf));
+ }
+ host = host_buf;
if (!longopt)
printf("%-*s ", HOST_WIDTH, host);
@@ -166,49 +271,85 @@
if (!longopt)
putchar('\n');
- remember_host(raddrp->sin_addr);
+ remember_host(*raddrp);
return (0);
}
static void
onehost(char *host)
{
+ utmp_array ua;
utmpidlearr up;
CLIENT *rusers_clnt;
- struct sockaddr_in addr;
- struct hostent *hp;
+ enum clnt_stat err;
+ struct netbuf addr;
+ struct addrinfo *res;
struct timeval tv;
- hp = gethostbyname(host);
- if (hp == NULL)
+ if (getaddrinfo(host, NULL, &(struct addrinfo) {
+ .ai_family = AF_UNSPEC
+ }, &res) != 0){
errx(1, "unknown host \"%s\"", host);
+ }
+ addr.len = addr.maxlen = res->ai_addrlen;
+ addr.buf = malloc(addr.len);
+ if (addr.buf == NULL)
+ errx(1, "no memory");
+ memcpy(addr.buf, res->ai_addr, addr.len);
- rusers_clnt = clnt_create(host, RUSERSPROG, RUSERSVERS_IDLE, "udp");
+ rusers_clnt = clnt_create(host, RUSERSPROG, RUSERSVERS_3, "netpath");
if (rusers_clnt == NULL)
errx(1, "%s", clnt_spcreateerror(""));
-
- memset(&up, 0, sizeof(up));
+ memset(&ua, 0, sizeof(ua));
tv.tv_sec = 15; /* XXX ?? */
tv.tv_usec = 0;
- if (clnt_call(rusers_clnt, RUSERSPROC_NAMES, (xdrproc_t)xdr_void, NULL,
- (xdrproc_t)xdr_utmpidlearr, &up, tv) != RPC_SUCCESS)
+ err = clnt_call(rusers_clnt, RUSERSPROC_NAMES, (xdrproc_t)xdr_void, NULL,
+ (xdrproc_t)xdr_utmp_array, &ua, tv);
+ if (err == RPC_PROGVERSMISMATCH) {
+ clnt_destroy(rusers_clnt);
+ memset(&up, 0, sizeof(up));
+ rusers_clnt = clnt_create(host, RUSERSPROG, RUSERSVERS_IDLE, "netpath");
+ if (rusers_clnt == NULL)
+ errx(1, "%s", clnt_spcreateerror(""));
+ err = clnt_call(rusers_clnt, RUSERSPROC_NAMES, (xdrproc_t)xdr_void, NULL,
+ (xdrproc_t)xdr_utmpidlearr, &up, tv);
+ if (err != RPC_SUCCESS)
+ errx(1, "%s", clnt_sperror(rusers_clnt, ""));
+ rusers_reply(&up, &addr, NULL);
+ }
+ else if (err != RPC_SUCCESS) {
errx(1, "%s", clnt_sperror(rusers_clnt, ""));
- memcpy(&addr.sin_addr.s_addr, hp->h_addr, sizeof(addr.sin_addr.s_addr));
- rusers_reply(&up, &addr);
+ }
+ else {
+ rusers_reply_3(&ua, &addr, NULL);
+ }
+
+ free(addr.buf);
clnt_destroy(rusers_clnt);
+ freeaddrinfo(res);
}
static void
allhosts(void)
{
utmpidlearr up;
+ utmp_array utmp_array_res;
enum clnt_stat clnt_stat;
memset(&up, 0, sizeof(up));
- clnt_stat = clnt_broadcast(RUSERSPROG, RUSERSVERS_IDLE,
+ memset(&utmp_array_res, 0, sizeof(utmp_array_res));
+ printf("Sending broadcast for rusersd protocl version 3...\n");
+ clnt_stat = rpc_broadcast(RUSERSPROG, RUSERSVERS_3,
+ RUSERSPROC_NAMES, (xdrproc_t)xdr_void, NULL,
+ (xdrproc_t)xdr_utmp_array, (char *)&utmp_array_res,
+ (resultproc_t)rusers_reply_3, "netpath");
+ if (clnt_stat != RPC_SUCCESS && clnt_stat != RPC_TIMEDOUT)
+ errx(1, "%s", clnt_sperrno(clnt_stat));
+ printf("Sending broadcast for rusersd protocl version 2...\n");
+ clnt_stat = rpc_broadcast(RUSERSPROG, RUSERSVERS_IDLE,
RUSERSPROC_NAMES, (xdrproc_t)xdr_void, NULL,
(xdrproc_t)xdr_utmpidlearr, (char *)&up,
- (resultproc_t)rusers_reply);
+ (resultproc_t)rusers_reply, "netpath");
if (clnt_stat != RPC_SUCCESS && clnt_stat != RPC_TIMEDOUT)
errx(1, "%s", clnt_sperrno(clnt_stat));
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Apr 6, 8:50 AM (5 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28272506
Default Alt Text
D45988.1775465429.diff (14 KB)
Attached To
Mode
D45988: rusers: Add version 3 of rusers
Attached
Detach File
Event Timeline
Log In to Comment