summaryrefslogtreecommitdiff
path: root/libexec/rpc.yppasswdd/rpc.yppasswdd.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-23 07:44:45 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-23 07:44:45 +0000
commit47ebd9d2844d5b9d2ec53091e49a3df50d192bc9 (patch)
tree575a6df227fc68c9dfcbc8b1854d55a271d64557 /libexec/rpc.yppasswdd/rpc.yppasswdd.c
parentcb98049da062fc5f50adbba8ded07dc78f3306ab (diff)
add ypserv
Diffstat (limited to 'libexec/rpc.yppasswdd/rpc.yppasswdd.c')
-rw-r--r--libexec/rpc.yppasswdd/rpc.yppasswdd.c206
1 files changed, 206 insertions, 0 deletions
diff --git a/libexec/rpc.yppasswdd/rpc.yppasswdd.c b/libexec/rpc.yppasswdd/rpc.yppasswdd.c
new file mode 100644
index 00000000000..1dd0acba4c9
--- /dev/null
+++ b/libexec/rpc.yppasswdd/rpc.yppasswdd.c
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 1994 Mats O Jansson <moj@stacken.kth.se>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef LINT
+static char rcsid[] = "$Id: rpc.yppasswdd.c,v 1.1 1995/10/23 07:44:41 deraadt Exp $";
+#endif
+
+#include <stdio.h>
+#include <rpc/rpc.h>
+#include <rpcsvc/yppasswd.h>
+#include <rpc/pmap_clnt.h>
+#include <signal.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <string.h>
+#include "yplog.h"
+static void yppasswddprog_1();
+void sig_child();
+
+int noshell = FALSE;
+int nogecos = FALSE;
+int nopw = FALSE;
+int make = FALSE;
+char make_arg[1024] = "make";
+char *progname = "yppasswdd";
+char *tempname;
+
+int
+main(argc,argv)
+int argc;
+char *argv[];
+{
+ SVCXPRT *transp;
+ int i = 1;
+ int usage = FALSE;
+
+ while (i < argc) {
+
+ if (argv[i][0] == '-') {
+
+ if (strcmp("-noshell",argv[i]) == 0) {
+ noshell = TRUE;
+ i++;
+ continue;
+ }
+
+ if (strcmp("-nogecos",argv[i]) == 0) {
+ nogecos = TRUE;
+ i++;
+ continue;
+ }
+
+ if (strcmp("-nopw",argv[i]) == 0) {
+ nopw = TRUE;
+ i++;
+ continue;
+ }
+
+ if (strcmp("-m",argv[i]) == 0) {
+ make = TRUE;
+ i++;
+ while (i < argc) {
+ strcat(make_arg," ");
+ strcat(make_arg,argv[i]);
+ i++;
+ }
+ continue;
+ }
+
+ usage = TRUE;
+ i++;
+
+ } else {
+ usage = TRUE;
+ i++;
+ }
+
+ };
+
+ if (usage == TRUE) {
+ fprintf(stderr,
+ "%s%s",
+ "usage: rpc.yppasswdd ",
+ "[-noshell] [-nogecos] [-nopw] [-m arg1 arg2 ... ]\n");
+ exit(1);
+ }
+
+#ifdef DAEMON
+ switch(fork()) {
+ case 0:
+ break;
+ case -1:
+ perror("fork");
+ exit(1);
+ default:
+ exit(0);
+ }
+ setsid();
+#endif
+
+ yplog_init(progname);
+
+ chdir("/etc");
+
+ /* std* must exists */
+/*
+ freopen("/dev/null", "r", stdin);
+ freopen("/var/yp/stderr", "w", stderr);
+ freopen("/var/yp/stdout", "w", stdout);
+*/
+ (void)pmap_unset(YPPASSWDPROG, YPPASSWDVERS);
+
+ (void)signal(SIGCHLD, sig_child);
+
+ transp = svcudp_create(RPC_ANYSOCK);
+ if (transp == NULL) {
+ (void)fprintf(stderr, "cannot create udp service.\n");
+ exit(1);
+ }
+ if (!svc_register(transp, YPPASSWDPROG, YPPASSWDVERS, yppasswddprog_1, IPPROTO_UDP)) {
+ (void)fprintf(stderr, "unable to register (YPPASSWDPROG, YPPASSWDVERS, udp).\n");
+ exit(1);
+ }
+
+ transp = svctcp_create(RPC_ANYSOCK, 0, 0);
+ if (transp == NULL) {
+ (void)fprintf(stderr, "cannot create tcp service.\n");
+ exit(1);
+ }
+ if (!svc_register(transp, YPPASSWDPROG, YPPASSWDVERS, yppasswddprog_1, IPPROTO_TCP)) {
+ (void)fprintf(stderr, "unable to register (YPPASSWDPROG, YPPASSWDVERS, tcp).\n");
+ exit(1);
+ }
+ svc_run();
+ (void)fprintf(stderr, "svc_run returned\n");
+ exit(1);
+}
+
+static void
+yppasswddprog_1(rqstp, transp)
+ struct svc_req *rqstp;
+ SVCXPRT *transp;
+{
+ union {
+ yppasswd yppasswdproc_update_1_arg;
+ } argument;
+ char *result;
+ bool_t (*xdr_argument)(), (*xdr_result)();
+ char *(*local)();
+
+ switch (rqstp->rq_proc) {
+ case NULLPROC:
+ (void)svc_sendreply(transp, xdr_void, (char *)NULL);
+ return;
+
+ case YPPASSWDPROC_UPDATE:
+ xdr_argument = xdr_yppasswd;
+ xdr_result = xdr_int;
+ local = (char *(*)()) yppasswdproc_update_1;
+ break;
+
+ default:
+ svcerr_noproc(transp);
+ return;
+ }
+ bzero((char *)&argument, sizeof(argument));
+ if (!svc_getargs(transp, xdr_argument, &argument)) {
+ svcerr_decode(transp);
+ return;
+ }
+ result = (*local)(&argument, rqstp, transp);
+
+}
+
+void
+sig_child()
+{
+ while (wait3((int *)NULL, WNOHANG, (struct rusage *)NULL) > 0);
+}