]> git.saurik.com Git - apple/network_cmds.git/blob - rpc_yppasswdd.tproj/rpc.yppasswdd.c
network_cmds-201.tar.gz
[apple/network_cmds.git] / rpc_yppasswdd.tproj / rpc.yppasswdd.c
1 /*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
7 *
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * file.
14 *
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
22 *
23 * @APPLE_LICENSE_HEADER_END@
24 */
25 /* $OpenBSD: rpc.yppasswdd.c,v 1.9 1997/08/19 07:00:51 niklas Exp $ */
26
27 /*
28 * Copyright (c) 1994 Mats O Jansson <moj@stacken.kth.se>
29 * All rights reserved.
30 *
31 * Redistribution and use in source and binary forms, with or without
32 * modification, are permitted provided that the following conditions
33 * are met:
34 * 1. Redistributions of source code must retain the above copyright
35 * notice, this list of conditions and the following disclaimer.
36 * 2. Redistributions in binary form must reproduce the above copyright
37 * notice, this list of conditions and the following disclaimer in the
38 * documentation and/or other materials provided with the distribution.
39 * 3. All advertising materials mentioning features or use of this software
40 * must display the following acknowledgement:
41 * This product includes software developed by Mats O Jansson
42 * 4. The name of the author may not be used to endorse or promote products
43 * derived from this software without specific prior written permission.
44 *
45 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
46 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
47 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
49 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55 * SUCH DAMAGE.
56 */
57
58 #ifndef LINT
59 static char rcsid[] = "$OpenBSD: rpc.yppasswdd.c,v 1.9 1997/08/19 07:00:51 niklas Exp $";
60 #endif
61
62 #include <sys/types.h>
63 #include <sys/wait.h>
64
65 #include <signal.h>
66 #include <stdio.h>
67 #include <unistd.h>
68 #include <stdlib.h>
69 #include <errno.h>
70 #include <string.h>
71 #include <pwd.h>
72 #include <util.h>
73
74 #include <rpc/rpc.h>
75 #include <rpc/pmap_clnt.h>
76
77 #include "yppasswd.h"
78
79 static void yppasswddprog_1();
80 void sig_child();
81
82 int noshell, nogecos, nopw, domake;
83 char make_arg[1024] = "make";
84 char *progname = "yppasswdd";
85 char *tempname;
86 int debug = 0;
87
88 void
89 usage()
90 {
91 fprintf(stderr, "%s%s",
92 "usage: rpc.yppasswdd ",
93 "[-d] [-noshell] [-nogecos] [-nopw] [-m arg1 arg2 ... ]\n");
94 exit(1);
95 }
96
97 int
98 main(argc, argv)
99 int argc;
100 char *argv[];
101 {
102 SVCXPRT *transp;
103 int i = 1;
104
105 while (i < argc) {
106 if (argv[i][0] == '-') {
107 if (strcmp("-noshell", argv[i]) == 0) {
108 noshell = 1;
109 } else if (strcmp("-nogecos", argv[i]) == 0) {
110 nogecos = 1;
111 } else if (strcmp("-nopw", argv[i]) == 0) {
112 nopw = 1;
113 } else if (strcmp("-m", argv[i]) == 0) {
114 domake = 1;
115 while (i < argc) {
116 strcat(make_arg, " ");
117 strcat(make_arg, argv[i]);
118 i++;
119 }
120 } else if (strcmp("-d", argv[i]) == 0) {
121 debug = 1;
122 } else
123 usage();
124 i++;
125 } else
126 usage();
127 }
128
129 if (debug == 0) {
130 (void) daemon(0, 0);
131 }
132 chdir("/etc");
133
134 /*
135 freopen("/dev/null", "r", stdin);
136 freopen("/var/yp/stderr", "w", stderr);
137 freopen("/var/yp/stdout", "w", stdout);
138 */
139 (void) pmap_unset(YPPASSWDPROG, YPPASSWDVERS);
140
141 (void) signal(SIGCHLD, sig_child);
142
143 transp = svcudp_create(RPC_ANYSOCK);
144 if (transp == NULL) {
145 (void) fprintf(stderr, "cannot create udp service.\n");
146 exit(1);
147 }
148 if (!svc_register(transp, YPPASSWDPROG, YPPASSWDVERS, yppasswddprog_1,
149 IPPROTO_UDP)) {
150 fprintf(stderr, "unable to register YPPASSWDPROG, YPPASSWDVERS, udp\n");
151 exit(1);
152 }
153 transp = svctcp_create(RPC_ANYSOCK, 0, 0);
154 if (transp == NULL) {
155 (void) fprintf(stderr, "cannot create tcp service.\n");
156 exit(1);
157 }
158 if (!svc_register(transp, YPPASSWDPROG, YPPASSWDVERS, yppasswddprog_1,
159 IPPROTO_TCP)) {
160 fprintf(stderr, "unable to register YPPASSWDPROG, YPPASSWDVERS, tcp\n");
161 exit(1);
162 }
163 svc_run();
164 (void) fprintf(stderr, "svc_run returned\n");
165 exit(1);
166 }
167
168 static void
169 yppasswddprog_1(rqstp, transp)
170 struct svc_req *rqstp;
171 SVCXPRT *transp;
172 {
173 union {
174 yppasswd yppasswdproc_update_1_arg;
175 } argument;
176 char *result;
177 bool_t(*xdr_argument) (), (*xdr_result) ();
178 char *(*local) ();
179
180 switch (rqstp->rq_proc) {
181 case NULLPROC:
182 (void) svc_sendreply(transp, xdr_void, (char *) NULL);
183 return;
184 case YPPASSWDPROC_UPDATE:
185 xdr_argument = xdr_yppasswd;
186 xdr_result = xdr_int;
187 local = (char *(*) ()) yppasswdproc_update_1_svc;
188 break;
189 default:
190 svcerr_noproc(transp);
191 return;
192 }
193 bzero((char *) &argument, sizeof(argument));
194 if (!svc_getargs(transp, xdr_argument, (caddr_t) & argument)) {
195 svcerr_decode(transp);
196 return;
197 }
198 result = (*local) (&argument, rqstp, transp);
199 }
200
201 void
202 sig_child()
203 {
204 int save_errno = errno;
205
206 while (wait3((int *) NULL, WNOHANG, (struct rusage *) NULL) > 0)
207 ;
208 errno = save_errno;
209 }