2
0
mirror of https://github.com/sudo-project/sudo.git synced 2025-08-22 18:08:23 +00:00

Add support for custom passwd/group files.

This commit is contained in:
Todd C. Miller 2005-01-05 19:50:49 +00:00
parent 66773d1b6a
commit 5e475c85b3

View File

@ -99,17 +99,19 @@ void print_privilege __P((struct privilege *));
void print_userspecs __P((void)); void print_userspecs __P((void));
void usage __P((void)) __attribute__((__noreturn__)); void usage __P((void)) __attribute__((__noreturn__));
extern void my_setpwfile __P((const char *));
extern void my_setgrfile __P((const char *));
int int
main(argc, argv) main(argc, argv)
int argc; int argc;
char **argv; char **argv;
{ {
struct cmndspec *cs; struct cmndspec *cs;
struct passwd pw, rpw;
struct member *runas; struct member *runas;
struct privilege *priv; struct privilege *priv;
struct userspec *us; struct userspec *us;
char *p, hbuf[MAXHOSTNAMELEN]; char *p, *grfile, *pwfile, *uflag, hbuf[MAXHOSTNAMELEN];
int ch, dflag, rval, matched; int ch, dflag, rval, matched;
#ifdef YYDEBUG #ifdef YYDEBUG
extern int yydebug; extern int yydebug;
@ -119,17 +121,9 @@ main(argc, argv)
Argv = argv; Argv = argv;
Argc = argc; Argc = argc;
setpwent();
setgrent();
pwcache_init();
memset(&pw, 0, sizeof(pw));
sudo_user.pw = &pw;
memset(&rpw, 0, sizeof(rpw));
runas_pw = &rpw;
dflag = 0; dflag = 0;
while ((ch = getopt(argc, argv, "dh:u:")) != -1) { grfile = pwfile = uflag = NULL;
while ((ch = getopt(argc, argv, "dg:h:p:u:")) != -1) {
switch (ch) { switch (ch) {
case 'd': case 'd':
dflag = 1; dflag = 1;
@ -137,9 +131,15 @@ main(argc, argv)
case 'h': case 'h':
user_host = optarg; user_host = optarg;
break; break;
case 'g':
grfile = optarg;
break;
case 'p':
pwfile = optarg;
break;
case 'u': case 'u':
/* XXX - call getpwnam() */ uflag = optarg;
runas_pw->pw_name = optarg; user_runas = &uflag;
break; break;
default: default:
usage(); usage();
@ -150,14 +150,25 @@ main(argc, argv)
argv += optind; argv += optind;
NewArgc = argc; NewArgc = argc;
NewArgv = argv; NewArgv = argv;
/* Set group/passwd file and init the cache. */
if (grfile)
my_setgrfile(grfile);
if (pwfile)
my_setpwfile(pwfile);
sudo_setpwent();
sudo_setgrent();
if (argc < 2) { if (argc < 2) {
if (!dflag) if (!dflag)
usage(); usage();
user_name = "nobody"; if ((sudo_user.pw = sudo_getpwnam("nobody")) == NULL)
errorx(1, "no passwd entry for nobody!");
user_cmnd = user_base = "true"; user_cmnd = user_base = "true";
} else { } else {
user_name = *argv++; if ((sudo_user.pw = sudo_getpwnam(*argv)) == NULL)
user_cmnd = *argv; errorx(1, "no passwd entry for %s!", *argv);
user_cmnd = *++argv;
if ((p = strrchr(user_cmnd, '/')) != NULL) if ((p = strrchr(user_cmnd, '/')) != NULL)
user_base = p + 1; user_base = p + 1;
else else
@ -198,10 +209,13 @@ main(argc, argv)
/* Initialize default values. */ /* Initialize default values. */
init_defaults(); init_defaults();
if (runas_pw->pw_name) if (**user_runas == '#') {
user_runas = &runas_pw->pw_name; if ((runas_pw = sudo_getpwuid(atoi(*user_runas + 1))) == NULL)
else runas_pw = sudo_fakepwnam(*user_runas);
runas_pw->pw_name = *user_runas; } else {
if ((runas_pw = sudo_getpwnam(*user_runas)) == NULL)
errorx(1, "no passwd entry for %s!", *user_runas);
}
/* Load ip addr/mask for each interface. */ /* Load ip addr/mask for each interface. */
load_interfaces(); load_interfaces();
@ -260,6 +274,25 @@ main(argc, argv)
exit(0); exit(0);
} }
void
sudo_setspent()
{
return;
}
void
sudo_endspent()
{
return;
}
char *
sudo_getepw(pw)
const struct passwd *pw;
{
return (pw->pw_passwd);
}
void void
set_fqdn() set_fqdn()
{ {
@ -297,7 +330,8 @@ set_perms(perm)
void void
cleanup() cleanup()
{ {
pwcache_destroy(); sudo_endpwent();
sudo_endgrent();
} }
void void
@ -466,8 +500,6 @@ dump_sudoers()
void void
usage() usage()
{ {
(void) fprintf(stderr, (void) fprintf(stderr, "usage: %s [-d] [-g grfile] [-h host] [-p pwfile] [-u user] <user> <command> [args]\n", getprogname());
"usage: %s [-h host] [-u user] <user> <command> [args]\n",
getprogname());
exit(1); exit(1);
} }