sys_init() will open a socket and keep it open for the whole like of the
process. If pppd is started without all standard fds open then the socket
will get one of their numbers, which will be clobbered later by the
/dev/null fd duplicated by main().

See Debian bug #235192.

diff -ruN ppp.orig/pppd/main.c ppp/pppd/main.c
--- ppp.orig/pppd/main.c	2004-02-29 18:50:12.000000000 +0100
+++ ppp/pppd/main.c	2004-02-29 18:48:56.000000000 +0100
@@ -385,11 +385,6 @@
     if (dryrun)
 	die(0);
 
-    /*
-     * Initialize system-dependent stuff.
-     */
-    sys_init();
-
     /* Make sure fds 0, 1, 2 are open to somewhere. */
     fd_devnull = open(_PATH_DEVNULL, O_RDWR);
     if (fd_devnull < 0)
@@ -401,6 +396,11 @@
 	fd_devnull = i;
     }
 
+    /*
+     * Initialize system-dependent stuff.
+     */
+    sys_init();
+
 #ifdef USE_TDB
     pppdb = tdb_open(_PATH_PPPDB, 0, 0, O_RDWR|O_CREAT, 0644);
     if (pppdb != NULL) {
