]> code.citadel.org Git - citadel.git/blobdiff - citadel/citadel.c
* support autoconf 2.53
[citadel.git] / citadel / citadel.c
index 5340ffc72456a1a836bb79cdca0aa594ba5cb362..09961d8ebbf31df8eb48ef653693096a90f1bc43 100644 (file)
@@ -83,8 +83,9 @@ int screenwidth;
 int screenheight;
 unsigned room_flags;
 char room_name[ROOMNAMELEN];
-char ugname[ROOMNAMELEN];
-long uglsn;                    /* holds <u>ngoto info */
+char *uglist[UGLISTLEN]; /* size of the ungoto list */
+long uglistlsn[UGLISTLEN]; /* current read position for all the ungoto's. Not going to make any friends with this one. */
+int uglistsize = 0;
 char is_mail = 0;              /* nonzero when we're in a mail room */
 char axlevel = 0;              /* access level */
 char is_room_aide = 0;         /* boolean flag, 1 if room aide */
@@ -108,6 +109,7 @@ char curr_floor = 0;                /* number of current floor */
 char floorlist[128][SIZ];      /* names of floors */
 char express_msgs = 0;         /* express messages waiting! */
 int termn8 = 0;                        /* Set to nonzero to cause a logoff */
+int secure;                    /* Set to nonzero when wire is encrypted */
 
 extern int rc_ansi_color;      /* ansi color value from citadel.rc */
 
@@ -116,9 +118,15 @@ extern int rc_ansi_color;  /* ansi color value from citadel.rc */
  */
 void logoff(int code)
 {
+    int lp;
        if (editor_pid > 0) {   /* kill the editor if it's running */
                kill(editor_pid, SIGHUP);
        }
+
+    /* Free the ungoto list */
+    for (lp = 0; lp < uglistsize; lp++)
+      free (uglist[lp]);
+
 /* shut down the server... but not if the logoff code is 3, because
  * that means we're exiting because we already lost the server
  */
@@ -183,7 +191,7 @@ void formout(char *name)
                scr_printf("%s\n", &cmd[4]);
                return;
        }
-       fmout(screenwidth, NULL,
+       fmout(screenwidth, NULL, NULL,
              ((userflags & US_PAGINATOR) ? 1 : 0),
              screenheight, 1, 1);
 }
@@ -318,19 +326,38 @@ char *pop_march(int desired_floor)
 /*
  * jump directly to a room
  */
-void dotgoto(char *towhere, int display_name)
+void dotgoto(char *towhere, int display_name, int fromungoto)
 {
        char aaa[SIZ], bbb[SIZ], psearch[SIZ];
        static long ls = 0L;
-       int newmailcount;
+       int newmailcount = 0;
        static int oldmailcount = (-1);
        int partial_match, best_match;
        char from_floor;
+    int ugpos = uglistsize;
 
        /* store ungoto information */
-       strcpy(ugname, room_name);
-       uglsn = ls;
-
+    if (fromungoto == 0)
+      {
+        if (uglistsize >= (UGLISTLEN-1))
+          {  /* sloppy slide them all down, hey it's the client, who cares. :-) */
+            int lp;
+            free (uglist[0]);
+            for (lp = 0; lp < (UGLISTLEN-1); lp++)
+              {
+                uglist[lp] = uglist[lp+1];
+                uglistlsn[lp] = uglistlsn[lp+1];
+              }
+            ugpos--;
+          }
+        else
+          uglistsize++;
+        
+        uglist[ugpos] = malloc(strlen(room_name)+1);
+        strcpy(uglist[ugpos], room_name);
+        uglistlsn[ugpos] = ls;
+      }
+      
        /* first try an exact match */
        snprintf(aaa, sizeof aaa, "GOTO %s", towhere);
        serv_puts(aaa);
@@ -437,6 +464,11 @@ void dotgoto(char *towhere, int display_name)
                        color(DIM_WHITE);
                }
                oldmailcount = newmailcount;
+               status_line(serv_info.serv_humannode, serv_info.serv_bbs_city,
+                               room_name, secure, newmailcount);
+       } else {
+               status_line(serv_info.serv_humannode, serv_info.serv_bbs_city,
+                               room_name, secure, -1);
        }
 }
 
@@ -499,7 +531,7 @@ void gotonext(void)
                strcpy(next_room, "_BASEROOM_");
        }
        remove_march(next_room, 0);
-       dotgoto(next_room, 1);
+       dotgoto(next_room, 1, 0);
 }
 
 /*
@@ -553,14 +585,14 @@ void gf_toroom(char *towhere, int mode)
 
        if (mode == GF_GOTO) {  /* <;G>oto mode */
                updatels();
-               dotgoto(towhere, 1);
+               dotgoto(towhere, 1, 0);
        }
        if (mode == GF_SKIP) {  /* <;S>kip mode */
-               dotgoto(towhere, 1);
+               dotgoto(towhere, 1, 0);
                remove_march("_FLOOR_", floor_being_left);
        }
        if (mode == GF_ZAP) {   /* <;Z>ap mode */
-               dotgoto(towhere, 1);
+               dotgoto(towhere, 1, 0);
                remove_march("_FLOOR_", floor_being_left);
                forget_all_rooms_on(floor_being_left);
        }
@@ -657,13 +689,10 @@ void check_screen_dims(void)
                unsigned short ypixels;         /* pixels */
        } xwinsz;
 
-       if (scr_set_windowsize())
-               return;
-
        if (have_xterm) {       /* dynamically size screen if on an xterm */
                if (ioctl(0, TIOCGWINSZ, &xwinsz) == 0) {
                        if (xwinsz.height)
-                               screenheight = (int) xwinsz.height;
+                               screenheight = is_curses_enabled() ? (int)xwinsz.height - 1 : (int) xwinsz.height;
                        if (xwinsz.width)
                                screenwidth = (int) xwinsz.width;
                }
@@ -770,6 +799,13 @@ void who_is_online(int longlist)
        time_t timenow = 0;
        time_t idletime, idlehours, idlemins, idlesecs;
        int last_session = (-1);
+    int skipidle = 0;
+    
+    if (longlist == 2)
+      {
+        longlist = 0;
+        skipidle = 1;
+      }
 
        serv_puts("TIME");
        serv_gets(tbuf);
@@ -790,6 +826,7 @@ void who_is_online(int longlist)
        serv_gets(buf);
        if (buf[0] == '1') {
                while (serv_gets(buf), strcmp(buf, "000")) {
+               int isidle = 0;
                        extract(username, buf, 1);
                        extract(roomname, buf, 2);
                        extract(fromhost, buf, 3);
@@ -806,6 +843,8 @@ void who_is_online(int longlist)
                                        strcat(roomname, " ");
                                }
                                strcpy(&roomname[14], "[idle]");
+                       if (skipidle)
+                  isidle = 1;
                        }
 
                        if (longlist) {
@@ -835,24 +874,26 @@ void who_is_online(int longlist)
                                pprintf("\n");
 
                        } else {
-                               if (extract_int(buf, 0) == last_session) {
-                                       pprintf("        ");
-                               } else {
-                                       color(BRIGHT_MAGENTA);
-                                       pprintf("%-3s ", flags);
-                                       color(DIM_WHITE);
-                                       pprintf("%-3d ", extract_int(buf, 0));
-                               }
-                               last_session = extract_int(buf, 0);
-                               color(BRIGHT_CYAN);
-                               pprintf("%-25s ", username);
-                               color(BRIGHT_MAGENTA);
-                               roomname[20] = 0;
-                               pprintf("%-20s ", roomname);
-                               color(BRIGHT_CYAN);
-                               fromhost[24] = '\0';
-                               pprintf("%-24s\n", fromhost);
-                               color(DIM_WHITE);
+                   if (isidle == 0) {
+                               if (extract_int(buf, 0) == last_session) {
+                                       pprintf("        ");
+                               } else {
+                                       color(BRIGHT_MAGENTA);
+                                       pprintf("%-3s ", flags);
+                                       color(DIM_WHITE);
+                                       pprintf("%-3d ", extract_int(buf, 0));
+                               }
+                               last_session = extract_int(buf, 0);
+                               color(BRIGHT_CYAN);
+                               pprintf("%-25s ", username);
+                               color(BRIGHT_MAGENTA);
+                               roomname[20] = 0;
+                               pprintf("%-20s ", roomname);
+                               color(BRIGHT_CYAN);
+                               fromhost[24] = '\0';
+                               pprintf("%-24s\n", fromhost);
+                               color(DIM_WHITE);
+                       }
                        }
                }
        }
@@ -877,6 +918,11 @@ int shift(int argc, char **argv, int start, int count) {
        return argc;
 }
 
+static void statusHook(char *s) {
+       sln_printf(s);
+       sln_flush();
+}
+
 /*
  * main
  */
@@ -891,6 +937,10 @@ int main(int argc, char **argv)
        char hexstring[MD5_HEXSTRING_SIZE];
        int stored_password = 0;
        char password[SIZ];
+
+       setIPCDeathHook(screen_delete);
+       setIPCErrorPrintf(err_printf);
+       setCryptoStatusHook(statusHook);
        
        /* Permissions sanity check - don't run citadel setuid/setgid */
        if (getuid() != geteuid()) {
@@ -906,10 +956,17 @@ int main(int argc, char **argv)
        sttybbs(SB_NO_INTR);    /* Install the new ones */
        signal(SIGHUP, dropcarr);       /* Cleanup gracefully if carrier is dropped */
        signal(SIGTERM, dropcarr);      /* Cleanup gracefully if terminated */
-       signal(SIGCONT, catch_sigcont);         /* Catch SIGCONT so we can reset terminal */
+       signal(SIGCONT, catch_sigcont); /* Catch SIGCONT so we can reset terminal */
+#ifdef SIGWINCH
+       signal(SIGWINCH, scr_winch);    /* Window resize signal */
+#endif
 
+#ifdef HAVE_OPENSSL
        arg_encrypt = RC_DEFAULT;
+#endif
+#ifdef HAVE_CURSES_H
        arg_screen = RC_DEFAULT;
+#endif
 
        /* 
         * Handle command line options as if we were called like /bin/login
@@ -921,19 +978,30 @@ int main(int argc, char **argv)
                        argc = shift(argc, argv, a, 2);
                }
                if (!strcmp(argv[a], "-x")) {
+#ifdef HAVE_OPENSSL
                        arg_encrypt = RC_NO;
+#endif
                        argc = shift(argc, argv, a, 1);
                }
                if (!strcmp(argv[a], "-X")) {
+#ifdef HAVE_OPENSSL
                        arg_encrypt = RC_YES;
-                       argc = shift(argc, argv, a, 1);
+                        argc = shift(argc, argv, a, 1);
+#else
+                       fprintf(stderr, "Not compiled with encryption support");
+                       return 1;
+#endif
                }
                if (!strcmp(argv[a], "-s")) {
+#ifdef HAVE_CURSES_H
                        arg_screen = RC_NO;
+#endif
                        argc = shift(argc, argv, a, 1);
                }
                if (!strcmp(argv[a], "-S")) {
+#ifdef HAVE_CURSES_H
                        arg_screen = RC_YES;
+#endif
                        argc = shift(argc, argv, a, 1);
                }
                if (!strcmp(argv[a], "-p")) {
@@ -1007,12 +1075,13 @@ int main(int argc, char **argv)
 
        get_serv_info(telnet_client_host);
 
-       if (!starttls()) {
-               sln_printf("Session will not be encrypted.\n");
-       }
-
        scr_printf("%-24s\n%s\n%s\n", serv_info.serv_software, serv_info.serv_humannode,
                serv_info.serv_bbs_city);
+       scr_flush();
+
+       secure = starttls();
+       status_line(serv_info.serv_humannode, serv_info.serv_bbs_city, NULL,
+                       secure, -1);
 
        screenwidth = 80;       /* default screen dimensions */
        screenheight = 24;
@@ -1031,7 +1100,7 @@ GSTA:     /* See if we have a username and password on disk */
                        serv_gets(aaa);
                        if (nonce[0])
                        {
-                               sprintf(aaa, "PAS2 %s", make_apop_string(password, nonce, hexstring));
+                               snprintf(aaa, sizeof aaa, "PAS2 %s", make_apop_string(password, nonce, hexstring, sizeof hexstring));
                        }
                        else    /* Else no APOP */
                        {
@@ -1089,11 +1158,11 @@ GSTA:   /* See if we have a username and password on disk */
 
        if (nonce[0])
        {
-               sprintf(aaa, "PAS2 %s", make_apop_string(password, nonce, hexstring));
+               snprintf(aaa, sizeof aaa, "PAS2 %s", make_apop_string(password, nonce, hexstring, sizeof hexstring));
        }
        else    /* Else no APOP */
        {
-                       snprintf(aaa, sizeof(aaa)-1, "PASS %s", password);
+               snprintf(aaa, sizeof aaa, "PASS %s", password);
        }
        
        serv_puts(aaa);
@@ -1202,11 +1271,10 @@ PWOK:
 
 
        /* Enter the lobby */
-       dotgoto("_BASEROOM_", 1);
+       dotgoto("_BASEROOM_", 1, 0);
 
 /* Main loop for the system... user is logged in. */
-       strcpy(ugname, "");
-       uglsn = 0L;
+    uglistsize = 0;
 
        if (newnow == 1)
                readmsgs(3, 1, 5);
@@ -1257,20 +1325,20 @@ PWOK:
                        case 90:
                                if (!rc_alt_semantics)
                                        updatelsa();
-                               dotgoto(argbuf, 0);
+                               dotgoto(argbuf, 0, 0);
                                break;
                        case 58:
                                updatelsa();
-                               dotgoto("_MAIL_", 1);
+                               dotgoto("_MAIL_", 1, 0);
                                break;
                        case 20:
                                updatels();
-                               dotgoto(argbuf, 0);
+                               dotgoto(argbuf, 0, 0);
                                break;
                        case 52:
                                if (rc_alt_semantics)
                                        updatelsa();
-                               dotgoto(argbuf, 0);
+                               dotgoto(argbuf, 0, 0);
                                break;
                        case 10:
                                readmsgs(0, 1, 0);
@@ -1487,6 +1555,10 @@ PWOK:
                                do_ignet_configuration();
                                break;
 
+                       case 92:
+                               do_filterlist_configuration();
+                               break;
+
                        case 6:
                                if (rc_alt_semantics)
                                        updatelsa();
@@ -1520,6 +1592,10 @@ PWOK:
                                who_is_online(1);
                                break;
 
+            case 91:
+                who_is_online(2);
+                break;
+                
                        case 80:
                                do_system_configuration();
                                break;