12337Scsgr/*- 22337Scsgr * Copyright (c) 1993, John Brezak 32337Scsgr * All rights reserved. 42337Scsgr * 52337Scsgr * Redistribution and use in source and binary forms, with or without 62337Scsgr * modification, are permitted provided that the following conditions 72337Scsgr * are met: 82337Scsgr * 1. Redistributions of source code must retain the above copyright 92337Scsgr * notice, this list of conditions and the following disclaimer. 102337Scsgr * 2. Redistributions in binary form must reproduce the above copyright 112337Scsgr * notice, this list of conditions and the following disclaimer in the 122337Scsgr * documentation and/or other materials provided with the distribution. 13262435Sbrueffer * 3. Neither the name of the University nor the names of its contributors 142337Scsgr * may be used to endorse or promote products derived from this software 152337Scsgr * without specific prior written permission. 162337Scsgr * 172337Scsgr * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 182337Scsgr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 192337Scsgr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 202337Scsgr * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 212337Scsgr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 222337Scsgr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 232337Scsgr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 242337Scsgr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 252337Scsgr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 262337Scsgr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 272337Scsgr * SUCH DAMAGE. 282337Scsgr */ 292337Scsgr 302337Scsgr#ifndef lint 3131422Scharnierstatic const char rcsid[] = 3250476Speter "$FreeBSD$"; 332337Scsgr#endif /* not lint */ 342337Scsgr 3531422Scharnier#include <stdlib.h> 362337Scsgr#include <rpc/rpc.h> 37100120Salfred#include <sys/socket.h> 382337Scsgr#include <signal.h> 392337Scsgr#include <syslog.h> 402337Scsgr#include <rpcsvc/rnusers.h> 412337Scsgr 42241777Sed#include "extern.h" 432337Scsgr 442337Scsgrint from_inetd = 1; 452337Scsgr 46201146Sedstatic void 4790336Simpcleanup(int sig __unused) 482337Scsgr{ 49201146Sed (void) rpcb_unset(RUSERSPROG, RUSERSVERS_IDLE, NULL); 50201146Sed (void) rpcb_unset(RUSERSPROG, RUSERSVERS_ORIG, NULL); 51201146Sed exit(0); 522337Scsgr} 532337Scsgr 5431422Scharnierint 55201146Sedmain(int argc __unused, char *argv[] __unused) 562337Scsgr{ 57201146Sed SVCXPRT *transp = NULL; /* Keep compiler happy. */ 58100120Salfred int ok; 59100120Salfred struct sockaddr_storage from; 60141918Sstefanf socklen_t fromlen; 618870Srgrimes 62201146Sed /* 63201146Sed * See if inetd started us 64201146Sed */ 654657Sats fromlen = sizeof(from); 66201146Sed if (getsockname(0, (struct sockaddr *)&from, &fromlen) < 0) { 67201146Sed from_inetd = 0; 68201146Sed } 698870Srgrimes 70201146Sed if (!from_inetd) { 71201146Sed daemon(0, 0); 722337Scsgr 73201146Sed (void) rpcb_unset(RUSERSPROG, RUSERSVERS_IDLE, NULL); 74201146Sed (void) rpcb_unset(RUSERSPROG, RUSERSVERS_ORIG, NULL); 752337Scsgr 762337Scsgr (void) signal(SIGINT, cleanup); 772337Scsgr (void) signal(SIGTERM, cleanup); 782337Scsgr (void) signal(SIGHUP, cleanup); 79201146Sed } 802337Scsgr 81201146Sed openlog("rpc.rusersd", LOG_CONS|LOG_PID, LOG_DAEMON); 828870Srgrimes 83100120Salfred if (from_inetd) { 84100120Salfred transp = svc_tli_create(0, NULL, NULL, 0, 0); 85100120Salfred if (transp == NULL) { 86100120Salfred syslog(LOG_ERR, "cannot create udp service."); 87100120Salfred exit(1); 88100120Salfred } 89100120Salfred ok = svc_reg(transp, RUSERSPROG, RUSERSVERS_IDLE, 90100120Salfred rusers_service, NULL); 91100120Salfred } else 92100120Salfred ok = svc_create(rusers_service, 93100120Salfred RUSERSPROG, RUSERSVERS_IDLE, "udp"); 94100120Salfred if (!ok) { 95100120Salfred syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_IDLE, %s)", (!from_inetd)?"udp":"(inetd)"); 962337Scsgr exit(1); 972337Scsgr } 98100120Salfred if (from_inetd) 99100120Salfred ok = svc_reg(transp, RUSERSPROG, RUSERSVERS_ORIG, 100100120Salfred rusers_service, NULL); 101100120Salfred else 102100120Salfred ok = svc_create(rusers_service, 103100120Salfred RUSERSPROG, RUSERSVERS_ORIG, "udp"); 104100120Salfred if (!ok) { 105100120Salfred syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_ORIG, %s)", (!from_inetd)?"udp":"(inetd)"); 1062337Scsgr exit(1); 1072337Scsgr } 1082337Scsgr 109201146Sed svc_run(); 1102337Scsgr syslog(LOG_ERR, "svc_run returned"); 1112337Scsgr exit(1); 1122337Scsgr} 113