rusersd.c revision 100120
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.
132337Scsgr * 3. All advertising materials mentioning features or use of this software
142337Scsgr *    must display the following acknowledgement:
152337Scsgr *	This product includes software developed by the University of
162337Scsgr *	California, Berkeley and its contributors.
172337Scsgr * 4. Neither the name of the University nor the names of its contributors
182337Scsgr *    may be used to endorse or promote products derived from this software
192337Scsgr *    without specific prior written permission.
202337Scsgr *
212337Scsgr * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
222337Scsgr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
232337Scsgr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
242337Scsgr * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
252337Scsgr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
262337Scsgr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
272337Scsgr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
282337Scsgr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
292337Scsgr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
302337Scsgr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
312337Scsgr * SUCH DAMAGE.
322337Scsgr */
332337Scsgr
342337Scsgr#ifndef lint
3531422Scharnierstatic const char rcsid[] =
3650476Speter  "$FreeBSD: head/libexec/rpc.rusersd/rusersd.c 100120 2002-07-15 18:51:57Z alfred $";
372337Scsgr#endif /* not lint */
382337Scsgr
3931422Scharnier#include <stdlib.h>
402337Scsgr#include <rpc/rpc.h>
41100120Salfred#include <sys/socket.h>
422337Scsgr#include <signal.h>
432337Scsgr#include <syslog.h>
442337Scsgr#define utmp rutmp
452337Scsgr#include <rpcsvc/rnusers.h>
462337Scsgr#undef utmp
472337Scsgr
4890336Simpextern void rusers_service(struct svc_req *, SVCXPRT *);
492337Scsgr
502337Scsgrint from_inetd = 1;
512337Scsgr
522337Scsgrvoid
5390336Simpcleanup(int sig __unused)
542337Scsgr{
55100120Salfred        (void) rpcb_unset(RUSERSPROG, RUSERSVERS_IDLE, NULL);
56100120Salfred        (void) rpcb_unset(RUSERSPROG, RUSERSVERS_ORIG, NULL);
572337Scsgr        exit(0);
582337Scsgr}
592337Scsgr
6031422Scharnierint
6190336Simpmain(int argc, char *argv[])
622337Scsgr{
632337Scsgr	SVCXPRT *transp;
64100120Salfred	int ok;
65100120Salfred	struct sockaddr_storage from;
662337Scsgr	int fromlen;
678870Srgrimes
682337Scsgr        /*
692337Scsgr         * See if inetd started us
702337Scsgr         */
714657Sats	fromlen = sizeof(from);
722337Scsgr        if (getsockname(0, (struct sockaddr *)&from, &fromlen) < 0) {
732337Scsgr                from_inetd = 0;
742337Scsgr        }
758870Srgrimes
762337Scsgr        if (!from_inetd) {
772337Scsgr                daemon(0, 0);
782337Scsgr
79100120Salfred                (void) rpcb_unset(RUSERSPROG, RUSERSVERS_IDLE, NULL);
80100120Salfred                (void) rpcb_unset(RUSERSPROG, RUSERSVERS_ORIG, NULL);
812337Scsgr
822337Scsgr		(void) signal(SIGINT, cleanup);
832337Scsgr		(void) signal(SIGTERM, cleanup);
842337Scsgr		(void) signal(SIGHUP, cleanup);
852337Scsgr        }
862337Scsgr
872337Scsgr        openlog("rpc.rusersd", LOG_CONS|LOG_PID, LOG_DAEMON);
888870Srgrimes
89100120Salfred	if (from_inetd) {
90100120Salfred		transp = svc_tli_create(0, NULL, NULL, 0, 0);
91100120Salfred		if (transp == NULL) {
92100120Salfred			syslog(LOG_ERR, "cannot create udp service.");
93100120Salfred			exit(1);
94100120Salfred		}
95100120Salfred		ok = svc_reg(transp, RUSERSPROG, RUSERSVERS_IDLE,
96100120Salfred			     rusers_service, NULL);
97100120Salfred	} else
98100120Salfred		ok = svc_create(rusers_service,
99100120Salfred				RUSERSPROG, RUSERSVERS_IDLE, "udp");
100100120Salfred	if (!ok) {
101100120Salfred		syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_IDLE, %s)", (!from_inetd)?"udp":"(inetd)");
1022337Scsgr		exit(1);
1032337Scsgr	}
104100120Salfred	if (from_inetd)
105100120Salfred		ok = svc_reg(transp, RUSERSPROG, RUSERSVERS_ORIG,
106100120Salfred			     rusers_service, NULL);
107100120Salfred	else
108100120Salfred		ok = svc_create(rusers_service,
109100120Salfred				RUSERSPROG, RUSERSVERS_ORIG, "udp");
110100120Salfred	if (!ok) {
111100120Salfred		syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_ORIG, %s)", (!from_inetd)?"udp":"(inetd)");
1122337Scsgr		exit(1);
1132337Scsgr	}
1142337Scsgr
1152337Scsgr        svc_run();
1162337Scsgr	syslog(LOG_ERR, "svc_run returned");
1172337Scsgr	exit(1);
1182337Scsgr}
119