]> code.citadel.org Git - citadel.git/blobdiff - citadel/citadel.c
removed all references to sprintf from several files (not all files yet)
[citadel.git] / citadel / citadel.c
index e4b427f6e3e187e64baab310cdb6a5bd7199fd28..7f5b7dd43ec84b4e3e34e760a99d7f4aa8c3fc53 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 */
@@ -117,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
  */
@@ -319,7 +326,7 @@ 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;
@@ -327,11 +334,30 @@ void dotgoto(char *towhere, int display_name)
        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);
@@ -505,7 +531,7 @@ void gotonext(void)
                strcpy(next_room, "_BASEROOM_");
        }
        remove_march(next_room, 0);
-       dotgoto(next_room, 1);
+       dotgoto(next_room, 1, 0);
 }
 
 /*
@@ -559,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);
        }
@@ -776,6 +802,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);
@@ -796,6 +829,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);
@@ -812,6 +846,8 @@ void who_is_online(int longlist)
                                        strcat(roomname, " ");
                                }
                                strcpy(&roomname[14], "[idle]");
+                       if (skipidle)
+                  isidle = 1;
                        }
 
                        if (longlist) {
@@ -841,24 +877,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);
+                       }
                        }
                }
        }
@@ -914,8 +952,12 @@ int main(int argc, char **argv)
        signal(SIGTERM, dropcarr);      /* Cleanup gracefully if terminated */
        signal(SIGCONT, catch_sigcont);         /* Catch SIGCONT so we can reset terminal */
 
+#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
@@ -927,19 +969,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")) {
@@ -1038,7 +1091,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 */
                        {
@@ -1096,11 +1149,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);
@@ -1209,11 +1262,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);
@@ -1264,20 +1316,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);
@@ -1494,6 +1546,10 @@ PWOK:
                                do_ignet_configuration();
                                break;
 
+                       case 92:
+                               do_filterlist_configuration();
+                               break;
+
                        case 6:
                                if (rc_alt_semantics)
                                        updatelsa();
@@ -1527,6 +1583,10 @@ PWOK:
                                who_is_online(1);
                                break;
 
+            case 91:
+                who_is_online(2);
+                break;
+                
                        case 80:
                                do_system_configuration();
                                break;