-/*
- * 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
+//
+// Beware: this is really old and crappy code, written in the
+// late 1980s when my coding style was absolute garbage. It
+// works, but we probably should replace most of it.
+//
+// Copyright (c) 1987-2024 by the citadel.org team
+//
+// This program is open source software. Use, duplication, or disclosure is subject to the GNU General Public License version 3.
#include "textclient.h"
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;
extern int rc_allow_attachments;
extern int rc_display_message_numbers;
extern int rc_force_mail_prompts;
+extern int rc_sixel;
extern int editor_pid;
-extern CtdlIPC *ipc_for_signal_handlers; /* KLUDGE cover your eyes */
+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 */
-struct parts *last_message_parts = NULL; /* Parts from last msg */
+int has_images = 0; // Current msg has images
+struct parts *last_message_parts = NULL; // Parts from last msg
-
-void ka_sigcatch(int signum)
-{
+void ka_sigcatch(int signum) {
alarm(S_KEEPALIVE);
signal(SIGALRM, ka_sigcatch);
CtdlIPCNoop(ipc_for_signal_handlers);
}
-/*
- * server keep-alive version of wait() (needed for external editor)
- */
-pid_t ka_wait(int *kstatus)
-{
+// server keep-alive version of wait() (needed for external editor)
+pid_t ka_wait(int *kstatus) {
pid_t p;
alarm(S_KEEPALIVE);
}
-/*
- * version of system() that uses ka_wait()
- */
-int ka_system(char *shc)
-{
+// version of system() that uses ka_wait()
+int ka_system(char *shc) {
pid_t childpid;
pid_t waitpid;
int retcode;
}
-
-/*
- * add a newline to the buffer...
- */
-void add_newline(struct cittext *textlist)
-{
+// add a newline to the buffer...
+void add_newline(struct cittext *textlist) {
struct cittext *ptr;
ptr = textlist;
while (ptr->text[strlen(ptr->text) - 1] == 32)
ptr->text[strlen(ptr->text) - 1] = 0;
- /* strcat(ptr->text,"\n"); */
ptr->next = (struct cittext *)
malloc(sizeof(struct cittext));
}
-/*
- * add a word to the buffer...
- */
-void add_word(struct cittext *textlist, char *wordbuf)
-{
+// add a word to the buffer...
+void add_word(struct cittext *textlist, char *wordbuf) {
struct cittext *ptr;
ptr = textlist;
}
-/*
- * begin editing of an opened file pointed to by fp
- */
-void citedit(FILE *fp)
-{
+// begin editing of an opened file pointed to by fp
+void citedit(FILE * fp) {
int a, prev, finished, b, last_space;
int appending = 0;
struct cittext *textlist = NULL;
char wordbuf[MAXWORDBUF];
int rv = 0;
- /* first, load the text into the buffer */
+ // first, load the text into the buffer
fseek(fp, 0L, 0);
textlist = (struct cittext *) malloc(sizeof(struct cittext));
textlist->next = NULL;
add_newline(textlist);
add_word(textlist, "");
}
- } else {
+ }
+ else {
wordbuf[strlen(wordbuf) + 1] = 0;
wordbuf[strlen(wordbuf)] = a;
}
prev = a;
}
- /* get text */
+ // get text
finished = 0;
prev = (appending ? 13 : (-1));
strcpy(wordbuf, "");
scr_putc(32);
scr_putc(8);
}
- } else if (a == 23) {
+ }
+ else if (a == 23) {
do {
wordbuf[strlen(wordbuf) - 1] = 0;
scr_putc(8);
scr_putc(32);
scr_putc(8);
} while (!IsEmptyStr(wordbuf) && wordbuf[strlen(wordbuf) - 1] != ' ');
- } else if (a == 13) {
+ }
+ else if (a == 13) {
scr_printf("\n");
if (IsEmptyStr(wordbuf))
finished = 1;
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);
strcpy(wordbuf, "");
}
- } else {
+ }
+ else {
scr_putc(a);
wordbuf[strlen(wordbuf) + 1] = 0;
wordbuf[strlen(wordbuf)] = a;
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) {
scr_putc(8);
}
scr_printf("\n%s", wordbuf);
- } else {
+ }
+ else {
add_word(textlist, wordbuf);
strcpy(wordbuf, "");
scr_printf("\n");
prev = a;
} while (finished == 0);
- /* write the buffer back to disk */
+ // write the buffer back to disk
fseek(fp, 0L, 0);
for (ptr = textlist; ptr != NULL; ptr = ptr->next) {
fprintf(fp, "%s", ptr->text);
if (rv < 0)
scr_printf("failed to set message buffer: %s\n", strerror(errno));
-
- /* and deallocate the memory we used */
+
+ // and deallocate the memory we used
while (textlist != NULL) {
ptr = textlist->next;
free(textlist);
}
-/*
- * Free the struct parts
- */
-void free_parts(struct parts *p)
-{
+// Free the struct parts
+void free_parts(struct parts *p) {
struct parts *a_part = p;
while (a_part) {
}
-/*
- * This is a mini RFC2047 decoder.
- * It only handles strings encoded from UTF-8 as Quoted-printable.
- */
+// 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;
+ 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
- */
+
+// 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;
char ch;
int linelen;
int final_line_is_blank = 0;
-
has_images = 0;
sigcaught = 0;
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);
}
- /* View headers only */
+ // 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);
}
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");
if (rc_display_message_numbers) {
if (dest) {
fprintf(dest, "[#%s] ", message->msgid);
- } else {
+ }
+ else {
color(DIM_WHITE);
scr_printf("[");
color(BRIGHT_WHITE);
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("> ");
}
}
if (strcasecmp(message->room, room_name) && (IsEmptyStr(message->email))) {
if (dest) {
fprintf(dest, "in %s> ", message->room);
- } else {
+ }
+ else {
color(DIM_WHITE);
scr_printf("in ");
color(BRIGHT_MAGENTA);
if (!IsEmptyStr(message->recipient)) {
if (dest) {
fprintf(dest, "to %s ", message->recipient);
- } else {
+ }
+ else {
color(DIM_WHITE);
scr_printf("to ");
color(BRIGHT_CYAN);
}
}
}
-
+
if (dest) {
fprintf(dest, "\n");
- } else {
+ }
+ else {
scr_printf("\n");
}
- /* Set the reply-to address to an Internet e-mail address if possible
- */
+ // Set the reply-to address to an Internet e-mail address if possible
if ((message->email != NULL) && (!IsEmptyStr(message->email))) {
if (!IsEmptyStr(message->author)) {
snprintf(reply_to, sizeof reply_to, "%s <%s>", message->author, message->email);
}
else {
- safestrncpy(reply_to, message->email, sizeof reply_to);
+ strncpy(reply_to, message->email, sizeof reply_to);
}
}
- /* But if we can't do that, set it to a Citadel address.
- */
+ // But if we can't do that, set it to a Citadel address.
if (!strcmp(reply_to, NO_REPLY_TO)) {
- safestrncpy(reply_to, message->author, sizeof(reply_to));
+ strncpy(reply_to, message->author, sizeof(reply_to));
}
if (message->msgid != NULL) {
- safestrncpy(reply_inreplyto, message->msgid, sizeof reply_inreplyto);
+ strncpy(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)) {
+ strncpy(reply_references, message->references, sizeof reply_references);
+ }
}
if (message->subject != NULL) {
- safestrncpy(reply_subject, message->subject, sizeof reply_subject);
+ strncpy(reply_subject, message->subject, sizeof reply_subject);
if (!IsEmptyStr(message->subject)) {
if (dest) {
fprintf(dest, "Subject: %s\n", message->subject);
- } else {
+ }
+ else {
color(DIM_WHITE);
scr_printf("Subject: ");
color(BRIGHT_CYAN);
mini_2047_decode(message->subject);
scr_printf("%s\n", message->subject);
+
}
}
}
color(BRIGHT_WHITE);
}
- /******* end of header output, start of message text output *******/
+ // ****** end of header output, start of message text output ******
- /*
- * Convert HTML to plain text, formatting for the actual width
- * of the client screen.
- */
+ // Convert HTML to plain text, formatting for the actual width 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,
+ ((enable_color ? H2A_ANSI : 0) | (rc_sixel ? H2A_SIXEL : 0))
+ );
if (converted_text != NULL) {
free(message->text);
message->text = converted_text;
}
}
- /* Text/plain is a different type */
+ // Text/plain is a different type
if (!strcasecmp(message->content_type, "text/plain")) {
format_type = 1;
}
- /* Render text/x-markdown as plain text */
+ // Render text/x-markdown as plain text
if (!strcasecmp(message->content_type, "text/x-markdown")) {
format_type = 1;
}
- /* Extract URL's */
+ // Extract URL's
static char *urlprefixes[] = {
"http://",
"https://",
"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]));
+ strncpy(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;
}
}
}
- /*
- * Here we go
- */
+ // Here we go
if (format_type == 0) {
+ // renderer for legacy Citadel format
fr = fmout(screenwidth, NULL, message->text, dest, 1);
- } else {
- /* renderer for text/plain */
-
+ }
+ else {
+ // renderer for text/plain
lineptr = message->text;
-
do {
nextline = strchr(lineptr, '\n');
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) {
fprintf(dest, "%s\n", lineptr);
- } else {
+ }
+ else {
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;
}
else {
scr_printf("\n");
- fr = sigcaught;
+ fr = sigcaught;
}
}
- /* Enumerate any attachments */
- if ( (pagin == 1) && (message->attachments) ) {
+ // Enumerate any 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->disposition, "attachment"))
+ || (!strcasecmp(ptr->disposition, "inline"))
+ || (!strcasecmp(ptr->disposition, ""))
) {
- if ( (strcasecmp(ptr->number, message->mime_chosen))
- && (!IsEmptyStr(ptr->mimetype))
+ if ( (strcasecmp(ptr->number, message->mime_chosen))
+ && (!IsEmptyStr(ptr->mimetype))
) {
color(DIM_WHITE);
scr_printf("Part ");
}
}
- /* Save the attachments info for later */
+ // Save the attachments info for later
last_message_parts = message->attachments;
- /* Now we're done */
+ // Now we're done
free(message->text);
free(message);
- if (pagin == 1 && !dest)
+ if (pagin == 1 && !dest) {
color(DIM_WHITE);
+ }
stty_ctdl(0);
return (fr);
}
-/*
- * replace string function for the built-in editor
- */
-void replace_string(char *filename, long int startpos)
-{
+
+// replace string function for the built-in editor
+void replace_string(char *filename, long int startpos) {
char buf[512];
char srch_str[128];
char rplc_str[128];
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) {
rv = fwrite((char *) buf, 128, 1, fp);
if (rv < 0) {
scr_printf("failed to replace string: %s\n", strerror(errno));
- break; /*whoopsi! */
+ break; // No replacement happened; break out of the loop
}
strcpy(buf, &buf[128]);
wpos = ftell(fp);
scr_printf("<R>eplace made %d substitution(s).\n\n", substitutions);
}
-/*
- * Function to begin composing a new message
- */
+
+// Function to begin composing a new message
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
+ 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
) {
FILE *fp;
int a, b, e_ex_code;
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;
}
snprintf(header, sizeof header, " ****");
}
else {
- snprintf(header, sizeof header,
- " %s from %s",
- datestr,
- (is_anonymous ? "[anonymous]" : fullname)
- );
+ 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);
}
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 {
+ }
+ 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);
}
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);
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();
break;
case 2:
- default: /* allow 2+ modes */
- e_ex_code = 1; /* start with a failed exit code */
+ default: // allow 2+ modes
+ e_ex_code = 1; // start with a failed exit code
stty_ctdl(SB_RESTORE);
editor_pid = fork();
cksum = file_checksum(filename);
break;
}
-MECR: if (mode >= 2) {
+ MECR:if (mode >= 2) {
if (file_checksum(filename) == cksum) {
scr_printf("*** Aborted message.\n");
e_ex_code = 1;
}
b = keymenu("Entry command (? for options)",
- "<A>bort|"
- "<C>ontinue|"
- "<S>ave message|"
- "<P>rint formatted|"
- "add s<U>bject|"
- "<R>eplace string|"
- "<H>old message"
- );
-
- if (b == 'a') goto MEABT;
- if (b == 'c') goto ME1;
- if (b == 's') goto MEFIN;
+ "<A>bort|"
+ "<C>ontinue|" "<S>ave message|" "<P>rint formatted|" "add s<U>bject|" "<R>eplace string|" "<H>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;
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);
}
-/*
- * Make sure there's room in msg_arr[] for at least one more.
- */
+// Make sure there's room in msg_arr[] for at least one more.
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));
}
}
-/*
- * break_big_lines() - break up lines that are >1024 characters
- * otherwise the server will truncate
- */
+// break_big_lines() - break up lines that are >1024 characters, otherwise the server will truncate them.
void break_big_lines(char *msg) {
char *ptr;
char *break_here;
}
-/*
- * entmsg() - edit and create a message
- * returns 0 if message was saved
- */
+// entmsg() - edit and create a message
+// returns 0 if message was saved
int entmsg(CtdlIPC *ipc,
- int is_reply, /* nonzero if this was a <R>eply command */
- int c, /* mode */
- int masquerade /* prompt for a non-default display name? */
+ int is_reply, // nonzero if this was a <R>eply command
+ int c, // mode
+ int masquerade // prompt for a non-default display name?
) {
char buf[SIZ];
int a, b;
char subject[SIZ];
struct ctdlipcmessage message;
unsigned long *msgarr = NULL;
- int r; /* IPC response code */
+ int r; // IPC response code
int subject_required = 0;
- if (!entmsg_ok) {
+ // First, check to see if we have permission to enter a message in
+ // this room. The server will return an error code if we can't.
+ 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 '<E>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 '<R>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) {
strcpy(subject, "");
- /*
- * First, check to see if we have permission to enter a message in
- * this room. The server will return an error code if we can't.
- */
strcpy(message.recipient, "");
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;
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);
+ snprintf(message.subject, sizeof message.subject, "Re: %s", reply_subject);
}
}
- /* Trim down excessively long lists of thread references. We eliminate the
- * second one in the list so that the thread root remains intact.
- */
+ // Trim down excessively long lists of thread references. We eliminate the
+ // second one in the list so that the thread root remains intact.
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
);
}
return (1);
}
- /* Error code 570 is special. It means that we CAN enter a message
- * in this room, but a recipient needs to be specified.
- */
+ // Error code 570 is special. It means that we CAN enter a message in this room, but a recipient needs to be specified.
need_recp = 0;
if (r / 10 == 57) {
need_recp = 1;
}
- /* If the user is a dumbass, tell them how to type. */
+ // If the user is a dumbass, tell them how to type.
if ((userflags & US_EXPERT) == 0) {
scr_printf("Entering message. Word wrap will give you soft linebreaks. Pressing the\n");
scr_printf("'enter' key will give you a hard linebreak and an indent. Press 'enter' twice\n");
scr_printf("when finished.\n");
}
- /* Handle the selection of a recipient, if necessary. */
+ // Handle the selection of a recipient, if necessary.
strcpy(buf, "");
if (need_recp == 1) {
if (axlevel >= AxProbU) {
if (is_reply) {
strcpy(buf, reply_to);
- } else {
- newprompt("Enter recipient: ", buf, SIZ-100);
+ }
+ else {
+ newprompt("Enter recipient: ", buf, SIZ - 100);
if (IsEmptyStr(buf)) {
return (1);
}
}
- } else
+ }
+ else {
strcpy(buf, "sysop");
+ }
}
strcpy(message.recipient, buf);
message.anonymous = 1;
}
- /* If it's mail, we've got to check the validity of the recipient... */
+ // 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);
}
}
- /* Learn the number of the newest message in in the room, so we can
- * tell upon saving whether someone else has posted too.
- */
+ // Learn the number of the newest message in in the room, so we can 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++)
- ;
+ }
+ else {
+ 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);
+ // 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);
return (2);
}
- /* Reopen the temp file that was created, so we can send it */
+ // Reopen the temp file that was created, so we can send it
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.
- */
+ // Break lines that are >1024 characters, otherwise the server will truncate them.
break_big_lines(message.text);
- /* Transmit message to the server */
+ // Transmit message to the server
r = CtdlIPCPostMessage(ipc, 1, NULL, &message, buf);
if (r / 100 != 4) {
scr_printf("%s\n", buf);
return (1);
}
- /* Yes, unlink it now, so it doesn't stick around if we crash */
+ // 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++)
- ;
+ }
+ else {
+ for (num_msgs = 0; msgarr[num_msgs]; num_msgs++);
}
- /* get new highest message number in room to set lrp for goto... */
+ // get new highest message number in room to set lrp for goto...
maxmsgnum = msgarr[num_msgs - 1];
- /* now see if anyone else has posted in here */
+ // now see if anyone else has posted in here
b = (-1);
for (a = 0; a < num_msgs; ++a) {
if (msgarr[a] > highmsg) {
++b;
}
}
- if (msgarr) free(msgarr);
+ if (msgarr) {
+ free(msgarr);
+ }
msgarr = NULL;
- /* In the Mail> room, this algorithm always counts one message
- * higher than in public rooms, so we decrement it by one.
- */
+ // In the Mail> room, this algorithm always counts one message higher than in public rooms, so we decrement it by one.
if (need_recp) {
--b;
}
if (b == 1) {
- scr_printf("*** 1 additional message has been entered "
- "in this room by another user.\n");
+ 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("*** %d additional messages have been entered in this room by other users.\n", b);
}
- free(message.text);
-
- return(0);
+ free(message.text);
+ return (0);
}
-/*
- * Do editing on a quoted file
- */
-void process_quote(void)
-{
+
+// Do editing on a quoted file
+void process_quote(void) {
FILE *qfile, *tfile;
char buf[128];
int line, qstart, qend;
- /* Unlink the second temp file as soon as it's opened, so it'll get
- * deleted even if the program dies
- */
+ // Unlink the second temp file as soon as it's opened, so it'll get deleted even if the program dies
qfile = fopen(temp2, "r");
unlink(temp2);
- /* Display the quotable text with line numbers added */
+ // Display the quotable text with line numbers added
line = 0;
if (fgets(buf, 128, qfile) == NULL) {
- /* we're skipping a line here */
+ // we're skipping a line here
}
while (fgets(buf, 128, qfile) != NULL) {
scr_printf("%3d %s", ++line, buf);
rewind(qfile);
line = 0;
if (fgets(buf, 128, qfile) == NULL) {
- /* we're skipping a line here */
+ // we're skipping a line here
}
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);
}
-
-/*
- * List the URL's which were embedded in the previous message
- */
-void list_urls(CtdlIPC *ipc)
-{
+// List the URLs which were embedded in the previous message
+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;
}
scr_printf("%3d %s\n", i + 1, urls[i]);
}
- if ((i = num_urls) != 1)
+ if ((i = num_urls) != 1) {
i = intprompt("Display which one", 1, 1, num_urls);
+ }
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");
}
-/*
- * Run image viewer in background
- */
-int do_image_view(const char *filename)
-{
+// Run image viewer in background
+int do_image_view(const char *filename) {
char cmd[SIZ];
pid_t childpid;
waitpid(childpid, &retcode, 0);
return retcode;
}
-
+
return -1;
}
-/*
- * View an image attached to a message
- */
-void image_view(CtdlIPC *ipc, unsigned long msg)
-{
+// View an image attached to a message
+void image_view(CtdlIPC * ipc, unsigned long msg) {
struct parts *ptr = last_message_parts;
char part[SIZ];
int found = 0;
- /* Run through available parts */
+ // 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)) {
+ if ( (!strcasecmp(ptr->disposition, "attachment")
+ || !strcasecmp(ptr->disposition, "inline"))
+ && !strncmp(ptr->mimetype, "image/", 6)
+ ) {
found++;
if (found == 1) {
strcpy(part, ptr->number);
}
while (found > 0) {
- if (found > 1)
- strprompt("View which part (0 when done)", part, SIZ-1);
+ if (found > 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 */
+
+ // view image
found = -found;
r = CtdlIPCAttachmentDownload(ipc, msg, ptr->number, &file, progress, buf);
if (r / 100 != 2) {
scr_printf("%s\n", buf);
- } else {
+ }
+ 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);
break;
}
}
-
-/*
- * Read the messages in the current room
- */
+
+// 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) */
+ 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;
char targ[ROOMNAMELEN];
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 */
+ 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
CtdlMakeTempFileName(prtfile, sizeof prtfile);
r = CtdlIPCGetMessages(ipc, c, q, NULL, &msg_arr, cmd);
if (r / 100 != 1) {
scr_printf("%s\n", cmd);
- } else {
- for (num_msgs = 0; msg_arr[num_msgs]; num_msgs++)
- ;
+ }
+ else {
+ 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;
}
- /* this loop cycles through each message... */
+ // this loop cycles through each message...
start = ((rdir == 1) ? 0 : (num_msgs - 1));
for (a = start; ((a < num_msgs) && (a >= 0)); a = a + rdir) {
while (msg_arr[a] == 0L) {
return;
}
-RAGAIN: pagin = ((arcflag == 0)
+ RAGAIN:pagin = ((arcflag == 0)
&& (quotflag == 0)
&& (userflags & US_PAGINATOR)) ? 1 : 0;
- /* If we're doing a quote, set the screenwidth to 72 */
+ // If we're doing a quote, set the screenwidth to 72
if (quotflag) {
hold_sw = screenwidth;
screenwidth = 72;
}
- /* If printing or archiving, set the screenwidth to 80 */
+ // If printing or archiving, set the screenwidth to 80
if (arcflag) {
hold_sw = screenwidth;
screenwidth = 80;
}
- /* clear parts list */
+ // clear parts list
free_parts(last_message_parts);
last_message_parts = NULL;
- /* now read the message... */
+ // now read the message...
e = read_message(ipc, msg_arr[a], pagin, dest);
- /* ...and set the screenwidth back if we have to */
+ // ...and set the screenwidth back if we have to
if ((quotflag) || (arcflag)) {
screenwidth = hold_sw;
}
f = fork();
if (f == 0) {
if (freopen(prtfile, "r", stdin) == NULL) {
- /* we probably should handle the error condition here */
+ // we probably should handle the error condition here
}
stty_ctdl(SB_RESTORE);
ka_system(printcmd);
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 {
+ }
+ else {
color(DIM_WHITE);
scr_printf("(");
color(BRIGHT_WHITE);
do {
e = (inkey() & 127);
e = tolower(e);
-/* return key same as <N> */ if (e == 10)
+
+ if (e == 10) { // return key same as <N>
e = 'n';
-/* space key same as <N> */ if (e == 32)
+ }
+
+ if (e == 32) { // space key same as <N>
e = 'n';
-/* del/move for aides only */
- if ( (!is_room_aide)
- && ((room_flags & QR_MAILBOX) == 0)
- && ((room_flags2 & QR2_COLLABDEL) == 0)
- ) {
- if ((e == 'd') || (e == 'm'))
+ }
+
+ if ( (!is_room_aide) // delete/move are available only to admins
+ && ((room_flags & QR_MAILBOX) == 0)
+ && ((room_flags2 & QR2_COLLABDEL) == 0)
+ ) {
+ if ((e == 'd') || (e == 'm')) {
e = 0;
+ }
}
-/* print only if available */
- if ((e == 'p') && (IsEmptyStr(printcmd)))
+
+ if ((e == 'p') && (IsEmptyStr(printcmd))) { // print, if available
e = 0;
-/* can't file if not allowed */
- if ((e == 'f')
- && (rc_allow_attachments == 0))
+ }
+
+ if ((e == 'f') && (rc_allow_attachments == 0)) { // file attachments, if available
e = 0;
-/* link only if browser avail*/
- if ((e == 'u')
- && (IsEmptyStr(rc_url_cmd)))
+ }
+
+ if ((e == 'u') && (IsEmptyStr(rc_url_cmd))) { // display urls, if a browser is available
e = 0;
- if ((e == 'i')
- && (IsEmptyStr(imagecmd) || !has_images))
+ }
+
+ if ((e == 'i') && (IsEmptyStr(imagecmd) || !has_images)) { // display images, if available
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");
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) {
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;
- } else {
+ }
+ else {
+ goto RMSGREAD;
+ }
+ if (r / 100 != 2) { // r will be initialized. The logic here sucks.
goto RMSGREAD;
}
- if (r / 100 != 2) /* r will be init'ed, FIXME */
- goto RMSGREAD; /* the logic here sucks */
break;
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 {
+ }
+ else {
extract_token(filename, cmd, 2, '|', sizeof filename);
- /*
- * Part 1 won't have a filename; use the
- * subject of the message instead. IO
- */
+ // Part 1 won't have a filename; use the subject of the message instead. --IO
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)
+ 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);
}
scr_printf("%s\n", cmd);
if (r / 100 == 2)
msg_arr[a] = 0L;
- } else {
+ }
+ else {
goto RMSGREAD;
}
break;
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;
- }
-
- free(msg);
-
- 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 */
+ 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);
+ 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)
-{
+// View and edit a system message
+void edit_system_message(CtdlIPC * ipc, char *which_message) {
char desc[SIZ];
char read_cmd[SIZ];
char write_cmd[SIZ];
}
-
-
-/*
- * Loads the contents of a file into memory. Caller must free the allocated
- * memory.
- */
-char *load_message_from_file(FILE *src)
-{
+// Loads the contents of a file into memory. Caller must free the allocated memory.
+char *load_message_from_file(FILE *src) {
size_t i;
size_t got = 0;
char *dest = NULL;
i = ftell(src);
rewind(src);
- dest = (char *)calloc(1, i + 1);
- if (!dest)
+ dest = (char *) calloc(1, i + 1);
+ if (!dest) {
return NULL;
+ }
while (got < i) {
size_t g;
g = fread(dest + got, 1, i - got, src);
got += g;
if (g < i - got) {
- /* Interrupted system call, keep going */
- if (errno == EINTR)
- continue;
- /* At this point we have either EOF or error */
+ if (errno == EINTR) {
+ continue; // Interrupted system call, keep going
+ }
+ // At this point we have either EOF or error
i = got;
break;
}