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 */
{
if (debug)
{
- log_packet(p, len, "sent ");
+ log_packet(p, len, "sent ", LOG_DEBUG);
}
if (write(ppp_fd, p, len) < 0)
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));
}
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
/* 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);
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);
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
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;
+ }
}