]> code.citadel.org Git - citadel.git/blobdiff - textclient/messages.c
work on sixel support
[citadel.git] / textclient / messages.c
index a6d5201728b674ba694828eb0c2d3ce5dfc19718..183ed0f93db0b4caa0980c7757f1f08abb9c91e9 100644 (file)
@@ -1,16 +1,12 @@
-/*
- * 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"
 
 
 #include "textclient.h"
 
@@ -57,29 +53,25 @@ extern char printcmd[];
 extern int rc_allow_attachments;
 extern int rc_display_message_numbers;
 extern int rc_force_mail_prompts;
 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 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 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);
 }
 
 
        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);
        pid_t p;
 
        alarm(S_KEEPALIVE);
@@ -94,11 +86,8 @@ pid_t ka_wait(int *kstatus)
 }
 
 
 }
 
 
-/*
- * 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;
        pid_t childpid;
        pid_t waitpid;
        int retcode;
@@ -127,12 +116,8 @@ int ka_system(char *shc)
 }
 
 
 }
 
 
-
-/*
- * 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;
        struct cittext *ptr;
 
        ptr = textlist;
@@ -141,7 +126,6 @@ void add_newline(struct cittext *textlist)
 
        while (ptr->text[strlen(ptr->text) - 1] == 32)
                ptr->text[strlen(ptr->text) - 1] = 0;
 
        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));
 
        ptr->next = (struct cittext *)
            malloc(sizeof(struct cittext));
@@ -151,11 +135,8 @@ void add_newline(struct cittext *textlist)
 }
 
 
 }
 
 
-/*
- * 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;
        struct cittext *ptr;
 
        ptr = textlist;
@@ -175,11 +156,8 @@ void add_word(struct cittext *textlist, char *wordbuf)
 }
 
 
 }
 
 
-/*
- * 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;
        int a, prev, finished, b, last_space;
        int appending = 0;
        struct cittext *textlist = NULL;
@@ -187,7 +165,7 @@ void citedit(FILE * fp)
        char wordbuf[MAXWORDBUF];
        int rv = 0;
 
        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;
        fseek(fp, 0L, 0);
        textlist = (struct cittext *) malloc(sizeof(struct cittext));
        textlist->next = NULL;
@@ -205,7 +183,8 @@ void citedit(FILE * fp)
                                add_newline(textlist);
                                add_word(textlist, "");
                        }
                                add_newline(textlist);
                                add_word(textlist, "");
                        }
-               } else {
+               }
+               else {
                        wordbuf[strlen(wordbuf) + 1] = 0;
                        wordbuf[strlen(wordbuf)] = a;
                }
                        wordbuf[strlen(wordbuf) + 1] = 0;
                        wordbuf[strlen(wordbuf)] = a;
                }
@@ -216,7 +195,7 @@ void citedit(FILE * fp)
                prev = a;
        }
 
                prev = a;
        }
 
-       /* get text */
+       // get text
        finished = 0;
        prev = (appending ? 13 : (-1));
        strcpy(wordbuf, "");
        finished = 0;
        prev = (appending ? 13 : (-1));
        strcpy(wordbuf, "");
@@ -246,14 +225,16 @@ void citedit(FILE * fp)
                                scr_putc(32);
                                scr_putc(8);
                        }
                                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] != ' ');
                        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;
                        scr_printf("\n");
                        if (IsEmptyStr(wordbuf))
                                finished = 1;
@@ -268,7 +249,8 @@ void citedit(FILE * fp)
                                add_word(textlist, wordbuf);
                                strcpy(wordbuf, "");
                        }
                                add_word(textlist, wordbuf);
                                strcpy(wordbuf, "");
                        }
-               } else {
+               }
+               else {
                        scr_putc(a);
                        wordbuf[strlen(wordbuf) + 1] = 0;
                        wordbuf[strlen(wordbuf)] = a;
                        scr_putc(a);
                        wordbuf[strlen(wordbuf) + 1] = 0;
                        wordbuf[strlen(wordbuf)] = a;
@@ -292,7 +274,8 @@ void citedit(FILE * fp)
                                        scr_putc(8);
                                }
                                scr_printf("\n%s", wordbuf);
                                        scr_putc(8);
                                }
                                scr_printf("\n%s", wordbuf);
-                       } else {
+                       }
+                       else {
                                add_word(textlist, wordbuf);
                                strcpy(wordbuf, "");
                                scr_printf("\n");
                                add_word(textlist, wordbuf);
                                strcpy(wordbuf, "");
                                scr_printf("\n");
@@ -301,7 +284,7 @@ void citedit(FILE * fp)
                prev = a;
        } while (finished == 0);
 
                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);
        fseek(fp, 0L, 0);
        for (ptr = textlist; ptr != NULL; ptr = ptr->next) {
                fprintf(fp, "%s", ptr->text);
@@ -313,7 +296,7 @@ void citedit(FILE * fp)
                scr_printf("failed to set message buffer: %s\n", strerror(errno));
 
 
                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);
        while (textlist != NULL) {
                ptr = textlist->next;
                free(textlist);
@@ -322,11 +305,8 @@ void citedit(FILE * fp)
 }
 
 
 }
 
 
-/*
- * 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) {
        struct parts *a_part = p;
 
        while (a_part) {
@@ -339,69 +319,76 @@ void free_parts(struct parts *p)
 }
 
 
 }
 
 
-/*
- * This is a mini RFC2047 decoder.
- * It only handles strings encoded from UTF-8 as Quoted-printable.
- */
-void mini_2047_decode(char *s)
-{
-       if (!s)
+// 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) {               // no null strings allowed!
                return;
                return;
+       }
 
 
-       char *qstart = strstr(s, "=?UTF-8?Q?");
-       if (!qstart)
+       char *qstart = strstr(s, "=?UTF-8?Q?"); // Must start with this string
+       if (!qstart) {
                return;
                return;
+       }
 
 
-       char *qend = strstr(s, "?=");
-       if (!qend)
+       char *qend = strstr(qstart + 10, "?="); // Must end with this string
+       if (!qend) {
                return;
                return;
+       }
 
 
-       if (qend <= qstart)
+       if (qend <= qstart) {   // And there must be something in between them.
                return;
                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];
                        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);
                        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 */
+
+// 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
+) {
        char buf[SIZ];
        char now[256];
        int format_type = 0;
        int fr = 0;
        int nhdr = 0;
        struct ctdlipcmessage *message = NULL;
        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 *converted_text = NULL;
        char *lineptr;
        char *nextline;
@@ -410,7 +397,6 @@ int read_message(CtdlIPC * ipc, long num,   /* message number */
        char ch;
        int linelen;
        int final_line_is_blank = 0;
        char ch;
        int linelen;
        int final_line_is_blank = 0;
-
        has_images = 0;
 
        sigcaught = 0;
        has_images = 0;
 
        sigcaught = 0;
@@ -433,7 +419,8 @@ int read_message(CtdlIPC * ipc, long num,   /* message number */
 
        if (dest) {
                fprintf(dest, "\n ");
 
        if (dest) {
                fprintf(dest, "\n ");
-       } else {
+       }
+       else {
                scr_printf("\n");
                if (pagin != 2) {
                        scr_printf(" ");
                scr_printf("\n");
                if (pagin != 2) {
                        scr_printf(" ");
@@ -443,7 +430,7 @@ int read_message(CtdlIPC * ipc, long num,   /* message number */
                color(BRIGHT_CYAN);
        }
 
                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);
        if (pagin == 2) {
                scr_printf("nhdr=%s\nfrom=%s\ntype=%d\nmsgn=%s\n",
                           message->nhdr ? "yes" : "no", message->author, message->type, message->msgid);
@@ -453,8 +440,7 @@ int read_message(CtdlIPC * ipc, long num,   /* message number */
                if (!IsEmptyStr(message->email)) {
                        scr_printf("rfca=%s\n", message->email);
                }
                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);
                }
                if (!IsEmptyStr(message->recipient)) {
                        scr_printf("rcpt=%s\n", message->recipient);
                }
@@ -477,7 +463,8 @@ int read_message(CtdlIPC * ipc, long num,   /* message number */
        if (rc_display_message_numbers) {
                if (dest) {
                        fprintf(dest, "[#%s] ", message->msgid);
        if (rc_display_message_numbers) {
                if (dest) {
                        fprintf(dest, "[#%s] ", message->msgid);
-               } else {
+               }
+               else {
                        color(DIM_WHITE);
                        scr_printf("[");
                        color(BRIGHT_WHITE);
                        color(DIM_WHITE);
                        scr_printf("[");
                        color(BRIGHT_WHITE);
@@ -489,26 +476,29 @@ int read_message(CtdlIPC * ipc, long num, /* message number */
        if (nhdr == 1 && !is_room_aide) {
                if (dest) {
                        fprintf(dest, " ****");
        if (nhdr == 1 && !is_room_aide) {
                if (dest) {
                        fprintf(dest, " ****");
-               } else {
+               }
+               else {
                        scr_printf(" ****");
                }
                        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);
                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);
                        }
                                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);
                        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);
                                color(DIM_WHITE);
                                scr_printf("<");
                                color(BRIGHT_BLUE);
@@ -520,7 +510,8 @@ int read_message(CtdlIPC * ipc, long num,   /* message number */
                if (strcasecmp(message->room, room_name) && (IsEmptyStr(message->email))) {
                        if (dest) {
                                fprintf(dest, "in %s> ", message->room);
                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);
                                color(DIM_WHITE);
                                scr_printf("in ");
                                color(BRIGHT_MAGENTA);
@@ -530,7 +521,8 @@ int read_message(CtdlIPC * ipc, long num,   /* message number */
                if (!IsEmptyStr(message->recipient)) {
                        if (dest) {
                                fprintf(dest, "to %s ", message->recipient);
                if (!IsEmptyStr(message->recipient)) {
                        if (dest) {
                                fprintf(dest, "to %s ", message->recipient);
-                       } else {
+                       }
+                       else {
                                color(DIM_WHITE);
                                scr_printf("to ");
                                color(BRIGHT_CYAN);
                                color(DIM_WHITE);
                                scr_printf("to ");
                                color(BRIGHT_CYAN);
@@ -541,46 +533,49 @@ int read_message(CtdlIPC * ipc, long num, /* message number */
 
        if (dest) {
                fprintf(dest, "\n");
 
        if (dest) {
                fprintf(dest, "\n");
-       } else {
+       }
+       else {
                scr_printf("\n");
        }
 
                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);
        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);
+               }
+               else {
+                       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)) {
        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) {
        }
 
        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 (message->references != NULL) {
                if (!IsEmptyStr(message->references)) {
                if (!IsEmptyStr(message->references)) {
-                       safestrncpy(reply_references, message->references, sizeof reply_references);
+                       strncpy(reply_references, message->references, sizeof reply_references);
                }
                }
+       }
 
        if (message->subject != NULL) {
 
        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);
                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(DIM_WHITE);
                                scr_printf("Subject: ");
                                color(BRIGHT_CYAN);
                                mini_2047_decode(message->subject);
                                scr_printf("%s\n", message->subject);
+
                        }
                }
        }
                        }
                }
        }
@@ -589,14 +584,13 @@ int read_message(CtdlIPC * ipc, long num, /* message number */
                color(BRIGHT_WHITE);
        }
 
                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")) {
        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;
                if (converted_text != NULL) {
                        free(message->text);
                        message->text = converted_text;
@@ -604,30 +598,30 @@ int read_message(CtdlIPC * ipc, long num, /* message number */
                }
        }
 
                }
        }
 
-       /* Text/plain is a different type */
+       // Text/plain is a different type
        if (!strcasecmp(message->content_type, "text/plain")) {
                format_type = 1;
        }
 
        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;
        }
 
        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;
        static char *urlprefixes[] = {
                "http://",
                "https://",
                "ftp://"
        };
        int p = 0;
-       num_urls = 0;           /* Start with a clean slate */
+       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)) {
                        searchptr = strstr(searchptr, urlprefixes[p]);
                        if (searchptr != NULL) {
        for (p = 0; p < (sizeof urlprefixes / sizeof(char *)); ++p) {
                searchptr = message->text;
                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') {
                                for (i = 0; i < strlen(urls[num_urls]); i++) {
                                        ch = urls[num_urls][i];
                                        if (ch == '>' || ch == '\"' || ch == ')' || ch == ' ' || ch == '\n') {
@@ -641,16 +635,14 @@ int read_message(CtdlIPC * ipc, long num, /* message number */
                }
        }
 
                }
        }
 
-       /*
-        * Here we go
-        */
+       // Here we go
        if (format_type == 0) {
        if (format_type == 0) {
+               // renderer for legacy Citadel format
                fr = fmout(screenwidth, NULL, message->text, dest, 1);
                fr = fmout(screenwidth, NULL, message->text, dest, 1);
-       } else {
-               /* renderer for text/plain */
-
+       }
+       else {
+               // renderer for text/plain
                lineptr = message->text;
                lineptr = message->text;
-
                do {
                        nextline = strchr(lineptr, '\n');
                        if (nextline != NULL) {
                do {
                        nextline = strchr(lineptr, '\n');
                        if (nextline != NULL) {
@@ -667,7 +659,8 @@ int read_message(CtdlIPC * ipc, long num,   /* message number */
                                }
                                if (dest) {
                                        fprintf(dest, "%s\n", lineptr);
                                }
                                if (dest) {
                                        fprintf(dest, "%s\n", lineptr);
-                               } else {
+                               }
+                               else {
                                        scr_printf("%s\n", lineptr);
                                }
                        }
                                        scr_printf("%s\n", lineptr);
                                }
                        }
@@ -682,24 +675,25 @@ int read_message(CtdlIPC * ipc, long num, /* message number */
        if (!final_line_is_blank) {
                if (dest) {
                        fprintf(dest, "\n");
        if (!final_line_is_blank) {
                if (dest) {
                        fprintf(dest, "\n");
-               } else {
+               }
+               else {
                        scr_printf("\n");
                        fr = sigcaught;
                }
        }
 
                        scr_printf("\n");
                        fr = sigcaught;
                }
        }
 
-       /* Enumerate any attachments */
+       // Enumerate any attachments
        if ((pagin == 1) && (message->attachments)) {
                struct parts *ptr;
 
                for (ptr = message->attachments; ptr; ptr = ptr->next) {
        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);
                                        color(DIM_WHITE);
                                        scr_printf("Part ");
                                        color(BRIGHT_MAGENTA);
@@ -718,24 +712,23 @@ int read_message(CtdlIPC * ipc, long num, /* message number */
                }
        }
 
                }
        }
 
-       /* Save the attachments info for later */
+       // Save the attachments info for later
        last_message_parts = message->attachments;
 
        last_message_parts = message->attachments;
 
-       /* Now we're done */
+       // Now we're done
        free(message->text);
        free(message);
 
        free(message->text);
        free(message);
 
-       if (pagin == 1 && !dest)
+       if (pagin == 1 && !dest) {
                color(DIM_WHITE);
                color(DIM_WHITE);
+       }
        stty_ctdl(0);
        return (fr);
 }
 
        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];
        char buf[512];
        char srch_str[128];
        char rplc_str[128];
@@ -779,7 +772,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));
                        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);
                        }
                        strcpy(buf, &buf[128]);
                        wpos = ftell(fp);
@@ -796,14 +789,17 @@ void replace_string(char *filename, long int startpos)
        scr_printf("<R>eplace made %d substitution(s).\n\n", substitutions);
 }
 
        scr_printf("<R>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 */
-                       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)
-{
+
+// 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
+) {
        FILE *fp;
        int a, b, e_ex_code;
        long beg;
        FILE *fp;
        int a, b, e_ex_code;
        long beg;
@@ -824,9 +820,9 @@ int client_make_message(CtdlIPC * ipc, char *filename,      /* temporary file name */
 
        if (room_flags & QR_ANONONLY && !recipient) {
                snprintf(header, sizeof header, " ****");
 
        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);
                if (!IsEmptyStr(recipient)) {
                        size_t tmp = strlen(header);
                        snprintf(&header[tmp], sizeof header - tmp, " to %s", recipient);
@@ -854,18 +850,18 @@ int client_make_message(CtdlIPC * ipc, char *filename,    /* temporary file name */
                        if (beg < 0)
                                scr_printf("failed to get stream position %s\n", strerror(errno));
                        fclose(fp);
                        if (beg < 0)
                                scr_printf("failed to get stream position %s\n", strerror(errno));
                        fclose(fp);
-               } else {
+               }
+               else {
                        fp = fopen(filename, "w");
                        if (fp == NULL) {
                        fp = fopen(filename, "w");
                        if (fp == NULL) {
-                               scr_printf("*** Error opening temp file!\n    %s: %s\n", filename, strerror(errno)
-                                   );
+                               scr_printf("*** Error opening temp file!\n    %s: %s\n", filename, strerror(errno));
                                return (1);
                        }
                        fclose(fp);
                }
        }
 
                                return (1);
                        }
                        fclose(fp);
                }
        }
 
-      ME1:switch (mode) {
+ME1:   switch (mode) {
 
        case 0:
                fp = fopen(filename, "r+");
 
        case 0:
                fp = fopen(filename, "r+");
@@ -901,8 +897,8 @@ int client_make_message(CtdlIPC * ipc, char *filename,      /* temporary file name */
                break;
 
        case 2:
                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);
                stty_ctdl(SB_RESTORE);
                editor_pid = fork();
                cksum = file_checksum(filename);
@@ -991,11 +987,8 @@ int client_make_message(CtdlIPC * ipc, char *filename,     /* temporary file name */
 }
 
 
 }
 
 
-/*
- * Make sure there's room in msg_arr[] for at least one more.
- */
-void check_msg_arr_size(void)
-{
+// 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));
        if ((num_msgs + 1) > msg_arr_size) {
                msg_arr_size += 512;
                msg_arr = realloc(msg_arr, ((sizeof(long)) * msg_arr_size));
@@ -1003,12 +996,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)
-{
+// 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;
 
        char *ptr;
        char *break_here;
 
@@ -1028,15 +1017,13 @@ 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 <R>eply command */
-          int c,               /* mode */
-          int masquerade       /* prompt for a non-default display name? */
-    )
-{
+// 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?
+) {
        char buf[SIZ];
        int a, b;
        int need_recp = 0;
        char buf[SIZ];
        int a, b;
        int need_recp = 0;
@@ -1046,31 +1033,44 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a <R>eply command
        char subject[SIZ];
        struct ctdlipcmessage message;
        unsigned long *msgarr = NULL;
        char subject[SIZ];
        struct ctdlipcmessage message;
        unsigned long *msgarr = NULL;
-       int r;                  /* IPC response code */
+       int r;                  // IPC response code
        int subject_required = 0;
 
        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);
        }
 
        if (c > 0) {
                mode = 1;
                scr_printf("You may not enter messages in this type of room.\n");
                return (1);
        }
 
        if (c > 0) {
                mode = 1;
-       } else {
+       }
+       else {
                mode = 0;
        }
 
        strcpy(subject, "");
 
                mode = 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, "");
        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;
 
        message.anonymous = 0;
        message.type = mode;
 
@@ -1083,14 +1083,14 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a <R>eply command
                if (!IsEmptyStr(reply_subject)) {
                        if (!strncasecmp(reply_subject, "Re: ", 3)) {
                                strcpy(message.subject, reply_subject);
                if (!IsEmptyStr(reply_subject)) {
                        if (!strncasecmp(reply_subject, "Re: ", 3)) {
                                strcpy(message.subject, reply_subject);
-                       } else {
+                       }
+                       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)) {
                int rrtok = num_tokens(reply_references, '|');
                int rrlen = strlen(reply_references);
                if (((rrtok >= 3) && (rrlen > 900)) || (rrtok > 10)) {
@@ -1098,7 +1098,8 @@ int entmsg(CtdlIPC * ipc, int is_reply,   /* nonzero if this was a <R>eply command
                }
 
                snprintf(message.references, sizeof message.references, "%s%s%s",
                }
 
                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);
        }
 
        r = CtdlIPCPostMessage(ipc, 0, &subject_required, &message, buf);
@@ -1108,35 +1109,36 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a <R>eply command
                return (1);
        }
 
                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;
        }
 
        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");
        }
 
        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);
        strcpy(buf, "");
        if (need_recp == 1) {
                if (axlevel >= AxProbU) {
                        if (is_reply) {
                                strcpy(buf, reply_to);
-                       } else {
+                       }
+                       else {
                                newprompt("Enter recipient: ", buf, SIZ - 100);
                                if (IsEmptyStr(buf)) {
                                        return (1);
                                }
                        }
                                newprompt("Enter recipient: ", buf, SIZ - 100);
                                if (IsEmptyStr(buf)) {
                                        return (1);
                                }
                        }
-               } else
+               }
+               else {
                        strcpy(buf, "sysop");
                        strcpy(buf, "sysop");
+               }
        }
        strcpy(message.recipient, buf);
 
        }
        strcpy(message.recipient, buf);
 
@@ -1146,7 +1148,7 @@ int entmsg(CtdlIPC * ipc, int is_reply,   /* nonzero if this was a <R>eply command
                        message.anonymous = 1;
        }
 
                        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);
                if (r / 100 != 2) {
        if (!IsEmptyStr(message.recipient)) {
                r = CtdlIPCPostMessage(ipc, 0, &subject_required, &message, buf);
                if (r / 100 != 2) {
@@ -1155,25 +1157,24 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a <R>eply command
                }
        }
 
                }
        }
 
-       /* 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);
        num_msgs = 0;
        r = CtdlIPCGetMessages(ipc, LastMessages, 1, NULL, &msgarr, buf);
        if (r / 100 != 1) {
                scr_printf("%s\n", buf);
-       } else {
+       }
+       else {
                for (num_msgs = 0; msgarr[num_msgs]; num_msgs++);
        }
 
                for (num_msgs = 0; msgarr[num_msgs]; num_msgs++);
        }
 
-       /* Now compose the message... */
+       // 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);
        }
 
        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))) {
        fp = fopen(temp, "r");
 
        if (!fp || !(message.text = load_message_from_file(fp))) {
@@ -1185,19 +1186,17 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a <R>eply command
        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);
 
        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);
        }
 
        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)
        unlink(temp);
 
        if (num_msgs >= 1)
@@ -1209,60 +1208,56 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a <R>eply command
        r = CtdlIPCGetMessages(ipc, NewMessages, 0, NULL, &msgarr, buf);
        if (r / 100 != 1) {
                scr_printf("%s\n", buf);
        r = CtdlIPCGetMessages(ipc, NewMessages, 0, NULL, &msgarr, buf);
        if (r / 100 != 1) {
                scr_printf("%s\n", buf);
-       } else {
+       }
+       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... */
+       // get new highest message number in room to set lrp for goto...
        maxmsgnum = msgarr[num_msgs - 1];
 
        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;
                }
        }
        b = (-1);
        for (a = 0; a < num_msgs; ++a) {
                if (msgarr[a] > highmsg) {
                        ++b;
                }
        }
-       if (msgarr)
+       if (msgarr) {
                free(msgarr);
                free(msgarr);
+       }
        msgarr = NULL;
 
        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) {
        if (need_recp) {
                --b;
        }
 
        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
- */
-void process_quote(void)
-{
+
+// Do editing on a quoted file
+void process_quote(void) {
        FILE *qfile, *tfile;
        char buf[128];
        int line, qstart, qend;
 
        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);
 
        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) {
        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);
        }
        while (fgets(buf, 128, qfile) != NULL) {
                scr_printf("%3d %s", ++line, buf);
@@ -1274,12 +1269,13 @@ void process_quote(void)
        rewind(qfile);
        line = 0;
        if (fgets(buf, 128, qfile) == NULL) {
        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) {
        }
        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, " >%s", buf);
+               }
        }
        fprintf(tfile, " \n");
        fclose(qfile);
        }
        fprintf(tfile, " \n");
        fclose(qfile);
@@ -1288,18 +1284,14 @@ void process_quote(void)
 }
 
 
 }
 
 
-
-/*
- * 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) {
        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;
        }
 
                return;
        }
 
@@ -1307,22 +1299,18 @@ void list_urls(CtdlIPC * ipc)
                scr_printf("%3d %s\n", i + 1, urls[i]);
        }
 
                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);
                i = intprompt("Display which one", 1, 1, num_urls);
+       }
 
        snprintf(cmd, sizeof cmd, rc_url_cmd, urls[i - 1]);
        rv = system(cmd);
 
        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");
 }
 
 
        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;
 
        char cmd[SIZ];
        pid_t childpid;
 
@@ -1380,20 +1368,18 @@ int do_image_view(const char *filename)
 }
 
 
 }
 
 
-/*
- * 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;
 
        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) {
        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);
                        found++;
                        if (found == 1) {
                                strcpy(part, ptr->number);
@@ -1402,8 +1388,9 @@ void image_view(CtdlIPC * ipc, unsigned long msg)
        }
 
        while (found > 0) {
        }
 
        while (found > 0) {
-               if (found > 1)
+               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")
                found = -found;
                for (ptr = last_message_parts; ptr; ptr = ptr->next) {
                        if ((!strcasecmp(ptr->disposition, "attachment")
@@ -1412,15 +1399,16 @@ void image_view(CtdlIPC * ipc, unsigned long msg)
                            && !strcasecmp(ptr->number, part)) {
                                char tmp[PATH_MAX];
                                char buf[SIZ];
                            && !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;
 
                                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);
                                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);
                                        size_t len;
 
                                        len = (size_t) extract_long(buf, 0);
@@ -1441,14 +1429,12 @@ void image_view(CtdlIPC * ipc, unsigned long msg)
 }
 
 
 }
 
 
-/*
- * 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) */
-    )
-{
+// 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)
+) {
        int a, e, f, g, start;
        int savedpos;
        int hold_sw = 0;
        int a, e, f, g, start;
        int savedpos;
        int hold_sw = 0;
@@ -1461,11 +1447,11 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,        /* see listing in citadel_ipc.h
        char targ[ROOMNAMELEN];
        char filename[PATH_MAX];
        char save_to[PATH_MAX];
        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);
 
 
        CtdlMakeTempFileName(prtfile, sizeof prtfile);
 
@@ -1476,13 +1462,15 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,        /* see listing in citadel_ipc.h
        r = CtdlIPCGetMessages(ipc, c, q, NULL, &msg_arr, cmd);
        if (r / 100 != 1) {
                scr_printf("%s\n", cmd);
        r = CtdlIPCGetMessages(ipc, c, q, NULL, &msg_arr, cmd);
        if (r / 100 != 1) {
                scr_printf("%s\n", cmd);
-       } else {
+       }
+       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)
+       if (num_msgs == 0) {
+               if (c == LastMessages) {
                        return;
                        return;
+               }
                scr_printf("*** There are no ");
                if (c == NewMessages)
                        scr_printf("new ");
                scr_printf("*** There are no ");
                if (c == NewMessages)
                        scr_printf("new ");
@@ -1492,7 +1480,7 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,  /* see listing in citadel_ipc.h
                return;
        }
 
                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) {
        start = ((rdir == 1) ? 0 : (num_msgs - 1));
        for (a = start; ((a < num_msgs) && (a >= 0)); a = a + rdir) {
                while (msg_arr[a] == 0L) {
@@ -1505,30 +1493,30 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,        /* see listing in citadel_ipc.h
                         && (quotflag == 0)
                         && (userflags & US_PAGINATOR)) ? 1 : 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 (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;
                }
 
                if (arcflag) {
                        hold_sw = screenwidth;
                        screenwidth = 80;
                }
 
-               /* clear parts list */
+               // clear parts list
                free_parts(last_message_parts);
                last_message_parts = NULL;
 
                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);
 
                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;
                }
                if ((quotflag) || (arcflag)) {
                        screenwidth = hold_sw;
                }
-             RMSGREAD:
+RMSGREAD:
                highest_msg_read = msg_arr[a];
                if (quotflag) {
                        fclose(dest);
                highest_msg_read = msg_arr[a];
                if (quotflag) {
                        fclose(dest);
@@ -1547,7 +1535,7 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,  /* see listing in citadel_ipc.h
                        f = fork();
                        if (f == 0) {
                                if (freopen(prtfile, "r", stdin) == NULL) {
                        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);
                                }
                                stty_ctdl(SB_RESTORE);
                                ka_system(printcmd);
@@ -1567,7 +1555,8 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,  /* see listing in citadel_ipc.h
                    && (((room_flags & QR_MAILBOX) == 0)
                        || (rc_force_mail_prompts == 0))) {
                        e = 'n';
                    && (((room_flags & QR_MAILBOX) == 0)
                        || (rc_force_mail_prompts == 0))) {
                        e = 'n';
-               } else {
+               }
+               else {
                        color(DIM_WHITE);
                        scr_printf("(");
                        color(BRIGHT_WHITE);
                        color(DIM_WHITE);
                        scr_printf("(");
                        color(BRIGHT_WHITE);
@@ -1585,38 +1574,47 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,        /* see listing in citadel_ipc.h
                        do {
                                e = (inkey() & 127);
                                e = tolower(e);
                        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';
                                        e = 'n';
-/* space key same as <N> */ if (e == 32)
+                               }
+
+                                if (e == 32) {                                 // space key same as <N>
                                        e = '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;
                                                e = 0;
+                                       }
                                }
                                }
-/* print only if available */
-                               if ((e == 'p') && (IsEmptyStr(printcmd)))
+
+                               if ((e == 'p') && (IsEmptyStr(printcmd))) {             // print, if available
                                        e = 0;
                                        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;
                                        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;
                                        e = 0;
-                               if ((e == 'i')
-                                   && (IsEmptyStr(imagecmd) || !has_images))
+                               }
+
+                               if ((e == 'i') && (IsEmptyStr(imagecmd) || !has_images)) {      // display images, if available
                                        e = 0;
                                        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')
                        } 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");
                        switch (e) {
                        case 's':
                                scr_printf("Stop");
@@ -1674,7 +1672,7 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,  /* see listing in citadel_ipc.h
                        else
                                scr_printf("\n");
                }
                        else
                                scr_printf("\n");
                }
-             DONE_QUOTING:switch (e) {
+DONE_QUOTING:  switch (e) {
                case '?':
                        scr_printf("Options available here:\n"
                                   " ?  Help (prints this message)\n"
                case '?':
                        scr_printf("Options available here:\n"
                                   " ?  Help (prints this message)\n"
@@ -1683,10 +1681,7 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c, /* see listing in citadel_ipc.h
                                   " 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");
                                   " 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)
-                           ) {
+                       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");
                                scr_printf(" D  Delete this message\n" " M  Move message to another room\n");
                        }
                        scr_printf(" C  Copy message to another room\n");
@@ -1735,11 +1730,13 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,        /* see listing in citadel_ipc.h
                                scr_printf("%s\n", cmd);
                                if (r / 100 == 2)
                                        msg_arr[a] = 0L;
                                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;
                        }
                                goto RMSGREAD;
                        }
-                       if (r / 100 != 2)       /* r will be init'ed, FIXME */
-                               goto RMSGREAD;  /* the logic here sucks */
                        break;
                case 'o':
                case 'f':
                        break;
                case 'o':
                case 'f':
@@ -1747,24 +1744,24 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,        /* see listing in citadel_ipc.h
                        r = CtdlIPCAttachmentDownload(ipc, msg_arr[a], filename, &attachment, progress, cmd);
                        if (r / 100 != 2) {
                                scr_printf("%s\n", 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);
                                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 (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);
                                        save_buffer(attachment, extract_unsigned_long(cmd, 0), save_to);
                                        snprintf(cmd, sizeof cmd, rc_open_cmd, save_to);
                                        rv = system(cmd);
                                        mkdir(tempdir, 0700);
                                        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);
                                                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);
                                }
                                        destination_directory(save_to, filename);
                                        save_buffer(attachment, extract_unsigned_long(cmd, 0), save_to);
                                }
@@ -1781,7 +1778,8 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,  /* see listing in citadel_ipc.h
                                scr_printf("%s\n", cmd);
                                if (r / 100 == 2)
                                        msg_arr[a] = 0L;
                                scr_printf("%s\n", cmd);
                                if (r / 100 == 2)
                                        msg_arr[a] = 0L;
-                       } else {
+                       }
+                       else {
                                goto RMSGREAD;
                        }
                        break;
                                goto RMSGREAD;
                        }
                        break;
@@ -1830,13 +1828,8 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c, /* see listing in citadel_ipc.h
 }                              /* end read routine */
 
 
 }                              /* 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];
        char desc[SIZ];
        char read_cmd[SIZ];
        char write_cmd[SIZ];
@@ -1848,14 +1841,8 @@ void edit_system_message(CtdlIPC * ipc, char *which_message)
 }
 
 
 }
 
 
-
-
-/*
- * 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;
        size_t i;
        size_t got = 0;
        char *dest = NULL;
@@ -1865,8 +1852,9 @@ char *load_message_from_file(FILE * src)
        rewind(src);
 
        dest = (char *) calloc(1, i + 1);
        rewind(src);
 
        dest = (char *) calloc(1, i + 1);
-       if (!dest)
+       if (!dest) {
                return NULL;
                return NULL;
+       }
 
        while (got < i) {
                size_t g;
 
        while (got < i) {
                size_t g;
@@ -1874,10 +1862,10 @@ char *load_message_from_file(FILE * src)
                g = fread(dest + got, 1, i - got, src);
                got += g;
                if (g < i - got) {
                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;
                }
                        i = got;
                        break;
                }