- if (fread(&itmp, sizeof(itmp), 1, f) != 1)
- {
- log(0, 0, 0, 0, "Error reading ip %d from state file: %s\n", i, strerror(errno));
- exit(1);
- }
-
- if (itmp.address != ip_address_pool[i].address)
- {
- log(0, 0, 0, 0, "Mismatched ip %d from state file: pool may only be extended\n", i);
- exit(1);
- }
-
- memcpy(&ip_address_pool[i], &itmp, sizeof(itmp));
- }
-
- if (fread(buf, sizeof(buf), 1, f) != 1 || buf[0] != MAXTUNNEL || buf[1] != sizeof(tunnelt))
- {
- log(0, 0, 0, 0, "Error/mismatch reading tunnel header from state file\n");
- exit(1);
- }
-
- log(2, 0, 0, 0, "Loading %u tunnels\n", MAXTUNNEL);
- if (fread(tunnel, sizeof(tunnelt), MAXTUNNEL, f) != MAXTUNNEL)
- {
- log(0, 0, 0, 0, "Error reading tunnel data from state file\n");
- exit(1);
- }
-
- for (i = 0; i < MAXTUNNEL; i++)
- {
- tunnel[i].controlc = 0;
- tunnel[i].controls = NULL;
- tunnel[i].controle = NULL;
- if (*tunnel[i].hostname)
- log(3, 0, 0, 0, "Created tunnel for %s\n", tunnel[i].hostname);
- }
-
- if (fread(buf, sizeof(buf), 1, f) != 1 || buf[0] != MAXSESSION || buf[1] != sizeof(sessiont))
- {
- log(0, 0, 0, 0, "Error/mismatch reading session header from state file\n");
- exit(1);
- }
-
- log(2, 0, 0, 0, "Loading %u sessions\n", MAXSESSION);
- if (fread(session, sizeof(sessiont), MAXSESSION, f) != MAXSESSION)
- {
- log(0, 0, 0, 0, "Error reading session data from state file\n");
- exit(1);
- }
-
- for (i = 0; i < MAXSESSION; i++)
- {
- session[i].tbf_in = 0;
- session[i].tbf_out = 0;
- if (session[i].opened)
- {
- log(2, 0, i, 0, "Loaded active session for user %s\n", session[i].user);
- if (session[i].ip)
- sessionsetup(session[i].tunnel, i);
- }
- }
-
- fclose(f);
- log(0, 0, 0, 0, "Loaded saved state information\n");
-}
-
-void dump_state()
-{
- FILE *f;
- u32 buf[2];
-
- if (!config->save_state)
- return;
-
- do
- {
- if (!(f = fopen(STATEFILE, "w")))
- break;
-
- log(1, 0, 0, 0, "Dumping state information\n");
-
- if (fwrite(DUMP_MAGIC, sizeof(DUMP_MAGIC) - 1, 1, f) != 1)
- break;
-
- log(2, 0, 0, 0, "Dumping %u ip addresses\n", ip_pool_size);
- buf[0] = ip_pool_size;
- buf[1] = sizeof(ippoolt);
- if (fwrite(buf, sizeof(buf), 1, f) != 1)
- break;
- if (fwrite(ip_address_pool, sizeof(ippoolt), ip_pool_size, f) != ip_pool_size)
- break;
-
- log(2, 0, 0, 0, "Dumping %u tunnels\n", MAXTUNNEL);
- buf[0] = MAXTUNNEL;
- buf[1] = sizeof(tunnelt);
- if (fwrite(buf, sizeof(buf), 1, f) != 1)
- break;
- if (fwrite(tunnel, sizeof(tunnelt), MAXTUNNEL, f) != MAXTUNNEL)
- break;
-
- log(2, 0, 0, 0, "Dumping %u sessions\n", MAXSESSION);
- buf[0] = MAXSESSION;
- buf[1] = sizeof(sessiont);
- if (fwrite(buf, sizeof(buf), 1, f) != 1)
- break;
- if (fwrite(session, sizeof(sessiont), MAXSESSION, f) != MAXSESSION)
- break;
-
- if (fclose(f) == 0)
- return ; // OK
- }
- while (0);
-
- log(0, 0, 0, 0, "Can't write state information: %s\n", strerror(errno));
- unlink(STATEFILE);
-}
-
-void build_chap_response(char *challenge, u8 id, u16 challenge_length, char **challenge_response)
-{
- MD5_CTX ctx;
- *challenge_response = NULL;
-
- if (!*config->l2tpsecret)
- {
- log(0, 0, 0, 0, "LNS requested CHAP authentication, but no l2tp secret is defined\n");
- return;
- }
-
- log(4, 0, 0, 0, " Building challenge response for CHAP request\n");
-
- *challenge_response = (char *)calloc(17, 1);
-
- MD5Init(&ctx);
- MD5Update(&ctx, &id, 1);
- MD5Update(&ctx, config->l2tpsecret, strlen(config->l2tpsecret));
- MD5Update(&ctx, challenge, challenge_length);
- MD5Final(*challenge_response, &ctx);
-
- return;
-}
-
-static int facility_value(char *name)
-{
- int i;
- for (i = 0; facilitynames[i].c_name; i++)
- {
- if (strcmp(facilitynames[i].c_name, name) == 0)
- return facilitynames[i].c_val;
- }
- return 0;
-}
-
-void update_config()
-{
- int i;
- static int timeout = 0;
- static int interval = 0;
-
- // Update logging
- closelog();
- syslog_log = 0;
- if (log_stream)
- {
- fclose(log_stream);
- log_stream = NULL;
- }
- if (*config->log_filename)
- {
- if (strstr(config->log_filename, "syslog:") == config->log_filename)