*/
#ifndef lint
-static char rcsid[] = "$Id: main.c,v 1.54 1999/03/02 05:36:42 paulus Exp $";
+static char rcsid[] = "$Id: main.c,v 1.55 1999/03/02 05:59:21 paulus Exp $";
#endif
#include <stdio.h>
static char pidfilename[MAXPATHLEN]; /* name of pid file */
static char default_devnam[MAXPATHLEN]; /* name of default device */
static pid_t pid; /* Our pid */
-static uid_t uid; /* Our real user-id */
static int conn_running; /* we have a [dis]connector running */
int ttyfd = -1; /* Serial port file descriptor */
int baud_rate; /* Actual bits/second for serial device */
int hungup; /* terminal has been hung up */
int privileged; /* we're running as real uid root */
+int uid; /* real user ID of the user */
int need_holdoff; /* need holdoff period before restarting */
int detached; /* have detached from terminal */
argv[0]);
exit(1);
}
+ setuid(0); /* make real uid = root */
if (!ppp_available()) {
option_error(no_ppp_msg);
hungup = 0;
kill_link = 0;
sigprocmask(SIG_UNBLOCK, &mask, NULL);
- while ((ttyfd = open(devnam, O_NONBLOCK | O_RDWR, 0)) < 0) {
+ for (;;) {
+ /* If the user specified the device name, become the
+ user before opening it. */
+ if (!devnam_info.priv)
+ seteuid(uid);
+ ttyfd = open(devnam, O_NONBLOCK | O_RDWR, 0);
+ if (!devnam_info.priv)
+ seteuid(0);
+ if (ttyfd >= 0)
+ break;
if (errno != EINTR)
syslog(LOG_ERR, "Failed to open %s: %m", devnam);
if (!persist || errno != EINTR)
/* reopen tty if necessary to wait for carrier */
if (connector == NULL && modem) {
- while ((i = open(devnam, O_RDWR)) < 0) {
+ for (;;) {
+ if (!devnam_info.priv)
+ seteuid(uid);
+ i = open(devnam, O_RDWR);
+ if (!devnam_info.priv)
+ seteuid(0);
+ if (i >= 0)
+ break;
if (errno != EINTR)
syslog(LOG_ERR, "Failed to reopen %s: %m", devnam);
if (!persist || errno != EINTR || hungup || kill_link)
close(errfd);
}
}
- setuid(getuid());
+ setuid(uid);
setgid(getgid());
execl("/bin/sh", "sh", "-c", program, (char *)0);
syslog(LOG_ERR, "could not exec /bin/sh: %m");
(void) setsid(); /* No controlling tty. */
(void) umask (S_IRWXG|S_IRWXO);
(void) chdir ("/"); /* no current directory. */
- setuid(geteuid());
setgid(getegid());
/* Ensure that nothing of our device environment is inherited. */
*/
#ifndef lint
-static char rcsid[] = "$Id: options.c,v 1.46 1999/02/26 11:03:34 paulus Exp $";
+static char rcsid[] = "$Id: options.c,v 1.47 1999/03/02 05:59:21 paulus Exp $";
#endif
#include <ctype.h>
int ret;
struct passwd *pw;
- pw = getpwuid(getuid());
+ pw = getpwuid(uid);
if (pw == NULL || (user = pw->pw_dir) == NULL || user[0] == 0)
return 1;
file = _PATH_USEROPT;
readable(fd)
int fd;
{
- uid_t uid;
int ngroups, i;
struct stat sbuf;
GIDSET_TYPE groups[NGROUPS_MAX];
- uid = getuid();
if (uid == 0)
return 1;
if (fstat(fd, &sbuf) != 0)
return -1;
}
- if (!privileged_option) {
- if (!quiet)
- option_error("setting the device name requires root privilege");
- return -1;
- }
-
(void) strncpy(devnam, cp, MAXPATHLEN);
devnam[MAXPATHLEN-1] = 0;
default_device = FALSE;
+ devnam_info.priv = privileged_option;
+ devnam_info.source = option_source;
return 1;
}
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: pppd.h,v 1.25 1999/02/26 11:03:34 paulus Exp $
+ * $Id: pppd.h,v 1.26 1999/03/02 05:59:22 paulus Exp $
*/
/*
extern int need_holdoff; /* Need holdoff period after link terminates */
extern char **script_env; /* Environment variables for scripts */
extern int detached; /* Have detached from controlling tty */
+extern int uid; /* Real user ID of the user running pppd */
/*
* Variables set by command-line options.
char *source; /* where option came from */
};
-extern struct option_info auth_req_info;
+extern struct option_info devnam_info;
extern struct option_info connector_info;
extern struct option_info disconnector_info;
extern struct option_info welcomer_info;