* Copyright (c) 1990 The Regents of the University of California.
* %sccs.include.redist.c%
static char sccsid
[] = "@(#)pw_util.c 5.1 (Berkeley) %G%";
* This file is used by all the "password" programs; vipw(8), chpass(1),
#include <sys/resource.h>
/* Unlimited cpu, file size. */
rlim
.rlim_cur
= rlim
.rlim_max
= RLIM_INFINITY
;
(void)setrlimit(RLIMIT_CPU
, &rlim
);
(void)setrlimit(RLIMIT_FSIZE
, &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 usual signals. */
(void)sigaddset(&set
, SIGTSTP
);
(void)sigaddset(&set
, SIGHUP
);
(void)sigaddset(&set
, SIGINT
);
(void)sigaddset(&set
, SIGQUIT
);
(void)sigaddset(&set
, SIGTERM
);
(void)sigprocmask(SIG_BLOCK
, &set
, (sigset_t
*)NULL
);
/* Create with exact permissions. */
* If the master password file doesn't exist, the system is hosed.
* Might as well try to build one.
* Open should allow flock'ing the file; see 4.4BSD. XXX
lockfd
= open(_PATH_MASTERPASSWD
, O_RDONLY
, 0);
(void)fprintf(stderr
, "%s: %s: %s\n",
progname
, _PATH_MASTERPASSWD
, strerror(errno
));
if (flock(lockfd
, LOCK_EX
)) {
"%s: the password db is busy.\n", progname
);
static char path
[MAXPATHLEN
] = _PATH_MASTERPASSWD
;
if (p
= rindex(path
, '/'))
(void)sprintf(p
, "%s.XXXXXX", progname
);
if ((fd
= mkstemp(path
)) == -1) {
"%s: %s: %s\n", progname
, path
, strerror(errno
));
(void)printf("%s: rebuilding the database...\n", progname
);
execl(_PATH_PWD_MKDB
, "pwd_mkdb", "-p", tempname
, NULL
);
pw_error(_PATH_PWD_MKDB
, 1, 1);
pid
= waitpid(pid
, (int *)&pstat
, 0);
if (pid
== -1 || pstat
.w_status
)
(void)printf("%s: done\n", progname
);
if (!(editor
= getenv("EDITOR")))
if (p
= rindex(editor
, '/'))
execlp(editor
, p
, tempname
, NULL
);
pid
= waitpid(pid
, (int *)&pstat
, 0);
return (pid
== -1 ? 1 : pstat
.w_status
);
(void)printf("re-edit the password file? [y]: ");
if (c
!= EOF
&& c
!= (int)'\n')
while (getchar() != (int)'\n');
pw_error((char *)NULL
, 0, 0);
pw_error(name
, err
, eval
)
(void)fprintf(stderr
, "%s: ", progname
);
(void)fprintf(stderr
, "%s: ", name
);
(void)fprintf(stderr
, "%s\n", strerror(sverrno
));
"%s: %s unchanged\n", progname
, _PATH_MASTERPASSWD
);