]> code.citadel.org Git - citadel.git/blobdiff - citadel/commands.c
* The size constant "256" which shows up everywhere as a buffer size has now
[citadel.git] / citadel / commands.c
index e78c688287766aa4e7418ff3926165aea3f0ff46..3a67eb77eff00991902fe841f57841fef638d30b 100644 (file)
@@ -56,21 +56,22 @@ struct citcmd {
 
 
 int rc_exp_beep;
-char rc_exp_cmd[256];
+char rc_exp_cmd[1024];
 int rc_allow_attachments;
 int rc_display_message_numbers;
 int rc_force_mail_prompts;
 int rc_remember_passwords;
 int rc_ansi_color;
 int num_urls = 0;
-char urls[MAXURLS][256];
-char rc_url_cmd[256];
+char urls[MAXURLS][1024];
+char rc_url_cmd[1024];
 
 char *gl_string;
 int next_lazy_cmd = 5;
 
 int lines_printed = 0;         /* line count for paginator */
 extern int screenwidth, screenheight;
+extern int termn8;
 
 struct citcmd *cmdlist = NULL;
 
@@ -182,38 +183,123 @@ void pprintf(const char *format, ...) {
  */
 void print_express(void)
 {
-       char buf[256];
+       char buf[1024];
        FILE *outpipe;
+       time_t timestamp;
+       struct tm *stamp;
+       int flags = 0;
+       char sender[64];
+       char node[64];
 
        if (express_msgs == 0)
                return;
-       express_msgs = 0;
-       serv_puts("PEXP");
-       serv_gets(buf);
-       if (buf[0] != '1')
-               return;
 
-       if (strlen(rc_exp_cmd) > 0) {
-               outpipe = popen(rc_exp_cmd, "w");
-               if (outpipe != NULL) {
-                       while (serv_gets(buf), strcmp(buf, "000")) {
-                               fprintf(outpipe, "%s\n", buf);
-                       }
-                       pclose(outpipe);
-                       return;
-               }
-       }
-       /* fall back to built-in express message display */
        if (rc_exp_beep) {
                putc(7, stdout);
        }
-       color(BRIGHT_RED);
-       printf("\r---\n");
-       while (serv_gets(buf), strcmp(buf, "000")) {
-               printf("%s\n", buf);
+       if (strlen(rc_exp_cmd) == 0) {
+               color(BRIGHT_RED);
+               printf("\r---");
        }
-       printf("---\n");
+       
+       while (express_msgs != 0) {
+               serv_puts("GEXP");
+               serv_gets(buf);
+               if (buf[0] != '1')
+                       return;
+       
+               express_msgs = extract_int(&buf[4], 0);
+               timestamp = extract_long(&buf[4], 1);
+               flags = extract_int(&buf[4], 2);
+               extract(sender, &buf[4], 3);
+               extract(node, &buf[4], 4);
+       
+               stamp = localtime(&timestamp);
+
+               /* If the page is a Logoff Request, honor it. */
+               if (flags & 2) {
+                       termn8 = 1;
+                       return;
+               }
+       
+               if (strlen(rc_exp_cmd) > 0) {
+                       outpipe = popen(rc_exp_cmd, "w");
+                       if (outpipe != NULL) {
+                               /* Header derived from flags */
+                               if (flags & 2)
+                                       fprintf(outpipe,
+                                              "Please log off now, as requested ");
+                               else if (flags & 1)
+                                       fprintf(outpipe, "Broadcast message ");
+                               else if (flags & 4)
+                                       fprintf(outpipe, "Chat request ");
+                               else
+                                       fprintf(outpipe, "Message ");
+                               /* Timestamp.  Can this be improved? */
+                               if (stamp->tm_hour == 0 || stamp->tm_hour == 12)
+                                       fprintf(outpipe, "at 12:%02d%cm",
+                                               stamp->tm_min, 
+                                               stamp->tm_hour ? 'p' : 'a');
+                               else if (stamp->tm_hour > 12)           /* pm */
+                                       fprintf(outpipe, "at %d:%02dpm",
+                                               stamp->tm_hour - 12,
+                                               stamp->tm_min);
+                               else                                    /* am */
+                                       fprintf(outpipe, "at %d:%02dam",
+                                               stamp->tm_hour, stamp->tm_min);
+                               fprintf(outpipe, " from %s", sender);
+                               if (strncmp(serv_info.serv_nodename, node, 32))
+                                       fprintf(outpipe, " @%s", node);
+                               fprintf(outpipe, ":\n");
+                               while (serv_gets(buf), strcmp(buf, "000")) {
+                                       fprintf(outpipe, "%s\n", buf);
+                               }
+                               pclose(outpipe);
+                               if (express_msgs == 0)
+                                       return;
+                               continue;
+                       }
+               }
+               /* fall back to built-in express message display */
+               printf("\n");
+
+               /* Header derived from flags */
+               if (flags & 2)
+                       printf("Please log off now, as requested ");
+               else if (flags & 1)
+                       printf("Broadcast message ");
+               else if (flags & 4)
+                       printf("Chat request ");
+               else
+                       printf("Message ");
+       
+               /* Timestamp.  Can this be improved? */
+               if (stamp->tm_hour == 0 || stamp->tm_hour == 12)/* 12am/12pm */
+                       printf("at 12:%02d%cm", stamp->tm_min, 
+                               stamp->tm_hour ? 'p' : 'a');
+               else if (stamp->tm_hour > 12)                   /* pm */
+                       printf("at %d:%02dpm",
+                               stamp->tm_hour - 12, stamp->tm_min);
+               else                                            /* am */
+                       printf("at %d:%02dam", stamp->tm_hour, stamp->tm_min);
+               
+               /* Sender */
+               printf(" from %s", sender);
+       
+               /* Remote node, if any */
+               if (strncmp(serv_info.serv_nodename, node, 32))
+                       printf(" @%s", node);
+       
+               printf(":\n");
+       
+               while (serv_gets(buf), strcmp(buf, "000")) {
+                       printf("%s", buf);
+               }
+       }
+       printf("\n---\n");
        color(BRIGHT_WHITE);
+
+
 }
 
 
@@ -228,7 +314,7 @@ void set_keepalives(int s)
 
 static time_t idlet = 0;
 static void really_do_keepalive(void) {
-       char buf[256];
+       char buf[1024];
 
        time(&idlet);
        if (keepalives_enabled == KA_YES) {
@@ -571,7 +657,7 @@ int lkey(void)
 void load_command_set(void)
 {
        FILE *ccfile;
-       char buf[256];
+       char buf[1024];
        struct citcmd *cptr;
        struct citcmd *lastcmd = NULL;
        int a, d;
@@ -615,7 +701,7 @@ void load_command_set(void)
                perror("commands: cannot open citadel.rc");
                logoff(errno);
        }
-       while (fgets(buf, 256, ccfile) != NULL) {
+       while (fgets(buf, sizeof buf, ccfile) != NULL) {
                while ((strlen(buf) > 0) ? (isspace(buf[strlen(buf) - 1])) : 0)
                        buf[strlen(buf) - 1] = 0;
 
@@ -743,7 +829,7 @@ char *cmd_expand(char *strbuf, int mode)
 {
        int a;
        static char exp[64];
-       char buf[256];
+       char buf[1024];
 
        strcpy(exp, strbuf);
 
@@ -1323,7 +1409,7 @@ char keymenu(char *menuprompt, char *menustring) {
        int i, c, a;
        int choices;
        int do_prompt = 0;
-       char buf[256];
+       char buf[1024];
        int ch;
        int display_prompt = 1;