rusersd.c revision 90336
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 90336 2002-02-07 05:24:53Z imp $";
372337Scsgr#endif /* not lint */
382337Scsgr
3931422Scharnier#include <stdlib.h>
402337Scsgr#include <rpc/rpc.h>
4131422Scharnier#include <rpc/pmap_clnt.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{
552337Scsgr        (void) pmap_unset(RUSERSPROG, RUSERSVERS_IDLE);
562337Scsgr        (void) pmap_unset(RUSERSPROG, RUSERSVERS_ORIG);
572337Scsgr        exit(0);
582337Scsgr}
592337Scsgr
6031422Scharnierint
6190336Simpmain(int argc, char *argv[])
622337Scsgr{
632337Scsgr	SVCXPRT *transp;
642337Scsgr        int sock = 0;
652337Scsgr        int proto = 0;
662337Scsgr	struct sockaddr_in from;
672337Scsgr	int fromlen;
688870Srgrimes
692337Scsgr        /*
702337Scsgr         * See if inetd started us
712337Scsgr         */
724657Sats	fromlen = sizeof(from);
732337Scsgr        if (getsockname(0, (struct sockaddr *)&from, &fromlen) < 0) {
742337Scsgr                from_inetd = 0;
752337Scsgr                sock = RPC_ANYSOCK;
762337Scsgr                proto = IPPROTO_UDP;
772337Scsgr        }
788870Srgrimes
792337Scsgr        if (!from_inetd) {
802337Scsgr                daemon(0, 0);
812337Scsgr
822337Scsgr                (void) pmap_unset(RUSERSPROG, RUSERSVERS_IDLE);
832337Scsgr                (void) pmap_unset(RUSERSPROG, RUSERSVERS_ORIG);
842337Scsgr
852337Scsgr		(void) signal(SIGINT, cleanup);
862337Scsgr		(void) signal(SIGTERM, cleanup);
872337Scsgr		(void) signal(SIGHUP, cleanup);
882337Scsgr        }
892337Scsgr
902337Scsgr        openlog("rpc.rusersd", LOG_CONS|LOG_PID, LOG_DAEMON);
918870Srgrimes
922337Scsgr	transp = svcudp_create(sock);
932337Scsgr	if (transp == NULL) {
9431422Scharnier		syslog(LOG_ERR, "cannot create udp service");
952337Scsgr		exit(1);
962337Scsgr	}
972337Scsgr	if (!svc_register(transp, RUSERSPROG, RUSERSVERS_IDLE, rusers_service, proto)) {
9831422Scharnier		syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_IDLE, %s)", proto?"udp":"(inetd)");
992337Scsgr		exit(1);
1002337Scsgr	}
1012337Scsgr
1022337Scsgr	if (!svc_register(transp, RUSERSPROG, RUSERSVERS_ORIG, rusers_service, proto)) {
10331422Scharnier		syslog(LOG_ERR, "unable to register (RUSERSPROG, RUSERSVERS_ORIG, %s)", proto?"udp":"(inetd)");
1042337Scsgr		exit(1);
1052337Scsgr	}
1068870Srgrimes
1072337Scsgr        svc_run();
1082337Scsgr	syslog(LOG_ERR, "svc_run returned");
1092337Scsgr	exit(1);
1102337Scsgr}
111