]> code.citadel.org Git - citadel.git/blobdiff - citadel/routines2.c
* Network run frequency is now a site-definable setting
[citadel.git] / citadel / routines2.c
index 4e43f3119a23c53c53b2f23ae7fc95de55debb16..8257176d9699d60aed9e35187dea17065fbea0bb 100644 (file)
@@ -1,6 +1,8 @@
-/* More Citadel/UX routines...
- * unlike routines.c, some of these DO use global variables.
- * $Id$
+/* $Id$
+ *
+ * More client-side support functions.
+ * Unlike routines.c, some of these DO use global variables.
+ *
  */
 
 #include "sysdep.h"
 #include <stdio.h>
 #include <ctype.h>
 #include <string.h>
-#include <time.h>
+#include <limits.h>
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
 #include <signal.h>
 #include <pwd.h>
 #include <setjmp.h>
 #include <errno.h>
 #include <stdarg.h>
 #include "citadel.h"
+#include "citadel_decls.h"
 #include "routines2.h"
 #include "routines.h"
 #include "commands.h"
@@ -36,7 +51,6 @@ int inkey(void);
 void serv_write(char *buf, int nbytes);
 int haschar(char *st, int ch);
 void progress(long int curr, long int cmax);
-void citedit(FILE * fp, long int base_pos);
 int yesno(void);
 
 extern char temp[];
@@ -77,14 +91,15 @@ int room_prompt(int qrflags)
 void entregis(void)
 {                              /* register with name and address */
 
-       char buf[256];
-       char tmpname[256];
-       char tmpaddr[256];
-       char tmpcity[256];
-       char tmpstate[256];
-       char tmpzip[256];
-       char tmpphone[256];
-       char tmpemail[256];
+       char buf[SIZ];
+       char tmpname[SIZ];
+       char tmpaddr[SIZ];
+       char tmpcity[SIZ];
+       char tmpstate[SIZ];
+       char tmpzip[SIZ];
+       char tmpphone[SIZ];
+       char tmpemail[SIZ];
+       char tmpcountry[SIZ];
        int a;
 
        strcpy(tmpname, "");
@@ -94,6 +109,7 @@ void entregis(void)
        strcpy(tmpzip, "");
        strcpy(tmpphone, "");
        strcpy(tmpemail, "");
+       strcpy(tmpcountry, "");
 
        serv_puts("GREG _SELF_");
        serv_gets(buf);
@@ -114,14 +130,17 @@ void entregis(void)
                                strcpy(tmpphone, buf);
                        if (a == 9)
                                strcpy(tmpemail, buf);
+                       if (a == 10)
+                               strcpy(tmpcountry, buf);
                        ++a;
                }
        }
        strprompt("REAL name", tmpname, 29);
        strprompt("Address", tmpaddr, 24);
        strprompt("City/town", tmpcity, 14);
-       strprompt("State", tmpstate, 2);
-       strprompt("ZIP Code", tmpzip, 10);
+       strprompt("State/province", tmpstate, 2);
+       strprompt("ZIP/Postal Code", tmpzip, 10);
+       strprompt("Country", tmpcountry, 31);
        strprompt("Telephone number", tmpphone, 14);
        strprompt("Email address", tmpemail, 31);
 
@@ -139,13 +158,14 @@ void entregis(void)
        serv_puts(tmpzip);
        serv_puts(tmpphone);
        serv_puts(tmpemail);
+       serv_puts(tmpcountry);
        serv_puts("000");
        printf("\n");
 }
 
 void updatels(void)
 {                              /* make all messages old in current room */
-       char buf[256];
+       char buf[SIZ];
        serv_puts("SLRP HIGHEST");
        serv_gets(buf);
        if (buf[0] != '2')
@@ -157,7 +177,7 @@ void updatels(void)
  */
 void updatelsa(void)
 {
-       char buf[256];
+       char buf[SIZ];
        sprintf(buf, "SLRP %ld", highest_msg_read);
        serv_puts(buf);
        serv_gets(buf);
@@ -171,7 +191,7 @@ void updatelsa(void)
  */
 void do_upload(int fd)
 {
-       char buf[256];
+       char buf[SIZ];
        char tbuf[4096];
        long transmitted_bytes, total_bytes;
        int bytes_to_send;
@@ -213,10 +233,10 @@ void do_upload(int fd)
  */
 void cli_upload(void)
 {
-       char flnm[256];
+       char flnm[SIZ];
        char desc[151];
-       char buf[256];
-       char tbuf[256];
+       char buf[SIZ];
+       char tbuf[SIZ];
        int a;
        int fd;
 
@@ -261,8 +281,8 @@ void cli_upload(void)
  */
 void cli_image_upload(char *keyname)
 {
-       char flnm[256];
-       char buf[256];
+       char flnm[SIZ];
+       char buf[SIZ];
        int fd;
 
        sprintf(buf, "UIMG 0|%s", keyname);
@@ -294,9 +314,9 @@ void cli_image_upload(char *keyname)
  */
 void upload(int c)
 {                              /* c = upload mode */
-       char flnm[256];
+       char flnm[SIZ];
        char desc[151];
-       char buf[256];
+       char buf[SIZ];
        char tbuf[4096];
        int xfer_pid;
        int a, b;
@@ -377,7 +397,7 @@ void upload(int c)
        sprintf(buf, "cd %s; ls", tempdir);
        lsfp = popen(buf, "r");
        if (lsfp != NULL) {
-               while (fgets(flnm, 256, lsfp) != NULL) {
+               while (fgets(flnm, sizeof flnm, lsfp) != NULL) {
                        flnm[strlen(flnm) - 1] = 0;
                        sprintf(buf, "%s/%s", tempdir, flnm);
                        fd = open(buf, O_RDONLY);
@@ -420,8 +440,8 @@ void upload(int c)
 void val_user(char *user, int do_validate)
 {
        int a;
-       char cmd[256];
-       char buf[256];
+       char cmd[SIZ];
+       char buf[SIZ];
        int ax = 0;
 
        sprintf(cmd, "GREG %s", user);
@@ -452,6 +472,8 @@ void val_user(char *user, int do_validate)
                                ax = atoi(buf);
                        if (a == 10)
                                printf("%s\n", buf);
+                       if (a == 11)
+                               printf("%s\n", buf);
                } while (strcmp(buf, "000"));
                printf("Current access level: %d (%s)\n", ax, axdefs[ax]);
        } else {
@@ -473,8 +495,8 @@ void val_user(char *user, int do_validate)
 
 void validate(void)
 {                              /* validate new users */
-       char cmd[256];
-       char buf[256];
+       char cmd[SIZ];
+       char buf[SIZ];
        int finished = 0;
 
        do {
@@ -515,7 +537,7 @@ void subshell(void)
 void deletefile(void)
 {
        char filename[32];
-       char cmd[256];
+       char cmd[SIZ];
 
        newprompt("Filename: ", filename, 31);
        if (strlen(filename) == 0)
@@ -531,7 +553,7 @@ void deletefile(void)
  */
 void netsendfile(void)
 {
-       char filename[32], destsys[20], cmd[256];
+       char filename[32], destsys[20], cmd[SIZ];
 
        newprompt("Filename: ", filename, 31);
        if (strlen(filename) == 0)
@@ -551,7 +573,7 @@ void movefile(void)
 {
        char filename[64];
        char newroom[ROOMNAMELEN];
-       char cmd[256];
+       char cmd[SIZ];
 
        newprompt("Filename: ", filename, 63);
        if (strlen(filename) == 0)
@@ -570,24 +592,24 @@ void movefile(void)
  */
 void list_bio(void)
 {
-       char buf[256];
+       char buf[SIZ];
        int pos = 1;
 
        serv_puts("LBIO");
        serv_gets(buf);
        if (buf[0] != '1') {
-               printf("%s\n", &buf[4]);
+               pprintf("%s\n", &buf[4]);
                return;
        }
        while (serv_gets(buf), strcmp(buf, "000")) {
                if ((pos + strlen(buf) + 5) > screenwidth) {
-                       printf("\n");
+                       pprintf("\n");
                        pos = 1;
                }
-               printf("%s, ", buf);
+               pprintf("%s, ", buf);
                pos = pos + strlen(buf) + 2;
        }
-       printf("%c%c  \n\n", 8, 8);
+       pprintf("%c%c  \n\n", 8, 8);
 }
 
 
@@ -596,12 +618,12 @@ void list_bio(void)
  */
 void read_bio(void)
 {
-       char who[256];
-       char buf[256];
+       char who[SIZ];
+       char buf[SIZ];
 
        do {
                newprompt("Read bio for who ('?' for list) : ", who, 25);
-               printf("\n");
+               pprintf("\n");
                if (!strcmp(who, "?"))
                        list_bio();
        } while (!strcmp(who, "?"));
@@ -609,11 +631,11 @@ void read_bio(void)
        serv_puts(buf);
        serv_gets(buf);
        if (buf[0] != '1') {
-               printf("%s\n", &buf[4]);
+               pprintf("%s\n", &buf[4]);
                return;
        }
        while (serv_gets(buf), strcmp(buf, "000")) {
-               printf("%s\n", buf);
+               pprintf("%s\n", buf);
        }
 }
 
@@ -623,11 +645,12 @@ void read_bio(void)
  */
 void do_system_configuration(void)
 {
-       char buf[256];
-       char sc[23][256];
+       char buf[SIZ];
+       char sc[29][SIZ];
        int expire_mode = 0;
        int expire_value = 0;
        int a;
+       int logpages = 0;
 
        /* Clear out the config buffers */
        memset(&sc[0][0], 0, sizeof(sc));
@@ -638,8 +661,9 @@ void do_system_configuration(void)
        if (buf[0] == '1') {
                a = 0;
                while (serv_gets(buf), strcmp(buf, "000")) {
-                       if (a < 23)
+                       if (a < 29) {
                                strcpy(&sc[a][0], buf);
+                       }
                        ++a;
                }
        }
@@ -664,6 +688,9 @@ void do_system_configuration(void)
        strprompt("Name of system administrator", &sc[13][0], 25);
        strprompt("Paginator prompt", &sc[10][0], 79);
 
+       /* this prompt is commented out until we finish the moderation system
+       strprompt("Default moderation filter for new users", &sc[25][0], 4);
+       */
 
        /* Security parameters */
 
@@ -684,8 +711,19 @@ void do_system_configuration(void)
        sprintf(&sc[11][0], "%d", (boolprompt(
              "Restrict Internet mail to only those with that privilege",
                                                     atoi(&sc[11][0]))));
-
-       strprompt("Name of room to log pages", &sc[18][0], ROOMNAMELEN);
+       sprintf(&sc[26][0], "%d", (boolprompt(
+             "Allow Aides to Zap (forget) rooms",
+                                                    atoi(&sc[26][0]))));
+
+       if (strlen(&sc[18][0]) > 0) logpages = 1;
+       else logpages = 0;
+       logpages = boolprompt("Log all pages", logpages);
+       if (logpages) {
+               strprompt("Name of logging room", &sc[18][0], ROOMNAMELEN);
+       }
+       else {
+               sc[18][0] = 0;
+       }
 
 
        /* Server tuning */
@@ -695,11 +733,17 @@ void do_system_configuration(void)
        strprompt("Maximum message length", &sc[20][0], 20);
        strprompt("Minimum number of worker threads", &sc[21][0], 3);
        strprompt("Maximum number of worker threads", &sc[22][0], 3);
+
+       /* no longer applicable ... deprecated
        strprompt("Server-to-server networking password", &sc[15][0], 19);
+       */
 
+       strprompt("How often to run network jobs (in seconds)", &sc[28][0], 5);
+       strprompt("SMTP server port (-1 to disable)", &sc[24][0], 5);
+       strprompt("POP3 server port (-1 to disable)", &sc[23][0], 5);
+       strprompt("IMAP server port (-1 to disable)", &sc[27][0], 5);
 
        /* Expiry settings */
-
        strprompt("Default user purge time (days)", &sc[16][0], 5);
        strprompt("Default room purge time (days)", &sc[17][0], 5);
 
@@ -734,7 +778,7 @@ void do_system_configuration(void)
                serv_puts("CONF set");
                serv_gets(buf);
                if (buf[0] == '4') {
-                       for (a = 0; a < 23; ++a)
+                       for (a = 0; a < 29; ++a)
                                serv_puts(&sc[a][0]);
                        serv_puts("000");
                }
@@ -746,11 +790,32 @@ void do_system_configuration(void)
 }
 
 
+/*
+ * support function for do_internet_configuration()
+ */
+void get_inet_rec_type(char *buf) {
+       int sel;
+
+       keyopt(" <1> localhost       (Alias for this computer)\n");
+       keyopt(" <2> gateway domain  (Domain for all Citadel systems)\n");
+       keyopt(" <3> smart-host      (Forward all outbound mail to this host)\n");
+       sel = intprompt("Which one", 1, 1, 3);
+       switch(sel) {
+               case 1: strcpy(buf, "localhost");
+                       return;
+               case 2: strcpy(buf, "gatewaydomain");
+                       return;
+               case 3: strcpy(buf, "smarthost");
+                       return;
+       }
+}
+
+
 /*
  * Internet mail configuration
  */
 void do_internet_configuration(void) {
-       char buf[256];
+       char buf[SIZ];
        int num_recs = 0;
        char **recs = NULL;
        char ch;
@@ -766,7 +831,7 @@ void do_internet_configuration(void) {
                ++num_recs;
                if (num_recs == 1) recs = malloc(sizeof(char *));
                else recs = realloc(recs, (sizeof(char *)) * num_recs);
-               recs[num_recs-1] = malloc(256);
+               recs[num_recs-1] = malloc(SIZ);
                strcpy(recs[num_recs-1], buf);
        }
 
@@ -792,62 +857,286 @@ void do_internet_configuration(void) {
                color(DIM_WHITE);
                }
 
-               keyopt("\n<A>dd <D>elete <S>ave <Q>uit -> ");
+               ch = keymenu("", "<A>dd|<D>elete|<S>ave|<Q>uit");
+               switch(ch) {
+                       case 'a':
+                               ++num_recs;
+                               if (num_recs == 1)
+                                       recs = malloc(sizeof(char *));
+                               else recs = realloc(recs,
+                                       (sizeof(char *)) * num_recs);
+                               newprompt("Enter host name: ",
+                                       buf, 50);
+                               strcat(buf, "|");
+                               get_inet_rec_type(&buf[strlen(buf)]);
+                               recs[num_recs-1] = strdup(buf);
+                               break;
+                       case 'd':
+                               i = intprompt("Delete which one",
+                                       1, 1, num_recs) - 1;
+                               free(recs[i]);
+                               --num_recs;
+                               for (j=i; j<num_recs; ++j)
+                                       recs[j] = recs[j+1];
+                               break;
+                       case 's':
+                               sprintf(buf, "CONF putsys|%s",
+                                       INTERNETCFG);
+                               serv_puts(buf);
+                               serv_gets(buf);
+                               if (buf[0] == '4') {
+                                       for (i=0; i<num_recs; ++i) {
+                                               serv_puts(recs[i]);
+                                       }
+                                       serv_puts("000");
+                               }
+                               else {
+                                       printf("%s\n", &buf[4]);
+                               }
+                               quitting = 1;
+                               break;
+                       case 'q':
+                               quitting = boolprompt(
+                                       "Quit without saving", 0);
+                               break;
+                       default:
+                               badkey = 1;
+               }
+       } while (quitting == 0);
+
+       if (recs != NULL) {
+               for (i=0; i<num_recs; ++i) free(recs[i]);
+               free(recs);
+       }
+}
+
+
+
+/*
+ * Edit network configuration for room sharing, mailing lists, etc.
+ */
+void network_config_management(char *entrytype, char *comment) {
+       char filename[PATH_MAX];
+       char changefile[PATH_MAX];
+       int e_ex_code;
+       pid_t editor_pid;
+       int cksum;
+       int b, i;
+       char buf[SIZ];
+       char instr[SIZ];
+       char addr[SIZ];
+       FILE *tempfp;
+       FILE *changefp;
+
+       if (strlen(editor_path) == 0) {
+               printf("You must have an external editor configured in order"
+                       " to use this function.\n");
+               return;
+       }
+
+       snprintf(filename, sizeof filename, "%s.listedit", tmpnam(NULL));
+       snprintf(changefile, sizeof changefile, "%s.listedit", tmpnam(NULL));
+
+       tempfp = fopen(filename, "w");
+       if (tempfp == NULL) {
+               printf("Cannot open %s: %s\n", filename, strerror(errno));
+               return;
+       }
+
+       fprintf(tempfp, "# Configuration for room: %s\n", room_name);
+       fprintf(tempfp, "# %s\n", comment);
+       fprintf(tempfp, "# Specify one per line.\n"
+                       "\n\n");
+
+       serv_puts("GNET");
+       serv_gets(buf);
+       if (buf[0] == '1') {
+               while(serv_gets(buf), strcmp(buf, "000")) {
+                       extract(instr, buf, 0);
+                       if (!strcasecmp(instr, entrytype)) {
+                               extract(addr, buf, 1);
+                               fprintf(tempfp, "%s\n", addr);
+                       }
+               }
+       }
+       fclose(tempfp);
+
+       e_ex_code = 1;  /* start with a failed exit code */
+       editor_pid = fork();
+       cksum = file_checksum(filename);
+       if (editor_pid == 0) {
+               chmod(filename, 0600);
+               sttybbs(SB_RESTORE);
+               execlp(editor_path, editor_path, filename, NULL);
+               exit(1);
+       }
+       if (editor_pid > 0) {
                do {
-                       badkey = 0;
-                       ch = inkey();
-                       ch = tolower(ch);
-                       if ( (ch=='d') && (num_recs == 0) ) ch = 0;
-                       switch(ch) {
-                               case 'a':
-                                       printf("Add\n");
-                                       ++num_recs;
-                                       if (num_recs == 1)
-                                               recs = malloc(sizeof(char *));
-                                       else recs = realloc(recs,
-                                               (sizeof(char *)) * num_recs);
-                                       newprompt("Enter host name: ",
-                                               buf, 50);
-                                       strcat(buf, "|");
-                                       newprompt("Enter record type: ",
-                                               &buf[strlen(buf)], 20);
-                                       recs[num_recs-1] = strdup(buf);
-                                       break;
-                               case 'd':
-                                       printf("Delete\n");
-                                       i = intprompt("Delete which one",
-                                               1, 1, num_recs) - 1;
-                                       free(recs[i]);
-                                       --num_recs;
-                                       for (j=i; j<num_recs; ++j)
-                                               recs[j] = recs[j+1];
-                                       break;
-                               case 's':
-                                       printf("Save\n");
-                                       sprintf(buf, "CONF putsys|%s",
-                                               INTERNETCFG);
+                       e_ex_code = 0;
+                       b = ka_wait(&e_ex_code);
+               } while ((b != editor_pid) && (b >= 0));
+       editor_pid = (-1);
+       sttybbs(0);
+       }
+
+       if (file_checksum(filename) == cksum) {
+               printf("*** Not saving changes.\n");
+               e_ex_code = 1;
+       }
+
+       if (e_ex_code == 0) {           /* Save changes */
+               changefp = fopen(changefile, "w");
+               serv_puts("GNET");
+               serv_gets(buf);
+               if (buf[0] == '1') {
+                       while(serv_gets(buf), strcmp(buf, "000")) {
+                               extract(instr, buf, 0);
+                               if (strcasecmp(instr, entrytype)) {
+                                       fprintf(changefp, "%s\n", buf);
+                               }
+                       }
+               }
+               tempfp = fopen(filename, "r");
+               while (fgets(buf, sizeof buf, tempfp) != NULL) {
+                       for (i=0; i<strlen(buf); ++i) {
+                               if (buf[i] == '#') buf[i] = 0;
+                       }
+                       striplt(buf);
+                       if (strlen(buf) > 0) {
+                               fprintf(changefp, "%s|%s\n", entrytype, buf);
+                       }
+               }
+               fclose(tempfp);
+               fclose(changefp);
+
+               /* now write it to the server... */
+               serv_puts("SNET");
+               serv_gets(buf);
+               if (buf[0] == '4') {
+                       changefp = fopen(changefile, "r");
+                       if (changefp != NULL) {
+                               while (fgets(buf, sizeof buf,
+                                      changefp) != NULL) {
+                                       buf[strlen(buf) - 1] = 0;
                                        serv_puts(buf);
-                                       serv_gets(buf);
-                                       if (buf[0] == '4') {
-                                               for (i=0; i<num_recs; ++i) {
-                                                       serv_puts(recs[i]);
-                                               }
-                                               serv_puts("000");
-                                       }
-                                       else {
-                                               printf("%s\n", &buf[4]);
-                                       }
-                                       quitting = 1;
-                                       break;
-                               case 'q':
-                                       printf("Quit\n");
-                                       quitting = boolprompt(
-                                               "Quit without saving", 0);
-                                       break;
-                               default:
-                                       badkey = 1;
+                               }
+                               fclose(changefp);
                        }
-               } while (badkey == 1);
+                       serv_puts("000");
+               }
+       }
+
+       unlink(filename);               /* Delete the temporary files */
+       unlink(changefile);
+}
+
+
+/*
+ * IGnet node configuration
+ */
+void do_ignet_configuration(void) {
+       char buf[SIZ];
+       int num_recs = 0;
+       char **recs = NULL;
+       char ch;
+       int badkey;
+       int i, j;
+       int quitting = 0;
+       
+
+       sprintf(buf, "CONF getsys|%s", IGNETCFG);
+       serv_puts(buf);
+       serv_gets(buf);
+       if (buf[0] == '1') while (serv_gets(buf), strcmp(buf, "000")) {
+               ++num_recs;
+               if (num_recs == 1) recs = malloc(sizeof(char *));
+               else recs = realloc(recs, (sizeof(char *)) * num_recs);
+               recs[num_recs-1] = malloc(SIZ);
+               strcpy(recs[num_recs-1], buf);
+       }
+
+       do {
+               printf("\n");
+               color(BRIGHT_WHITE);
+               printf( "### "
+                       "   Node          "
+                       "  Secret         "
+                       "          Host or IP             "
+                       "Port#\n");
+               color(DIM_WHITE);
+               printf( "--- "
+                       "---------------- "
+                       "---------------- "
+                       "-------------------------------- "
+                       "-----\n");
+               for (i=0; i<num_recs; ++i) {
+               color(DIM_WHITE);
+               printf("%3d ", i+1);
+               extract(buf, recs[i], 0);
+               color(BRIGHT_CYAN);
+               printf("%-16s ", buf);
+               extract(buf, recs[i], 1);
+               color(BRIGHT_MAGENTA);
+               printf("%-16s ", buf);
+               extract(buf, recs[i], 2);
+               color(BRIGHT_CYAN);
+               printf("%-32s ", buf);
+               extract(buf, recs[i], 3);
+               color(BRIGHT_MAGENTA);
+               printf("%-3s\n", buf);
+               color(DIM_WHITE);
+               }
+
+               ch = keymenu("", "<A>dd|<D>elete|<S>ave|<Q>uit");
+               switch(ch) {
+                       case 'a':
+                               ++num_recs;
+                               if (num_recs == 1)
+                                       recs = malloc(sizeof(char *));
+                               else recs = realloc(recs,
+                                       (sizeof(char *)) * num_recs);
+                               newprompt("Enter node name    : ", buf, 16);
+                               strcat(buf, "|");
+                               newprompt("Enter shared secret: ",
+                                       &buf[strlen(buf)], 16);
+                               strcat(buf, "|");
+                               newprompt("Enter host or IP   : ",
+                                       &buf[strlen(buf)], 32);
+                               strcat(buf, "|504");
+                               strprompt("Enter port number  : ",
+                                       &buf[strlen(buf)-3], 5);
+                               recs[num_recs-1] = strdup(buf);
+                               break;
+                       case 'd':
+                               i = intprompt("Delete which one",
+                                       1, 1, num_recs) - 1;
+                               free(recs[i]);
+                               --num_recs;
+                               for (j=i; j<num_recs; ++j)
+                                       recs[j] = recs[j+1];
+                               break;
+                       case 's':
+                               sprintf(buf, "CONF putsys|%s", IGNETCFG);
+                               serv_puts(buf);
+                               serv_gets(buf);
+                               if (buf[0] == '4') {
+                                       for (i=0; i<num_recs; ++i) {
+                                               serv_puts(recs[i]);
+                                       }
+                                       serv_puts("000");
+                               }
+                               else {
+                                       printf("%s\n", &buf[4]);
+                               }
+                               quitting = 1;
+                               break;
+                       case 'q':
+                               quitting = boolprompt(
+                                       "Quit without saving", 0);
+                               break;
+                       default:
+                               badkey = 1;
+               }
        } while (quitting == 0);
 
        if (recs != NULL) {
@@ -855,3 +1144,5 @@ void do_internet_configuration(void) {
                free(recs);
        }
 }
+
+