]> code.citadel.org Git - citadel.git/blobdiff - citadel/messages.c
* Changed the comments at the beginning of each file to a consistent format
[citadel.git] / citadel / messages.c
index e8b1d208c04ec86f840f38e2d92ea27b95355a9f..27ff4968bc01a6c9963f857af969584c2dba8f65 100644 (file)
@@ -1,7 +1,8 @@
 /*
+ * $Id$
+ *
  * Citadel/UX message support routines
  * see copyright.txt for copyright information
- * $Id$
  */
 
 #include "sysdep.h"
 #include <stdio.h>
 #include <ctype.h>
 #include <string.h>
-#include <time.h>
 #include <signal.h>
 #include <errno.h>
 #include <limits.h>
 #include <sys/wait.h>
 #include <sys/stat.h>
+#include <sys/time.h>
 #include <stdarg.h>
 #include "citadel.h"
 #include "messages.h"
@@ -37,7 +38,6 @@ struct cittext {
        };
 
 void sttybbs(int cmd);
-int struncmp(char *lstr, char *rstr, int len);
 int fmout(int width, FILE *fp, char pagin, int height, int starting_lp, char subst);
 int haschar(char *st, int ch);
 int checkpagin(int lp, int pagin, int height);
@@ -75,8 +75,6 @@ extern int rc_force_mail_prompts;
 
 extern int editor_pid;
 
-int lines_printed;
-
 void ka_sigcatch(int signum) {
        char buf[256];
        alarm(S_KEEPALIVE);
@@ -186,27 +184,18 @@ void add_word(struct cittext *textlist, char *wordbuf)
 
 
 /*
- * begin editing of an opened file pointed to by fp, beginning at position pos.
+ * begin editing of an opened file pointed to by fp
  */
-void citedit(FILE *fp, long int base_pos)
+void citedit(FILE *fp)
 {
        int a,prev,finished,b,last_space;
        int appending = 0;
        struct cittext *textlist = NULL;
        struct cittext *ptr;
        char wordbuf[MAXWORDBUF];
-       char buf[256];
-       time_t last_server_msg,now;
-
-       /*
-        * we're going to keep track of the last time we talked to
-        * the server, so we can periodically send keep-alive messages
-        * out so it doesn't time out.
-        */
-       time(&last_server_msg);
 
        /* first, load the text into the buffer */
-       fseek(fp,base_pos,0);
+       fseek(fp, 0L, 0);
        textlist = (struct cittext *)malloc(sizeof(struct cittext));
        textlist->next = NULL;
        strcpy(textlist->text,"");
@@ -222,40 +211,51 @@ void citedit(FILE *fp, long int base_pos)
                                add_word(textlist,"\n");
                                add_newline(textlist);
                                add_word(textlist,"");
-                               }
                        }
+               }
                else {
                        wordbuf[strlen(wordbuf)+1] = 0;
                        wordbuf[strlen(wordbuf)] = a;
-                       }
+               }
                if (strlen(wordbuf)+3 > screenwidth) {
                        add_word(textlist,wordbuf);
                        strcpy(wordbuf,"");
-                       }
-               prev = a;
                }
+               prev = a;
+       }
 
        /* get text */
        finished = 0;
        prev = (appending ? 13 : (-1));
        strcpy(wordbuf,"");
+       async_ka_start();
        do {
                a=inkey();
                if (a==10) a=13;
                if (a==9) a=32;
                if (a==127) a=8;
+
+
+       /******* new ***********/
+               if ((a>32)&&(a<127)&&(prev==13)) {
+                       add_word(textlist,"\n");
+                       printf(" ");
+               }
+       /***********************/
+
                if ((a==32)&&(prev==13)) {
                        add_word(textlist,"\n");
                        add_newline(textlist);
-                       }
+               }
+
                if (a==8) {
                        if (strlen(wordbuf)>0) {
                                wordbuf[strlen(wordbuf)-1] = 0;
                                putc(8,stdout);
                                putc(32,stdout);
                                putc(8,stdout);
-                               }
                        }
+               }
                else if (a==13) {
                        printf("\n");
                        if (strlen(wordbuf)==0) finished = 1;
@@ -266,16 +266,16 @@ void citedit(FILE *fp, long int base_pos)
                                        add_word(textlist,wordbuf);
                                        strcpy(wordbuf,&wordbuf[b+1]);
                                        b=0;
-                                       }
+                               }
                                add_word(textlist,wordbuf);
                                strcpy(wordbuf,"");
-                               }
                        }
+               }
                else {
                        putc(a,stdout);
                        wordbuf[strlen(wordbuf)+1] = 0;
                        wordbuf[strlen(wordbuf)] = a;
-                       }
+               }
                if ((strlen(wordbuf)+3) > screenwidth) {
                        last_space = (-1);
                        for (b=0; b<strlen(wordbuf); ++b)
@@ -287,47 +287,40 @@ void citedit(FILE *fp, long int base_pos)
                                        add_word(textlist,wordbuf);
                                        strcpy(wordbuf,&wordbuf[b+1]);
                                        b=0;
-                                       }
+                               }
                                for (b=0; b<strlen(wordbuf); ++b) {
                                        putc(8,stdout);
                                        putc(32,stdout);
                                        putc(8,stdout);
-                                       }
-                               printf("\n%s",wordbuf);
                                }
+                               printf("\n%s",wordbuf);
+                       }
                        else {
                                add_word(textlist,wordbuf);
                                strcpy(wordbuf,"");
                                printf("\n");
-                               }
                        }
+               }
                prev = a;
-
-               /* this check implements the server keep-alive */
-               time(&now);
-               if ( (now - last_server_msg) > S_KEEPALIVE ) {
-                       serv_puts("NOOP");
-                       serv_gets(buf);
-                       last_server_msg = now;
-                       }
-
-               } while (finished==0);
+       } while (finished==0);
+       async_ka_end();
 
        /* write the buffer back to disk */
-       fseek(fp,base_pos,0);
+       fseek(fp, 0L, 0);
        for (ptr=textlist; ptr!=NULL; ptr=ptr->next) {
                fprintf(fp,"%s",ptr->text);
                }
        putc(10,fp);
-       putc(0,fp);
+       fflush(fp);
+       ftruncate(fileno(fp), ftell(fp));
 
        /* and deallocate the memory we used */
        while (textlist!=NULL) {
                ptr=textlist->next;
                free(textlist);
                textlist=ptr;
-               }
        }
+}
 
 
 int read_message(long int num, char pagin) /* Read a message from the server */
@@ -336,9 +329,8 @@ int read_message(long int num, char pagin) /* Read a message from the server */
 {
        char buf[256];
        char m_subject[256];
-       char from[256];
-       time_t now;
-       struct tm *tm;
+       char from[256], node[256], rfca[256];
+       char now[256];
        int format_type = 0;
        int fr = 0;
        int nhdr = 0;
@@ -358,6 +350,11 @@ int read_message(long int num, char pagin) /* Read a message from the server */
                }
 
        strcpy(m_subject,"");
+       strcpy(reply_to, "nobody ... xxxxx");
+       strcpy(from, "");
+       strcpy(node, "");
+       strcpy(rfca, "");
+
        printf("\n");
        ++lines_printed;
        lines_printed = checkpagin(lines_printed,pagin,screenheight);
@@ -378,16 +375,15 @@ int read_message(long int num, char pagin) /* Read a message from the server */
                return(0);
                }
 
-       strcpy(reply_to,"nobody...xxxxx");
-       while(serv_gets(buf), struncmp(buf,"text",4)) {
-               if (!struncmp(buf,"nhdr=yes",8)) nhdr=1;
-               if (!struncmp(buf,"from=",5)) {
+       while(serv_gets(buf), strncasecmp(buf,"text",4)) {
+               if (!strncasecmp(buf,"nhdr=yes",8)) nhdr=1;
+               if (!strncasecmp(buf,"from=",5)) {
                        strcpy(from,&buf[5]);
                        }
                if (nhdr==1) buf[0]='_';
-               if (!struncmp(buf,"type=",5))
+               if (!strncasecmp(buf,"type=",5))
                        format_type=atoi(&buf[5]);
-               if ((!struncmp(buf,"msgn=",5))&&(rc_display_message_numbers)) {
+               if ((!strncasecmp(buf,"msgn=",5))&&(rc_display_message_numbers)) {
                        color(DIM_WHITE);
                        printf("[");
                        color(BRIGHT_WHITE);
@@ -395,16 +391,27 @@ int read_message(long int num, char pagin) /* Read a message from the server */
                        color(DIM_WHITE);
                        printf("] ");
                        }
-               if (!struncmp(buf,"from=",5)) {
+               if (!strncasecmp(buf,"from=",5)) {
                        color(DIM_WHITE);
                        printf("from ");
                        color(BRIGHT_CYAN);
                        printf("%s ",&buf[5]);
                        }
-               if (!struncmp(buf,"subj=",5))
+               if (!strncasecmp(buf,"subj=",5))
                        strcpy(m_subject,&buf[5]);
-               if ((!struncmp(buf,"hnod=",5)) 
-                  && (strucmp(&buf[5],serv_info.serv_humannode))) {
+
+               if (!strncasecmp(buf,"rfca=",5)) {
+                       safestrncpy(rfca, &buf[5], sizeof(rfca) - 5);
+                       color(DIM_WHITE);
+                       printf("<");
+                       color(BRIGHT_BLUE);
+                       printf("%s",&buf[5]);
+                       color(DIM_WHITE);
+                       printf("> ");
+                       }
+               if ((!strncasecmp(buf,"hnod=",5)) 
+                  && (strcasecmp(&buf[5],serv_info.serv_humannode))
+                  && (strlen(rfca) == 0) ) {
                        color(DIM_WHITE);
                        printf("(");
                        color(BRIGHT_WHITE);
@@ -412,47 +419,39 @@ int read_message(long int num, char pagin) /* Read a message from the server */
                        color(DIM_WHITE);
                        printf(") ");
                        }
-               if ((!struncmp(buf,"room=",5))
-                  && (strucmp(&buf[5],room_name))) {
+               if ((!strncasecmp(buf,"room=",5))
+                  && (strcasecmp(&buf[5],room_name)) 
+                  && (strlen(rfca) == 0)) {
                        color(DIM_WHITE);
                        printf("in ");
                        color(BRIGHT_MAGENTA);
                        printf("%s> ",&buf[5]);
                        }
 
-               if (!struncmp(buf,"node=",5)) {
+               if (!strncasecmp(buf,"node=",5)) {
+                       safestrncpy(node, &buf[5], sizeof(buf) - 5);
                        if ( (room_flags&QR_NETWORK)
-                          || ((strucmp(&buf[5],serv_info.serv_nodename)
-                          &&(strucmp(&buf[5],serv_info.serv_fqdn)))))
-                               {
-                               color(DIM_WHITE);
-                               printf("@");
-                               color(BRIGHT_YELLOW);
-                               printf("%s ",&buf[5]);
-                               }
-                       if ((!strucmp(&buf[5],serv_info.serv_nodename))
-                          ||(!strucmp(&buf[5],serv_info.serv_fqdn)))
+                          || ((strcasecmp(&buf[5],serv_info.serv_nodename)
+                          &&(strcasecmp(&buf[5],serv_info.serv_fqdn)))) ) 
                                {
-                               strcpy(reply_to,from);
-                               }
-                       else {
-                               sprintf(reply_to,"%s @ %s",from,&buf[5]);
+                               if (strlen(rfca) == 0) {
+                                       color(DIM_WHITE);
+                                       printf("@");
+                                       color(BRIGHT_YELLOW);
+                                       printf("%s ",&buf[5]);
                                }
                        }
+               }
 
-               if (!struncmp(buf,"rcpt=",5)) {
+               if (!strncasecmp(buf,"rcpt=",5)) {
                        color(DIM_WHITE);
                        printf("to ");
                        color(BRIGHT_CYAN);
                        printf("%s ",&buf[5]);
                        }
-               if (!struncmp(buf,"time=",5)) {
-                       now=atol(&buf[5]);
-                       tm=(struct tm *)localtime(&now);
-                       strcpy(buf,asctime(tm)); buf[strlen(buf)-1]=0;
-                       strcpy(&buf[16],&buf[19]);
-                       color(BRIGHT_MAGENTA);
-                       printf("%s ",&buf[4]);
+               if (!strncasecmp(buf,"time=",5)) {
+                       fmt_date(now, atol(&buf[5]));
+                       printf("%s ", now);
                        }
                }
 
@@ -465,6 +464,14 @@ int read_message(long int num, char pagin) /* Read a message from the server */
                        }
                }
        printf("\n");
+
+       if (strlen(rfca) > 0) {
+               strcpy(reply_to, rfca);
+       }
+       else {
+               snprintf(reply_to, sizeof(reply_to), "%s @ %s", from, node);
+       }
+
        if (pagin == 1) color(BRIGHT_WHITE);
        ++lines_printed;
        lines_printed = checkpagin(lines_printed,pagin,screenheight);
@@ -535,7 +542,7 @@ void replace_string(char *filename, long int startpos)
                buf[strlen(buf)] = a;
                if ( strlen(buf) >= strlen(srch_str) ) {
                        ptr=&buf[strlen(buf)-strlen(srch_str)];
-                       if (!struncmp(ptr,srch_str,strlen(srch_str))) {
+                       if (!strncasecmp(ptr,srch_str,strlen(srch_str))) {
                                strcpy(ptr,rplc_str);
                                ++substitutions;
                                }
@@ -551,22 +558,21 @@ void replace_string(char *filename, long int startpos)
                }
        fseek(fp,wpos,0);
        if (strlen(buf)>0) fwrite((char *)buf,strlen(buf),1,fp);
-       putc(0,fp);
+       wpos = ftell(fp);
        fclose(fp);
+       truncate(filename, wpos);
        printf("<R>eplace made %d substitution(s).\n\n",substitutions);
        }
 
 
-int make_message(char *filename, char *recipient, int anon_type, int format_type, int mode)
-                       /* temporary file name */
-                       /* NULL if it's not mail */
-                       /* see MES_ types in header file */
-                
-         
+int make_message(char *filename,       /* temporary file name */
+               char *recipient,        /* NULL if it's not mail */
+               int anon_type,          /* see MES_ types in header file */
+               int format_type,
+               int mode)
 { 
        FILE *fp;
        int a,b,e_ex_code;
-       time_t now;
        long beg;
        char datestr[64];
        int cksum = 0;
@@ -576,9 +582,7 @@ int make_message(char *filename, char *recipient, int anon_type, int format_type
                mode=0;
                }
 
-       time(&now);
-       strcpy(datestr,asctime(localtime(&now)));
-       datestr[strlen(datestr)-1] = 0;
+       fmt_date(datestr, time(NULL));
 
        if (room_flags & QR_ANONONLY) {
                printf(" ****");
@@ -609,7 +613,7 @@ ME1:        switch(mode) {
 
           case 0:
                fp=fopen(filename,"r+");
-               citedit(fp,beg);
+               citedit(fp);
                fclose(fp);
                goto MECR;
 
@@ -654,21 +658,15 @@ MECR:     if (mode==2) {
                if (e_ex_code==0) goto MEFIN;
                goto MEABT2;
                }
-MECR1: printf("Entry cmd (? for options) -> ");
-MECR2: b=inkey();
-       if (b==NEXT_KEY) b='n';
-       if (b==STOP_KEY) b='s';
-       b=(b&127); b=tolower(b);
-       if (b=='?') {
-               printf("Help\n");
-               formout("saveopt");
-               goto MECR1;
-               }
-       if (b=='a') { printf("Abort\n");        goto MEABT;     }
-       if (b=='c') { printf("Continue\n");     goto ME1;       }
-       if (b=='s') { printf("Save message\n"); goto MEFIN;     } 
+
+       b = keymenu("Entry command (? for options)",
+               "<A>bort|<C>ontinue|<S>ave message|<P>rint formatted|"
+               "<R>eplace string|<H>old message");
+
+       if (b=='a') goto MEABT;
+       if (b=='c') goto ME1;
+       if (b=='s') goto MEFIN;
        if (b=='p') {
-               printf("Print formatted\n");
                printf(" %s from %s",datestr,fullname);
                if (strlen(recipient)>0) printf(" to %s",recipient);
                printf("\n");
@@ -683,15 +681,12 @@ MECR2:    b=inkey();
                goto MECR;
                }
        if (b=='r') {
-               printf("Replace string\n");
                replace_string(filename,0L);
                goto MECR;
                }
        if (b=='h') {
-               printf("Hold message\n");
                return(2);
                }
-       goto MECR2;
 
 MEFIN: return(0);
 
@@ -708,7 +703,13 @@ void transmit_message(FILE *fp)
 {
        char buf[256];
        int ch,a;
-       
+       long msglen;
+       time_t lasttick;
+
+       fseek(fp, 0L, SEEK_END);
+       msglen = ftell(fp);
+       rewind(fp);
+       lasttick = time(NULL);
        strcpy(buf,"");
        while (ch=getc(fp), (ch>=0)) {
                if (ch==10) {
@@ -732,8 +733,18 @@ void transmit_message(FILE *fp)
                                strcpy(buf,"");
                                }
                        }
+
+               if ( (time(NULL) - lasttick) > 2L ) {
+                       printf(" %3ld%% completed\r",
+                               ((ftell(fp) * 100L) / msglen) );
+                       fflush(stdout);
+                       lasttick = time(NULL);
+                       }
+
                }
        serv_puts(buf);
+       printf("                \r");
+       fflush(stdout);
        }
 
 
@@ -1053,8 +1064,7 @@ RMSGREAD: fflush(stdout);
                        color(DIM_WHITE);
                        printf(") ");
 
-                       if (is_mail==1) keyopt("<R>eply ");
-                       keyopt("<B>ack <A>gain <Q>uote <N>ext <S>top ");
+                       keyopt("<B>ack <A>gain <Q>uote <R>eply <N>ext <S>top ");
                        if (rc_url_cmd[0] && num_urls) keyopt("<U>RL View ");
                        keyopt("<?>Help/others -> ");
                        
@@ -1068,7 +1078,6 @@ RMSGREAD: fflush(stdout);
                                        if ((e=='d')||(e=='m')||(e=='c')) e=0;
                                        }
 /* print only if available */  if ((e=='p')&&(strlen(printcmd)==0)) e=0;
-/* can't reply in public rms */        if ((e=='r')&&(is_mail!=1)) e=0;
 /* can't file if not allowed */        if ((e=='f')&&(rc_allow_attachments==0)) e=0;
 /* link only if browser avail*/        if ((e=='u')&&(strlen(rc_url_cmd)==0)) e=0;
                                } while((e!='a')&&(e!='n')&&(e!='s')
@@ -1211,3 +1220,28 @@ void edit_system_message(char *which_message)
        sprintf(write_cmd, "EMSG %s", which_message);
        do_edit(desc, read_cmd, "NOOP", write_cmd);
        }
+
+
+
+
+/*
+ * Verify the message base
+ */
+void check_message_base(void) {
+       char buf[256];
+
+       printf("Please read the documentation before running this command.\n");
+       printf("Having done so, do you still want to check the message base? ");
+       if (yesno()==0) return;
+
+       serv_puts("FSCK");
+       serv_gets(buf);
+       if (buf[0] != '1') {
+               printf("%s\n", &buf[4]);
+               return;
+       }
+
+       while (serv_gets(buf), strcmp(buf, "000")) {
+               printf("%s\n", buf);
+       }
+}