*/
#ifndef lint
-static char rcsid[] = "$Id: main.c,v 1.7 1994/04/18 04:06:26 paulus Exp $";
+static char rcsid[] = "$Id: main.c,v 1.10 1994/05/18 06:00:48 paulus Exp $";
#endif
#define SETSID
#include <syslog.h>
#include <netdb.h>
#include <utmp.h>
+#include <pwd.h>
#include <sys/wait.h>
/*
* /etc/ppp/options exists.
*/
#ifndef REQ_SYSOPTIONS
-#define REQ_SYSOPTIONS 0
-#endif
-
-#ifdef STREAMS
-#undef SGTTY
+#define REQ_SYSOPTIONS 1
#endif
#ifdef SGTTY
char hostname[MAXNAMELEN]; /* Our hostname */
char our_name[MAXNAMELEN];
char remote_name[MAXNAMELEN];
+static char pidfilename[MAXPATHLEN];
static pid_t pid; /* Our pid */
static pid_t pgrpid; /* Process Group ID */
-static char pidfilename[MAXPATHLEN];
+uid_t uid; /* Our real user-id */
char devname[MAXPATHLEN] = "/dev/tty"; /* Device name */
int default_device = TRUE; /* use default device (stdin/out) */
-int fd; /* Device file descriptor */
+int fd = -1; /* Device file descriptor */
int s; /* Socket file descriptor */
int phase; /* where the link is at */
void (*) (void *, char *, ...), void *));
void pr_log __ARGS((void *, char *, ...));
-#ifdef STREAMS
extern char *ttyname __ARGS((int));
-#endif
extern char *getlogin __ARGS((void));
/*
struct cmd *cmdp;
FILE *pidfile;
char *p;
+ struct passwd *pw;
-#ifdef STREAMS
- p = ttyname(fileno(stdin));
+ p = ttyname(0);
if (p)
strcpy(devname, p);
-#endif
if (gethostname(hostname, MAXNAMELEN) < 0 ) {
perror("couldn't get hostname");
hostname[MAXNAMELEN-1] = 0;
pid = getpid();
+ uid = getuid();
if (!ppp_available()) {
fprintf(stderr, "Sorry - PPP is not available on this system\n");
progname = *argv;
- if (!options_from_file(_PATH_SYSOPTIONS, REQ_SYSOPTIONS) ||
+ if (!options_from_file(_PATH_SYSOPTIONS, REQ_SYSOPTIONS, 0) ||
!options_from_user() ||
- !parse_args(argc-1, argv+1))
+ !parse_args(argc-1, argv+1) ||
+ !options_for_tty())
die(1);
check_auth_options();
setipdefault();
magic_init();
p = getlogin();
- if (p == NULL)
- p = "(unknown)";
+ if (p == NULL) {
+ pw = getpwuid(uid);
+ if (pw != NULL && pw->pw_name != NULL)
+ p = pw->pw_name;
+ else
+ p = "(unknown)";
+ }
syslog(LOG_NOTICE, "pppd %s.%d started by %s, uid %d",
- VERSION, PATCHLEVEL, p, getuid());
+ VERSION, PATCHLEVEL, p, uid);
#ifdef SETSID
/*
}
#endif /* TIOCSCTTY */
- /* set line speed, flow control, etc. */
- set_up_tty(fd);
-
/* run connection script */
if (connector) {
MAINDEBUG((LOG_INFO, "Connecting with <%s>", connector));
+ /* set line speed, flow control, etc.; set CLOCAL for now */
+ set_up_tty(fd, 1);
+
/* drop dtr to hang up in case modem is off hook */
if (!default_device && modem) {
setdtr(fd, FALSE);
sleep(1); /* give it time to set up its terminal */
}
+ /* set line speed, flow control, etc.; clear CLOCAL if modem option */
+ set_up_tty(fd, 0);
+
/* set up the serial device as a ppp interface */
establish_ppp();
/*
* set_up_tty: Set up the serial port on `fd' for 8 bits, no parity,
- * at the requested speed, etc.
+ * at the requested speed, etc. If `local' is true, set CLOCAL
+ * regardless of whether the modem option was specified.
*/
-set_up_tty(fd)
- int fd;
+set_up_tty(fd, local)
+ int fd, local;
{
#ifndef SGTTY
- int speed;
+ int speed, x;
struct termios tios;
if (tcgetattr(fd, &tios) < 0) {
#endif /* CRTSCTS */
tios.c_cflag |= CS8 | CREAD | HUPCL;
- if (!modem)
+ if (local || !modem)
tios.c_cflag |= CLOCAL;
tios.c_iflag = IGNBRK | IGNPAR;
tios.c_oflag = 0;
die(1);
}
+#ifdef ultrix
+ x = 0;
+ if (ioctl(fd, (crtscts || modem)? TIOCMODEM: TIOCNMODEM, &x) < 0)
+ syslog(LOG_WARNING, "TIOC(N)MODEM: %m");
+ if (ioctl(fd, (local || !modem)? TIOCNCAR: TIOCCAR) < 0)
+ syslog(LOG_WARNING, "TIOC(N)CAR: %m");
+#endif
+
#else /* SGTTY */
int speed;
struct sgttyb sgttyb;
if (modem)
setdtr(fd, FALSE);
- if (fcntl(fd, F_SETFL, initfdflags) < 0)
+ if (initfdflags != -1 && fcntl(fd, F_SETFL, initfdflags) < 0)
syslog(LOG_WARNING, "fcntl(F_SETFL, fdflags): %m");
disestablish_ppp();
MAINDEBUG((LOG_DEBUG, "Alarm"));
+ if (callout == NULL)
+ return;
/*
* Get the first scheduled timeout and any that were scheduled
* for the same time as a list, and remove them all from callout