Slight semantics change: ALWAYS use YP if the system is bound to a

YP server.  This is required if the passwd database is to stay in sync
if this program is run on the YP server.  Note, local passwd database
operations can still be performed by passing the -l flag.

Also, some minor cleanup and RCS id police.
This commit is contained in:
thorpej 1996-08-09 09:19:33 +00:00
parent c01edc3a02
commit 27643ee095
8 changed files with 101 additions and 98 deletions

View File

@ -1,5 +1,5 @@
# $NetBSD: Makefile,v 1.13 1996/08/09 09:19:33 thorpej Exp $
# from: @(#)Makefile 5.11 (Berkeley) 2/19/91
# $Id: Makefile,v 1.12 1996/05/15 21:55:25 jtc Exp $
PROG= passwd
SRCS= local_passwd.c yp_passwd.c passwd.c getpwent.c

View File

@ -1,3 +1,5 @@
/* $NetBSD: kpasswd_proto.h,v 1.2 1996/08/09 09:19:34 thorpej Exp $ */
/*-
* Copyright (c) 1989 The Regents of the University of California.
* All rights reserved.
@ -31,7 +33,6 @@
* SUCH DAMAGE.
*
* from: @(#)kpasswd_proto.h 5.1 (Berkeley) 2/3/91
* $Id $
*/
/*

View File

@ -1,3 +1,5 @@
/* $NetBSD: krb5_passwd.c,v 1.2 1996/08/09 09:19:35 thorpej Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
@ -32,8 +34,11 @@
*/
#ifndef lint
/*static char sccsid[] = "from: @(#)krb_passwd.c 5.4 (Berkeley) 3/1/91";*/
static char rcsid[] = "$Id: krb5_passwd.c,v 1.1 1994/07/27 03:28:16 brezak Exp $";
#if 0
static char sccsid[] = "from: @(#)krb_passwd.c 5.4 (Berkeley) 3/1/91";
#else
static char rcsid[] = "$NetBSD: krb5_passwd.c,v 1.2 1996/08/09 09:19:35 thorpej Exp $";
#endif
#endif /* not lint */
#ifdef KERBEROS5

View File

@ -1,3 +1,5 @@
/* $NetBSD: krb_passwd.c,v 1.2 1996/08/09 09:19:36 thorpej Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
@ -32,8 +34,11 @@
*/
#ifndef lint
/*static char sccsid[] = "from: @(#)krb_passwd.c 5.4 (Berkeley) 3/1/91";*/
static char rcsid[] = "$Id: krb_passwd.c,v 1.1 1994/07/27 03:28:19 brezak Exp $";
#if 0
static char sccsid[] = "from: @(#)krb_passwd.c 5.4 (Berkeley) 3/1/91";
#else
static char rcsid[] = "$NetBSD: krb_passwd.c,v 1.2 1996/08/09 09:19:36 thorpej Exp $";
#endif
#endif /* not lint */
#ifdef KERBEROS

View File

@ -1,3 +1,5 @@
/* $NetBSD: local_passwd.c,v 1.9 1996/08/09 09:19:39 thorpej Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
@ -32,8 +34,11 @@
*/
#ifndef lint
/*static char sccsid[] = "from: @(#)local_passwd.c 5.5 (Berkeley) 5/6/91";*/
static char rcsid[] = "$Id: local_passwd.c,v 1.8 1996/05/15 21:55:26 jtc Exp $";
#if 0
static char sccsid[] = "from: @(#)local_passwd.c 5.5 (Berkeley) 5/6/91";
#else
static char rcsid[] = "$NetBSD: local_passwd.c,v 1.9 1996/08/09 09:19:39 thorpej Exp $";
#endif
#endif /* not lint */
#include <sys/types.h>
@ -48,7 +53,6 @@ static char rcsid[] = "$Id: local_passwd.c,v 1.8 1996/05/15 21:55:26 jtc Exp $";
uid_t uid;
char *progname = "passwd";
char *tempname;
local_passwd(uname)
@ -59,10 +63,6 @@ local_passwd(uname)
char *getnewpasswd();
if (!(pw = getpwnam(uname))) {
#ifdef YP
extern int use_yp;
if (!use_yp)
#endif
(void)fprintf(stderr, "passwd: unknown user %s.\n", uname);
return(1);
}

View File

@ -1,3 +1,5 @@
.\" $NetBSD: passwd.1,v 1.6 1996/08/09 09:19:40 thorpej Exp $
.\"
.\" Copyright (c) 1990 The Regents of the University of California.
.\" All rights reserved.
.\"
@ -30,7 +32,6 @@
.\" SUCH DAMAGE.
.\"
.\" from: @(#)passwd.1 6.11 (Berkeley) 7/24/91
.\" $Id: passwd.1,v 1.5 1995/02/12 17:45:56 phil Exp $
.\"
.Dd July 24, 1991
.Dt PASSWD 1

View File

@ -1,3 +1,5 @@
/* $NetBSD: passwd.c,v 1.8 1996/08/09 09:19:41 thorpej Exp $ */
/*
* Copyright (c) 1988 The Regents of the University of California.
* All rights reserved.
@ -38,10 +40,14 @@ char copyright[] =
#endif /* not lint */
#ifndef lint
/*static char sccsid[] = "from: @(#)passwd.c 5.5 (Berkeley) 7/6/91";*/
static char rcsid[] = "$Id: passwd.c,v 1.7 1995/02/12 17:45:56 phil Exp $";
#if 0
static char sccsid[] = "from: @(#)passwd.c 5.5 (Berkeley) 7/6/91";
#else
static char rcsid[] = "$NetBSD: passwd.c,v 1.8 1996/08/09 09:19:41 thorpej Exp $";
#endif
#endif /* not lint */
#include <err.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
@ -55,9 +61,12 @@ static char rcsid[] = "$Id: passwd.c,v 1.7 1995/02/12 17:45:56 phil Exp $";
int use_kerberos;
int use_yp;
int yppwd;
extern char *__progname; /* from crt0.o */
#ifdef YP
int force_yp;
extern int _yp_check __P((char **)); /* buried deep inside libc */
#endif
main(argc, argv)
@ -67,8 +76,6 @@ main(argc, argv)
extern int optind;
register int ch;
char *username;
int status = 0;
char *basename;
#if defined(KERBEROS) || defined(KERBEROS5)
use_kerberos = 1;
@ -77,67 +84,57 @@ main(argc, argv)
use_yp = _yp_check(NULL);
#endif
basename = strrchr(argv[0], '/');
if (basename == NULL)
basename = argv[0];
if (strcmp(basename, "yppasswd") == 0) {
if (strcmp(__progname, "yppasswd") == 0) {
#ifdef YP
if (!use_yp) {
fprintf(stderr, "yppasswd: YP not in use.\n");
exit (1);
}
if (!use_yp)
errx(1, "YP not in use.");
use_kerberos = 0;
use_yp = 1;
force_yp = 1;
yppwd = 1;
#else
fprintf(stderr, "yppasswd: YP not compiled in\n");
exit(1);
errx(1, "YP support not compiled in.");
#endif
}
while ((ch = getopt(argc, argv, "lky")) != EOF)
while ((ch = getopt(argc, argv, "lky")) != -1)
switch (ch) {
case 'l': /* change local password file */
if (yppwd)
usage();
use_kerberos = 0;
use_yp = 0;
break;
case 'k': /* change Kerberos password */
#if defined(KERBEROS) || defined(KERBEROS5)
if (yppwd)
usage();
use_kerberos = 1;
use_yp = 0;
break;
#else
fprintf(stderr, "passwd: Kerberos not compiled in\n");
exit(1);
errx(1, "Kerberos support not compiled in.");
#endif
case 'y': /* change YP password */
#ifdef YP
if (!use_yp) {
fprintf(stderr, "passwd: YP not in use.\n");
exit(1);
}
if (yppwd)
usage();
if (!use_yp)
errx(1, "YP not in use.");
use_kerberos = 0;
use_yp = 1;
force_yp = 1;
break;
#else
fprintf(stderr, "passwd: YP not compiled in\n");
exit(1);
errx(1, "YP support not compiled in.");
#endif
default:
usage();
exit(1);
}
argc -= optind;
argv += optind;
username = getlogin();
if (username == NULL) {
fprintf(stderr, "passwd: who are you ??\n");
exit(1);
}
if (username == NULL)
errx(1, "who are you ??");
switch(argc) {
case 0:
@ -145,11 +142,10 @@ main(argc, argv)
case 1:
#if defined(KERBEROS) || defined(KERBEROS5)
if (use_kerberos && strcmp(argv[0], username)) {
(void)fprintf(stderr, "passwd: %s\n\t%s\n%s\n",
errx(1, "%s\n\t%s\n%s\n",
"to change another user's Kerberos password, do",
"\"kinit <user>; passwd; kdestroy\";",
"to change a user's local passwd, use \"passwd -l <user>\"");
exit(1);
}
#endif
username = argv[0];
@ -164,14 +160,18 @@ main(argc, argv)
exit(krb_passwd());
#endif
#ifdef YP
if (force_yp || ((status = local_passwd(username)) && use_yp))
if (use_yp)
exit(yp_passwd(username));
exit(status);
#endif
exit(local_passwd(username));
}
usage()
{
fprintf(stderr, "usage: passwd [-l] [-k] [-y] user\n");
if (yppwd)
fprintf(stderr, "usage: %s user\n", __progname);
else
fprintf(stderr, "usage: %s [-l] [-k] [-y] user\n", __progname);
exit(1);
}

View File

@ -1,3 +1,5 @@
/* $NetBSD: yp_passwd.c,v 1.9 1996/08/09 09:19:42 thorpej Exp $ */
/*
* Copyright (c) 1988 The Regents of the University of California.
* All rights reserved.
@ -30,13 +32,18 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef lint
/*static char sccsid[] = "from: @(#)yp_passwd.c 1.0 2/2/93";*/
static char rcsid[] = "$Id: yp_passwd.c,v 1.8 1995/02/08 19:54:12 phil Exp $";
#if 0
static char sccsid[] = "from: @(#)yp_passwd.c 1.0 2/2/93";
#else
static char rcsid[] = "$NetBSD: yp_passwd.c,v 1.9 1996/08/09 09:19:42 thorpej Exp $";
#endif
#endif /* not lint */
#ifdef YP
#include <err.h>
#include <stdio.h>
#include <string.h>
#include <netdb.h>
@ -54,7 +61,8 @@ static char rcsid[] = "$Id: yp_passwd.c,v 1.8 1995/02/08 19:54:12 phil Exp $";
#define _PASSWORD_LEN PASS_MAX
#endif
extern char *progname;
extern char *__progname; /* from crt0.o */
static char *getnewpasswd();
static struct passwd *ypgetpwnam();
@ -70,16 +78,15 @@ pw_error(name, err, eval)
if (err) {
sverrno = errno;
(void)fprintf(stderr, "%s: ", progname);
(void)fprintf(stderr, "%s: ", __progname);
if (name)
(void)fprintf(stderr, "%s: ", name);
(void)fprintf(stderr, "%s\n", strerror(sverrno));
}
(void)fprintf(stderr,
"%s: YP passwd database unchanged\n", progname);
exit(eval);
errx(eval, "YP passwd database unchanged");
}
int
yp_passwd(username)
char *username;
{
@ -96,57 +103,39 @@ yp_passwd(username)
/*
* Get local domain
*/
if (r = yp_get_default_domain(&domain)) {
fprintf(stderr, "%s: can't get local YP domain. Reason: %s\n",
progname, yperr_string(r));
exit(1);
}
if (r = yp_get_default_domain(&domain))
errx(1, "can't get local YP domain. Reason: %s",
yperr_string(r));
/*
* Find the host for the passwd map; it should be running
* the daemon.
*/
if ((r = yp_master(domain, "passwd.byname", &master)) != 0) {
fprintf(stderr,
"%s: can't find the master YP server. Reason: %s\n",
progname, yperr_string(r));
exit(1);
}
if ((r = yp_master(domain, "passwd.byname", &master)) != 0)
errx(1, "can't find the master YP server. Reason: %s",
yperr_string(r));
/*
* Ask the portmapper for the port of the daemon.
*/
if ((rpcport = getrpcport(master, YPPASSWDPROG,
YPPASSWDPROC_UPDATE, IPPROTO_UDP)) == 0) {
fprintf(stderr,
"%s: master YP server not running yppasswd daemon.\n",
progname);
fprintf(stderr, "\tCan't change password.\n");
exit(1);
}
YPPASSWDPROC_UPDATE, IPPROTO_UDP)) == 0)
errx(1, "master YP server not running yppasswd daemon.\n\t%s\n",
"Can't change password.");
/*
* Be sure the port is priviledged
*/
if (rpcport >= IPPORT_RESERVED) {
fprintf(stderr, "%s: yppasswd daemon is on an invalid port.\n",
progname);
exit(1);
}
if (rpcport >= IPPORT_RESERVED)
errx(1, "yppasswd daemon is on an invalid port.");
/* Get user's login identity */
if (!(pw = ypgetpwnam(username))) {
(void)fprintf(stderr, "%s: unknown user %s.\n",
progname, username);
exit(1);
}
if (uid && uid != pw->pw_uid) {
fprintf(stderr,
"%s: you may only change your own password: %s\n",
progname, strerror(EACCES));
exit(1);
}
if (!(pw = ypgetpwnam(username)))
errx(1, "unknown user %s", username);
if (uid && uid != pw->pw_uid)
errx(1, "you may only change your own password: %s",
strerror(EACCES));
/* prompt for new password */
yppasswd.newpw.pw_passwd = getnewpasswd(pw, &yppasswd.oldpass);
@ -161,21 +150,23 @@ yp_passwd(username)
client = clnt_create(master, YPPASSWDPROG, YPPASSWDVERS, "udp");
if (client==NULL) {
fprintf(stderr, "cannot contact yppasswdd on %s: Reason: %s\n",
warnx("cannot contact yppasswdd on %s: Reason: %s",
master, yperr_string(YPERR_YPBIND));
return(YPERR_YPBIND);
}
client->cl_auth = authunix_create_default();
tv.tv_sec = 2;
tv.tv_usec = 0;
r = clnt_call(client, YPPASSWDPROC_UPDATE,
xdr_yppasswd, &yppasswd, xdr_int, &status, tv);
xdr_yppasswd, &yppasswd, xdr_int, &status, tv);
if (r)
fprintf(stderr, "%s: rpc to yppasswdd failed.\n", progname);
errx(1, "rpc to yppasswdd failed.");
else if (status)
printf("Couldn't change YP password.\n");
else
printf("The YP password has been changed on %s, the master YP passwd server.\n", master);
printf("The YP password has been changed on %s, %s\n",
master, "the master YP passwd server.");
exit(0);
}