* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
-#define RCSID "$Id: main.c,v 1.83 1999/08/13 06:46:15 paulus Exp $"
+#define RCSID "$Id: main.c,v 1.84 1999/08/24 05:31:10 paulus Exp $"
#include <stdio.h>
#include <ctype.h>
#include "fsm.h"
#include "lcp.h"
#include "ipcp.h"
+#ifdef INET6
+#include "ipv6cp.h"
+#endif
#include "upap.h"
#include "chap.h"
#include "ccp.h"
static void bad_signal __P((int));
static void holdoff_end __P((void *));
static int device_script __P((char *, int, int, int));
-static void reap_kids __P((int waitfor));
+static int reap_kids __P((int waitfor));
static void record_child __P((int, char *, void (*) (void *), void *));
static int start_charshunt __P((int, int));
static void charshunt_done __P((void *));
&cbcp_protent,
#endif
&ipcp_protent,
+#ifdef INET6
+ &ipv6cp_protent,
+#endif
&ccp_protent,
#ifdef IPX_CHANGE
&ipxcp_protent,
ngroups = getgroups(NGROUPS_MAX, groups);
+ /*
+ * Initialize magic number generator now so that protocols may
+ * use magic numbers in initialization.
+ */
+ magic_init();
+
/*
* Initialize to the standard option set, then parse, in order,
* the system options file, the user's options file,
script_setenv("DEVICE", devnam);
/*
- * Initialize system-dependent stuff and magic number package.
+ * Initialize system-dependent stuff.
*/
sys_init();
- magic_init();
if (debug)
setlogmask(LOG_UPTO(LOG_DEBUG));
link_stats.bytes_out, link_stats.bytes_in);
}
+ /*
+ * Delete pid file before disestablishing ppp. Otherwise it
+ * can happen that another pppd gets the same unit and then
+ * we delete its pid file.
+ */
+ if (!demand) {
+ if (pidfilename[0] != 0
+ && unlink(pidfilename) < 0 && errno != ENOENT)
+ warn("unable to delete pid file %s: %m", pidfilename);
+ pidfilename[0] = 0;
+ }
+
/*
* If we may want to bring the link up again, transfer
* the ppp unit back to the loopback. Set the
for (chp = children; chp != NULL; chp = chp->next)
dbglog(" script %s, pid %d", chp->prog, chp->pid);
}
- reap_kids(1);
+ if (reap_kids(1) < 0)
+ break;
}
die(status);
* reap_kids - get status from any dead child processes,
* and log a message for abnormal terminations.
*/
-static void
+static int
reap_kids(waitfor)
int waitfor;
{
if (chp)
free(chp);
}
- if (pid == -1 && errno != ECHILD && errno != EINTR)
- error("Error waiting for child process: %m");
+ if (pid == -1) {
+ if (errno == ECHILD)
+ return -1;
+ if (errno != EINTR)
+ error("Error waiting for child process: %m");
+ }
+ return 0;
}