]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/main.c
typo
[ppp.git] / pppd / main.c
index a33a5e242188bfc6f0437ce0f448f58853e9750b..4da0b9af4bc73b2eaf9dea34abcea2ec18368938 100644 (file)
@@ -17,9 +17,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#ifndef lint
-static char rcsid[] = "$Id: main.c,v 1.80 1999/07/21 00:24:31 paulus Exp $";
-#endif
+#define RCSID  "$Id: main.c,v 1.83 1999/08/13 06:46:15 paulus Exp $"
 
 #include <stdio.h>
 #include <ctype.h>
@@ -65,6 +63,8 @@ static char rcsid[] = "$Id: main.c,v 1.80 1999/07/21 00:24:31 paulus Exp $";
 #include "atcp.h"
 #endif
 
+static const char rcsid[] = RCSID;
+
 /* interface vars */
 char ifname[32];               /* Interface name */
 int ifunit;                    /* Interface unit number */
@@ -72,6 +72,7 @@ int ifunit;                   /* Interface unit number */
 char *progname;                        /* Name of this program */
 char hostname[MAXNAMELEN];     /* Our hostname */
 static char pidfilename[MAXPATHLEN];   /* name of pid file */
+static char linkpidfile[MAXPATHLEN];   /* name of linkname pid file */
 static char ppp_devnam[MAXPATHLEN]; /* name of PPP tty (maybe ttypx) */
 static uid_t uid;              /* Our real user-id */
 static int conn_running;       /* we have a [dis]connector running */
@@ -87,6 +88,7 @@ struct stat devstat;          /* result of stat() on devnam */
 int prepass = 0;               /* doing prepass to find device name */
 int devnam_fixed;              /* set while in options.ttyxx file */
 volatile int status;           /* exit status for pppd */
+int unsuccess;                 /* # unsuccessful connection attempts */
 
 static int fd_ppp = -1;                /* fd for talking PPP */
 static int fd_loop;            /* fd for getting demand-dial packets */
@@ -143,6 +145,7 @@ static struct subprocess *children;
 /* Prototypes for procedures local to this file. */
 
 static void create_pidfile __P((void));
+static void create_linkpidfile __P((void));
 static void cleanup __P((void));
 static void close_tty __P((void));
 static void get_input __P((void));
@@ -471,6 +474,8 @@ main(argc, argv)
 
     waiting = 0;
 
+    create_linkpidfile();
+
     /*
      * If we're doing dial-on-demand, set up the interface now.
      */
@@ -498,6 +503,7 @@ main(argc, argv)
        ttyfd = -1;
        real_ttyfd = -1;
        status = EXIT_OK;
+       ++unsuccess;
 
        if (demand) {
            /*
@@ -852,11 +858,11 @@ main(argc, argv)
        if (!demand) {
            if (pidfilename[0] != 0
                && unlink(pidfilename) < 0 && errno != ENOENT) 
-               warn("unable to delete pid file: %m");
+               warn("unable to delete pid file %s: %m", pidfilename);
            pidfilename[0] = 0;
        }
 
-       if (!persist)
+       if (!persist || (maxfail > 0 && unsuccess >= maxfail))
            break;
 
        kill_link = 0;
@@ -933,9 +939,11 @@ detach()
     close(2);
     detached = 1;
     log_to_fd = -1;
-    /* update pid file if it has been written already */
+    /* update pid files if they have been written already */
     if (pidfilename[0])
        create_pidfile();
+    if (linkpidfile[0])
+       create_linkpidfile();
 }
 
 /*
@@ -972,6 +980,29 @@ create_pidfile()
     }
     slprintf(numbuf, sizeof(numbuf), "%d", getpid());
     script_setenv("PPPD_PID", numbuf);
+    if (linkpidfile[0])
+       create_linkpidfile();
+}
+
+static void
+create_linkpidfile()
+{
+    FILE *pidfile;
+
+    if (linkname[0] == 0)
+       return;
+    slprintf(linkpidfile, sizeof(linkpidfile), "%sppp-%s.pid",
+            _PATH_VARRUN, linkname);
+    if ((pidfile = fopen(linkpidfile, "w")) != NULL) {
+       fprintf(pidfile, "%d\n", getpid());
+       if (pidfilename[0])
+           fprintf(pidfile, "%s\n", ifname);
+       (void) fclose(pidfile);
+    } else {
+       error("Failed to create pid file %s: %m", linkpidfile);
+       linkpidfile[0] = 0;
+    }
+    script_setenv("LINKNAME", linkname);
 }
 
 /*
@@ -1090,8 +1121,11 @@ cleanup()
        close_tty();
 
     if (pidfilename[0] != 0 && unlink(pidfilename) < 0 && errno != ENOENT) 
-       warn("unable to delete pid file: %m");
+       warn("unable to delete pid file %s: %m", pidfilename);
     pidfilename[0] = 0;
+    if (linkpidfile[0] != 0 && unlink(linkpidfile) < 0 && errno != ENOENT) 
+       warn("unable to delete pid file %s: %m", linkpidfile);
+    linkpidfile[0] = 0;
 
     if (locked)
        unlock();