X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=init.c;h=ff02dce9fa90ff6ea9670be941522f322af5c0f1;hp=82636f18ba55723a3a619ea80c3f6e1f921f27ee;hb=b6980caf7b13994c57957872876cdecc21e54a82;hpb=79b870584c9a4fca6f6bf34b9b95dcff3b76dc29 diff --git a/init.c b/init.c index 82636f1..ff02dce 100644 --- a/init.c +++ b/init.c @@ -11,20 +11,19 @@ */ #include -#include +#include #include #include - #include #include #include +#include #include "mutt.h" #include "keymap.h" #include "charset.h" #include "thread.h" -#include #include "mutt_idna.h" #if defined (USE_LIBESMTP) && (defined (USE_SSL) || defined (USE_GNUTLS)) @@ -42,7 +41,7 @@ static int parse_sort (struct option_t* dst, const char *s, const struct mapping_t *map, char* errbuf, ssize_t errlen); -static HASH *ConfigOptions = NULL; +static hash_t *ConfigOptions = NULL; /* for synonym warning reports: synonym found during parsing */ typedef struct syn_t { @@ -69,10 +68,6 @@ static const char* CurRCFile = NULL; static int CurRCLine = 0; /* prototypes for checking for special vars */ -static int check_dsn_return (const char* option, unsigned long val, - char* errbuf, ssize_t errlen); -static int check_dsn_notify (const char* option, unsigned long val, - char* errbuf, ssize_t errlen); static int check_history (const char* option, unsigned long val, char* errbuf, ssize_t errlen); /* this checks that numbers are >= 0 */ @@ -92,8 +87,6 @@ static struct { int (*check) (const char* option, unsigned long val, char* errbuf, ssize_t errlen); } SpecialVars[] = { - { "dsn_notify", check_dsn_notify }, - { "dsn_return", check_dsn_return }, #if defined (USE_LIBESMTP) && (defined (USE_SSL) || defined (USE_GNUTLS)) { "smtp_use_tls", mutt_libesmtp_check_usetls }, #endif @@ -112,8 +105,6 @@ static void sort_to_string (char* dst, ssize_t dstlen, struct option_t* option) static void rx_to_string (char* dst, ssize_t dstlen, struct option_t* option); static void magic_to_string (char* dst, ssize_t dstlen, struct option_t* option); static void addr_to_string (char* dst, ssize_t dstlen, struct option_t* option); -static void user_to_string (char* dst, ssize_t dstlen, struct option_t* option); -static void sys_to_string (char* dst, ssize_t dstlen, struct option_t* option); /* protos for config type handles: convert to value from string */ static int bool_from_string (struct option_t* dst, const char* val, @@ -134,8 +125,6 @@ static int magic_from_string (struct option_t* dst, const char* val, char* errbuf, ssize_t errlen); static int addr_from_string (struct option_t* dst, const char* val, char* errbuf, ssize_t errlen); -static int user_from_string (struct option_t* dst, const char* val, - char* errbuf, ssize_t errlen); static struct { unsigned short type; @@ -156,8 +145,6 @@ static struct { * but must define it as DT_ is used for indexing */ { DT_SYN, NULL, NULL }, { DT_ADDR, addr_to_string, addr_from_string }, - { DT_USER, user_to_string, user_from_string }, - { DT_SYS, sys_to_string, NULL }, }; static void bool_to_string (char* dst, ssize_t dstlen, @@ -233,55 +220,6 @@ static void str_to_string (char* dst, ssize_t dstlen, NONULL (*((char**) option->data))); } -static void user_to_string (char* dst, ssize_t dstlen, - struct option_t* option) { - snprintf (dst, dstlen, "%s=\"%s\"", option->option, - NONULL (((char*) option->data))); -} - -static void sys_to_string (char* dst, ssize_t dstlen, - struct option_t* option) { - char *val = NULL, *t = NULL; - int clean = 0; - - /* get some $madmutt_ values dynamically */ - if (m_strcmp("madmutt_pwd", option->option) == 0) { - val = p_new(char, _POSIX_PATH_MAX); - val = getcwd (val, _POSIX_PATH_MAX-1); - clean = 1; - } else if (m_strcmp("madmutt_folder_path", option->option) == 0 && - CurrentFolder && *CurrentFolder) { - val = CurrentFolder; - } else if (m_strcmp("madmutt_folder_name", option->option) == 0 && - CurrentFolder && *CurrentFolder) { - - ssize_t Maildirlength = m_strlen(Maildir); - - /* - * if name starts with $folder, just strip it to keep hierarchy - * $folder=imap://host, path=imap://host/inbox/b -> inbox/b - */ - if (Maildirlength > 0 && m_strncmp(CurrentFolder, Maildir, - Maildirlength) == 0 && - m_strlen(CurrentFolder) > Maildirlength) { - val = CurrentFolder + Maildirlength; - if (Maildir[Maildirlength]!='/') - val += 1; - /* if not $folder, just use everything after last / */ - } else if ((t = strrchr (CurrentFolder, '/')) != NULL) - val = t+1; - /* default: use as-is */ - else - val = (char *) CurrentFolder; - - } else - val = (char *) option->init; - - snprintf (dst, dstlen, "%s=\"%s\"", option->option, NONULL (val)); - if (clean) - p_delete(&val); -} - static int path_from_string (struct option_t* dst, const char* val, char* errbuf __attribute__ ((unused)), ssize_t errlen __attribute__ ((unused))) { char path[_POSIX_PATH_MAX]; @@ -313,24 +251,6 @@ static int str_from_string (struct option_t* dst, const char* val, return (1); } -static int user_from_string (struct option_t* dst, const char* val, - char* errbuf __attribute__ ((unused)), ssize_t errlen __attribute__ ((unused))) { - /* if dst == NULL, we may get here in case the user did unset it, - * see parse_set() where item is free()'d before coming here; so - * just silently ignore it */ - if (!dst) - return (1); - if (m_strlen((char*) dst->data) == 0) - dst->data = (unsigned long) m_strdup(val); - else { - char* s = (char*) dst->data; - m_strreplace(&s, val); - } - if (m_strlen(dst->init) == 0) - dst->init = m_strdup((char*) dst->data); - return (1); -} - static void quad_to_string (char* dst, ssize_t dstlen, struct option_t* option) { const char *vals[] = { "no", "yes", "ask-no", "ask-yes" }; @@ -567,6 +487,20 @@ int quadoption (int opt) return (QuadOptions[n] >> b) & 0x3; } +int query_quadoption2(int v, const char *prompt) +{ + switch (v) { + case M_YES: + case M_NO: + return (v); + + default: + v = mutt_yesorno(prompt, (v == M_ASKYES)); + CLEARLINE (LINES - 1); + return (v); + } +} + int query_quadoption (int opt, const char *prompt) { int v = quadoption (opt); @@ -732,9 +666,8 @@ static int parse_ignore (BUFFER * buf, BUFFER * s, return 0; } -static int parse_list (BUFFER * buf, BUFFER * s, - unsigned long data __attribute__ ((unused)), - BUFFER * err __attribute__ ((unused))) +static int parse_list(BUFFER * buf, BUFFER * s, unsigned long data, + BUFFER * err __attribute__ ((unused))) { do { mutt_extract_token (buf, s, 0); @@ -1251,8 +1184,7 @@ static int parse_alias (BUFFER * buf, BUFFER * s, set_option (OPTFORCEREDRAWINDEX); } - mutt_extract_token(buf, s, - M_TOKEN_QUOTE | M_TOKEN_SPACE | M_TOKEN_SEMICOLON); + mutt_extract_token(buf, s, M_TOKEN_QUOTE | M_TOKEN_SPACE); (*last)->addr = mutt_parse_adrlist((*last)->addr, buf->data); if (mutt_addrlist_to_idna((*last)->addr, &estr)) { snprintf (err->data, err->dsize, @@ -1380,32 +1312,6 @@ static void mutt_set_default(const char *name __attribute__ ((unused)), void* p, ptr->init = m_strdup(buf); } -static struct option_t* add_option (const char* name, const char* init, - short type, short dodup) { - struct option_t* option = p_new(struct option_t, 1); - - option->option = m_strdup(name); - option->type = type; - if (init) - option->init = dodup ? m_strdup(init) : (char*) init; - return (option); -} - -/* creates new option_t* of type DT_USER for $user_ var */ -static struct option_t* add_user_option (const char* name) { - return (add_option (name, NULL, DT_USER, 1)); -} - -/* free()'s option_t* */ -static void del_option (void* p) { - struct option_t *ptr = (struct option_t*) p; - char* s = (char*) ptr->data; - p_delete(&ptr->option); - p_delete(&s); - p_delete(&ptr->init); - p_delete(&ptr); -} - static int init_expand (char** dst, struct option_t* src) { BUFFER token, in; ssize_t len = 0; @@ -1481,45 +1387,6 @@ static void mutt_restore_default (const char* name __attribute__ ((unused)), set_option (OPTREDRAWTREE); } -/* check whether value for $dsn_return would be valid */ -static int check_dsn_return (const char* option __attribute__ ((unused)), unsigned long p, - char* errbuf, ssize_t errlen) { - char* val = (char*) p; - if (val && *val && m_strncmp(val, "hdrs", 4) != 0 && - m_strncmp(val, "full", 4) != 0) { - if (errbuf) - snprintf (errbuf, errlen, _("'%s' is invalid for $%s"), val, "dsn_return"); - return (0); - } - return (1); -} - -/* check whether value for $dsn_notify would be valid */ -static int -check_dsn_notify (const char* option __attribute__ ((unused)), - unsigned long val, char* errbuf, ssize_t errlen) -{ - const char *p = (const char*)val; - - while (p && *p) { - const char *q = m_strchrnul(p, ','); - int len = q - p; - - if (!m_strncmp(p, "never", len) && !m_strncmp(p, "delay", len) - && !m_strncmp(p, "failure", len) && !m_strncmp(p, "success", len)) - { - if (errbuf) - snprintf(errbuf, errlen, _("'%.*s' is invalid for $%s"), - len, p, "dsn_notify"); - return 0; - } - - p = q + 1; - } - - return 1; -} - static int check_num (const char* option, unsigned long p, char* errbuf, ssize_t errlen) { if ((int) p < 0) { @@ -1630,16 +1497,6 @@ static int parse_set (BUFFER * tmp, BUFFER * s, unsigned long data, option = newopt; } - /* see if we need to add $user_ var */ - if (!option && m_strncmp("user_", tmp->data, 5) == 0) { - /* there's no option named like this yet so only add one - * if the action isn't any of: reset, unset, query */ - if (!(reset || unset || query || *s->dptr != '=')) { - option = add_user_option (tmp->data); - hash_insert (ConfigOptions, option->option, option, 0); - } - } - if (!option && !(reset && m_strcmp("all", tmp->data) == 0)) { snprintf (err->data, err->dsize, _("%s: unknown variable"), tmp->data); return (-1); @@ -1670,11 +1527,6 @@ static int parse_set (BUFFER * tmp, BUFFER * s, unsigned long data, set_option (OPTRESORTINIT); set_option (OPTREDRAWTREE); return (0); - } - else if (!FuncTable[DTYPE (option->type)].opt_fromstr) { - snprintf (err->data, err->dsize, _("$%s is read-only"), option->option); - r = -1; - break; } else { CHECK_PAGER; mutt_restore_default (NULL, option, 1); @@ -1720,29 +1572,17 @@ static int parse_set (BUFFER * tmp, BUFFER * s, unsigned long data, DTYPE (option->type) == DT_MAGIC || DTYPE (option->type) == DT_NUM || DTYPE (option->type) == DT_SORT || - DTYPE (option->type) == DT_RX || - DTYPE (option->type) == DT_USER || - DTYPE (option->type) == DT_SYS) { - + DTYPE (option->type) == DT_RX) + { /* XXX maybe we need to get unset into handlers? */ if (DTYPE (option->type) == DT_STR || DTYPE (option->type) == DT_PATH || - DTYPE (option->type) == DT_ADDR || - DTYPE (option->type) == DT_USER || - DTYPE (option->type) == DT_SYS) { + DTYPE (option->type) == DT_ADDR) + { if (unset) { CHECK_PAGER; - if (!FuncTable[DTYPE (option->type)].opt_fromstr) { - snprintf (err->data, err->dsize, _("$%s is read-only"), - option->option); - r = -1; - break; - } else if (DTYPE (option->type) == DT_ADDR) + if (DTYPE (option->type) == DT_ADDR) address_list_wipe((address_t **) option->data); - else if (DTYPE (option->type) == DT_USER) - /* to unset $user_ means remove */ - hash_delete (ConfigOptions, option->option, - option, del_option); else p_delete((void **)(void *)&option->data); break; @@ -1755,20 +1595,12 @@ static int parse_set (BUFFER * tmp, BUFFER * s, unsigned long data, break; } - /* the $madmutt_ variables are read-only */ - if (!FuncTable[DTYPE (option->type)].opt_fromstr) { - snprintf (err->data, err->dsize, _("$%s is read-only"), - option->option); + CHECK_PAGER; + s->dptr++; + mutt_extract_token (tmp, s, 0); + if (!FuncTable[DTYPE (option->type)].opt_fromstr + (option, tmp->data, err->data, err->dsize)) r = -1; - break; - } else { - CHECK_PAGER; - s->dptr++; - mutt_extract_token (tmp, s, 0); - if (!FuncTable[DTYPE (option->type)].opt_fromstr - (option, tmp->data, err->data, err->dsize)) - r = -1; - } } else if (DTYPE (option->type) == DT_QUAD) { @@ -1849,12 +1681,12 @@ static int source_rc (const char *rcfile, BUFFER * err) p_clear(&token, 1); while ((linebuf = mutt_read_line(linebuf, &buflen, f, &line)) != NULL) { - conv = ConfigCharset && (*ConfigCharset) && Charset; + conv = ConfigCharset && (*ConfigCharset) && MCharset.charset; if (conv) { currentline = m_strdup(linebuf); if (!currentline) continue; - mutt_convert_string (¤tline, ConfigCharset, Charset, 0); + mutt_convert_string (¤tline, ConfigCharset, MCharset.charset, 0); } else currentline = linebuf; @@ -1928,7 +1760,7 @@ static int parse_source (BUFFER * tmp, BUFFER * s, every call to this function. err where to write error messages */ -int mutt_parse_rc_line ( /* const */ char *line, BUFFER * token, BUFFER * err) +int mutt_parse_rc_line (const char *line, BUFFER * token, BUFFER * err) { int i, r = -1; BUFFER expn; @@ -2309,7 +2141,6 @@ static int mutt_execute_commands (string_list_t * p) void mutt_init (int skip_sys_rc, string_list_t * commands) { struct passwd *pw; - struct utsname utsname; const char *p; char buffer[STRING], error[STRING]; int default_rc = 0, need_pause = 0; @@ -2320,16 +2151,9 @@ void mutt_init (int skip_sys_rc, string_list_t * commands) err.data = error; err.dsize = sizeof(error); - /* use 3*sizeof(muttvars) instead of 2*sizeof() - * to have some room for $user_ vars */ - ConfigOptions = hash_create (sizeof(MuttVars) * 3); + ConfigOptions = hash_new (sizeof(MuttVars) * 2, 0); for (i = 0; MuttVars[i].option; i++) { - if (DTYPE (MuttVars[i].type) != DT_SYS) - hash_insert (ConfigOptions, MuttVars[i].option, &MuttVars[i], 0); - else - hash_insert (ConfigOptions, MuttVars[i].option, - add_option (MuttVars[i].option, MuttVars[i].init, - DT_SYS, 0), 0); + hash_insert (ConfigOptions, MuttVars[i].option, &MuttVars[i]); } /* @@ -2338,61 +2162,14 @@ void mutt_init (int skip_sys_rc, string_list_t * commands) snprintf (AttachmentMarker, sizeof(AttachmentMarker), "\033]9;%ld\a", (long) time (NULL)); - /* on one of the systems I use, getcwd() does not return the same prefix - as is listed in the passwd file */ - if ((p = getenv ("HOME"))) - Homedir = m_strdup(p); - + luaM_initialize(); /* Get some information about the user */ if ((pw = getpwuid (getuid ()))) { char rnbuf[STRING]; - - Username = m_strdup(pw->pw_name); - if (!Homedir) - Homedir = m_strdup(pw->pw_dir); - - mutt_gecos_name(rnbuf, sizeof(rnbuf), pw, GecosMask.rx); + mutt_gecos_name(rnbuf, sizeof(rnbuf), pw, MCore.gecos_mask); Realname = m_strdup(rnbuf); - Shell = m_strdup(pw->pw_shell); - endpwent (); - } - else { - if (!Homedir) { - mutt_endwin (NULL); - fputs (_("unable to determine home directory"), stderr); - exit (1); - } - if ((p = getenv ("USER"))) - Username = m_strdup(p); - else { - mutt_endwin (NULL); - fputs (_("unable to determine username"), stderr); - exit (1); - } - Shell = m_strdup((p = getenv ("SHELL")) ? p : "/bin/sh"); } - /* And about the host... */ - uname (&utsname); - /* some systems report the FQDN instead of just the hostname */ - if ((p = strchr (utsname.nodename, '.'))) { - Hostname = p_dupstr(utsname.nodename, p - utsname.nodename); - p++; - m_strcpy(buffer, sizeof(buffer), p); /* save the domain for below */ - } - else - Hostname = m_strdup(utsname.nodename); - - if (!p && getdnsdomainname(buffer, sizeof(buffer)) == -1) - Fqdn = m_strdup("@"); - else - if (*buffer != '@') { - Fqdn = p_new(char, m_strlen(buffer) + m_strlen(Hostname) + 2); - sprintf (Fqdn, "%s.%s", NONULL(Hostname), buffer); - } - else - Fqdn = m_strdup(NONULL (Hostname)); - #ifdef USE_NNTP { FILE *f; @@ -2414,15 +2191,13 @@ void mutt_init (int skip_sys_rc, string_list_t * commands) NewsServer = m_strdup(p); #endif - if ((p = getenv ("MAIL"))) + if ((p = getenv("MAIL") ?: getenv("MAILDIR"))) { Spoolfile = m_strdup(p); - else if ((p = getenv ("MAILDIR"))) - Spoolfile = m_strdup(p); - else { + } else { #ifdef HOMESPOOL - mutt_concat_path(buffer, sizeof(buffer), NONULL(Homedir), MAILPATH); + mutt_concat_path(buffer, sizeof(buffer), NONULL(MCore.homedir), MAILPATH); #else - mutt_concat_path(buffer, sizeof(buffer), MAILPATH, NONULL(Username)); + mutt_concat_path(buffer, sizeof(buffer), MAILPATH, NONULL(MCore.username)); #endif Spoolfile = m_strdup(buffer); } @@ -2436,16 +2211,6 @@ void mutt_init (int skip_sys_rc, string_list_t * commands) "/mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap"); } - Tempdir = m_strdup((p = getenv ("TMPDIR")) ? p : "/tmp"); - - p = getenv ("VISUAL"); - if (!p) { - p = getenv ("EDITOR"); - if (!p) - p = "vi"; - } - Editor = m_strdup(p); - if ((p = getenv ("REPLYTO")) != NULL) { BUFFER buf, token; @@ -2463,8 +2228,6 @@ void mutt_init (int skip_sys_rc, string_list_t * commands) if ((p = getenv ("EMAIL")) != NULL) From = rfc822_parse_adrlist (NULL, p); - charset_initialize(); - /* Set standard defaults */ hash_map (ConfigOptions, mutt_set_default, 0); hash_map (ConfigOptions, mutt_restore_default, 0); @@ -2480,10 +2243,10 @@ void mutt_init (int skip_sys_rc, string_list_t * commands) mutt_init_history (); if (!Muttrc) { - snprintf (buffer, sizeof(buffer), "%s/.madmuttrc", NONULL (Homedir)); + snprintf (buffer, sizeof(buffer), "%s/.madmuttrc", NONULL(MCore.homedir)); if (access (buffer, F_OK) == -1) snprintf (buffer, sizeof(buffer), "%s/.madmutt/madmuttrc", - NONULL (Homedir)); + NONULL(MCore.homedir)); default_rc = 1; Muttrc = m_strdup(buffer); @@ -2494,8 +2257,6 @@ void mutt_init (int skip_sys_rc, string_list_t * commands) mutt_expand_path (buffer, sizeof(buffer)); Muttrc = m_strdup(buffer); } - p_delete(&AliasFile); - AliasFile = m_strdup(NONULL (Muttrc)); /* Process the global rc file if it exists and the user hasn't explicity requested not to via "-n". */ @@ -2535,6 +2296,15 @@ void mutt_init (int skip_sys_rc, string_list_t * commands) exit (1); } + /* LUA {{{ */ + snprintf(buffer, sizeof(buffer), "%s/.madmutt.lua", NONULL(MCore.homedir)); + if (access(buffer, F_OK) < 0) + snprintf(buffer, sizeof(buffer), "%s/.madmutt/cfg.lua", NONULL(MCore.homedir)); + if (!access(buffer, F_OK)) { + need_pause = luaM_wrap(mutt_error, luaM_dofile(buffer)); + } + /* }}} */ + if (mutt_execute_commands (commands) != 0) need_pause = 1;