Allow cli session changes to happen if the session is timing out
[l2tpns.git] / l2tpns.c
index 1abe8ac..95f1df4 100644 (file)
--- a/l2tpns.c
+++ b/l2tpns.c
@@ -4,7 +4,7 @@
 // Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced
 // vim: sw=8 ts=8
 
-char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.18 2004/07/28 06:12:30 fred_nerk Exp $";
+char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.21 2004/08/02 06:06:28 fred_nerk Exp $";
 
 #include <arpa/inet.h>
 #include <assert.h>
@@ -94,6 +94,7 @@ int bgp_configured = 0;
 struct config_descriptt config_values[] = {
        CONFIG("debug", debug, INT),
        CONFIG("log_file", log_filename, STRING),
+       CONFIG("pid_file", pid_file, STRING),
        CONFIG("l2tp_secret", l2tpsecret, STRING),
        CONFIG("primary_dns", default_dns1, IP),
        CONFIG("secondary_dns", default_dns2, IP),
@@ -2034,7 +2035,7 @@ int regular_cleanups(void)
                if (!session[s].tunnel) // Session isn't in use
                        continue;
 
-               if (!session[s].die && session[s].ip && !(session[s].flags & SF_IPCP_ACKED) )
+               if (!session[s].die && session[s].ip && !(session[s].flags & SF_IPCP_ACKED))
                {
                        // IPCP has not completed yet. Resend
                        log(3, session[s].ip, s, session[s].tunnel, "No ACK for initial IPCP ConfigReq... resending\n");
@@ -2078,7 +2079,6 @@ int regular_cleanups(void)
                                        (int)(time_now - session[s].last_packet));
                        tunnelsend(b, 24, session[s].tunnel); // send it
                        if (++count >= MAX_ACTIONS) break;
-                       continue;
                }
 
                // Check for actions requested from the CLI
@@ -2130,7 +2130,6 @@ int regular_cleanups(void)
                                cluster_send_session(s);
 
                        if (++count >= MAX_ACTIONS) break;
-                       continue;
                }
        }
 
@@ -2995,6 +2994,10 @@ int main(int argc, char *argv[])
        /* remove plugins (so cleanup code gets run) */
        plugins_done();
 
+       // Remove the PID file if we wrote it
+       if (config->wrote_pid && *config->pid_file == '/')
+               unlink(config->pid_file);
+
        /* kill CLI children */
        signal(SIGTERM, SIG_IGN);
        kill(0, SIGTERM);
@@ -3401,6 +3404,22 @@ void update_config()
                timeout = config->cluster_hb_timeout;
        }
 
+       // Write PID file
+       if (*config->pid_file == '/' && !config->wrote_pid)
+       {
+               FILE *f;
+               if ((f = fopen(config->pid_file, "w")))
+               {
+                       fprintf(f, "%d\n", getpid());
+                       fclose(f);
+                       config->wrote_pid = 1;
+               }
+               else
+               {
+                       log(0, 0, 0, 0, "Can't write to PID file %s: %s\n", config->pid_file, strerror(errno));
+               }
+       }
+
        config->reload_config = 0;
 }
 
@@ -3476,7 +3495,9 @@ int sessionsetup(tunnelidt t, sessionidt s)
        for (r = 0; r < MAXROUTE && session[s].route[r].ip; r++)
                routeset(s, session[s].route[r].ip, session[s].route[r].mask, session[s].ip, 1);
 
-       if (!session[s].sid) {  // did this session just finish radius?
+       if (!session[s].sid)
+       {
+               // did this session just finish radius?
                log(3, session[s].ip, s, t, "Sending initial IPCP to client\n");
                sendipcp(t, s);
                session[s].sid = ++last_sid;