xref: /netbsd-src/libexec/rpc.rusersd/rusersd.c (revision 8b0f9554ff8762542c4defc4f70e1eb76fb508fa)
1*8b0f9554Sperry /*	$NetBSD: rusersd.c,v 1.17 2007/12/15 19:44:46 perry Exp $	*/
2176865a0Sthorpej 
3e7153151Sbrezak /*-
44b660341Sbrezak  *  Copyright (c) 1993 John Brezak
5e7153151Sbrezak  *  All rights reserved.
6e7153151Sbrezak  *
7e7153151Sbrezak  *  Redistribution and use in source and binary forms, with or without
8e7153151Sbrezak  *  modification, are permitted provided that the following conditions
9e7153151Sbrezak  *  are met:
10e7153151Sbrezak  *  1. Redistributions of source code must retain the above copyright
11e7153151Sbrezak  *     notice, this list of conditions and the following disclaimer.
12e7153151Sbrezak  *  2. Redistributions in binary form must reproduce the above copyright
13e7153151Sbrezak  *     notice, this list of conditions and the following disclaimer in the
14e7153151Sbrezak  *     documentation and/or other materials provided with the distribution.
154b660341Sbrezak  *  3. The name of the author may not be used to endorse or promote products
164b660341Sbrezak  *     derived from this software without specific prior written permission.
17e7153151Sbrezak  *
184b660341Sbrezak  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
194b660341Sbrezak  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
204b660341Sbrezak  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
214b660341Sbrezak  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
224b660341Sbrezak  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
234b660341Sbrezak  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
244b660341Sbrezak  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
254b660341Sbrezak  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
264b660341Sbrezak  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
274b660341Sbrezak  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
284b660341Sbrezak  * POSSIBILITY OF SUCH DAMAGE.
29e7153151Sbrezak  */
30e7153151Sbrezak 
3106f9c787Schristos #include <sys/cdefs.h>
32aee4b07bSmycroft #ifndef lint
33*8b0f9554Sperry __RCSID("$NetBSD: rusersd.c,v 1.17 2007/12/15 19:44:46 perry Exp $");
34aee4b07bSmycroft #endif /* not lint */
35aee4b07bSmycroft 
36e7153151Sbrezak #include <stdio.h>
37e7153151Sbrezak #include <rpc/rpc.h>
3806f9c787Schristos #include <sys/socket.h>
39e7153151Sbrezak #include <signal.h>
40e7153151Sbrezak #include <syslog.h>
4106f9c787Schristos #include <stdlib.h>
424b660341Sbrezak #include <rpcsvc/rusers.h>	/* New version */
434b660341Sbrezak #include <rpcsvc/rnusers.h>	/* Old version */
44e7153151Sbrezak 
4506f9c787Schristos #include "rusers_proc.h"
4606f9c787Schristos 
47e7153151Sbrezak 
48e7153151Sbrezak int from_inetd = 1;
49e7153151Sbrezak 
50*8b0f9554Sperry static void cleanup(int) __dead;
5106f9c787Schristos 
5206f9c787Schristos static void
535ef15934Schristos /*ARGSUSED*/
cleanup(int n)54e1d419e4Sfvdl cleanup(int n)
55e7153151Sbrezak {
56ae7821a4Smrg 
57e1d419e4Sfvdl 	(void) rpcb_unset(RUSERSPROG, RUSERSVERS_3, NULL);
58e1d419e4Sfvdl 	(void) rpcb_unset(RUSERSPROG, RUSERSVERS_IDLE, NULL);
59e7153151Sbrezak 	exit(0);
60e7153151Sbrezak }
61e7153151Sbrezak 
6206f9c787Schristos int
635ef15934Schristos /*ARGSUSED*/
main(int argc,char * argv[])64e1d419e4Sfvdl main(int argc, char *argv[])
65e7153151Sbrezak {
66e7153151Sbrezak 	SVCXPRT *transp;
6719e7dc6fSfvdl 	struct sockaddr_storage from;
680c37c63eSmrg 	socklen_t fromlen;
69e7153151Sbrezak 
70e7153151Sbrezak 	/*
71e7153151Sbrezak 	 * See if inetd started us
72e7153151Sbrezak 	 */
73002aa598Smycroft 	fromlen = sizeof(from);
745ef15934Schristos 	if (getsockname(0, (struct sockaddr *)(void *)&from, &fromlen) == -1)
75e7153151Sbrezak 		from_inetd = 0;
76e7153151Sbrezak 
77e7153151Sbrezak 	if (!from_inetd) {
785ef15934Schristos 		(void)daemon(0, 0);
79e7153151Sbrezak 
80e1d419e4Sfvdl 		(void)rpcb_unset(RUSERSPROG, RUSERSVERS_3, NULL);
81e1d419e4Sfvdl 		(void)rpcb_unset(RUSERSPROG, RUSERSVERS_IDLE, NULL);
8237e75f76Sbrezak 
8337e75f76Sbrezak 		(void)signal(SIGINT, cleanup);
8437e75f76Sbrezak 		(void)signal(SIGTERM, cleanup);
8537e75f76Sbrezak 		(void)signal(SIGHUP, cleanup);
86e7153151Sbrezak 	}
87e7153151Sbrezak 
88f2130fd9Smrg 	openlog("rpc.rusersd", LOG_PID, LOG_DAEMON);
89e7153151Sbrezak 
90e1d419e4Sfvdl 	if (from_inetd) {
91e1d419e4Sfvdl 		transp = svc_dg_create(0, 0, 0);
92e7153151Sbrezak 		if (transp == NULL) {
93e7153151Sbrezak 			syslog(LOG_ERR, "cannot create udp service.");
945ef15934Schristos 			return 1;
95e7153151Sbrezak 		}
96e1d419e4Sfvdl 		if (!svc_reg(transp, RUSERSPROG, RUSERSVERS_3, rusers_service,
97e1d419e4Sfvdl 		    NULL)) {
98e1d419e4Sfvdl 			syslog(LOG_ERR, "unable to register "
99e1d419e4Sfvdl 			    "(RUSERSPROG, RUSERSVERS_3).");
1005ef15934Schristos 			return 1;
101e7153151Sbrezak 		}
102e1d419e4Sfvdl 		if (!svc_reg(transp, RUSERSPROG, RUSERSVERS_IDLE,
103e1d419e4Sfvdl 		    rusers_service, NULL)) {
104e1d419e4Sfvdl 			syslog(LOG_ERR, "unable to register "
105e1d419e4Sfvdl 			    "(RUSERSPROG, RUSERSVERS_IDLE).");
1065ef15934Schristos 			return 1;
107e7153151Sbrezak 		}
108e1d419e4Sfvdl 	} else {
109e1d419e4Sfvdl 		if (!svc_create(rusers_service, RUSERSPROG, RUSERSVERS_3,
110e1d419e4Sfvdl 		    "udp")) {
111e1d419e4Sfvdl 			syslog(LOG_ERR, "unable to create "
112e1d419e4Sfvdl 			    "(RUSERSPROG, RUSERSVERS_3).");
1135ef15934Schristos 			return 1;
114e1d419e4Sfvdl 		}
115e1d419e4Sfvdl 		if (!svc_create(rusers_service, RUSERSPROG, RUSERSVERS_IDLE,
116e1d419e4Sfvdl 		    "udp")) {
117e1d419e4Sfvdl 			syslog(LOG_ERR, "unable to create "
118e1d419e4Sfvdl 			    "(RUSERSPROG, RUSERSVERS_IDLE).");
1195ef15934Schristos 			return 1;
120e1d419e4Sfvdl 		}
121e1d419e4Sfvdl 	}
122e7153151Sbrezak 
123e7153151Sbrezak 	svc_run();
124e7153151Sbrezak 	syslog(LOG_ERR, "svc_run returned");
1255ef15934Schristos 	return 1;
126e7153151Sbrezak }
127