X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fmain.c;h=092195471e35c730287e5b80e9cf3e0f80e890c1;hb=0875ace97fd7efe9a109a282a2f30c20872c78aa;hp=dbeaeac0ce400338301c9e9cd968541be41fc00b;hpb=bfa20ccde2a70b1252dbb614132f1a4cbee815d4;p=ppp.git diff --git a/pppd/main.c b/pppd/main.c index dbeaeac..0921954 100644 --- a/pppd/main.c +++ b/pppd/main.c @@ -18,7 +18,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: main.c,v 1.51 1998/11/07 06:59:28 paulus Exp $"; +static char rcsid[] = "$Id: main.c,v 1.57 1999/03/08 05:34:43 paulus Exp $"; #endif #include @@ -448,7 +448,16 @@ main(argc, argv) 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) @@ -504,7 +513,14 @@ main(argc, argv) /* 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) @@ -827,13 +843,26 @@ close_tty() restore_tty(ttyfd); - if (tty_mode != (mode_t) -1) - chmod(devnam, tty_mode); + if (tty_mode != (mode_t) -1) { + if (fchmod(ttyfd, tty_mode) != 0) { + /* XXX if devnam is a symlink, this will change the link */ + chmod(devnam, tty_mode); + } + } close(ttyfd); ttyfd = -1; } +/* + * hangup_modem - hang up the modem by clearing DTR. + */ +void hangup_modem(ttyfd) + int ttyfd; +{ + setdtr(ttyfd, 0); +} + struct callout { struct timeval c_time; /* time at which to call routine */ @@ -1141,7 +1170,7 @@ device_script(program, in, out) 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"); @@ -1220,10 +1249,10 @@ run_program(prog, args, must_exist, done, arg) int new_fd; /* Leave the current location */ - (void) setsid(); /* No controlling tty. */ + (void) setsid(); /* No controlling tty. */ (void) umask (S_IRWXG|S_IRWXO); - (void) chdir ("/"); /* no current directory. */ - setuid(geteuid()); + (void) chdir ("/"); /* no current directory. */ + setuid(0); /* set real UID = root */ setgid(getegid()); /* Ensure that nothing of our device environment is inherited. */ @@ -1374,10 +1403,12 @@ format_packet(p, len, printer, arg) } } - for (; len > 0; --len) { + for (i = 0; i < len && i < 32; ++i) { GETCHAR(x, p); printer(arg, " %.2x", x); } + if (i < len) + printer(arg, " ..."); } static void