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