X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fsys-svr4.c;h=cff5851d5f0ae77c9c5cadedb8cf8d16489c8f73;hp=20545a7fb79a575b5cba05d2ebdd7275ad3a0d0a;hb=bc45bd7903b4439e920bc2095b7543dc768f7ff8;hpb=a065bb9e75a41b9fddc43fc8fb97a395db7e21c5 diff --git a/pppd/sys-svr4.c b/pppd/sys-svr4.c index 20545a7..cff5851 100644 --- a/pppd/sys-svr4.c +++ b/pppd/sys-svr4.c @@ -26,7 +26,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: sys-svr4.c,v 1.3 1995/06/23 01:54:11 paulus Exp $"; +static char rcsid[] = "$Id: sys-svr4.c,v 1.6 1995/08/16 01:40:51 paulus Exp $"; #endif #include @@ -37,6 +37,8 @@ static char rcsid[] = "$Id: sys-svr4.c,v 1.3 1995/06/23 01:54:11 paulus Exp $"; #include #include #include +#include +#include #include #include #include @@ -47,6 +49,7 @@ static char rcsid[] = "$Id: sys-svr4.c,v 1.3 1995/06/23 01:54:11 paulus Exp $"; #include #include #include +#include #include #include #include @@ -63,6 +66,8 @@ static int ipmuxid = -1; static int restore_term; static struct termios inittermios; +static struct winsize wsinfo; /* Initial window size info */ +static pid_t tty_sid; /* original session ID for terminal */ static int link_mtu, link_mru; @@ -145,6 +150,9 @@ establish_ppp() { int i, ifd; + if (default_device) + tty_sid = getsid((pid_t)0); + pppfd = open("/dev/ppp", O_RDWR | O_NONBLOCK, 0); if (pppfd < 0) { syslog(LOG_ERR, "Can't open /dev/ppp: %m"); @@ -227,6 +235,16 @@ disestablish_ppp() syslog(LOG_ERR, "Couldn't restore tty module %s: %m", tty_modules[i]); } + if (hungup && default_device && tty_sid > 0) { + /* + * If we have received a hangup, we need to send a SIGHUP + * to the terminal's controlling process. The reason is + * that the original stream head for the terminal hasn't + * seen the M_HANGUP message (it went up through the ppp + * driver to the stream head for our fd to /dev/ppp). + */ + kill(tty_sid, SIGHUP); + } } } @@ -356,8 +374,10 @@ set_up_tty(fd, local) die(1); } - if (!restore_term) + if (!restore_term) { inittermios = tios; + ioctl(fd, TIOCGWINSZ, &wsinfo); + } tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB | CLOCAL); if (crtscts > 0) @@ -425,6 +445,7 @@ restore_tty() if (tcsetattr(fd, TCSAFLUSH, &inittermios) < 0) if (!hungup && errno != ENXIO) syslog(LOG_WARNING, "tcsetattr: %m"); + ioctl(fd, TIOCSWINSZ, &wsinfo); restore_term = 0; } } @@ -1148,6 +1169,21 @@ int logwtmp(line, name, host) char *line, *name, *host; { + static struct utmpx utmpx; + + if (name[0] != 0) { + /* logging in */ + strncpy(utmpx.ut_user, name, sizeof(utmpx.ut_user)); + strncpy(utmpx.ut_id, ifname, sizeof(utmpx.ut_id)); + strncpy(utmpx.ut_line, line, sizeof(utmpx.ut_line)); + utmpx.ut_pid = getpid(); + utmpx.ut_type = USER_PROCESS; + } else { + utmpx.ut_type = DEAD_PROCESS; + } + gettimeofday(&utmpx.ut_tv, NULL); + updwtmpx("/var/adm/wtmpx", &utmpx); + return 0; } /* @@ -1162,7 +1198,7 @@ gethostid() syslog(LOG_ERR, "sysinfo: %m"); return 0; } - return strtol(buf, NULL, 16); + return (int) strtoul(buf, NULL, 16); } int @@ -1184,15 +1220,80 @@ strioctl(fd, cmd, ptr, ilen, olen) return 0; } +/* + * lock - create a lock file for the named lock device + * + * XXX Does anybody know what the "032" in the lock file name means? + */ + +#define LOCK_PREFIX "/var/spool/locks/LK.032." +static char lock_file[40]; /* name of lock file created */ + int lock(dev) char *dev; { + int n, fd, pid; + struct stat sbuf; + char ascii_pid[12]; + + if (stat(dev, &sbuf) < 0) { + syslog(LOG_ERR, "Can't get device number for %s: %m", dev); + return -1; + } + if ((sbuf.st_mode & S_IFMT) != S_IFCHR) { + syslog(LOG_ERR, "Can't lock %s: not a character device", dev); + return -1; + } + sprintf(lock_file, "%s%03d.%03d", LOCK_PREFIX, major(sbuf.st_rdev), + minor(sbuf.st_rdev)); + + while ((fd = open(lock_file, O_EXCL | O_CREAT | O_RDWR, 0644)) < 0) { + if (errno == EEXIST + && (fd = open(lock_file, O_RDONLY, 0)) >= 0) { + /* Read the lock file to find out who has the device locked */ + n = read(fd, ascii_pid, 11); + if (n <= 0) { + syslog(LOG_ERR, "Can't read pid from lock file %s", lock_file); + close(fd); + } else { + ascii_pid[n] = 0; + pid = atoi(ascii_pid); + if (pid > 0 && kill(pid, 0) == -1 && errno == ESRCH) { + /* pid no longer exists - remove the lock file */ + if (unlink(lock_file) == 0) { + close(fd); + syslog(LOG_NOTICE, "Removed stale lock on %s (pid %d)", + dev, pid); + continue; + } else + syslog(LOG_WARNING, "Couldn't remove stale lock on %s", + dev); + } else + syslog(LOG_NOTICE, "Device %s is locked by pid %d", + dev, pid); + } + close(fd); + } else + syslog(LOG_ERR, "Can't create lock file %s: %m", lock_file); + lock_file[0] = 0; + return -1; + } + + sprintf(ascii_pid, "%10d\n", getpid()); + write(fd, ascii_pid, 11); + + close(fd); return 1; } -int +/* + * unlock - remove our lockfile + */ unlock() { - return 1; + if (lock_file[0]) { + unlink(lock_file); + lock_file[0] = 0; + } }