static u_int32_t proxy_arp_addr; /* Addr for proxy arp entry added */
static char proxy_arp_dev[16]; /* Device for proxy arp entry */
-static char *lock_file;
-
static struct utsname utsname; /* for the kernel version */
static int kernel_version;
#define KVERSION(j,n,p) ((j)*1000000 + (n)*1000 + (p))
extern int hungup;
-#ifndef LOCK_PREFIX
-#define LOCK_PREFIX "/var/lock/LCK.."
-#endif
-
static void set_ppp_fd (int new_fd)
{
SYSDEBUG ((LOG_DEBUG, "setting ppp_fd to %d\n", new_fd));
/*
* Restore the previous line discipline
*/
+ tcflush(tty_fd, TCIOFLUSH);
if (ioctl(tty_fd, TIOCSETD, &tty_disc) < 0) {
if ( ! ok_error (errno))
error("ioctl(TIOCSETD, N_TTY): %m");
ppp_registered(void)
{
int local_fd;
- int init_disc = -1;
- int initfdflags;
-
- local_fd = open(devnam, O_NONBLOCK | O_RDWR, 0);
- if (local_fd < 0) {
- error("Failed to open %s: %m(%d)", devnam, errno);
- return 0;
- }
-
- initfdflags = fcntl(local_fd, F_GETFL);
- if (initfdflags == -1) {
- error("Couldn't get device fd flags: %m(%d)", errno);
- close (local_fd);
+ int mfd = -1;
+ int ret = 0;
+ char slave[16];
+
+ /*
+ * We used to open the serial device and set it to the ppp line
+ * discipline here, in order to create a ppp unit. But that is
+ * not a good idea - the user might have specified a device that
+ * they can't open (permission, or maybe it doesn't really exist).
+ * So we grab a pty master/slave pair and use that.
+ */
+ if (!get_pty(&mfd, &local_fd, slave, 0)) {
+ no_ppp_msg = "Couldn't determine if PPP is supported (no free ptys)";
return 0;
}
- initfdflags &= ~O_NONBLOCK;
- fcntl(local_fd, F_SETFL, initfdflags);
-/*
- * Read the initial line dicipline and try to put the device into the
- * PPP dicipline.
- */
- if (ioctl(local_fd, TIOCGETD, &init_disc) < 0) {
- error("ioctl(TIOCGETD): %m(%d)", errno);
- close (local_fd);
- return 0;
- }
-
+ /*
+ * Try to put the device into the PPP discipline.
+ */
if (ioctl(local_fd, TIOCSETD, &ppp_disc) < 0) {
- error("ioctl(TIOCSETD): %m(%d)", errno);
- close (local_fd);
- return 0;
- }
-
- if (ioctl(local_fd, TIOCSETD, &init_disc) < 0) {
- error("ioctl(TIOCSETD): %m(%d)", errno);
- close (local_fd);
- return 0;
- }
+ error("ioctl(TIOCSETD(PPP)): %m(%d)", errno);
+ } else
+ ret = 1;
- close (local_fd);
- return 1;
+ close(local_fd);
+ close(mfd);
+ return ret;
}
/********************************************************************
struct ifreq ifr;
int size;
int my_version, my_modification, my_patch;
- extern char *no_ppp_msg;
+
+ no_ppp_msg =
+ "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.7 distribution.\n";
+
/*
* Open a socket for doing the ioctl operations.
*/
if (ok && ((ifr.ifr_hwaddr.sa_family & ~0xFF) != ARPHRD_PPP))
ok = 0;
- if (!ok)
- no_ppp_msg =
- "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.7 distribution.\n";
-
/*
* This is the PPP device. Validate the version of the driver at this
* point to ensure that this program will work with the driver.
*/
- else {
+ if (ok) {
char abBuffer [1024];
ifr.ifr_data = abBuffer;
memset(&ut, 0, sizeof(ut));
if (ut.ut_id[0] == 0)
- strlcpy(ut.ut_id, line + 3, sizeof(ut.ut_id));
+ strncpy(ut.ut_id, line + 3, sizeof(ut.ut_id));
- strlcpy(ut.ut_user, name, sizeof(ut.ut_user));
- strlcpy(ut.ut_line, line, sizeof(ut.ut_line));
+ strncpy(ut.ut_user, name, sizeof(ut.ut_user));
+ strncpy(ut.ut_line, line, sizeof(ut.ut_line));
time(&ut.ut_time);
/* Insert the host name if one is supplied */
if (*host)
- strlcpy (ut.ut_host, host, sizeof(ut.ut_host));
+ strncpy (ut.ut_host, host, sizeof(ut.ut_host));
/* Insert the IP address of the remote system if IP is enabled */
if (ipcp_protent.enabled_flag && ipcp_hisoptions[0].neg_addr)
}
}
+#if 0
/********************************************************************
* Code for locking/unlocking the serial device.
* This code is derived from chat.c.
*/
+#ifndef LOCK_PREFIX
+#define LOCK_PREFIX "/var/lock/LCK.."
+#endif
+
+static char *lock_file;
+
/*
* lock - create a lock file for the named device
*/
lock_file = NULL;
}
}
+#endif
/********************************************************************
*
return result;
}
+#if 0
/*
* daemon - Detach us from controlling terminal session.
*/
}
return 0;
}
+#endif
/*
* Use the hostname as part of the random number seed.