Use libutil instead of pw_{copy,util}.c. Clean up a little. Warnsify.
Sponsored by: DARPA, NAI Labs
This commit is contained in:
parent
b1c4fde84a
commit
3ad511fc27
@ -7,17 +7,19 @@ RPCDIR= ${DESTDIR}/usr/include/rpcsvc
|
|||||||
|
|
||||||
PROG= rpc.yppasswdd
|
PROG= rpc.yppasswdd
|
||||||
MAN= rpc.yppasswdd.8
|
MAN= rpc.yppasswdd.8
|
||||||
SRCS= pw_copy.c pw_util.c util.c yp_access.c yp_dblookup.c yp_dbwrite.c \
|
SRCS= util.c yp_access.c yp_dblookup.c yp_dbwrite.c \
|
||||||
yp_error.c yppasswdd_main.c yppasswdd_server.c ypxfr_misc.c ${GENSRCS}
|
yp_error.c yppasswdd_main.c yppasswdd_server.c ypxfr_misc.c ${GENSRCS}
|
||||||
GENSRCS=yp.h yp_clnt.c yppasswd.h yppasswd_private.h yppasswd_private_svc.c \
|
GENSRCS=yp.h yp_clnt.c yppasswd.h yppasswd_private.h yppasswd_private_svc.c \
|
||||||
yppasswd_private_xdr.c yppasswd_svc.c
|
yppasswd_private_xdr.c yppasswd_svc.c
|
||||||
|
|
||||||
CFLAGS+= -I${.CURDIR}/../../usr.sbin/vipw -I${.CURDIR}/../../usr.sbin/ypserv \
|
CFLAGS+= -I${.CURDIR}/../../usr.sbin/vipw \
|
||||||
-I${.CURDIR}/../../libexec/ypxfr -I${.CURDIR}/../../usr.bin/chpass \
|
-I${.CURDIR}/../../usr.sbin/ypserv \
|
||||||
|
-I${.CURDIR}/../../libexec/ypxfr \
|
||||||
-I${.CURDIR} -I.
|
-I${.CURDIR} -I.
|
||||||
|
WARNS?= 4
|
||||||
|
|
||||||
DPADD= ${LIBRPCSVC} ${LIBCRYPT}
|
DPADD= ${LIBRPCSVC} ${LIBCRYPT} ${LIBUTIL}
|
||||||
LDADD= -lrpcsvc -lcrypt
|
LDADD= -lrpcsvc -lcrypt -lutil
|
||||||
|
|
||||||
CLEANFILES= ${GENSRCS}
|
CLEANFILES= ${GENSRCS}
|
||||||
|
|
||||||
|
@ -1,150 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright (c) 1990, 1993, 1994
|
|
||||||
* The Regents of the University of California. 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. All advertising materials mentioning features or use of this software
|
|
||||||
* must display the following acknowledgement:
|
|
||||||
* This product includes software developed by the University of
|
|
||||||
* California, Berkeley and its contributors.
|
|
||||||
* 4. Neither the name of the University nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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
|
|
||||||
#if 0
|
|
||||||
static char sccsid[] = "@(#)pw_copy.c 8.4 (Berkeley) 4/2/94";
|
|
||||||
#endif
|
|
||||||
static const char rcsid[] =
|
|
||||||
"$FreeBSD$";
|
|
||||||
#endif /* not lint */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This module is used to copy the master password file, replacing a single
|
|
||||||
* record, by chpass(1) and passwd(1).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <err.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "yppasswdd_extern.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
pw_copy(int ffd, int tfd, struct passwd *pw)
|
|
||||||
{
|
|
||||||
FILE *from, *to;
|
|
||||||
int done;
|
|
||||||
char *p, buf[8192];
|
|
||||||
char uidstr[20];
|
|
||||||
char gidstr[20];
|
|
||||||
char chgstr[20];
|
|
||||||
char expstr[20];
|
|
||||||
|
|
||||||
snprintf(uidstr, sizeof(uidstr), "%d", pw->pw_uid);
|
|
||||||
snprintf(gidstr, sizeof(gidstr), "%d", pw->pw_gid);
|
|
||||||
snprintf(chgstr, sizeof(chgstr), "%ld", pw->pw_change);
|
|
||||||
snprintf(expstr, sizeof(expstr), "%ld", pw->pw_expire);
|
|
||||||
|
|
||||||
if (!(from = fdopen(ffd, "r"))) {
|
|
||||||
pw_error(passfile, 1, 1);
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
if (!(to = fdopen(tfd, "w"))) {
|
|
||||||
pw_error(tempname, 1, 1);
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
for (done = 0; fgets(buf, sizeof(buf), from);) {
|
|
||||||
if (!strchr(buf, '\n')) {
|
|
||||||
yp_error("%s: line too long", passfile);
|
|
||||||
pw_error(NULL, 0, 1);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if (done) {
|
|
||||||
(void)fprintf(to, "%s", buf);
|
|
||||||
if (ferror(to))
|
|
||||||
goto err;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Just copy comments and blank lines
|
|
||||||
*/
|
|
||||||
p = buf + strspn(buf, " \t\n");
|
|
||||||
if (*p == '\0' || *p == '#') {
|
|
||||||
(void)fprintf(to, "%s", buf);
|
|
||||||
if (ferror(to))
|
|
||||||
goto err;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!(p = strchr(buf, ':'))) {
|
|
||||||
yp_error("%s: corrupted entry", passfile);
|
|
||||||
pw_error(NULL, 0, 1);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
*p = '\0';
|
|
||||||
if (strcmp(buf, pw->pw_name)) {
|
|
||||||
*p = ':';
|
|
||||||
(void)fprintf(to, "%s", buf);
|
|
||||||
if (ferror(to))
|
|
||||||
goto err;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
(void)fprintf(to, "%s:%s:%s:%s:%s:%s:%s:%s:%s:%s\n",
|
|
||||||
pw->pw_name, pw->pw_passwd,
|
|
||||||
pw->pw_fields & _PWF_UID ? uidstr : "",
|
|
||||||
pw->pw_fields & _PWF_GID ? gidstr : "",
|
|
||||||
pw->pw_class,
|
|
||||||
pw->pw_fields & _PWF_CHANGE ? chgstr : "",
|
|
||||||
pw->pw_fields & _PWF_EXPIRE ? expstr : "",
|
|
||||||
pw->pw_gecos, pw->pw_dir, pw->pw_shell);
|
|
||||||
done = 1;
|
|
||||||
if (ferror(to))
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if (!done) {
|
|
||||||
if (allow_additions) {
|
|
||||||
(void)fprintf(to, "%s:%s:%s:%s:%s:%s:%s:%s:%s:%s\n",
|
|
||||||
pw->pw_name, pw->pw_passwd,
|
|
||||||
pw->pw_fields & _PWF_UID ? uidstr : "",
|
|
||||||
pw->pw_fields & _PWF_GID ? gidstr : "",
|
|
||||||
pw->pw_class,
|
|
||||||
pw->pw_fields & _PWF_CHANGE ? chgstr : "",
|
|
||||||
pw->pw_fields & _PWF_EXPIRE ? expstr : "",
|
|
||||||
pw->pw_gecos, pw->pw_dir, pw->pw_shell);
|
|
||||||
} else {
|
|
||||||
yp_error("user \"%s\" not found in %s -- \
|
|
||||||
NIS maps and password file possibly out of sync", pw->pw_name, passfile);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ferror(to)) {
|
|
||||||
err: pw_error(NULL, 1, 1);
|
|
||||||
(void)fclose(to);
|
|
||||||
(void)fclose(from);
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
(void)fclose(to);
|
|
||||||
(void)fclose(from);
|
|
||||||
return(0);
|
|
||||||
}
|
|
@ -1,181 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright (c) 1990, 1993, 1994
|
|
||||||
* The Regents of the University of California. 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. All advertising materials mentioning features or use of this software
|
|
||||||
* must display the following acknowledgement:
|
|
||||||
* This product includes software developed by the University of
|
|
||||||
* California, Berkeley and its contributors.
|
|
||||||
* 4. Neither the name of the University nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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
|
|
||||||
#if 0
|
|
||||||
static char sccsid[] = "@(#)pw_util.c 8.3 (Berkeley) 4/2/94";
|
|
||||||
#endif
|
|
||||||
static const char rcsid[] =
|
|
||||||
"$FreeBSD$";
|
|
||||||
#endif /* not lint */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is used by all the "password" programs; vipw(8), chpass(1),
|
|
||||||
* and passwd(1).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/resource.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
|
|
||||||
#include <err.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <paths.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "yppasswdd_extern.h"
|
|
||||||
|
|
||||||
int pstat;
|
|
||||||
pid_t pid;
|
|
||||||
|
|
||||||
void
|
|
||||||
pw_init(void)
|
|
||||||
{
|
|
||||||
struct rlimit rlim;
|
|
||||||
|
|
||||||
/* Unlimited resource limits. */
|
|
||||||
rlim.rlim_cur = rlim.rlim_max = RLIM_INFINITY;
|
|
||||||
(void)setrlimit(RLIMIT_CPU, &rlim);
|
|
||||||
(void)setrlimit(RLIMIT_FSIZE, &rlim);
|
|
||||||
(void)setrlimit(RLIMIT_STACK, &rlim);
|
|
||||||
(void)setrlimit(RLIMIT_DATA, &rlim);
|
|
||||||
(void)setrlimit(RLIMIT_RSS, &rlim);
|
|
||||||
|
|
||||||
/* Don't drop core (not really necessary, but GP's). */
|
|
||||||
rlim.rlim_cur = rlim.rlim_max = 0;
|
|
||||||
(void)setrlimit(RLIMIT_CORE, &rlim);
|
|
||||||
|
|
||||||
/* Turn off signals. */
|
|
||||||
/* (void)signal(SIGALRM, SIG_IGN); */
|
|
||||||
(void)signal(SIGHUP, SIG_IGN);
|
|
||||||
(void)signal(SIGINT, SIG_IGN);
|
|
||||||
(void)signal(SIGPIPE, SIG_IGN);
|
|
||||||
(void)signal(SIGQUIT, SIG_IGN);
|
|
||||||
(void)signal(SIGTSTP, SIG_IGN);
|
|
||||||
(void)signal(SIGTTOU, SIG_IGN);
|
|
||||||
|
|
||||||
/* Create with exact permissions. */
|
|
||||||
(void)umask(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lockfd;
|
|
||||||
|
|
||||||
int
|
|
||||||
pw_lock(void)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* If the master password file doesn't exist, the system is hosed.
|
|
||||||
* Might as well try to build one. Set the close-on-exec bit so
|
|
||||||
* that users can't get at the encrypted passwords while editing.
|
|
||||||
* Open should allow flock'ing the file; see 4.4BSD. XXX
|
|
||||||
*/
|
|
||||||
lockfd = open(passfile, O_RDONLY, 0);
|
|
||||||
if (lockfd < 0 || fcntl(lockfd, F_SETFD, 1) == -1) {
|
|
||||||
yp_error("%s: %s", passfile, strerror(errno));
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
if (flock(lockfd, LOCK_EX|LOCK_NB)) {
|
|
||||||
yp_error("%s: the password db file is busy", passfile);
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
return (lockfd);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
pw_tmp(void)
|
|
||||||
{
|
|
||||||
static char path[MAXPATHLEN];
|
|
||||||
int fd;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
sprintf(path,"%s",passfile);
|
|
||||||
if ((p = strrchr(path, '/')))
|
|
||||||
++p;
|
|
||||||
else
|
|
||||||
p = path;
|
|
||||||
strcpy(p, "pw.XXXXXX");
|
|
||||||
if ((fd = mkstemp(path)) == -1) {
|
|
||||||
yp_error("%s: %s", path, strerror(errno));
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
tempname = path;
|
|
||||||
return (fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
pw_mkdb(const char *username)
|
|
||||||
{
|
|
||||||
|
|
||||||
yp_error("rebuilding the database...");
|
|
||||||
(void)fflush(stderr);
|
|
||||||
/* Temporarily turn off SIGCHLD catching */
|
|
||||||
install_reaper(0);
|
|
||||||
if (!(pid = vfork())) {
|
|
||||||
if (!username) {
|
|
||||||
execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", tempname,
|
|
||||||
(char *)NULL);
|
|
||||||
} else {
|
|
||||||
execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", "-u", username,
|
|
||||||
tempname, (char *)NULL);
|
|
||||||
}
|
|
||||||
pw_error(_PATH_PWD_MKDB, 1, 1);
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
/* Handle this ourselves. */
|
|
||||||
reaper(-1);
|
|
||||||
/* Put the handler back. Foo. */
|
|
||||||
install_reaper(1);
|
|
||||||
if (pid == -1 || !WIFEXITED(pstat) || WEXITSTATUS(pstat) != 0) {
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
yp_error("done");
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
pw_error(const char *name, int err, int eval)
|
|
||||||
{
|
|
||||||
if (err && name != NULL)
|
|
||||||
yp_error("%s", name);
|
|
||||||
|
|
||||||
yp_error("%s: unchanged", passfile);
|
|
||||||
(void)unlink(tempname);
|
|
||||||
}
|
|
@ -32,17 +32,8 @@
|
|||||||
* $FreeBSD$
|
* $FreeBSD$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/types.h>
|
#ifndef _YPPASSWDD_EXTERN_H
|
||||||
#include <limits.h>
|
#define _YPPASSWDD_EXTERN_H
|
||||||
#include <db.h>
|
|
||||||
#include <paths.h>
|
|
||||||
#include <pw_util.h>
|
|
||||||
#include <rpc/rpc.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <err.h>
|
|
||||||
#include <rpcsvc/yp.h>
|
|
||||||
#include "yp_extern.h"
|
|
||||||
#include "ypxfr_extern.h"
|
|
||||||
|
|
||||||
#ifndef YPLIBDIR
|
#ifndef YPLIBDIR
|
||||||
#define YPLIBDIR "/usr/libexec/"
|
#define YPLIBDIR "/usr/libexec/"
|
||||||
@ -63,11 +54,9 @@ extern void master_yppasswdprog_1 __P((struct svc_req *,
|
|||||||
register SVCXPRT *));
|
register SVCXPRT *));
|
||||||
extern void reaper(int);
|
extern void reaper(int);
|
||||||
extern void install_reaper(int);
|
extern void install_reaper(int);
|
||||||
extern int pw_copy(int, int, struct passwd *);
|
|
||||||
extern char *ok_shell __P ((char *));
|
extern char *ok_shell __P ((char *));
|
||||||
extern char *passfile;
|
extern char *passfile;
|
||||||
extern char *passfile_default;
|
extern char *passfile_default;
|
||||||
extern char *tempname;
|
|
||||||
extern char *yppasswd_domain;
|
extern char *yppasswd_domain;
|
||||||
extern int no_chsh;
|
extern int no_chsh;
|
||||||
extern int no_chfn;
|
extern int no_chfn;
|
||||||
@ -77,3 +66,5 @@ extern int resvport;
|
|||||||
extern int inplace;
|
extern int inplace;
|
||||||
extern int verbose;
|
extern int verbose;
|
||||||
extern int _rpc_dtablesize(void);
|
extern int _rpc_dtablesize(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -35,34 +35,37 @@ static const char rcsid[] =
|
|||||||
"$FreeBSD$";
|
"$FreeBSD$";
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
#include "yppasswd.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <stdlib.h> /* getenv, exit */
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <rpc/pmap_clnt.h> /* for pmap_unset */
|
|
||||||
#include <string.h> /* strcmp */
|
|
||||||
#include <signal.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#ifdef __cplusplus
|
|
||||||
#include <sysent.h> /* getdtablesize, open */
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
#include <memory.h>
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <syslog.h>
|
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <memory.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h> /* getenv, exit */
|
||||||
|
#include <string.h>
|
||||||
|
#include <string.h> /* strcmp */
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <rpc/rpc.h>
|
||||||
|
#include <rpc/pmap_clnt.h> /* for pmap_unset */
|
||||||
#include <rpcsvc/yp.h>
|
#include <rpcsvc/yp.h>
|
||||||
struct dom_binding {};
|
struct dom_binding {};
|
||||||
#include <rpcsvc/ypclnt.h>
|
#include <rpcsvc/ypclnt.h>
|
||||||
|
|
||||||
|
#include "yppasswd.h"
|
||||||
#include "yppasswdd_extern.h"
|
#include "yppasswdd_extern.h"
|
||||||
#include "yppasswd_private.h"
|
#include "yppasswd_private.h"
|
||||||
#include "ypxfr_extern.h"
|
#include "ypxfr_extern.h"
|
||||||
|
#include "yp_extern.h"
|
||||||
|
|
||||||
#ifndef SIG_PF
|
#ifndef SIG_PF
|
||||||
#define SIG_PF void(*)(int)
|
#define SIG_PF void(*)(int)
|
||||||
@ -82,10 +85,15 @@ static int _rpcfdtype;
|
|||||||
#define _SERVED 1
|
#define _SERVED 1
|
||||||
#define _SERVING 2
|
#define _SERVING 2
|
||||||
|
|
||||||
|
static char _localhost[] = "localhost";
|
||||||
|
static char _passwd_byname[] = "passwd.byname";
|
||||||
extern int _rpcsvcstate; /* Set when a request is serviced */
|
extern int _rpcsvcstate; /* Set when a request is serviced */
|
||||||
char *progname = "rpc.yppasswdd";
|
static char _progname[] = "rpc.yppasswdd";
|
||||||
char *yp_dir = _PATH_YP;
|
char *progname = _progname;
|
||||||
char *passfile_default = _PATH_YP "master.passwd";
|
static char _yp_dir[] = _PATH_YP;
|
||||||
|
char *yp_dir = _yp_dir;
|
||||||
|
static char _passfile_default[] = _PATH_YP "master.passwd";
|
||||||
|
char *passfile_default = _passfile_default;
|
||||||
char *passfile;
|
char *passfile;
|
||||||
char *yppasswd_domain = NULL;
|
char *yppasswd_domain = NULL;
|
||||||
int no_chsh = 0;
|
int no_chsh = 0;
|
||||||
@ -95,10 +103,10 @@ int multidomain = 0;
|
|||||||
int verbose = 0;
|
int verbose = 0;
|
||||||
int resvport = 1;
|
int resvport = 1;
|
||||||
int inplace = 0;
|
int inplace = 0;
|
||||||
char *sockname = YP_SOCKNAME;
|
char sockname[] = YP_SOCKNAME;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
terminate(int sig)
|
terminate(int sig __unused)
|
||||||
{
|
{
|
||||||
rpcb_unset(YPPASSWDPROG, YPPASSWDVERS, NULL);
|
rpcb_unset(YPPASSWDPROG, YPPASSWDVERS, NULL);
|
||||||
rpcb_unset(MASTER_YPPASSWDPROG, MASTER_YPPASSWDVERS, NULL);
|
rpcb_unset(MASTER_YPPASSWDPROG, MASTER_YPPASSWDVERS, NULL);
|
||||||
@ -107,13 +115,13 @@ terminate(int sig)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reload(int sig)
|
reload(int sig __unused)
|
||||||
{
|
{
|
||||||
load_securenets();
|
load_securenets();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
closedown(int sig)
|
closedown(int sig __unused)
|
||||||
{
|
{
|
||||||
if (_rpcsvcstate == _IDLE) {
|
if (_rpcsvcstate == _IDLE) {
|
||||||
extern fd_set svc_fdset;
|
extern fd_set svc_fdset;
|
||||||
@ -154,7 +162,8 @@ usage(void)
|
|||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
register SVCXPRT *transp = NULL;
|
struct rlimit rlim;
|
||||||
|
SVCXPRT *transp = NULL;
|
||||||
struct sockaddr_in saddr;
|
struct sockaddr_in saddr;
|
||||||
int asize = sizeof (saddr);
|
int asize = sizeof (saddr);
|
||||||
struct netconfig *nconf;
|
struct netconfig *nconf;
|
||||||
@ -216,14 +225,14 @@ name isn't set -- aborting");
|
|||||||
|
|
||||||
load_securenets();
|
load_securenets();
|
||||||
|
|
||||||
if (getrpcport("localhost", YPPROG, YPVERS, IPPROTO_UDP) <= 0) {
|
if (getrpcport(_localhost, YPPROG, YPVERS, IPPROTO_UDP) <= 0) {
|
||||||
yp_error("no ypserv processes registered with local portmap");
|
yp_error("no ypserv processes registered with local portmap");
|
||||||
yp_error("this host is not an NIS server -- aborting");
|
yp_error("this host is not an NIS server -- aborting");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mastername = ypxfr_get_master(yppasswd_domain, "passwd.byname",
|
if ((mastername = ypxfr_get_master(yppasswd_domain,
|
||||||
"localhost",0)) == NULL) {
|
_passwd_byname, _localhost, 0)) == NULL) {
|
||||||
yp_error("can't get name of NIS master server for domain %s",
|
yp_error("can't get name of NIS master server for domain %s",
|
||||||
yppasswd_domain);
|
yppasswd_domain);
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -311,14 +320,26 @@ the %s domain -- aborting", yppasswd_domain);
|
|||||||
(void) signal(SIGALRM, (SIG_PF) closedown);
|
(void) signal(SIGALRM, (SIG_PF) closedown);
|
||||||
(void) alarm(_RPCSVC_CLOSEDOWN/2);
|
(void) alarm(_RPCSVC_CLOSEDOWN/2);
|
||||||
}
|
}
|
||||||
/* set up resource limits and block signals */
|
|
||||||
pw_init();
|
|
||||||
|
|
||||||
/* except SIGCHLD, which we need to catch */
|
/* Unlimited resource limits. */
|
||||||
install_reaper(1);
|
rlim.rlim_cur = rlim.rlim_max = RLIM_INFINITY;
|
||||||
signal(SIGTERM, (SIG_PF) terminate);
|
(void)setrlimit(RLIMIT_CPU, &rlim);
|
||||||
|
(void)setrlimit(RLIMIT_FSIZE, &rlim);
|
||||||
|
(void)setrlimit(RLIMIT_STACK, &rlim);
|
||||||
|
(void)setrlimit(RLIMIT_DATA, &rlim);
|
||||||
|
(void)setrlimit(RLIMIT_RSS, &rlim);
|
||||||
|
|
||||||
signal(SIGHUP, (SIG_PF) reload);
|
/* Don't drop core (not really necessary, but GP's). */
|
||||||
|
rlim.rlim_cur = rlim.rlim_max = 0;
|
||||||
|
(void)setrlimit(RLIMIT_CORE, &rlim);
|
||||||
|
|
||||||
|
/* Turn off signals. */
|
||||||
|
(void)signal(SIGALRM, SIG_IGN);
|
||||||
|
(void)signal(SIGHUP, (SIG_PF) reload);
|
||||||
|
(void)signal(SIGINT, SIG_IGN);
|
||||||
|
(void)signal(SIGPIPE, SIG_IGN);
|
||||||
|
(void)signal(SIGQUIT, SIG_IGN);
|
||||||
|
(void)signal(SIGTERM, (SIG_PF) terminate);
|
||||||
|
|
||||||
svc_run();
|
svc_run();
|
||||||
yp_error("svc_run returned");
|
yp_error("svc_run returned");
|
||||||
|
@ -35,78 +35,51 @@ static const char rcsid[] =
|
|||||||
"$FreeBSD$";
|
"$FreeBSD$";
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <db.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <rpc/rpc.h>
|
|
||||||
#include <rpcsvc/yp.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/fcntl.h>
|
#include <sys/fcntl.h>
|
||||||
struct dom_binding {};
|
#include <sys/socket.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <db.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <libgen.h>
|
||||||
|
#include <libutil.h>
|
||||||
|
|
||||||
|
#include <rpc/rpc.h>
|
||||||
|
#include <rpcsvc/yp.h>
|
||||||
|
struct dom_binding;
|
||||||
#include <rpcsvc/ypclnt.h>
|
#include <rpcsvc/ypclnt.h>
|
||||||
#include "yppasswdd_extern.h"
|
#include "yppasswdd_extern.h"
|
||||||
#include "yppasswd.h"
|
#include "yppasswd.h"
|
||||||
#include "yppasswd_private.h"
|
#include "yppasswd_private.h"
|
||||||
|
#include "ypxfr_extern.h"
|
||||||
char *tempname;
|
#include "yp_extern.h"
|
||||||
|
|
||||||
void
|
|
||||||
reaper(int sig)
|
|
||||||
{
|
|
||||||
extern pid_t pid;
|
|
||||||
extern int pstat;
|
|
||||||
int st;
|
|
||||||
int saved_errno;
|
|
||||||
|
|
||||||
saved_errno = errno;
|
|
||||||
|
|
||||||
if (sig > 0) {
|
|
||||||
if (sig == SIGCHLD)
|
|
||||||
while (wait3(&st, WNOHANG, NULL) > 0) ;
|
|
||||||
} else {
|
|
||||||
pid = waitpid(pid, &pstat, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = saved_errno;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
install_reaper(int on)
|
|
||||||
{
|
|
||||||
if (on) {
|
|
||||||
signal(SIGCHLD, reaper);
|
|
||||||
} else {
|
|
||||||
signal(SIGCHLD, SIG_DFL);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct passwd yp_password;
|
static struct passwd yp_password;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
copy_yp_pass(char *p, int x, int m)
|
copy_yp_pass(char *p, int x, int m)
|
||||||
{
|
{
|
||||||
register char *t, *s = p;
|
char *t, *s = p;
|
||||||
static char *buf;
|
static char *buf;
|
||||||
|
|
||||||
yp_password.pw_fields = 0;
|
yp_password.pw_fields = 0;
|
||||||
|
|
||||||
buf = (char *)realloc(buf, m + 10);
|
buf = realloc(buf, m + 10);
|
||||||
bzero(buf, m + 10);
|
bzero(buf, m + 10);
|
||||||
|
|
||||||
/* Turn all colons into NULLs */
|
/* Turn all colons into NULLs */
|
||||||
@ -150,7 +123,7 @@ copy_yp_pass(char *p, int x, int m)
|
|||||||
static int
|
static int
|
||||||
validchars(char *arg)
|
validchars(char *arg)
|
||||||
{
|
{
|
||||||
int i;
|
size_t i;
|
||||||
|
|
||||||
for (i = 0; i < strlen(arg); i++) {
|
for (i = 0; i < strlen(arg); i++) {
|
||||||
if (iscntrl(arg[i])) {
|
if (iscntrl(arg[i])) {
|
||||||
@ -171,7 +144,7 @@ validchars(char *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
validate_master(struct passwd *opw, struct x_master_passwd *npw)
|
validate_master(struct passwd *opw __unused, struct x_master_passwd *npw)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (npw->pw_name[0] == '+' || npw->pw_name[0] == '-') {
|
if (npw->pw_name[0] == '+' || npw->pw_name[0] == '-') {
|
||||||
@ -205,7 +178,7 @@ validate(struct passwd *opw, struct x_passwd *npw)
|
|||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (npw->pw_uid != opw->pw_uid) {
|
if ((uid_t)npw->pw_uid != opw->pw_uid) {
|
||||||
yp_error("UID mismatch: client says user %s has UID %d",
|
yp_error("UID mismatch: client says user %s has UID %d",
|
||||||
npw->pw_name, npw->pw_uid);
|
npw->pw_name, npw->pw_uid);
|
||||||
yp_error("database says user %s has UID %d", opw->pw_name,
|
yp_error("database says user %s has UID %d", opw->pw_name,
|
||||||
@ -213,7 +186,7 @@ validate(struct passwd *opw, struct x_passwd *npw)
|
|||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (npw->pw_gid != opw->pw_gid) {
|
if ((gid_t)npw->pw_gid != opw->pw_gid) {
|
||||||
yp_error("GID mismatch: client says user %s has GID %d",
|
yp_error("GID mismatch: client says user %s has GID %d",
|
||||||
npw->pw_name, npw->pw_gid);
|
npw->pw_name, npw->pw_gid);
|
||||||
yp_error("database says user %s has GID %d", opw->pw_name,
|
yp_error("database says user %s has GID %d", opw->pw_name,
|
||||||
@ -276,7 +249,7 @@ find_domain(struct x_passwd *pw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
while ((dirp = readdir(dird)) != NULL) {
|
while ((dirp = readdir(dird)) != NULL) {
|
||||||
snprintf(yp_mapdir, sizeof(yp_mapdir), "%s/%s",
|
snprintf(yp_mapdir, sizeof yp_mapdir, "%s/%s",
|
||||||
yp_dir, dirp->d_name);
|
yp_dir, dirp->d_name);
|
||||||
if (stat(yp_mapdir, &statbuf) < 0) {
|
if (stat(yp_mapdir, &statbuf) < 0) {
|
||||||
yp_error("stat(%s) failed: %s", yp_mapdir,
|
yp_error("stat(%s) failed: %s", yp_mapdir,
|
||||||
@ -293,10 +266,10 @@ find_domain(struct x_passwd *pw)
|
|||||||
&key, &data, 0) != YP_TRUE) {
|
&key, &data, 0) != YP_TRUE) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
*(char *)(data.data + data.size) = '\0';
|
*((char *)data.data + data.size) = '\0';
|
||||||
copy_yp_pass(data.data, 1, data.size);
|
copy_yp_pass(data.data, 1, data.size);
|
||||||
if (yp_password.pw_uid == pw->pw_uid &&
|
if (yp_password.pw_uid == (uid_t)pw->pw_uid &&
|
||||||
yp_password.pw_gid == pw->pw_gid) {
|
yp_password.pw_gid == (gid_t)pw->pw_gid) {
|
||||||
hit++;
|
hit++;
|
||||||
snprintf(domain, YPMAXDOMAIN, "%s", tmp);
|
snprintf(domain, YPMAXDOMAIN, "%s", tmp);
|
||||||
}
|
}
|
||||||
@ -311,6 +284,20 @@ find_domain(struct x_passwd *pw)
|
|||||||
return((char *)&domain);
|
return((char *)&domain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *maps[] = {
|
||||||
|
"master.passwd.byname",
|
||||||
|
"master.passwd.byuid",
|
||||||
|
"passwd.byname",
|
||||||
|
"passwd.byuid"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *formats[] = {
|
||||||
|
"%s:%s:%d:%d:%s:%ld:%ld:%s:%s:%s",
|
||||||
|
"%s:%s:%d:%d:%s:%ld:%ld:%s:%s:%s",
|
||||||
|
"%s:%s:%d:%d:%s:%s:%s",
|
||||||
|
"%s:%s:%d:%d:%s:%s:%s"
|
||||||
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
update_inplace(struct passwd *pw, char *domain)
|
update_inplace(struct passwd *pw, char *domain)
|
||||||
{
|
{
|
||||||
@ -320,23 +307,19 @@ update_inplace(struct passwd *pw, char *domain)
|
|||||||
char pwbuf[YPMAXRECORD];
|
char pwbuf[YPMAXRECORD];
|
||||||
char keybuf[20];
|
char keybuf[20];
|
||||||
int i;
|
int i;
|
||||||
char *maps[] = { "master.passwd.byname", "master.passwd.byuid",
|
|
||||||
"passwd.byname", "passwd.byuid" };
|
|
||||||
|
|
||||||
char *formats[] = { "%s:%s:%d:%d:%s:%ld:%ld:%s:%s:%s",
|
|
||||||
"%s:%s:%d:%d:%s:%ld:%ld:%s:%s:%s",
|
|
||||||
"%s:%s:%d:%d:%s:%s:%s", "%s:%s:%d:%d:%s:%s:%s" };
|
|
||||||
char *ptr = NULL;
|
char *ptr = NULL;
|
||||||
char *yp_last = "YP_LAST_MODIFIED";
|
static char yp_last[] = "YP_LAST_MODIFIED";
|
||||||
char yplastbuf[YPMAXRECORD];
|
char yplastbuf[YPMAXRECORD];
|
||||||
|
|
||||||
snprintf(yplastbuf, sizeof(yplastbuf), "%lu", time(NULL));
|
snprintf(yplastbuf, sizeof yplastbuf, "%llu",
|
||||||
|
(unsigned long long)time(NULL));
|
||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
|
|
||||||
if (i % 2) {
|
if (i % 2) {
|
||||||
snprintf(keybuf, sizeof(keybuf), "%ld", pw->pw_uid);
|
snprintf(keybuf, sizeof keybuf,
|
||||||
key.data = (char *)&keybuf;
|
"%llu", (unsigned long long)pw->pw_uid);
|
||||||
|
key.data = &keybuf;
|
||||||
key.size = strlen(keybuf);
|
key.size = strlen(keybuf);
|
||||||
} else {
|
} else {
|
||||||
key.data = pw->pw_name;
|
key.data = pw->pw_name;
|
||||||
@ -380,7 +363,7 @@ update_inplace(struct passwd *pw, char *domain)
|
|||||||
strlen(pw->pw_name))) {
|
strlen(pw->pw_name))) {
|
||||||
yp_error("warning: found entry for UID %d \
|
yp_error("warning: found entry for UID %d \
|
||||||
in map %s@%s with wrong name (%.*s)", pw->pw_uid, maps[i], domain,
|
in map %s@%s with wrong name (%.*s)", pw->pw_uid, maps[i], domain,
|
||||||
ptr - (char *)data.data, data.data);
|
ptr - (char *)data.data, (char *)data.data);
|
||||||
yp_error("there may be more than one user \
|
yp_error("there may be more than one user \
|
||||||
with the same UID - continuing");
|
with the same UID - continuing");
|
||||||
continue;
|
continue;
|
||||||
@ -390,7 +373,7 @@ with the same UID - continuing");
|
|||||||
* We're really being ultra-paranoid here.
|
* We're really being ultra-paranoid here.
|
||||||
* This is generally a 'can't happen' condition.
|
* This is generally a 'can't happen' condition.
|
||||||
*/
|
*/
|
||||||
snprintf(pwbuf, sizeof(pwbuf), ":%d:%d:", pw->pw_uid,
|
snprintf(pwbuf, sizeof pwbuf, ":%d:%d:", pw->pw_uid,
|
||||||
pw->pw_gid);
|
pw->pw_gid);
|
||||||
if (!strstr(data.data, pwbuf)) {
|
if (!strstr(data.data, pwbuf)) {
|
||||||
yp_error("warning: found entry for user %s \
|
yp_error("warning: found entry for user %s \
|
||||||
@ -402,13 +385,13 @@ with the same name - continuing");
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (i < 2) {
|
if (i < 2) {
|
||||||
snprintf(pwbuf, sizeof(pwbuf), formats[i],
|
snprintf(pwbuf, sizeof pwbuf, formats[i],
|
||||||
pw->pw_name, pw->pw_passwd, pw->pw_uid,
|
pw->pw_name, pw->pw_passwd, pw->pw_uid,
|
||||||
pw->pw_gid, pw->pw_class, pw->pw_change,
|
pw->pw_gid, pw->pw_class, pw->pw_change,
|
||||||
pw->pw_expire, pw->pw_gecos, pw->pw_dir,
|
pw->pw_expire, pw->pw_gecos, pw->pw_dir,
|
||||||
pw->pw_shell);
|
pw->pw_shell);
|
||||||
} else {
|
} else {
|
||||||
snprintf(pwbuf, sizeof(pwbuf), formats[i],
|
snprintf(pwbuf, sizeof pwbuf, formats[i],
|
||||||
pw->pw_name, *(ptr+1) == '*' ? "*" : pw->pw_passwd,
|
pw->pw_name, *(ptr+1) == '*' ? "*" : pw->pw_passwd,
|
||||||
pw->pw_uid, pw->pw_gid, pw->pw_gecos, pw->pw_dir,
|
pw->pw_uid, pw->pw_gid, pw->pw_gecos, pw->pw_dir,
|
||||||
pw->pw_shell);
|
pw->pw_shell);
|
||||||
@ -450,21 +433,6 @@ with the same name - continuing");
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
|
||||||
yp_mktmpnam(void)
|
|
||||||
{
|
|
||||||
static char path[MAXPATHLEN];
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
sprintf(path,"%s",passfile);
|
|
||||||
if ((p = strrchr(path, '/')))
|
|
||||||
++p;
|
|
||||||
else
|
|
||||||
p = path;
|
|
||||||
strcpy(p, "yppwtmp.XXXXXX");
|
|
||||||
return(mktemp(path));
|
|
||||||
}
|
|
||||||
|
|
||||||
int *
|
int *
|
||||||
yppasswdproc_update_1_svc(yppasswd *argp, struct svc_req *rqstp)
|
yppasswdproc_update_1_svc(yppasswd *argp, struct svc_req *rqstp)
|
||||||
{
|
{
|
||||||
@ -495,17 +463,16 @@ yppasswdproc_update_1_svc(yppasswd *argp, struct svc_req *rqstp)
|
|||||||
rqhost = svc_getcaller(rqstp->rq_xprt);
|
rqhost = svc_getcaller(rqstp->rq_xprt);
|
||||||
|
|
||||||
gettimeofday(&t_test, NULL);
|
gettimeofday(&t_test, NULL);
|
||||||
if (!bcmp((char *)rqhost, (char *)&clntaddr,
|
if (!bcmp(rqhost, &clntaddr, sizeof *rqhost) &&
|
||||||
sizeof(struct sockaddr_in)) &&
|
|
||||||
t_test.tv_sec > t_saved.tv_sec &&
|
t_test.tv_sec > t_saved.tv_sec &&
|
||||||
t_test.tv_sec - t_saved.tv_sec < 300) {
|
t_test.tv_sec - t_saved.tv_sec < 300) {
|
||||||
|
|
||||||
bzero((char *)&clntaddr, sizeof(struct sockaddr_in));
|
bzero(&clntaddr, sizeof clntaddr);
|
||||||
bzero((char *)&t_saved, sizeof(struct timeval));
|
bzero(&t_saved, sizeof t_saved);
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
bcopy((char *)rqhost, (char *)&clntaddr, sizeof(struct sockaddr_in));
|
bcopy(rqhost, &clntaddr, sizeof clntaddr);
|
||||||
gettimeofday(&t_saved, NULL);
|
gettimeofday(&t_saved, NULL);
|
||||||
|
|
||||||
if (yp_access(resvport ? "master.passwd.byname" : NULL, rqstp)) {
|
if (yp_access(resvport ? "master.passwd.byname" : NULL, rqstp)) {
|
||||||
@ -548,7 +515,7 @@ yppasswdproc_update_1_svc(yppasswd *argp, struct svc_req *rqstp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Nul terminate, please. */
|
/* Nul terminate, please. */
|
||||||
*(char *)(data.data + data.size) = '\0';
|
*((char *)data.data + data.size) = '\0';
|
||||||
|
|
||||||
copy_yp_pass(data.data, 1, data.size);
|
copy_yp_pass(data.data, 1, data.size);
|
||||||
|
|
||||||
@ -608,30 +575,31 @@ yppasswdproc_update_1_svc(yppasswd *argp, struct svc_req *rqstp)
|
|||||||
|
|
||||||
/* Step 5: make a new password file with the updated info. */
|
/* Step 5: make a new password file with the updated info. */
|
||||||
|
|
||||||
if ((pfd = pw_lock()) < 0) {
|
if (pw_init(dirname(passfile), passfile)) {
|
||||||
return (&result);
|
yp_error("pw_init() failed");
|
||||||
|
return &result;
|
||||||
}
|
}
|
||||||
if ((tfd = pw_tmp()) < 0) {
|
if ((pfd = pw_lock()) == -1) {
|
||||||
return (&result);
|
pw_fini();
|
||||||
|
yp_error("pw_lock() failed");
|
||||||
|
return &result;
|
||||||
}
|
}
|
||||||
|
if ((tfd = pw_tmp(-1)) == -1) {
|
||||||
if (pw_copy(pfd, tfd, &yp_password)) {
|
pw_fini();
|
||||||
yp_error("failed to created updated password file -- \
|
yp_error("pw_tmp() failed");
|
||||||
cleaning up and bailing out");
|
return &result;
|
||||||
unlink(tempname);
|
|
||||||
return(&result);
|
|
||||||
}
|
}
|
||||||
|
if (pw_copy(pfd, tfd, &yp_password, NULL) == -1) {
|
||||||
passfile_hold = yp_mktmpnam();
|
pw_fini();
|
||||||
rename(passfile, passfile_hold);
|
yp_error("pw_copy() failed");
|
||||||
if (strcmp(passfile, _PATH_MASTERPASSWD)) {
|
return &result;
|
||||||
rename(tempname, passfile);
|
|
||||||
} else {
|
|
||||||
if (pw_mkdb(argp->newpw.pw_name) < 0) {
|
|
||||||
yp_error("pwd_mkdb failed");
|
|
||||||
return(&result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (pw_mkdb(yp_password.pw_name) == -1) {
|
||||||
|
pw_fini();
|
||||||
|
yp_error("pw_mkdb() failed");
|
||||||
|
return &result;
|
||||||
|
}
|
||||||
|
pw_fini();
|
||||||
|
|
||||||
if (inplace) {
|
if (inplace) {
|
||||||
if ((rval = update_inplace(&yp_password, domain))) {
|
if ((rval = update_inplace(&yp_password, domain))) {
|
||||||
@ -769,7 +737,7 @@ allow additions to be made to the password database");
|
|||||||
} else {
|
} else {
|
||||||
|
|
||||||
/* Nul terminate, please. */
|
/* Nul terminate, please. */
|
||||||
*(char *)(data.data + data.size) = '\0';
|
*((char *)data.data + data.size) = '\0';
|
||||||
|
|
||||||
copy_yp_pass(data.data, 1, data.size);
|
copy_yp_pass(data.data, 1, data.size);
|
||||||
}
|
}
|
||||||
@ -794,30 +762,31 @@ allow additions to be made to the password database");
|
|||||||
passfile = (char *)&passfile_buf;
|
passfile = (char *)&passfile_buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pfd = pw_lock()) < 0) {
|
if (pw_init(dirname(passfile), passfile)) {
|
||||||
return (&result);
|
yp_error("pw_init() failed");
|
||||||
|
return &result;
|
||||||
}
|
}
|
||||||
if ((tfd = pw_tmp()) < 0) {
|
if ((pfd = pw_lock()) == -1) {
|
||||||
return (&result);
|
pw_fini();
|
||||||
|
yp_error("pw_lock() failed");
|
||||||
|
return &result;
|
||||||
}
|
}
|
||||||
|
if ((tfd = pw_tmp(-1)) == -1) {
|
||||||
if (pw_copy(pfd, tfd, (struct passwd *)&argp->newpw)) {
|
pw_fini();
|
||||||
yp_error("failed to created updated password file -- \
|
yp_error("pw_tmp() failed");
|
||||||
cleaning up and bailing out");
|
return &result;
|
||||||
unlink(tempname);
|
|
||||||
return(&result);
|
|
||||||
}
|
}
|
||||||
|
if (pw_copy(pfd, tfd, (struct passwd *)&argp->newpw, NULL) == -1) {
|
||||||
passfile_hold = yp_mktmpnam();
|
pw_fini();
|
||||||
rename(passfile, passfile_hold);
|
yp_error("pw_copy() failed");
|
||||||
if (strcmp(passfile, _PATH_MASTERPASSWD)) {
|
return &result;
|
||||||
rename(tempname, passfile);
|
|
||||||
} else {
|
|
||||||
if (pw_mkdb(argp->newpw.pw_name) < 0) {
|
|
||||||
yp_error("pwd_mkdb failed");
|
|
||||||
return(&result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (pw_mkdb(argp->newpw.pw_name) == -1) {
|
||||||
|
pw_fini();
|
||||||
|
yp_error("pw_mkdb() failed");
|
||||||
|
return &result;
|
||||||
|
}
|
||||||
|
pw_fini();
|
||||||
|
|
||||||
if (inplace) {
|
if (inplace) {
|
||||||
if ((rval = update_inplace((struct passwd *)&argp->newpw,
|
if ((rval = update_inplace((struct passwd *)&argp->newpw,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user