X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=textclient%2Fmessages.c;h=31ca9011f6d6a6b39310df58402286eaf1eb33fc;hb=633eabfc5820a6cc3b3c45793243928d0fa9c099;hp=fe975c5e77dc560cf10e3741cf85746a8b16c0c8;hpb=2dfd5bee542a9d635e380097e63c307bd6c27d65;p=citadel.git diff --git a/textclient/messages.c b/textclient/messages.c index fe975c5e7..31ca9011f 100644 --- a/textclient/messages.c +++ b/textclient/messages.c @@ -1,16 +1,14 @@ -/* - * Text client functions for reading and writing of messages - * - * Copyright (c) 1987-2018 by the citadel.org team - * - * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ +// Text client functions for reading and writing of messages +// +// Copyright (c) 1987-2020 by the citadel.org team +// +// This program is open source software. Use, duplication, and/or +// disclosure are subject to the GNU General Purpose License version 3. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. #include "textclient.h" @@ -30,7 +28,7 @@ struct cittext { void stty_ctdl(int cmd); int haschar(const char *st, int ch); int file_checksum(char *filename); -void progress(CtdlIPC* ipc, unsigned long curr, unsigned long cmax); +void progress(CtdlIPC * ipc, unsigned long curr, unsigned long cmax); unsigned long *msg_arr = NULL; int msg_arr_size = 0; @@ -62,11 +60,10 @@ extern CtdlIPC *ipc_for_signal_handlers; /* KLUDGE cover your eyes */ int num_urls = 0; char urls[MAXURLS][SIZ]; char imagecmd[SIZ]; -int has_images = 0; /* Current msg has images */ +int has_images = 0; /* Current msg has images */ struct parts *last_message_parts = NULL; /* Parts from last msg */ - void ka_sigcatch(int signum) { alarm(S_KEEPALIVE); @@ -127,7 +124,6 @@ int ka_system(char *shc) } - /* * add a newline to the buffer... */ @@ -178,7 +174,7 @@ void add_word(struct cittext *textlist, char *wordbuf) /* * begin editing of an opened file pointed to by fp */ -void citedit(FILE *fp) +void citedit(FILE * fp) { int a, prev, finished, b, last_space; int appending = 0; @@ -261,10 +257,8 @@ void citedit(FILE *fp) for (b = 0; b < strlen(wordbuf); ++b) if (wordbuf[b] == 32) { wordbuf[b] = 0; - add_word(textlist, - wordbuf); - strcpy(wordbuf, - &wordbuf[b + 1]); + add_word(textlist, wordbuf); + strcpy(wordbuf, &wordbuf[b + 1]); b = 0; } add_word(textlist, wordbuf); @@ -284,10 +278,8 @@ void citedit(FILE *fp) for (b = 0; b < strlen(wordbuf); ++b) if (wordbuf[b] == 32) { wordbuf[b] = 0; - add_word(textlist, - wordbuf); - strcpy(wordbuf, - &wordbuf[b + 1]); + add_word(textlist, wordbuf); + strcpy(wordbuf, &wordbuf[b + 1]); b = 0; } for (b = 0; b < strlen(wordbuf); ++b) { @@ -316,7 +308,7 @@ void citedit(FILE *fp) if (rv < 0) scr_printf("failed to set message buffer: %s\n", strerror(errno)); - + /* and deallocate the memory we used */ while (textlist != NULL) { ptr = textlist->next; @@ -346,62 +338,78 @@ void free_parts(struct parts *p) /* * This is a mini RFC2047 decoder. * It only handles strings encoded from UTF-8 as Quoted-printable. + * We can do this "in place" because the converted string will always be smaller than the source string. */ -void mini_2047_decode(char *s) { - if (!s) return; +void mini_2047_decode(char *s) +{ + if (!s) { // no null strings allowed! + return; + } - char *qstart = strstr(s, "=?UTF-8?Q?"); - if (!qstart) return; + char *qstart = strstr(s, "=?UTF-8?Q?"); // Must start with this string + if (!qstart) { + return; + } - char *qend = strstr(s, "?="); - if (!qend) return; + char *qend = strstr(qstart+10, "?="); // Must end with this string + if (!qend) { + return; + } - if (qend <= qstart) return; + if (qend <= qstart) { // And there must be something in between them. + return; + } - strcpy(qstart, &qstart[10]); - qend -= 10; + // The string has qualified for conversion. - char *p = qstart; - while (p < qend) { + strcpy(qend, ""); // Strip the trailer + strcpy(qstart, &qstart[10]); // Strip the header - if (p[0] == '=') { + char *r = qstart; // Pointer to where in the string we're reading + char *w = s; // Pointer to where in the string we're writing + while(*r) { // Loop through the source string + if (r[0] == '=') { // "=" means read a hex character char ch[3]; - ch[0] = p[1]; - ch[1] = p[2]; - ch[2] = p[3]; + ch[0] = r[1]; + ch[1] = r[2]; + ch[2] = r[3]; int c; sscanf(ch, "%02x", &c); - p[0] = c; - strcpy(&p[1], &p[3]); - qend -= 2; + w[0] = c; + r += 3; + ++w; } - - if (p[0] == '_') { - p[0] = ' '; + else if (r[0] == '_') { // "_" is a space + w[0] = ' '; + ++r; + ++w; + } + else { // anything else pass through literally + w[0] = r[0]; + ++r; + ++w; } - - ++p; } - - strcpy(qend, &qend[2]); + w[0] = 0; // null terminate } + /* * Read a message from the server */ int read_message(CtdlIPC *ipc, - long num, /* message number */ - int pagin, /* 0 = normal read, 1 = read with pagination, 2 = header */ - FILE *dest) /* Destination file, NULL for screen */ -{ + long num, /* message number */ + int pagin, /* 0 = normal read, 1 = read with pagination, 2 = header */ + FILE *dest /* Destination file, NULL for screen */ +) { char buf[SIZ]; char now[256]; int format_type = 0; int fr = 0; int nhdr = 0; struct ctdlipcmessage *message = NULL; - int r; /* IPC response code */ + int r; /* IPC response code */ char *converted_text = NULL; char *lineptr; char *nextline; @@ -410,7 +418,6 @@ int read_message(CtdlIPC *ipc, char ch; int linelen; int final_line_is_blank = 0; - has_images = 0; sigcaught = 0; @@ -433,10 +440,12 @@ int read_message(CtdlIPC *ipc, if (dest) { fprintf(dest, "\n "); - } else { + } + else { scr_printf("\n"); - if (pagin != 2) + if (pagin != 2) { scr_printf(" "); + } } if (pagin == 1 && !dest) { color(BRIGHT_CYAN); @@ -445,19 +454,14 @@ int read_message(CtdlIPC *ipc, /* View headers only */ if (pagin == 2) { scr_printf("nhdr=%s\nfrom=%s\ntype=%d\nmsgn=%s\n", - message->nhdr ? "yes" : "no", - message->author, message->type, - message->msgid); + message->nhdr ? "yes" : "no", message->author, message->type, message->msgid); if (!IsEmptyStr(message->subject)) { scr_printf("subj=%s\n", message->subject); } if (!IsEmptyStr(message->email)) { scr_printf("rfca=%s\n", message->email); } - scr_printf("room=%s\ntime=%s", - message->room, - asctime(localtime(&message->time)) - ); + scr_printf("room=%s\ntime=%s", message->room, asctime(localtime(&message->time))); if (!IsEmptyStr(message->recipient)) { scr_printf("rcpt=%s\n", message->recipient); } @@ -466,10 +470,7 @@ int read_message(CtdlIPC *ipc, for (ptr = message->attachments; ptr; ptr = ptr->next) { scr_printf("part=%s|%s|%s|%s|%s|%ld\n", - ptr->name, ptr->filename, ptr->number, - ptr->disposition, ptr->mimetype, - ptr->length - ); + ptr->name, ptr->filename, ptr->number, ptr->disposition, ptr->mimetype, ptr->length); } } scr_printf("\n"); @@ -495,31 +496,34 @@ int read_message(CtdlIPC *ipc, if (nhdr == 1 && !is_room_aide) { if (dest) { fprintf(dest, " ****"); - } else { + } + else { scr_printf(" ****"); } - } else { + } + else { struct tm thetime; localtime_r(&message->time, &thetime); strftime(now, sizeof now, "%F %R", &thetime); if (dest) { fprintf(dest, "%s from %s ", now, message->author); - if (!IsEmptyStr(message->email)) { + if (!message->is_local) { fprintf(dest, "<%s> ", message->email); } - } else { + } + else { color(BRIGHT_CYAN); scr_printf("%s ", now); color(DIM_WHITE); scr_printf("from "); color(BRIGHT_CYAN); scr_printf("%s ", message->author); - if (!IsEmptyStr(message->email)) { + if (!message->is_local) { color(DIM_WHITE); scr_printf("<"); color(BRIGHT_BLUE); scr_printf("%s", message->email); - color(DIM_WHITE); + color(DIM_WHITE); scr_printf("> "); } } @@ -544,7 +548,7 @@ int read_message(CtdlIPC *ipc, } } } - + if (dest) { fprintf(dest, "\n"); } else { @@ -556,8 +560,7 @@ int read_message(CtdlIPC *ipc, if ((message->email != NULL) && (!IsEmptyStr(message->email))) { if (!IsEmptyStr(message->author)) { snprintf(reply_to, sizeof reply_to, "%s <%s>", message->author, message->email); - } - else { + } else { safestrncpy(reply_to, message->email, sizeof reply_to); } } @@ -572,9 +575,10 @@ int read_message(CtdlIPC *ipc, safestrncpy(reply_inreplyto, message->msgid, sizeof reply_inreplyto); } - if (message->references != NULL) if (!IsEmptyStr(message->references)) { - safestrncpy(reply_references, message->references, sizeof reply_references); - } + if (message->references != NULL) + if (!IsEmptyStr(message->references)) { + safestrncpy(reply_references, message->references, sizeof reply_references); + } if (message->subject != NULL) { safestrncpy(reply_subject, message->subject, sizeof reply_subject); @@ -587,6 +591,7 @@ int read_message(CtdlIPC *ipc, color(BRIGHT_CYAN); mini_2047_decode(message->subject); scr_printf("%s\n", message->subject); + } } } @@ -602,7 +607,7 @@ int read_message(CtdlIPC *ipc, * of the client screen. */ if (!strcasecmp(message->content_type, "text/html")) { - converted_text = html_to_ascii(message->text, 0, screenwidth, 0); + converted_text = html_to_ascii(message->text, 0, screenwidth); if (converted_text != NULL) { free(message->text); message->text = converted_text; @@ -627,17 +632,16 @@ int read_message(CtdlIPC *ipc, "ftp://" }; int p = 0; - num_urls = 0; /* Start with a clean slate */ - for (p=0; p<(sizeof urlprefixes / sizeof(char *)); ++p) { + num_urls = 0; /* Start with a clean slate */ + for (p = 0; p < (sizeof urlprefixes / sizeof(char *)); ++p) { searchptr = message->text; - while ( (searchptr != NULL) && (num_urls < MAXURLS) ) { + while ((searchptr != NULL) && (num_urls < MAXURLS)) { searchptr = strstr(searchptr, urlprefixes[p]); if (searchptr != NULL) { safestrncpy(urls[num_urls], searchptr, sizeof(urls[num_urls])); for (i = 0; i < strlen(urls[num_urls]); i++) { ch = urls[num_urls][i]; - if (ch == '>' || ch == '\"' || ch == ')' || - ch == ' ' || ch == '\n') { + if (ch == '>' || ch == '\"' || ch == ')' || ch == ' ' || ch == '\n') { urls[num_urls][i] = 0; break; } @@ -663,12 +667,13 @@ int read_message(CtdlIPC *ipc, if (nextline != NULL) { *nextline = 0; ++nextline; - if (*nextline == 0) nextline = NULL; + if (*nextline == 0) + nextline = NULL; } if (sigcaught == 0) { linelen = strlen(lineptr); - if (linelen && (lineptr[linelen-1] == '\r')) { + if (linelen && (lineptr[linelen - 1] == '\r')) { lineptr[--linelen] = 0; } if (dest) { @@ -677,8 +682,10 @@ int read_message(CtdlIPC *ipc, scr_printf("%s\n", lineptr); } } - if (lineptr[0] == 0) final_line_is_blank = 1; - else final_line_is_blank = 0; + if (lineptr[0] == 0) + final_line_is_blank = 1; + else + final_line_is_blank = 0; lineptr = nextline; } while (nextline); fr = sigcaught; @@ -686,25 +693,24 @@ int read_message(CtdlIPC *ipc, if (!final_line_is_blank) { if (dest) { fprintf(dest, "\n"); - } - else { + } else { scr_printf("\n"); - fr = sigcaught; + fr = sigcaught; } } /* Enumerate any attachments */ - if ( (pagin == 1) && (message->attachments) ) { + if ((pagin == 1) && (message->attachments)) { struct parts *ptr; for (ptr = message->attachments; ptr; ptr = ptr->next) { - if ( (!strcasecmp(ptr->disposition, "attachment")) - || (!strcasecmp(ptr->disposition, "inline")) - || (!strcasecmp(ptr->disposition, "")) - ) { - if ( (strcasecmp(ptr->number, message->mime_chosen)) - && (!IsEmptyStr(ptr->mimetype)) - ) { + if ((!strcasecmp(ptr->disposition, "attachment")) + || (!strcasecmp(ptr->disposition, "inline")) + || (!strcasecmp(ptr->disposition, "")) + ) { + if ((strcasecmp(ptr->number, message->mime_chosen)) + && (!IsEmptyStr(ptr->mimetype)) + ) { color(DIM_WHITE); scr_printf("Part "); color(BRIGHT_MAGENTA); @@ -736,6 +742,7 @@ int read_message(CtdlIPC *ipc, return (fr); } + /* * replace string function for the built-in editor */ @@ -752,12 +759,12 @@ void replace_string(char *filename, long int startpos) long msglen = 0L; int rv; - newprompt("Enter text to be replaced: ", srch_str, (sizeof(srch_str)-1) ); + newprompt("Enter text to be replaced: ", srch_str, (sizeof(srch_str) - 1)); if (IsEmptyStr(srch_str)) { return; } - newprompt("Enter text to replace it with: ", rplc_str, (sizeof(rplc_str)-1) ); + newprompt("Enter text to replace it with: ", rplc_str, (sizeof(rplc_str) - 1)); fp = fopen(filename, "r+"); if (fp == NULL) { @@ -784,7 +791,7 @@ void replace_string(char *filename, long int startpos) rv = fwrite((char *) buf, 128, 1, fp); if (rv < 0) { scr_printf("failed to replace string: %s\n", strerror(errno)); - break; /*whoopsi! */ + break; /*whoopsi! */ } strcpy(buf, &buf[128]); wpos = ftell(fp); @@ -801,18 +808,15 @@ void replace_string(char *filename, long int startpos) scr_printf("eplace made %d substitution(s).\n\n", substitutions); } + /* * Function to begin composing a new message */ -int client_make_message(CtdlIPC *ipc, - char *filename, /* temporary file name */ +int client_make_message(CtdlIPC * ipc, char *filename, /* temporary file name */ char *recipient, /* NULL if it's not mail */ - int is_anonymous, - int format_type, - int mode, - char *subject, /* buffer to store subject line */ - int subject_required -) { + int is_anonymous, int format_type, int mode, char *subject, /* buffer to store subject line */ + int subject_required) +{ FILE *fp; int a, b, e_ex_code; long beg; @@ -820,7 +824,7 @@ int client_make_message(CtdlIPC *ipc, char header[SIZ]; int cksum = 0; - if ( (mode == 2) && (IsEmptyStr(editor_path)) ) { + if ((mode == 2) && (IsEmptyStr(editor_path))) { scr_printf("*** No editor available; using built-in editor.\n"); mode = 0; } @@ -833,25 +837,21 @@ int client_make_message(CtdlIPC *ipc, if (room_flags & QR_ANONONLY && !recipient) { snprintf(header, sizeof header, " ****"); - } - else { - snprintf(header, sizeof header, - " %s from %s", - datestr, - (is_anonymous ? "[anonymous]" : fullname) - ); + } else { + snprintf(header, sizeof header, " %s from %s", datestr, (is_anonymous ? "[anonymous]" : fullname) + ); if (!IsEmptyStr(recipient)) { size_t tmp = strlen(header); - snprintf(&header[tmp], sizeof header - tmp, - " to %s", recipient); + snprintf(&header[tmp], sizeof header - tmp, " to %s", recipient); } } scr_printf("%s\n", header); - if (subject != NULL) if (!IsEmptyStr(subject)) { - scr_printf("Subject: %s\n", subject); - } - - if ( (subject_required) && (IsEmptyStr(subject)) ) { + if (subject != NULL) + if (!IsEmptyStr(subject)) { + scr_printf("Subject: %s\n", subject); + } + + if ((subject_required) && (IsEmptyStr(subject))) { newprompt("Subject: ", subject, 70); } @@ -865,30 +865,27 @@ int client_make_message(CtdlIPC *ipc, fmout(screenwidth, fp, NULL, NULL, 0); beg = ftell(fp); if (beg < 0) - scr_printf("failed to get stream position %s\n", - strerror(errno)); + scr_printf("failed to get stream position %s\n", strerror(errno)); fclose(fp); } else { fp = fopen(filename, "w"); if (fp == NULL) { - scr_printf("*** Error opening temp file!\n %s: %s\n", - filename, strerror(errno) - ); - return(1); + scr_printf("*** Error opening temp file!\n %s: %s\n", filename, strerror(errno) + ); + return (1); } fclose(fp); } } -ME1: switch (mode) { + ME1:switch (mode) { case 0: fp = fopen(filename, "r+"); if (fp == NULL) { - scr_printf("*** Error opening temp file!\n %s: %s\n", - filename, strerror(errno) - ); - return(1); + scr_printf("*** Error opening temp file!\n %s: %s\n", filename, strerror(errno) + ); + return (1); } citedit(fp); fclose(fp); @@ -897,10 +894,8 @@ ME1: switch (mode) { case 1: fp = fopen(filename, "a"); if (fp == NULL) { - scr_printf("*** Error opening temp file!\n" - " %s: %s\n", - filename, strerror(errno)); - return(1); + scr_printf("*** Error opening temp file!\n" " %s: %s\n", filename, strerror(errno)); + return (1); } do { a = inkey(); @@ -919,7 +914,7 @@ ME1: switch (mode) { break; case 2: - default: /* allow 2+ modes */ + default: /* allow 2+ modes */ e_ex_code = 1; /* start with a failed exit code */ stty_ctdl(SB_RESTORE); editor_pid = fork(); @@ -943,7 +938,7 @@ ME1: switch (mode) { break; } -MECR: if (mode >= 2) { + MECR:if (mode >= 2) { if (file_checksum(filename) == cksum) { scr_printf("*** Aborted message.\n"); e_ex_code = 1; @@ -955,34 +950,31 @@ MECR: if (mode >= 2) { } b = keymenu("Entry command (? for options)", - "bort|" - "ontinue|" - "ave message|" - "

rint formatted|" - "add sbject|" - "eplace string|" - "old message" - ); - - if (b == 'a') goto MEABT; - if (b == 'c') goto ME1; - if (b == 's') goto MEFIN; + "bort|" + "ontinue|" "ave message|" "

rint formatted|" "add sbject|" "eplace string|" "old message"); + + if (b == 'a') + goto MEABT; + if (b == 'c') + goto ME1; + if (b == 's') + goto MEFIN; if (b == 'p') { scr_printf(" %s from %s", datestr, fullname); if (!IsEmptyStr(recipient)) { scr_printf(" to %s", recipient); } scr_printf("\n"); - if (subject != NULL) if (!IsEmptyStr(subject)) { - scr_printf("Subject: %s\n", subject); - } + if (subject != NULL) + if (!IsEmptyStr(subject)) { + scr_printf("Subject: %s\n", subject); + } fp = fopen(filename, "r"); if (fp != NULL) { fmout(screenwidth, fp, NULL, NULL, 0); beg = ftell(fp); if (beg < 0) - scr_printf("failed to get stream position %s\n", - strerror(errno)); + scr_printf("failed to get stream position %s\n", strerror(errno)); fclose(fp); } goto MECR; @@ -1001,13 +993,13 @@ MECR: if (mode >= 2) { goto MECR; } -MEFIN: return (0); + MEFIN:return (0); -MEABT: scr_printf("Are you sure? "); + MEABT:scr_printf("Are you sure? "); if (yesno() == 0) { goto ME1; } -MEABT2: unlink(filename); + MEABT2:unlink(filename); return (2); } @@ -1015,11 +1007,11 @@ MEABT2: unlink(filename); /* * Make sure there's room in msg_arr[] for at least one more. */ -void check_msg_arr_size(void) { +void check_msg_arr_size(void) +{ if ((num_msgs + 1) > msg_arr_size) { msg_arr_size += 512; - msg_arr = realloc(msg_arr, - ((sizeof(long)) * msg_arr_size) ); + msg_arr = realloc(msg_arr, ((sizeof(long)) * msg_arr_size)); } } @@ -1028,7 +1020,8 @@ void check_msg_arr_size(void) { * break_big_lines() - break up lines that are >1024 characters * otherwise the server will truncate */ -void break_big_lines(char *msg) { +void break_big_lines(char *msg) +{ char *ptr; char *break_here; @@ -1052,11 +1045,11 @@ void break_big_lines(char *msg) { * entmsg() - edit and create a message * returns 0 if message was saved */ -int entmsg(CtdlIPC *ipc, - int is_reply, /* nonzero if this was a eply command */ - int c, /* mode */ - int masquerade /* prompt for a non-default display name? */ -) { +int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a eply command */ + int c, /* mode */ + int masquerade /* prompt for a non-default display name? */ + ) +{ char buf[SIZ]; int a, b; int need_recp = 0; @@ -1069,15 +1062,28 @@ int entmsg(CtdlIPC *ipc, int r; /* IPC response code */ int subject_required = 0; - if (!entmsg_ok) { + if (entmsg_ok == ENTMSG_OK_YES) { + /* no problem, go right ahead */ + } + else if (entmsg_ok == ENTMSG_OK_BLOG) { + if (!is_reply) { + scr_printf("WARNING: this is a BLOG room.\n"); + scr_printf("The 'nter Message' command will create a BLOG POST.\n"); + scr_printf("If you want to leave a comment or reply to a comment, use the 'eply' command.\n"); + scr_printf("Do you really want to create a new blog post? "); + if (!yesno()) { + return(1); + } + } + } + else { scr_printf("You may not enter messages in this type of room.\n"); - return(1); + return (1); } if (c > 0) { mode = 1; - } - else { + } else { mode = 0; } @@ -1091,7 +1097,7 @@ int entmsg(CtdlIPC *ipc, strcpy(message.author, ""); strcpy(message.subject, ""); strcpy(message.references, ""); - message.text = ""; /* point to "", changes later */ + message.text = ""; /* point to "", changes later */ message.anonymous = 0; message.type = mode; @@ -1102,15 +1108,10 @@ int entmsg(CtdlIPC *ipc, if (is_reply) { if (!IsEmptyStr(reply_subject)) { - if (!strncasecmp(reply_subject, - "Re: ", 3)) { + if (!strncasecmp(reply_subject, "Re: ", 3)) { strcpy(message.subject, reply_subject); - } - else { - snprintf(message.subject, - sizeof message.subject, - "Re: %s", - reply_subject); + } else { + snprintf(message.subject, sizeof message.subject, "Re: %s", reply_subject); } } @@ -1119,15 +1120,12 @@ int entmsg(CtdlIPC *ipc, */ int rrtok = num_tokens(reply_references, '|'); int rrlen = strlen(reply_references); - if ( ((rrtok >= 3) && (rrlen > 900)) || (rrtok > 10) ) { + if (((rrtok >= 3) && (rrlen > 900)) || (rrtok > 10)) { remove_token(reply_references, 1, '|'); } snprintf(message.references, sizeof message.references, "%s%s%s", - reply_references, - (IsEmptyStr(reply_references) ? "" : "|"), - reply_inreplyto - ); + reply_references, (IsEmptyStr(reply_references) ? "" : "|"), reply_inreplyto); } r = CtdlIPCPostMessage(ipc, 0, &subject_required, &message, buf); @@ -1159,7 +1157,7 @@ int entmsg(CtdlIPC *ipc, if (is_reply) { strcpy(buf, reply_to); } else { - newprompt("Enter recipient: ", buf, SIZ-100); + newprompt("Enter recipient: ", buf, SIZ - 100); if (IsEmptyStr(buf)) { return (1); } @@ -1177,7 +1175,7 @@ int entmsg(CtdlIPC *ipc, /* If it's mail, we've got to check the validity of the recipient... */ if (!IsEmptyStr(message.recipient)) { - r = CtdlIPCPostMessage(ipc, 0, &subject_required, &message, buf); + r = CtdlIPCPostMessage(ipc, 0, &subject_required, &message, buf); if (r / 100 != 2) { scr_printf("%s\n", buf); return (1); @@ -1185,21 +1183,20 @@ int entmsg(CtdlIPC *ipc, } /* Learn the number of the newest message in in the room, so we can - * tell upon saving whether someone else has posted too. - */ + * tell upon saving whether someone else has posted too. + */ num_msgs = 0; r = CtdlIPCGetMessages(ipc, LastMessages, 1, NULL, &msgarr, buf); if (r / 100 != 1) { scr_printf("%s\n", buf); } else { - for (num_msgs = 0; msgarr[num_msgs]; num_msgs++) - ; + for (num_msgs = 0; msgarr[num_msgs]; num_msgs++); } /* Now compose the message... */ - if (client_make_message(ipc, temp, message.recipient, - message.anonymous, 0, c, message.subject, subject_required) != 0) { - if (msgarr) free(msgarr); + if (client_make_message(ipc, temp, message.recipient, message.anonymous, 0, c, message.subject, subject_required) != 0) { + if (msgarr) + free(msgarr); return (2); } @@ -1207,14 +1204,13 @@ int entmsg(CtdlIPC *ipc, fp = fopen(temp, "r"); if (!fp || !(message.text = load_message_from_file(fp))) { - scr_printf("*** Internal error while trying to save message!\n" - "%s: %s\n", - temp, strerror(errno)); + scr_printf("*** Internal error while trying to save message!\n" "%s: %s\n", temp, strerror(errno)); unlink(temp); - return(errno); + return (errno); } - if (fp) fclose(fp); + if (fp) + fclose(fp); /* Break lines that are >1024 characters, otherwise the server * will truncate them. @@ -1231,16 +1227,17 @@ int entmsg(CtdlIPC *ipc, /* Yes, unlink it now, so it doesn't stick around if we crash */ unlink(temp); - if (num_msgs >= 1) highmsg = msgarr[num_msgs - 1]; + if (num_msgs >= 1) + highmsg = msgarr[num_msgs - 1]; - if (msgarr) free(msgarr); + if (msgarr) + free(msgarr); msgarr = NULL; r = CtdlIPCGetMessages(ipc, NewMessages, 0, NULL, &msgarr, buf); if (r / 100 != 1) { scr_printf("%s\n", buf); } else { - for (num_msgs = 0; msgarr[num_msgs]; num_msgs++) - ; + for (num_msgs = 0; msgarr[num_msgs]; num_msgs++); } /* get new highest message number in room to set lrp for goto... */ @@ -1253,7 +1250,8 @@ int entmsg(CtdlIPC *ipc, ++b; } } - if (msgarr) free(msgarr); + if (msgarr) + free(msgarr); msgarr = NULL; /* In the Mail> room, this algorithm always counts one message @@ -1264,18 +1262,16 @@ int entmsg(CtdlIPC *ipc, } if (b == 1) { - scr_printf("*** 1 additional message has been entered " - "in this room by another user.\n"); - } - else if (b > 1) { - scr_printf("*** %d additional messages have been entered " - "in this room by other users.\n", b); + scr_printf("*** 1 additional message has been entered " "in this room by another user.\n"); + } else if (b > 1) { + scr_printf("*** %d additional messages have been entered " "in this room by other users.\n", b); } - free(message.text); + free(message.text); - return(0); + return (0); } + /* * Do editing on a quoted file */ @@ -1310,8 +1306,9 @@ void process_quote(void) } tfile = fopen(temp, "w"); while (fgets(buf, 128, qfile) != NULL) { - if ((++line >= qstart) && (line <= qend)) + if ((++line >= qstart) && (line <= qend)) { fprintf(tfile, " >%s", buf); + } } fprintf(tfile, " \n"); fclose(qfile); @@ -1320,18 +1317,17 @@ void process_quote(void) } - /* - * List the URL's which were embedded in the previous message + * List the URLs which were embedded in the previous message */ -void list_urls(CtdlIPC *ipc) +void list_urls(CtdlIPC * ipc) { int i; char cmd[SIZ]; int rv; if (num_urls == 0) { - scr_printf("There were no URL's in the previous message.\n\n"); + scr_printf("There were no URLs in the previous message.\n\n"); return; } @@ -1344,8 +1340,6 @@ void list_urls(CtdlIPC *ipc) snprintf(cmd, sizeof cmd, rc_url_cmd, urls[i - 1]); rv = system(cmd); - if (rv != 0) - scr_printf("failed to '%s' by %d\n", cmd, rv); scr_printf("\n"); } @@ -1407,7 +1401,7 @@ int do_image_view(const char *filename) waitpid(childpid, &retcode, 0); return retcode; } - + return -1; } @@ -1415,7 +1409,7 @@ int do_image_view(const char *filename) /* * View an image attached to a message */ -void image_view(CtdlIPC *ipc, unsigned long msg) +void image_view(CtdlIPC * ipc, unsigned long msg) { struct parts *ptr = last_message_parts; char part[SIZ]; @@ -1424,8 +1418,8 @@ void image_view(CtdlIPC *ipc, unsigned long msg) /* Run through available parts */ for (ptr = last_message_parts; ptr; ptr = ptr->next) { if ((!strcasecmp(ptr->disposition, "attachment") - || !strcasecmp(ptr->disposition, "inline")) - && !strncmp(ptr->mimetype, "image/", 6)) { + || !strcasecmp(ptr->disposition, "inline")) + && !strncmp(ptr->mimetype, "image/", 6)) { found++; if (found == 1) { strcpy(part, ptr->number); @@ -1435,18 +1429,18 @@ void image_view(CtdlIPC *ipc, unsigned long msg) while (found > 0) { if (found > 1) - strprompt("View which part (0 when done)", part, SIZ-1); + strprompt("View which part (0 when done)", part, SIZ - 1); found = -found; for (ptr = last_message_parts; ptr; ptr = ptr->next) { if ((!strcasecmp(ptr->disposition, "attachment") - || !strcasecmp(ptr->disposition, "inline")) - && !strncmp(ptr->mimetype, "image/", 6) - && !strcasecmp(ptr->number, part)) { + || !strcasecmp(ptr->disposition, "inline")) + && !strncmp(ptr->mimetype, "image/", 6) + && !strcasecmp(ptr->number, part)) { char tmp[PATH_MAX]; char buf[SIZ]; - void *file = NULL; /* The downloaded file */ + void *file = NULL; /* The downloaded file */ int r; - + /* view image */ found = -found; r = CtdlIPCAttachmentDownload(ipc, msg, ptr->number, &file, progress, buf); @@ -1454,8 +1448,8 @@ void image_view(CtdlIPC *ipc, unsigned long msg) scr_printf("%s\n", buf); } else { size_t len; - - len = (size_t)extract_long(buf, 0); + + len = (size_t) extract_long(buf, 0); progress(ipc, len, len); scr_flush(); CtdlMakeTempFileName(tmp, sizeof tmp); @@ -1471,16 +1465,16 @@ void image_view(CtdlIPC *ipc, unsigned long msg) break; } } - + /* * Read the messages in the current room */ -void readmsgs(CtdlIPC *ipc, - enum MessageList c, /* see listing in citadel_ipc.h */ - enum MessageDirection rdir, /* 1=Forward (-1)=Reverse */ - int q /* Number of msgs to read (if c==3) */ -) { +void readmsgs(CtdlIPC * ipc, enum MessageList c, /* see listing in citadel_ipc.h */ + enum MessageDirection rdir, /* 1=Forward (-1)=Reverse */ + int q /* Number of msgs to read (if c==3) */ + ) +{ int a, e, f, g, start; int savedpos; int hold_sw = 0; @@ -1494,10 +1488,10 @@ void readmsgs(CtdlIPC *ipc, char filename[PATH_MAX]; char save_to[PATH_MAX]; void *attachment = NULL; /* Downloaded attachment */ - FILE *dest = NULL; /* Alternate destination other than screen */ - int r; /* IPC response code */ - static int att_seq = 0; /* Attachment download sequence number */ - int rv = 0; /* silence the stupid warn_unused_result warnings */ + FILE *dest = NULL; /* Alternate destination other than screen */ + int r; /* IPC response code */ + static int att_seq = 0; /* Attachment download sequence number */ + int rv = 0; /* silence the stupid warn_unused_result warnings */ CtdlMakeTempFileName(prtfile, sizeof prtfile); @@ -1509,15 +1503,18 @@ void readmsgs(CtdlIPC *ipc, if (r / 100 != 1) { scr_printf("%s\n", cmd); } else { - for (num_msgs = 0; msg_arr[num_msgs]; num_msgs++) - ; + for (num_msgs = 0; msg_arr[num_msgs]; num_msgs++); } - if (num_msgs == 0) { /* TODO look at this later */ - if (c == LastMessages) return; + if (num_msgs == 0) { + if (c == LastMessages) { + return; + } scr_printf("*** There are no "); - if (c == NewMessages) scr_printf("new "); - if (c == OldMessages) scr_printf("old "); + if (c == NewMessages) + scr_printf("new "); + if (c == OldMessages) + scr_printf("old "); scr_printf("messages in this room.\n"); return; } @@ -1531,7 +1528,7 @@ void readmsgs(CtdlIPC *ipc, return; } -RAGAIN: pagin = ((arcflag == 0) + RAGAIN:pagin = ((arcflag == 0) && (quotflag == 0) && (userflags & US_PAGINATOR)) ? 1 : 0; @@ -1558,7 +1555,7 @@ RAGAIN: pagin = ((arcflag == 0) if ((quotflag) || (arcflag)) { screenwidth = hold_sw; } -RMSGREAD: + RMSGREAD: highest_msg_read = msg_arr[a]; if (quotflag) { fclose(dest); @@ -1594,7 +1591,7 @@ RMSGREAD: if (e == SIGQUIT) return; if (((userflags & US_NOPROMPT) || (e == SIGINT)) - && (((room_flags & QR_MAILBOX) == 0) + && (((room_flags & QR_MAILBOX) == 0) || (rc_force_mail_prompts == 0))) { e = 'n'; } else { @@ -1620,10 +1617,10 @@ RMSGREAD: /* space key same as */ if (e == 32) e = 'n'; /* del/move for aides only */ - if ( (!is_room_aide) - && ((room_flags & QR_MAILBOX) == 0) - && ((room_flags2 & QR2_COLLABDEL) == 0) - ) { + if ((!is_room_aide) + && ((room_flags & QR_MAILBOX) == 0) + && ((room_flags2 & QR2_COLLABDEL) == 0) + ) { if ((e == 'd') || (e == 'm')) e = 0; } @@ -1631,22 +1628,22 @@ RMSGREAD: if ((e == 'p') && (IsEmptyStr(printcmd))) e = 0; /* can't file if not allowed */ - if ((e == 'f') - && (rc_allow_attachments == 0)) + if ((e == 'f') + && (rc_allow_attachments == 0)) e = 0; /* link only if browser avail*/ - if ((e == 'u') - && (IsEmptyStr(rc_url_cmd))) + if ((e == 'u') + && (IsEmptyStr(rc_url_cmd))) e = 0; if ((e == 'i') - && (IsEmptyStr(imagecmd) || !has_images)) + && (IsEmptyStr(imagecmd) || !has_images)) e = 0; } while ((e != 'a') && (e != 'n') && (e != 's') && (e != 'd') && (e != 'm') && (e != 'p') && (e != 'q') && (e != 'b') && (e != 'h') && (e != 'r') && (e != 'f') && (e != '?') && (e != 'u') && (e != 'c') && (e != 'y') - && (e != 'i') && (e != 'o') ); + && (e != 'i') && (e != 'o')); switch (e) { case 's': scr_printf("Stop"); @@ -1704,28 +1701,26 @@ RMSGREAD: else scr_printf("\n"); } -DONE_QUOTING: switch (e) { + DONE_QUOTING:switch (e) { case '?': scr_printf("Options available here:\n" - " ? Help (prints this message)\n" - " S Stop reading immediately\n" - " A Again (repeats last message)\n" - " N Next (continue with next message)\n" - " Y My Next (continue with next message you authored)\n" - " B Back (go back to previous message)\n"); - if ( (is_room_aide) - || (room_flags & QR_MAILBOX) - || (room_flags2 & QR2_COLLABDEL) - ) { - scr_printf(" D Delete this message\n" - " M Move message to another room\n"); + " ? Help (prints this message)\n" + " S Stop reading immediately\n" + " A Again (repeats last message)\n" + " N Next (continue with next message)\n" + " Y My Next (continue with next message you authored)\n" + " B Back (go back to previous message)\n"); + if ((is_room_aide) + || (room_flags & QR_MAILBOX) + || (room_flags2 & QR2_COLLABDEL) + ) { + scr_printf(" D Delete this message\n" " M Move message to another room\n"); } scr_printf(" C Copy message to another room\n"); if (!IsEmptyStr(printcmd)) scr_printf(" P Print this message\n"); - scr_printf( - " Q Reply to this message, quoting portions of it\n" - " H Headers (display message headers only)\n"); + scr_printf(" Q Reply to this message, quoting portions of it\n" + " H Headers (display message headers only)\n"); if (is_mail) scr_printf(" R Reply to this message\n"); if (rc_allow_attachments) { @@ -1761,11 +1756,9 @@ DONE_QUOTING: switch (e) { break; case 'm': case 'c': - newprompt("Enter target room: ", - targ, ROOMNAMELEN - 1); + newprompt("Enter target room: ", targ, ROOMNAMELEN - 1); if (!IsEmptyStr(targ)) { - r = CtdlIPCMoveMessage(ipc, (e == 'c' ? 1 : 0), - msg_arr[a], targ, cmd); + r = CtdlIPCMoveMessage(ipc, (e == 'c' ? 1 : 0), msg_arr[a], targ, cmd); scr_printf("%s\n", cmd); if (r / 100 == 2) msg_arr[a] = 0L; @@ -1778,8 +1771,7 @@ DONE_QUOTING: switch (e) { case 'o': case 'f': newprompt("Which section? ", filename, ((sizeof filename) - 1)); - r = CtdlIPCAttachmentDownload(ipc, msg_arr[a], - filename, &attachment, progress, cmd); + r = CtdlIPCAttachmentDownload(ipc, msg_arr[a], filename, &attachment, progress, cmd); if (r / 100 != 2) { scr_printf("%s\n", cmd); } else { @@ -1791,19 +1783,15 @@ DONE_QUOTING: switch (e) { if (IsEmptyStr(filename)) { strcpy(filename, reply_subject); } - if (e == 'o') { /* open attachment */ + if (e == 'o') { /* open attachment */ mkdir(tempdir, 0700); - snprintf(save_to, sizeof save_to, "%s/%04x.%s", - tempdir, - ++att_seq, - filename); + snprintf(save_to, sizeof save_to, "%s/%04x.%s", tempdir, ++att_seq, filename); save_buffer(attachment, extract_unsigned_long(cmd, 0), save_to); snprintf(cmd, sizeof cmd, rc_open_cmd, save_to); rv = system(cmd); if (rv != 0) scr_printf("failed to save %s Reason %d\n", cmd, rv); - } - else { /* save attachment to disk */ + } else { /* save attachment to disk */ destination_directory(save_to, filename); save_buffer(attachment, extract_unsigned_long(cmd, 0), save_to); } @@ -1838,44 +1826,41 @@ DONE_QUOTING: switch (e) { case 'i': image_view(ipc, msg_arr[a]); goto RMSGREAD; - case 'y': - { /* hack hack hack */ - /* find the next message by me, stay here if we find nothing */ - int finda; - int lasta = a; - for (finda = (a + rdir); ((finda < num_msgs) && (finda >= 0)); finda += rdir) - { - /* This is repetitively dumb, but that's what computers are for. - We have to load up messages until we find one by us */ - char buf[SIZ]; - int founda = 0; - struct ctdlipcmessage *msg = NULL; - - /* read the header so we can get 'from=' */ - r = CtdlIPCGetSingleMessage(ipc, msg_arr[finda], 1, 0, &msg, buf); - if (!strncasecmp(msg->author, fullname, sizeof(fullname))) { - a = lasta; /* meesa current */ - founda = 1; - } + case 'y': + { /* hack hack hack */ + /* find the next message by me, stay here if we find nothing */ + int finda; + int lasta = a; + for (finda = (a + rdir); ((finda < num_msgs) && (finda >= 0)); finda += rdir) { + /* This is repetitively dumb, but that's what computers are for. + We have to load up messages until we find one by us */ + char buf[SIZ]; + int founda = 0; + struct ctdlipcmessage *msg = NULL; + + /* read the header so we can get 'from=' */ + r = CtdlIPCGetSingleMessage(ipc, msg_arr[finda], 1, 0, &msg, buf); + if (!strncasecmp(msg->author, fullname, sizeof(fullname))) { + a = lasta; /* meesa current */ + founda = 1; + } - free(msg); + free(msg); - if (founda) - break; /* for */ - lasta = finda; /* keep one behind or we skip on the reentrance to the for */ - } /* for */ - } /* case 'y' */ - } /* switch */ + if (founda) + break; /* for */ + lasta = finda; /* keep one behind or we skip on the reentrance to the for */ + } /* for */ + } /* case 'y' */ + } /* switch */ } /* end for loop */ } /* end read routine */ - - /* * View and edit a system message */ -void edit_system_message(CtdlIPC *ipc, char *which_message) +void edit_system_message(CtdlIPC * ipc, char *which_message) { char desc[SIZ]; char read_cmd[SIZ]; @@ -1888,13 +1873,10 @@ void edit_system_message(CtdlIPC *ipc, char *which_message) } - - /* - * Loads the contents of a file into memory. Caller must free the allocated - * memory. + * Loads the contents of a file into memory. Caller must free the allocated memory. */ -char *load_message_from_file(FILE *src) +char *load_message_from_file(FILE * src) { size_t i; size_t got = 0; @@ -1904,7 +1886,7 @@ char *load_message_from_file(FILE *src) i = ftell(src); rewind(src); - dest = (char *)calloc(1, i + 1); + dest = (char *) calloc(1, i + 1); if (!dest) return NULL;