-/*
- * Text client functions for reading and writing of messages
- *
- * Copyright (c) 1987-2020 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"
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;
add_word(textlist, wordbuf);
strcpy(wordbuf, "");
}
- } else {
+ }
+ else {
scr_putc(a);
wordbuf[strlen(wordbuf) + 1] = 0;
wordbuf[strlen(wordbuf)] = a;
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);
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.
- * 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!
+// 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;
}
- char *qstart = strstr(s, "=?UTF-8?Q?"); // Must start with this string
+ char *qstart = strstr(s, "=?UTF-8?Q?"); // Must start with this string
if (!qstart) {
return;
}
- char *qend = strstr(qstart+10, "?="); // Must end with this string
+ char *qend = strstr(qstart + 10, "?="); // Must end with this string
if (!qend) {
return;
}
- if (qend <= qstart) { // And there must be something in between them.
+ if (qend <= qstart) { // And there must be something in between them.
return;
}
// The string has qualified for conversion.
- strcpy(qend, ""); // Strip the trailer
- strcpy(qstart, &qstart[10]); // Strip the header
+ strcpy(qend, ""); // Strip the trailer
+ strcpy(qstart, &qstart[10]); // Strip the header
- char *r = qstart; // Pointer to where in the string we're reading
- char *w = s; // Pointer to where in the string we're writing
+ 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
+ while (*r) { // Loop through the source string
+ if (r[0] == '=') { // "=" means read a hex character
char ch[3];
ch[0] = r[1];
ch[1] = r[2];
r += 3;
++w;
}
- else if (r[0] == '_') { // "_" is a space
+ else if (r[0] == '_') { // "_" is a space
w[0] = ' ';
++r;
++w;
}
- else { // anything else pass through literally
+ else { // anything else pass through literally
w[0] = r[0];
++r;
++w;
}
}
- w[0] = 0; // null terminate
+ 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 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;
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 (rc_display_message_numbers) {
if (dest) {
fprintf(dest, "[#%s] ", message->msgid);
- } else {
+ }
+ else {
color(DIM_WHITE);
scr_printf("[");
color(BRIGHT_WHITE);
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);
+ }
+ 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)) {
- 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 (message->references != NULL) {
if (!IsEmptyStr(message->references)) {
- safestrncpy(reply_references, message->references, sizeof reply_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);
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);
+ 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 */
+ 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) {
- 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') {
}
}
- /*
- * 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) {
}
if (dest) {
fprintf(dest, "%s\n", lineptr);
- } else {
+ }
+ else {
scr_printf("%s\n", lineptr);
}
}
if (!final_line_is_blank) {
if (dest) {
fprintf(dest, "\n");
- } else {
+ }
+ else {
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 ((!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);
}
}
- /* 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];
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);
}
-/*
- * 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;
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 (beg < 0)
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)
- );
+ scr_printf("*** Error opening temp file!\n %s: %s\n", filename, strerror(errno));
return (1);
}
fclose(fp);
}
}
- ME1:switch (mode) {
+ME1: switch (mode) {
case 0:
fp = fopen(filename, "r+");
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);
}
-/*
- * 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));
}
-/*
- * 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;
}
-/*
- * 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 subject[SIZ];
struct ctdlipcmessage message;
unsigned long *msgarr = NULL;
- int r; /* IPC response code */
+ int r; // IPC response code
int subject_required = 0;
+ // 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 */
+ // no problem, go right ahead
}
else if (entmsg_ok == ENTMSG_OK_BLOG) {
if (!is_reply) {
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);
+ return (1);
}
}
}
if (c > 0) {
mode = 1;
- } else {
+ }
+ else {
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, "");
- message.text = ""; /* point to "", changes later */
+ message.text = ""; // point to "", changes later
message.anonymous = 0;
message.type = mode;
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);
}
}
- /* 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)) {
}
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);
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 {
+ }
+ 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);
if (r / 100 != 2) {
}
}
- /* 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 {
+ }
+ else {
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);
}
- /* 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))) {
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)
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++);
}
- /* 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)
+ 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");
- } 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);
-
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) {
}
-/*
- * List the URLs 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;
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);
}
-/*
- * 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;
}
-/*
- * 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)
+ 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->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);
}
-/*
- * 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;
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 {
+ }
+ else {
for (num_msgs = 0; msg_arr[num_msgs]; num_msgs++);
}
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) {
&& (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;
}
- RMSGREAD:
+RMSGREAD:
highest_msg_read = msg_arr[a];
if (quotflag) {
fclose(dest);
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);
&& (((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");
else
scr_printf("\n");
}
- DONE_QUOTING:switch (e) {
+DONE_QUOTING: switch (e) {
case '?':
scr_printf("Options available here:\n"
" ? Help (prints this 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("%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':
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);
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;
} /* 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;
rewind(src);
dest = (char *) calloc(1, i + 1);
- if (!dest)
+ 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;
}