X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fsys-linux.c;h=e92f6845a825b75d6fe043ef8ee52715677bab25;hp=c86d668d8ddda4a6e07e1909019b0cdd806771ca;hb=b326c62b2f2eaeafd0b6a11cecdb11faa31ff38b;hpb=9164ea8da8dd803c9c8a34bb2bab7742669f65de diff --git a/pppd/sys-linux.c b/pppd/sys-linux.c index c86d668..e92f684 100644 --- a/pppd/sys-linux.c +++ b/pppd/sys-linux.c @@ -86,6 +86,7 @@ static int has_proxy_arp = 0; static int driver_version = 0; static int driver_modification = 0; static int driver_patch = 0; +static int driver_is_old = 0; static int restore_term = 0; /* 1 => we've munged the terminal */ static struct termios inittermios; /* Initial TTY termios */ @@ -754,7 +755,7 @@ void output (int unit, unsigned char *p, int len) { if (debug) { - log_packet(p, len, "sent "); + log_packet(p, len, "sent ", LOG_DEBUG); } if (write(ppp_fd, p, len) < 0) @@ -1258,13 +1259,13 @@ int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway) if (defaultroute_exists(&rt)) { - u_int32_t old_gateway = ((struct sockaddr_in *) (&rt.rt_gateway))-> - sin_addr.s_addr; + struct in_addr old_gateway = + ((struct sockaddr_in *) (&rt.rt_gateway))-> sin_addr; - if (old_gateway != gateway) + if (old_gateway.s_addr != gateway) { syslog (LOG_ERR, - "ppp not replacing existing default route to %s[%s]", + "not replacing existing default route to %s [%s]", rt.rt_dev, inet_ntoa (old_gateway)); } @@ -1749,9 +1750,10 @@ int ppp_available(void) if (!ok) { no_ppp_msg = - "This system lacks kernel support for PPP. To include PPP support\n" - "in the kernel, please follow the steps detailed in the " - "README.linux\nfile in the ppp-2.3 distribution.\n"; + "This system lacks kernel support for PPP. This could be because\n" + "the PPP kernel module is not loaded, or because the kernel is\n" + "not configured for PPP. See the README.linux file in the\n" + "ppp-2.3.1 distribution.\n"; } /* * This is the PPP device. Validate the version of the driver at this @@ -1796,7 +1798,12 @@ int ppp_available(void) /* The modification levels must be legal */ if (driver_modification < my_modification) { - ok = 0; + if (driver_modification >= 2) { + /* we can cope with 2.2.0 and above */ + driver_is_old = 1; + } else { + ok = 0; + } } close (s); @@ -2292,15 +2299,27 @@ int cifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr) void open_ppp_loopback(void) { - int flags; + int flags, i; struct termios tios; - if (openpty (&master_fd, &slave_fd, loop_name, NULL, NULL) < 0) - { - syslog(LOG_ERR, "No free pty for loopback"); - die(1); - } + master_fd = -1; + for (i = 0; i < 64; ++i) { + sprintf(loop_name, "/dev/pty%c%x", 'p' + i / 16, i % 16); + master_fd = open(loop_name, O_RDWR, 0); + if (master_fd >= 0) + break; + } + if (master_fd < 0) { + syslog(LOG_ERR, "No free pty for loopback"); + die(1); + } SYSDEBUG((LOG_DEBUG, "using %s for loopback", loop_name)); + loop_name[5] = 't'; + slave_fd = open(loop_name, O_RDWR, 0); + if (slave_fd < 0) { + syslog(LOG_ERR, "Couldn't open %s for loopback: %m", loop_name); + die(1); + } set_ppp_fd(slave_fd); @@ -2517,6 +2536,30 @@ int cipxfaddr (int unit) return result; } +/* + * daemon - Detach us from controlling terminal session. + */ +int +daemon(nochdir, noclose) + int nochdir, noclose; +{ + int pid; + + if ((pid = fork()) < 0) + return -1; + if (pid != 0) + exit(0); /* parent dies */ + setsid(); + if (!nochdir) + chdir("/"); + if (!noclose) { + fclose(stdin); /* don't need stdin, stdout, stderr */ + fclose(stdout); + fclose(stderr); + } + return 0; +} + /******************************************************************** * * sys_check_options - check the options that the user specified @@ -2547,4 +2590,10 @@ sys_check_options(void) break; } #endif + if (demand && driver_is_old) { + option_error("demand dialling is not supported by kernel driver version " + "%d.%d.%d", driver_version, driver_modification, + driver_patch); + demand = 0; + } }