#include "tools.h"
#include "rooms.h"
#include "client_chat.h"
+#include "citadel_dirs.h"
#ifndef HAVE_SNPRINTF
#include "snprintf.h"
#endif
int rc_remember_passwords;
int rc_ansi_color;
int rc_color_use_bg;
-int num_urls = 0;
int rc_prompt_control = 0;
time_t rc_idle_threshold = (time_t)900;
-char urls[MAXURLS][SIZ];
char rc_url_cmd[SIZ];
char rc_gotmail_cmd[SIZ];
/* these variables are local to this module */
char keepalives_enabled = KA_YES; /* send NOOPs to server when idle */
-int ok_to_interrupt = 0; /* print express msgs asynchronously */
+int ok_to_interrupt = 0; /* print instant msgs asynchronously */
time_t AnsiDetect; /* when did we send the detect code? */
int enable_color = 0; /* nonzero for ANSI color */
if (!pagin) return(0);
if (lp>=(height-1)) {
set_keepalives(KA_HALF);
- hit_any_key();
+ hit_any_key(ipc_for_signal_handlers); /* Cheating -IO */
set_keepalives(KA_YES);
return(0);
}
vsnprintf(buf, sizeof(buf), format, arg_ptr);
va_end(arg_ptr);
- for (i=0; i<strlen(buf); ++i) {
+ for (i=0; !IsEmptyStr(&buf[i]); ++i) {
scr_putc(buf[i]);
if (buf[i]==10) {
++lines_printed;
/*
- * print_express() - print express messages if there are any
+ * print_instant() - print instant messages if there are any
*/
-void print_express(void)
+void print_instant(void)
{
char buf[1024];
FILE *outpipe;
time_t timestamp;
- struct tm *stamp;
+ struct tm stamp;
int flags = 0;
char sender[64];
char node[64];
char *listing = NULL;
int r; /* IPC result code */
- if (express_msgs == 0)
+ if (instant_msgs == 0)
return;
if (rc_exp_beep) {
ctdl_beep();
}
- if (strlen(rc_exp_cmd) == 0) {
+ if (IsEmptyStr(rc_exp_cmd)) {
color(BRIGHT_RED);
scr_printf("\r---");
}
- while (express_msgs != 0) {
+ while (instant_msgs != 0) {
r = CtdlIPCGetInstantMessage(ipc_for_signal_handlers, &listing, buf);
if (r / 100 != 1)
return;
- express_msgs = extract_int(buf, 0);
+ instant_msgs = extract_int(buf, 0);
timestamp = extract_long(buf, 1);
flags = extract_int(buf, 2);
- extract(sender, buf, 3);
- extract(node, buf, 4);
+ extract_token(sender, buf, 3, '|', sizeof sender);
+ extract_token(node, buf, 4, '|', sizeof node);
strcpy(last_paged, sender);
- stamp = localtime(×tamp);
+ localtime_r(×tamp, &stamp);
/* If the page is a Logoff Request, honor it. */
if (flags & 2) {
return;
}
- if (strlen(rc_exp_cmd) > 0) {
+ if (!IsEmptyStr(rc_exp_cmd)) {
outpipe = popen(rc_exp_cmd, "w");
if (outpipe != NULL) {
/* Header derived from flags */
else
fprintf(outpipe, "Message ");
/* Timestamp. Can this be improved? */
- if (stamp->tm_hour == 0 || stamp->tm_hour == 12)
+ if (stamp.tm_hour == 0 || stamp.tm_hour == 12)
fprintf(outpipe, "at 12:%02d%cm",
- stamp->tm_min,
- stamp->tm_hour ? 'p' : 'a');
- else if (stamp->tm_hour > 12) /* pm */
+ stamp.tm_min,
+ stamp.tm_hour ? 'p' : 'a');
+ else if (stamp.tm_hour > 12) /* pm */
fprintf(outpipe, "at %d:%02dpm",
- stamp->tm_hour - 12,
- stamp->tm_min);
+ stamp.tm_hour - 12,
+ stamp.tm_min);
else /* am */
fprintf(outpipe, "at %d:%02dam",
- stamp->tm_hour, stamp->tm_min);
+ stamp.tm_hour, stamp.tm_min);
fprintf(outpipe, " from %s", sender);
- if (strncmp(serv_info.serv_nodename, node, 32))
+ if (strncmp(ipc_for_signal_handlers->ServInfo.nodename, node, 32))
fprintf(outpipe, " @%s", node);
fprintf(outpipe, ":\n%s\n", listing);
pclose(outpipe);
- if (express_msgs == 0)
+ if (instant_msgs == 0)
return;
continue;
}
}
- /* fall back to built-in express message display */
+ /* fall back to built-in instant message display */
scr_printf("\n");
lines_printed++;
scr_printf("Message ");
/* Timestamp. Can this be improved? */
- if (stamp->tm_hour == 0 || stamp->tm_hour == 12)/* 12am/12pm */
- scr_printf("at 12:%02d%cm", stamp->tm_min,
- stamp->tm_hour ? 'p' : 'a');
- else if (stamp->tm_hour > 12) /* pm */
+ if (stamp.tm_hour == 0 || stamp.tm_hour == 12)/* 12am/12pm */
+ scr_printf("at 12:%02d%cm", stamp.tm_min,
+ stamp.tm_hour ? 'p' : 'a');
+ else if (stamp.tm_hour > 12) /* pm */
scr_printf("at %d:%02dpm",
- stamp->tm_hour - 12, stamp->tm_min);
+ stamp.tm_hour - 12, stamp.tm_min);
else /* am */
- scr_printf("at %d:%02dam", stamp->tm_hour, stamp->tm_min);
+ scr_printf("at %d:%02dam", stamp.tm_hour, stamp.tm_min);
/* Sender */
scr_printf(" from %s", sender);
/* Remote node, if any */
- if (strncmp(serv_info.serv_nodename, node, 32))
+ if (strncmp(ipc_for_signal_handlers->ServInfo.nodename, node, 32))
scr_printf(" @%s", node);
scr_printf(":\n");
time(&idlet);
+ /* This may sometimes get called before we are actually connected
+ * to the server. Don't do anything if we aren't connected. -IO
+ */
+ if (!ipc_for_signal_handlers)
+ return;
+
/* If full keepalives are enabled, send a NOOP to the server and
* wait for a response.
*/
if (keepalives_enabled == KA_YES) {
r = CtdlIPCNoop(ipc_for_signal_handlers);
- if (express_msgs > 0) {
+ if (instant_msgs > 0) {
if (ok_to_interrupt == 1) {
scr_printf("\r%64s\r", "");
- print_express();
+ print_instant();
scr_printf("%s%c ", room_name,
room_prompt(room_flags));
scr_flush();
* server supports it) and then do nothing.
*/
if ( (keepalives_enabled == KA_HALF)
- && (serv_info.serv_supports_qnop > 0) ) {
- CtdlIPC_putline(ipc_for_signal_handlers, "QNOP");
+ && (ipc_for_signal_handlers->ServInfo.supports_qnop > 0) ) {
+ CtdlIPC_chat_send(ipc_for_signal_handlers, "QNOP");
}
}
* necessary and then waits again.
*/
do {
- scr_set_windowsize();
+ scr_set_windowsize(ipc_for_signal_handlers);
do_keepalive();
- scr_set_windowsize();
+ scr_set_windowsize(ipc_for_signal_handlers);
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* At this point, there's input, so fetch it.
* (There's a hole in the bucket...)
*/
- a = scr_getc(SCR_NOBLOCK);
- if (a == 127)
+ a = scr_getc(SCR_BLOCK);
+ if (a == 127) {
a = 8;
- if (a > 126)
- a = 0;
- if (a == 13)
+ }
+ if (a == 13) {
a = 10;
+ }
+/* not so fast there dude, we have to handle UTF-8 and ISO-8859-1...
+ if (a > 126) {
+ a = 0;
+ }
if (((a != 23) && (a != 4) && (a != 10) && (a != 8) && (a != NEXT_KEY) && (a != STOP_KEY))
- && ((a < 32) || (a > 126)))
+ && ((a < 32) || (a > 126))) {
a = 0;
+ }
+ */
#ifndef DISABLE_CURSES
#if defined(HAVE_CURSES_H) || defined(HAVE_NCURSES_H)
- if (a == ERR)
- a = 0;
+ if (a == ERR) {
+ logoff(NULL, 3);
+ }
#endif
#endif
/* Gets a line from the terminal */
/* string == Pointer to string buffer */
/* lim == Maximum length - if negative, no-show */
-void getline(char *string, int lim)
+void ctdl_getline(char *string, int lim)
{
int a, b;
char flag = 0;
strcpy(string, "");
gl_string = string;
async_ka_start();
- GLA:a = inkey();
- a = (a & 127);
- if ((a == 8 || a == 23) && (strlen(string) == 0))
+
+GLA: a = inkey();
+ /* a = (a & 127); ** commented out because it isn't just an ASCII world anymore */
+ if ((a == 8 || a == 23) && (IsEmptyStr(string)))
goto GLA;
if ((a != 10) && (a != 8) && (strlen(string) == lim))
goto GLA;
do {
string[strlen(string) - 1] = 0;
scr_putc(8); scr_putc(32); scr_putc(8);
- } while (strlen(string) && string[strlen(string) - 1] != ' ');
+ } while (!IsEmptyStr(string) && string[strlen(string) - 1] != ' ');
goto GLA;
}
if ((a == 10)) {
int i;
char buf[128];
- print_express();
+ print_instant();
color(DIM_WHITE);
scr_printf("%s ", prompt);
color(DIM_MAGENTA);
scr_printf("%s", str);
}
else {
- for (i=0; i<strlen(str); ++i) {
+ for (i=0; !IsEmptyStr(&str[i]); ++i) {
scr_printf("*");
}
}
color(DIM_WHITE);
scr_printf(": ");
color(BRIGHT_CYAN);
- getline(buf, len);
+ ctdl_getline(buf, len);
if (buf[0] != 0)
strcpy(str, buf);
color(DIM_WHITE);
snprintf(buf, sizeof buf, "%d", i);
strprompt(prompt, buf, 15);
i = atoi(buf);
- for (p=0; p<strlen(buf); ++p) {
+ for (p=0; !IsEmptyStr(&buf[p]); ++p) {
if ( (!isdigit(buf[p]))
&& ( (buf[p]!='-') || (p!=0) ) )
i = imin - 1;
color(BRIGHT_MAGENTA);
scr_printf("%s", prompt);
color(DIM_MAGENTA);
- getline(str, len);
+ ctdl_getline(str, len);
color(DIM_WHITE);
}
{
FILE *ccfile;
char buf[1024];
+ char editor_key[100];
struct citcmd *cptr;
struct citcmd *lastcmd = NULL;
int a, d;
int b = 0;
+ int i;
/* first, set up some defaults for non-required variables */
- strcpy(editor_path, "");
+ for (i = 0; i < MAX_EDITORS; i++)
+ strcpy(editor_paths[i], "");
strcpy(printcmd, "");
+ strcpy(imagecmd, "");
strcpy(rc_username, "");
strcpy(rc_password, "");
rc_floor_mode = 0;
ccfile = fopen(buf, "r");
}
if (ccfile == NULL) {
- snprintf(buf, sizeof buf, "%s/citadel.rc", BBSDIR);
- ccfile = fopen(buf, "r");
+ ccfile = fopen(file_citadel_rc, "r");
}
if (ccfile == NULL) {
ccfile = fopen("/etc/citadel.rc", "r");
logoff(NULL, 3);
}
while (fgets(buf, sizeof buf, ccfile) != NULL) {
- while ((strlen(buf) > 0) ? (isspace(buf[strlen(buf) - 1])) : 0)
+ while ((!IsEmptyStr(buf)) ? (isspace(buf[strlen(buf) - 1])) : 0)
buf[strlen(buf) - 1] = 0;
if (!strncasecmp(buf, "encrypt=", 8)) {
#endif
if (!strncasecmp(buf, "editor=", 7))
- strcpy(editor_path, &buf[7]);
+ strcpy(editor_paths[0], &buf[7]);
+
+ for (i = 0; i < MAX_EDITORS; i++)
+ {
+ sprintf(editor_key, "editor%d=", i);
+ if (!strncasecmp(buf, editor_key, strlen(editor_key)))
+ strcpy(editor_paths[i], &buf[strlen(editor_key)]);
+ }
if (!strncasecmp(buf, "printcmd=", 9))
strcpy(printcmd, &buf[9]);
+ if (!strncasecmp(buf, "imagecmd=", 9))
+ strcpy(imagecmd, &buf[9]);
+
if (!strncasecmp(buf, "expcmd=", 7))
strcpy(rc_exp_cmd, &buf[7]);
rc_allow_attachments = atoi(&buf[18]);
}
if (!strncasecmp(buf, "idle_threshold=", 15)) {
- rc_idle_threshold = atoi(&buf[15]);
+ rc_idle_threshold = atol(&buf[15]);
}
if (!strncasecmp(buf, "remember_passwords=", 19)) {
rc_remember_passwords = atoi(&buf[19]);
strcpy(rc_gotmail_cmd, &buf[11]);
if (!strncasecmp(buf, "alternate_semantics=", 20)) {
- if (!strncasecmp(&buf[11], "yes", 3))
+ if (!strncasecmp(&buf[20], "yes", 3)) {
rc_alt_semantics = 1;
- if (!strncasecmp(&buf[11], "no", 2))
+ }
+ else {
rc_alt_semantics = 0;
+ }
}
+
if (!strncasecmp(buf, "cmd=", 4)) {
strcpy(buf, &buf[4]);
a = 0;
b = 0;
buf[strlen(buf) + 1] = 0;
- while (strlen(buf) > 0) {
+ while (!IsEmptyStr(buf)) {
b = strlen(buf);
for (d = strlen(buf); d >= 0; --d)
if (buf[d] == ',')
{
int a;
- for (a = 0; a < strlen(cmdstr); ++a)
+ for (a = 0; !IsEmptyStr(&cmdstr[a]); ++a)
if (cmdstr[a] == '&')
return (tolower(cmdstr[a + 1]));
return (0);
int a;
static char exp[64];
char buf[1024];
+ char *ptr;
strcpy(exp, strbuf);
- for (a = 0; a < strlen(exp); ++a) {
- if (strbuf[a] == '&') {
+ ptr = exp;
+ while (!IsEmptyStr(ptr)){
+ if (*ptr == '&') {
+
+ /* dont echo these non mnemonic command keys */
+ int noecho = *(ptr+1) == '<' || *(ptr+1) == '>' ||
+ *(ptr+1) == '+' || *(ptr+1) == '-';
if (mode == 0) {
- strcpy(&exp[a], &exp[a + 1]);
+ strcpy(ptr, ptr + 1 + noecho);
}
if (mode == 1) {
- exp[a] = '<';
- strcpy(buf, &exp[a + 2]);
- exp[a + 2] = '>';
- exp[a + 3] = 0;
+ *ptr = '<';
+ strcpy(buf, ptr + 2);
+ *(ptr + 2) = '>';
+ *(ptr+ 3) = 0;
strcat(exp, buf);
}
}
- if (!strncmp(&exp[a], "^r", 2)) {
+ if (!strncmp(ptr, "^r", 2)) {
strcpy(buf, exp);
- strcpy(&exp[a], room_name);
- strcat(exp, &buf[a + 2]);
+ strcpy(ptr, room_name);
+ strcat(exp, &buf[ptr - exp + 2]);
}
- if (!strncmp(&exp[a], "^c", 2)) {
- exp[a] = ',';
- strcpy(&exp[a + 1], &exp[a + 2]);
+ if (!strncmp(ptr, "^c", 2)) {
+ *ptr = ',';
+ strcpy(ptr + 1], ptr + 2]);
}
}
char buf[64];
strcpy(buf, cptr->c_keys[ncomp - 1]);
- for (a = 0; a < strlen(buf); ++a) {
+ for (a = 0; !IsEmptyStr(&buf[a]); ++a) {
if (buf[a] == ':')
return (1);
}
/* if we're running in idiot mode, display a cute little menu */
IFNEXPERT formout(ipc, "mainmenu");
- print_express();
+ print_instant();
strcpy(argbuf, "");
cmdpos = 0;
for (a = 0; a < 5; ++a)
if (cmdmatch(cmdbuf, cptr, 5)) {
/* We've found our command. */
if (requires_string(cptr, cmdpos)) {
- getline(argbuf, 32);
+ ctdl_getline(argbuf, 64);
} else {
scr_printf("\n");
}
|| (cptr->c_cmdnum == 20))
next_lazy_cmd = 13;
+ /* If this command is "read new"
+ * then the next lazy-command (space bar)
+ * should be "goto"
+ */
+ if (cptr->c_cmdnum == 13)
+ next_lazy_cmd = 5;
+
return (cptr->c_cmdnum);
}
for (cptr = cmdlist; cptr != NULL; cptr = cptr->next) {
if (cmdmatch(cmdbuf, cptr, cmdpos)) {
for (a = 0; a < 5; ++a) {
- pprintf("%s ", cmd_expand(cptr->c_keys[a], 1));
+ keyopt(cmd_expand(cptr->c_keys[a], 1));
+ pprintf(" ");
}
pprintf("\n");
}
}
+ sigcaught = 0;
pprintf("\n%s%c ", room_name, room_prompt(room_flags));
got = 0;
/*
* set tty modes. commands are:
*
- * 01- set to bbs mode
+ * 01- set to Citadel mode
* 2 - save current settings for later restoral
* 3 - restore saved settings
*/
#ifdef HAVE_TERMIOS_H
-void sttybbs(int cmd)
-{ /* SysV version of sttybbs() */
+void stty_ctdl(int cmd)
+{ /* SysV version of stty_ctdl() */
struct termios live;
static struct termios saved_settings;
static int last_cmd = 0;
}
#else
-void sttybbs(int cmd)
-{ /* BSD version of sttybbs() */
+void stty_ctdl(int cmd)
+{ /* BSD version of stty_ctdl() */
struct sgttyb live;
static struct sgttyb saved_settings;
static int last_cmd = 0;
char old = 0; /* The previous character */
int column = 0; /* Current column */
size_t i; /* Generic counter */
- size_t g = 0;
-
- num_urls = 0; /* Start with a clean slate of embedded URL's */
/* Space for a single word, which can be at most screenwidth */
word = (char *)calloc(1, width);
/* Read the entire message body into memory */
if (fpin) {
- size_t got = 0;
-
- fseek(fpin, 0, SEEK_END);
- i = ftell(fpin);
- rewind(fpin);
- buffer = (char *)calloc(1, i + 1);
+ buffer = load_message_from_file(fpin);
if (!buffer) {
- err_printf("Can't alloc memory for message: %s!\n",
+ err_printf("Can't print message: %s!\n",
strerror(errno));
logoff(NULL, 3);
}
-
- while (got < i) {
- size_t g;
-
- g = fread(buffer + got, 1, i - got, fpin);
- got += g;
- if (g < i - got) {
- /* Interrupted system call, keep going */
- if (errno == EINTR)
- continue;
- /* At this point we have either EOF or error */
- i = got;
- break;
- }
- buffer[i] = 0;
- }
} else {
buffer = text;
}
/* Run the message body */
while (*e) {
+ /* Catch characters that shouldn't be there at all */
+ if (*e == '\r') {
+ e++;
+ continue;
+ }
/* First, are we looking at a newline? */
if (*e == '\n') {
e++;
old = '\n';
continue;
}
+
+ /* Are we looking at a nonprintable?
+ * (This section is now commented out because we could be displaying
+ * a character set like UTF-8 or ISO-8859-1.)
+ if ( (*e < 32) || (*e > 126) ) {
+ e++;
+ continue;
+ } */
+
/* Or are we looking at a space? */
if (*e == ' ') {
e++;
if (e[i] == '\t' || e[i] == '\f' || e[i] == '\v')
e[i] = ' ';
- /*
- * Check for and copy URLs
- * We will get the entire URL even if it's longer than the
- * screen width, as long as the server didn't break it up
- */
- if (!strncasecmp(e, "http://", 7) ||
- !strncasecmp(e, "ftp://", 6)) {
- int j;
-
- strncpy(urls[num_urls], e, i);
- urls[num_urls][i] = 0;
- for (j = 0; j < strlen(e); j++) {
- char c;
-
- c = urls[num_urls][j];
- if (c == '>' || c == '\"' || c == ')' ||
- c == ' ' || c == '\n') {
- urls[num_urls][j] = 0;
- break;
- }
- }
- num_urls++;
- }
-
/* Break up really long words */
/* TODO: auto-hyphenation someday? */
if (i >= width)
}
} while (FD_ISSET(0, &rfds));
- for (a = 0; a < strlen(abuf); ++a) {
+ for (a = 0; !IsEmptyStr(&abuf[a]); ++a) {
if ((abuf[a] == 27) && (abuf[a + 1] == '[')
&& (abuf[a + 2] == '?')) {
enable_color = 1;
int i;
color(DIM_WHITE);
- for (i=0; i<strlen(buf); ++i) {
+ for (i=0; !IsEmptyStr(&buf[i]); ++i) {
if (buf[i]=='<') {
- scr_putc(buf[i]);
+ pprintf("%c", buf[i]);
color(BRIGHT_MAGENTA);
} else {
- if (buf[i]=='>') {
+ if (buf[i]=='>'&& buf[i+1] != '>') {
color(DIM_WHITE);
}
- scr_putc(buf[i]);
+ pprintf("%c", buf[i]);
}
}
color(DIM_WHITE);
choices = num_tokens(menustring, '|');
if (menuprompt != NULL) do_prompt = 1;
- if (menuprompt != NULL) if (strlen(menuprompt)==0) do_prompt = 0;
+ if (menuprompt != NULL) if (IsEmptyStr(menuprompt)) do_prompt = 0;
while (1) {
if (display_prompt) {
}
else {
for (i=0; i<choices; ++i) {
- extract(buf, menustring, i);
+ extract_token(buf, menustring, i, '|', sizeof buf);
keyopt(buf);
scr_printf(" ");
}
}
- scr_printf(" -> ");
+ scr_printf("-> ");
display_prompt = 0;
}
ch = lkey();
scr_printf("\rOne of... ");
scr_printf(" \n");
for (i=0; i<choices; ++i) {
- extract(buf, menustring, i);
+ extract_token(buf, menustring, i, '|', sizeof buf);
scr_printf(" ");
keyopt(buf);
scr_printf("\n");
}
for (i=0; i<choices; ++i) {
- extract(buf, menustring, i);
- for (c=1; c<strlen(buf); ++c) {
+ extract_token(buf, menustring, i, '|', sizeof buf);
+ for (c=1; !IsEmptyStr(&buf[c]); ++c) {
if ( (ch == tolower(buf[c]))
&& (buf[c-1]=='<')
&& (buf[c+1]=='>') ) {
- for (a=0; a<strlen(buf); ++a) {
+ for (a=0; !IsEmptyStr(&buf[a]); ++a) {
if ( (a!=(c-1)) && (a!=(c+1))) {
scr_putc(buf[a]);
}
}
- scr_printf("\n\n");
+ scr_printf("\n");
return ch;
}
}