X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=url.c;h=eb9d7f6385ae0bed975232d4df700b9220591a97;hp=e99c2752197225de0874f4618b4b63762460a01b;hb=92f33a4a968296528f1d5f151ff700210840cb2c;hpb=3d937534e7b1ee723f86594b5e4c64c95158a933 diff --git a/url.c b/url.c index e99c275..eb9d7f6 100644 --- a/url.c +++ b/url.c @@ -1,45 +1,43 @@ /* + * Copyright notice from original mutt: * Copyright (C) 2000 Thomas Roessler - * - * 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 2 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, USA. - */ + * + * This file is part of mutt-ng, see http://www.muttng.org/. + * It's licensed under the GNU General Public License, + * please see the file GPL in the top level source directory. + */ /* * A simple URL parser. */ +#if HAVE_CONFIG_H +# include "config.h" +#endif + #include "mutt.h" +#include "ascii.h" #include "mapping.h" #include "url.h" #include "mime.h" +#include "lib/mem.h" + #include -static struct mapping_t UrlMap[] = -{ - { "file", U_FILE }, - { "imap", U_IMAP }, - { "imaps", U_IMAPS }, - { "pop", U_POP }, - { "pops", U_POPS }, - { "nntp", U_NNTP }, - { "nntps", U_NNTPS }, - { "snews", U_NNTPS }, - { "mailto", U_MAILTO }, - { NULL, U_UNKNOWN} +static struct mapping_t UrlMap[] = { + {"file", U_FILE}, + {"imap", U_IMAP}, + {"imaps", U_IMAPS}, + {"pop", U_POP}, + {"pops", U_POPS}, + {"nntp", U_NNTP}, + {"news", U_NNTP}, + {"nntps", U_NNTPS}, + {"snews", U_NNTPS}, + {"mailto", U_MAILTO}, + {NULL, U_UNKNOWN} }; @@ -49,21 +47,19 @@ static void url_pct_decode (char *s) if (!s) return; - - for (d = s; *s; s++) - { + + for (d = s; *s; s++) { if (*s == '%' && s[1] && s[2] && - isxdigit ((unsigned char) s[1]) && + isxdigit ((unsigned char) s[1]) && isxdigit ((unsigned char) s[2]) && - hexval (s[1]) >= 0 && hexval (s[2]) >= 0) - { + hexval (s[1]) >= 0 && hexval (s[2]) >= 0) { *d++ = (hexval (s[1]) << 4) | (hexval (s[2])); s += 2; } else *d++ = *s; } - *d ='\0'; + *d = '\0'; } url_scheme_t url_check_scheme (const char *s) @@ -71,12 +67,12 @@ url_scheme_t url_check_scheme (const char *s) char sbuf[STRING]; char *t; int i; - + if (!s || !(t = strchr (s, ':'))) return U_UNKNOWN; if ((t - s) + 1 >= sizeof (sbuf)) return U_UNKNOWN; - + strfcpy (sbuf, s, t - s + 1); for (t = sbuf; *t; t++) *t = ascii_tolower (*t); @@ -91,11 +87,11 @@ int url_parse_file (char *d, const char *src, size_t dl) { if (ascii_strncasecmp (src, "file:", 5)) return -1; - else if (!ascii_strncasecmp (src, "file://", 7)) /* we don't support remote files */ + else if (!ascii_strncasecmp (src, "file://", 7)) /* we don't support remote files */ return -1; else strfcpy (d, src + 5, dl); - + url_pct_decode (d); return 0; } @@ -103,7 +99,7 @@ int url_parse_file (char *d, const char *src, size_t dl) /* ciss_parse_userhost: fill in components of ciss with info from src. Note * these are pointers into src, which is altered with '\0's. Port of 0 * means no port given. */ -static char *ciss_parse_userhost (ciss_url_t *ciss, char *src) +static char *ciss_parse_userhost (ciss_url_t * ciss, char *src) { char *t; char *p; @@ -116,17 +112,15 @@ static char *ciss_parse_userhost (ciss_url_t *ciss, char *src) if (strncmp (src, "//", 2)) return src; - + src += 2; if ((path = strchr (src, '/'))) *path++ = '\0'; - - if ((t = strrchr (src, '@'))) - { + + if ((t = strrchr (src, '@'))) { *t = '\0'; - if ((p = strchr (src, ':'))) - { + if ((p = strchr (src, ':'))) { *p = '\0'; ciss->pass = p + 1; url_pct_decode (ciss->pass); @@ -137,15 +131,14 @@ static char *ciss_parse_userhost (ciss_url_t *ciss, char *src) } else t = src; - - if ((p = strchr (t, ':'))) - { + + if ((p = strchr (t, ':'))) { *p++ = '\0'; ciss->port = atoi (p); } else ciss->port = 0; - + ciss->host = t; url_pct_decode (ciss->host); return path; @@ -153,7 +146,7 @@ static char *ciss_parse_userhost (ciss_url_t *ciss, char *src) /* url_parse_ciss: Fill in ciss_url_t. char* elements are pointers into src, * which is modified by this call (duplicate it first if you need to). */ -int url_parse_ciss (ciss_url_t *ciss, char *src) +int url_parse_ciss (ciss_url_t * ciss, char *src) { char *tmp; @@ -164,13 +157,13 @@ int url_parse_ciss (ciss_url_t *ciss, char *src) ciss->path = ciss_parse_userhost (ciss, tmp); url_pct_decode (ciss->path); - + return 0; } /* url_ciss_tostring: output the URL string for a given CISS object. */ -int url_ciss_tostring (ciss_url_t* ciss, char* dest, size_t len, int flags) +int url_ciss_tostring (ciss_url_t * ciss, char *dest, size_t len, int flags) { long l; @@ -179,18 +172,19 @@ int url_ciss_tostring (ciss_url_t* ciss, char* dest, size_t len, int flags) snprintf (dest, len, "%s:", mutt_getnamebyvalue (ciss->scheme, UrlMap)); - if (ciss->host) - { - safe_strcat (dest, len, "//"); - len -= (l = strlen (dest)); dest += l; - + if (ciss->host) { + str_cat (dest, len, "//"); + len -= (l = str_len (dest)); + dest += l; + if (ciss->user) { if (flags & U_DECODE_PASSWD && ciss->pass) - snprintf (dest, len, "%s:%s@", ciss->user, ciss->pass); + snprintf (dest, len, "%s:%s@", ciss->user, ciss->pass); else - snprintf (dest, len, "%s@", ciss->user); + snprintf (dest, len, "%s@", ciss->user); - len -= (l = strlen (dest)); dest += l; + len -= (l = str_len (dest)); + dest += l; } if (ciss->port) @@ -200,12 +194,12 @@ int url_ciss_tostring (ciss_url_t* ciss, char* dest, size_t len, int flags) } if (ciss->path) - safe_strcat (dest, len, ciss->path); + str_cat (dest, len, ciss->path); return 0; } -int url_parse_mailto (ENVELOPE *e, char **body, const char *src) +int url_parse_mailto (ENVELOPE * e, char **body, const char *src) { char *t; char *tmp; @@ -216,11 +210,11 @@ int url_parse_mailto (ENVELOPE *e, char **body, const char *src) int taglen; LIST *last = NULL; - + if (!(t = strchr (src, ':'))) return -1; - - if ((tmp = safe_strdup (t + 1)) == NULL) + + if ((tmp = str_dup (t + 1)) == NULL) return -1; if ((headers = strchr (tmp, '?'))) @@ -230,9 +224,8 @@ int url_parse_mailto (ENVELOPE *e, char **body, const char *src) e->to = rfc822_parse_adrlist (e->to, tmp); tag = headers ? strtok (headers, "&") : NULL; - - for (; tag; tag = strtok (NULL, "&")) - { + + for (; tag; tag = strtok (NULL, "&")) { if ((value = strchr (tag, '='))) *value++ = '\0'; if (!value || !*value) @@ -241,24 +234,29 @@ int url_parse_mailto (ENVELOPE *e, char **body, const char *src) url_pct_decode (tag); url_pct_decode (value); - if (!ascii_strcasecmp (tag, "body")) - { + if (!ascii_strcasecmp (tag, "body")) { if (body) - mutt_str_replace (body, value); + str_replace (body, value); } - else - { - taglen = strlen (tag); + else { +#define SAFEPFX (option (OPTSTRICTMAILTO) ? "" : "X-Mailto-") + taglen = str_len (tag) + str_len (SAFEPFX); /* mutt_parse_rfc822_line makes some assumptions */ - snprintf (scratch, sizeof (scratch), "%s: %s", tag, value); + snprintf (scratch, sizeof (scratch), "%s%s: %s", SAFEPFX, tag, value); +#undef SAVEPFX scratch[taglen] = '\0'; - value = &scratch[taglen+1]; + value = &scratch[taglen + 1]; SKIPWS (value); mutt_parse_rfc822_line (e, NULL, scratch, value, 1, 0, 0, &last); + /* if $strict_mailto is set, force editing headers to let + * users have a look at what we got */ + if (!option (OPTSTRICTMAILTO)) { + set_option (OPTXMAILTO); + set_option (OPTEDITHDRS); + } } } - - FREE (&tmp); + + mem_free (&tmp); return 0; } -