X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fcommands.c;h=427887cbb67554bd5d4670856a953e74947907be;hb=4eb74b26380dfde31c86c685f0589e0c653aebf0;hp=a575103175fcf83def5a683f961da232199b7195;hpb=7abe50c954a98f62753d57b142f401f2c52fbb7a;p=citadel.git diff --git a/citadel/commands.c b/citadel/commands.c index a57510317..427887cbb 100644 --- a/citadel/commands.c +++ b/citadel/commands.c @@ -4,6 +4,21 @@ * This file contains functions which implement parts of the * text-mode user interface. * + * Copyright (c) 1987-2009 by the citadel.org team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sysdep.h" @@ -43,6 +58,7 @@ #include #include #include +#include #include "citadel.h" #include "citadel_ipc.h" #include "commands.h" @@ -50,7 +66,6 @@ #include "citadel_decls.h" #include "routines.h" #include "routines2.h" -#include "tools.h" #include "rooms.h" #include "client_chat.h" #include "citadel_dirs.h" @@ -58,6 +73,7 @@ #include "snprintf.h" #endif #include "screen.h" +#include "ecrash.h" struct citcmd { struct citcmd *next; @@ -80,6 +96,7 @@ int rc_color_use_bg; int rc_prompt_control = 0; time_t rc_idle_threshold = (time_t)900; char rc_url_cmd[SIZ]; +char rc_open_cmd[SIZ]; char rc_gotmail_cmd[SIZ]; char *gl_string; @@ -186,7 +203,7 @@ void pprintf(const char *format, ...) { vsnprintf(buf, sizeof(buf), format, arg_ptr); va_end(arg_ptr); - for (i=0; i 0) { + if (!IsEmptyStr(rc_exp_cmd)) { outpipe = popen(rc_exp_cmd, "w"); if (outpipe != NULL) { /* Header derived from flags */ @@ -393,9 +410,22 @@ static int async_ka_enabled = 0; static void *ka_thread(void *arg) { +#ifdef HAVE_BACKTRACE + char threadName[256]; + + // Set up our name + sprintf(threadName, "ka_Thread n"); + + // Register for tracing + eCrash_RegisterThread(threadName, 0); +#endif really_do_keepalive(); pthread_detach(ka_thr_handle); ka_thr_active = 0; + +#ifdef HAVE_BACKTRACE + eCrash_UnregisterThread(); +#endif return NULL; } @@ -582,7 +612,7 @@ void ctdl_getline(char *string, int lim) GLA: a = inkey(); /* a = (a & 127); ** commented out because it isn't just an ASCII world anymore */ - if ((a == 8 || a == 23) && (strlen(string) == 0)) + if ((a == 8 || a == 23) && (IsEmptyStr(string))) goto GLA; if ((a != 10) && (a != 8) && (strlen(string) == lim)) goto GLA; @@ -595,7 +625,7 @@ GLA: a = inkey(); 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)) { @@ -636,7 +666,7 @@ void strprompt(char *prompt, char *str, int len) scr_printf("%s", str); } else { - for (i=0; i 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)) { @@ -894,6 +925,9 @@ void load_command_set(void) if (!strncasecmp(buf, "urlcmd=", 7)) strcpy(rc_url_cmd, &buf[7]); + if (!strncasecmp(buf, "opencmd=", 7)) + strcpy(rc_open_cmd, &buf[8]); + if (!strncasecmp(buf, "gotmailcmd=", 11)) strcpy(rc_gotmail_cmd, &buf[11]); @@ -929,7 +963,7 @@ void load_command_set(void) 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] == ',') @@ -963,7 +997,7 @@ char keycmd(char *cmdstr) { 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); @@ -982,7 +1016,7 @@ char *cmd_expand(char *strbuf, int mode) strcpy(exp, strbuf); - for (a = 0; a < strlen(exp); ++a) { + for (a = 0; exp[a]; ++a) { if (strbuf[a] == '&') { /* dont echo these non mnemonic command keys */ @@ -1048,7 +1082,7 @@ int requires_string(struct citcmd *cptr, int ncomp) 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); } @@ -1154,7 +1188,7 @@ int getcmd(CtdlIPC *ipc, char *argbuf) if (cmdmatch(cmdbuf, cptr, 5)) { /* We've found our command. */ if (requires_string(cptr, cmdpos)) { - ctdl_getline(argbuf, 32); + ctdl_getline(argbuf, 64); } else { scr_printf("\n"); } @@ -1188,11 +1222,13 @@ int getcmd(CtdlIPC *ipc, char *argbuf) 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; @@ -1548,7 +1584,7 @@ void look_for_ansi(void) struct timeval tv; char abuf[512]; time_t now; - int a; + int a, rv; if (rc_ansi_color == 0) { enable_color = 0; @@ -1573,11 +1609,11 @@ void look_for_ansi(void) select(1, &rfds, NULL, NULL, &tv); if (FD_ISSET(0, &rfds)) { abuf[strlen(abuf) + 1] = 0; - read(0, &abuf[strlen(abuf)], 1); + rv = read(0, &abuf[strlen(abuf)], 1); } } 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; @@ -1594,15 +1630,15 @@ void keyopt(char *buf) { int i; color(DIM_WHITE); - for (i=0; i') { + if (buf[i]=='>'&& buf[i+1] != '>') { color(DIM_WHITE); } - scr_putc(buf[i]); + pprintf("%c", buf[i]); } } color(DIM_WHITE); @@ -1624,7 +1660,7 @@ char keymenu(char *menuprompt, char *menustring) { choices = num_tokens(menustring, '|'); if (menuprompt != NULL) do_prompt = 1; - if (menuprompt != NULL) if (strlen(menuprompt)==0) do_prompt = 0; + if ((menuprompt != NULL) && (IsEmptyStr(menuprompt))) do_prompt = 0; while (1) { if (display_prompt) { @@ -1658,11 +1694,11 @@ char keymenu(char *menuprompt, char *menustring) { for (i=0; i') ) { - for (a=0; a