#endif
#include <lib-lib/mem.h>
+#include <lib-lib/ascii.h>
+#include <lib-lib/str.h>
+#include <lib-lib/macros.h>
+#include <lib-lib/file.h>
#include "mutt.h"
-#include "ascii.h"
#include "handler.h"
#include "recvattach.h"
#include "mutt_curses.h"
#include "mutt_crypt.h"
#include "mutt_idna.h"
-#include "lib/mem.h"
-#include "lib/str.h"
-#include "lib/intl.h"
#include "lib/debug.h"
#include <string.h>
fprintf (f, "Content-Type: %s/%s", TYPE (a), a->subtype);
if (a->parameter) {
- len = 25 + str_len (a->subtype); /* approximate len. of content-type */
+ len = 25 + m_strlen(a->subtype); /* approximate len. of content-type */
for (p = a->parameter; p; p = p->next) {
char *tmp;
fputc (';', f);
buffer[0] = 0;
- tmp = str_dup (p->value);
+ tmp = m_strdup(p->value);
encode = rfc2231_encode_string (&tmp);
rfc822_cat (buffer, sizeof (buffer), tmp, MimeSpecials);
p_delete(&tmp);
- tmplen = str_len (buffer) + str_len (p->attribute) + 1;
+ tmplen = m_strlen(buffer) + m_strlen(p->attribute) + 1;
if (len + tmplen + 2 > 76) {
fputs ("\n\t", f);
t = fn;
buffer[0] = 0;
- tmp = str_dup (t);
+ tmp = m_strdup(t);
encode = rfc2231_encode_string (&tmp);
rfc822_cat (buffer, sizeof (buffer), tmp, MimeSpecials);
p_delete(&tmp);
/* This is pretty gross, but it's the best solution for now... */
if ((WithCrypto & APPLICATION_PGP)
&& a->type == TYPEAPPLICATION
- && str_cmp (a->subtype, "pgp-encrypted") == 0) {
+ && m_strcmp(a->subtype, "pgp-encrypted") == 0) {
fputs ("Version: 1\n", f);
return 0;
}
}
info = p_new(CONTENT, 1);
- memset (&state, 0, sizeof (state));
+ p_clear(&state, 1);
if (b != NULL && b->type == TYPETEXT && (!b->noconv && !b->force_charset)) {
char *chs = mutt_get_parameter ("charset", b->parameter);
type = TYPEOTHER;
cur_sze = 0;
- szf = str_len (path);
+ szf = m_strlen(path);
for (count = 0; count < 4; count++) {
/*
/* cycle through the file extensions */
while ((p = strtok (p, " \t\n"))) {
- sze = str_len (p);
+ sze = m_strlen(p);
if ((sze > cur_sze) && (szf >= sze) &&
(str_casecmp (path + szf - sze, p) == 0
|| ascii_strcasecmp (path + szf - sze, p) == 0) && (szf == sze
a->d_filename = a->filename;
if (a->filename && a->unlink)
unlink (a->filename);
- a->filename = str_dup (temp);
+ a->filename = m_strdup(temp);
a->unlink = 1;
if (stat (a->filename, &sb) == -1) {
mutt_perror ("stat");
STATE s;
struct stat sb;
- memset (&s, 0, sizeof (s));
+ p_clear(&s, 1);
for (; a; a = a->next) {
if (a->type == TYPEMULTIPART) {
if (a->encoding != ENC7BIT)
mutt_decode_attachment (a, &s);
fclose (s.fpout);
a->d_filename = a->filename;
- a->filename = str_dup (buff);
+ a->filename = m_strdup(buff);
a->unlink = 1;
if (stat (a->filename, &sb) == -1) {
mutt_perror ("stat");
body = mutt_new_body ();
body->type = TYPEMESSAGE;
- body->subtype = str_dup ("rfc822");
- body->filename = str_dup (buffer);
+ body->subtype = m_strdup("rfc822");
+ body->filename = m_strdup(buffer);
body->unlink = 1;
body->use_disp = 0;
body->disposition = DISPINLINE;
CONTENT *info;
att = mutt_new_body ();
- att->filename = str_dup (path);
+ att->filename = m_strdup(path);
/* Attempt to determine the appropriate content-type based on the filename
* suffix.
mutt_lookup_mime_type (buf, sizeof (buf), xbuf, sizeof (xbuf),
path)) != TYPEOTHER || *xbuf != '\0') {
att->type = n;
- att->subtype = str_dup (buf);
- att->xtype = str_dup (xbuf);
+ att->subtype = m_strdup(buf);
+ att->xtype = m_strdup(xbuf);
}
#else
* chars if this is really a binary file...
*/
att->type = TYPETEXT;
- att->subtype = str_dup ("plain");
+ att->subtype = m_strdup("plain");
}
else {
att->type = TYPEAPPLICATION;
- att->subtype = str_dup ("octet-stream");
+ att->subtype = m_strdup("octet-stream");
}
}
new = mutt_new_body ();
new->type = TYPEMULTIPART;
- new->subtype = str_dup ("mixed");
+ new->subtype = m_strdup("mixed");
new->encoding = get_toplevel_encoding (b);
mutt_generate_boundary (&new->parameter);
new->use_disp = 0;
adr->next = NULL;
buf[0] = 0;
rfc822_write_address (buf, sizeof (buf), adr, display);
- len = str_len (buf);
+ len = m_strlen(buf);
if (count && linelen + len > 74) {
fputs ("\n\t", fp);
linelen = len + 8; /* tab is usually about 8 spaces... */
for (; (TrimRef == 0 || refcnt < TrimRef) && r; r = r->next) {
if (refcnt == refmax)
- mem_realloc (&ref, (refmax += REF_INC) * sizeof (LIST *));
+ p_realloc(&ref, refmax += REF_INC);
ref[refcnt++] = r;
}
i = p - h->data;
++p;
SKIPWS (p);
- tmp = str_dup (p);
+ tmp = m_strdup(p);
if (!tmp)
continue;
rfc2047_encode_string (&tmp);
- mem_realloc (&h->data,
- str_len (h->data) + 2 + str_len (tmp) + 1);
+ p_realloc(&h->data, m_strlen(h->data) + 2 + m_strlen(tmp) + 1);
sprintf (h->data + i, ": %s", NONULL (tmp)); /* __SPRINTF_CHECKED__ */
return '.'; /* normalized character (we're stricter than RFC2822, 3.6.4) */
}
-static void mutt_gen_localpart (char *buf, unsigned int len, char *fmt)
+static void mutt_gen_localpart(char *buf, unsigned int len, char *fmt)
{
- time_t now;
- struct tm *tm;
- char tmp[SHORT_STRING];
+ time_t now;
+ struct tm *tm;
+ int snlen;
- *buf = '\0';
+ *buf = '\0';
- now = time (NULL);
- tm = gmtime (&now);
+ now = time (NULL);
+ tm = gmtime (&now);
- for (; *fmt; ++fmt) {
- if (*fmt == '%') {
- switch (fmt[1]) {
- case 0:
- return;
- case 'd':
- snprintf (tmp, sizeof (tmp), "%02d", tm->tm_mday);
- str_ncat (buf, len, tmp, 2);
- break;
- case 'h':
- snprintf (tmp, sizeof (tmp), "%02d", tm->tm_hour);
- str_ncat (buf, len, tmp, 2);
- break;
- case 'm':
- snprintf (tmp, sizeof (tmp), "%02d", tm->tm_mon + 1);
- str_ncat (buf, len, tmp, 2);
- break;
- case 'M':
- snprintf (tmp, sizeof (tmp), "%02d", tm->tm_min);
- str_ncat (buf, len, tmp, 2);
- break;
- case 'O':
- snprintf (tmp, sizeof (tmp), "%lo", (unsigned long) now);
- str_ncat (buf, len, tmp, str_len (tmp));
- break;
- case 'p':
- snprintf (tmp, sizeof (tmp), "%u", (unsigned int) getpid ());
- str_ncat (buf, len, tmp, str_len (tmp));
- break;
- case 'P':
- snprintf (tmp, sizeof (tmp), "%c", MsgIdPfx);
- MsgIdPfx = (MsgIdPfx == 'Z') ? 'A' : MsgIdPfx + 1;
- str_ncat (buf, len, tmp, 1);
- break;
- case 'r':
- snprintf (tmp, sizeof (tmp), "%u", (unsigned int) rand ());
- str_ncat (buf, len, tmp, str_len (tmp));
- break;
- case 'R':
- snprintf (tmp, sizeof (tmp), "%x", (unsigned int) rand ());
- str_ncat (buf, len, tmp, str_len (tmp));
- break;
- case 's':
- snprintf (tmp, sizeof (tmp), "%02d", tm->tm_sec);
- str_ncat (buf, len, tmp, 2);
- break;
- case 'T':
- snprintf (tmp, sizeof (tmp), "%u", (unsigned int) now);
- str_ncat (buf, len, tmp, str_len (tmp));
- break;
- case 'X':
- snprintf (tmp, sizeof (tmp), "%x", (unsigned int) now);
- str_ncat (buf, len, tmp, str_len (tmp));
- break;
- case 'Y':
- snprintf (tmp, sizeof (tmp), "%04d", tm->tm_year + 1900); /* this will break in the year 10000 ;-) */
- str_ncat (buf, len, tmp, 4);
- break;
- case '%':
- str_ncat (buf, len, "%", 1);
- break;
- default:
- str_ncat (buf, len, ".", 1); /* invalid formats are replaced by '.' */
- } /* switch */
- ++fmt;
- }
- else {
- char c;
+ for (; *fmt; ++fmt) {
+#define APPEND_FMT(fmt, ...) \
+ if (len > 0) { \
+ snlen = snprintf(buf, len, fmt, ##__VA_ARGS__); \
+ buf += snlen; \
+ len -= snlen; \
+ }
- c = mutt_normalized_char (*fmt); /* @todo: filter out invalid characters */
- str_ncat (buf, len, &c, 1);
+#define APPEND_BYTE(c) \
+ if (len > 1) { \
+ *buf++ = c; \
+ *buf = '\0'; \
+ len--; \
+ }
+
+ if (*fmt == '%') {
+ switch (fmt[1]) {
+ case 0:
+ return;
+ case 'd':
+ APPEND_FMT("%02d", tm->tm_mday);
+ break;
+ case 'h':
+ APPEND_FMT("%02d", tm->tm_hour);
+ break;
+ case 'm':
+ APPEND_FMT("%02d", tm->tm_mon + 1);
+ break;
+ case 'M':
+ APPEND_FMT("%02d", tm->tm_min);
+ break;
+ case 'O':
+ APPEND_FMT("%lo", (unsigned long)now);
+ break;
+ case 'p':
+ APPEND_FMT("%u", (unsigned int)getpid());
+ break;
+ case 'P':
+ APPEND_FMT("%c", MsgIdPfx);
+ MsgIdPfx = (MsgIdPfx == 'Z') ? 'A' : MsgIdPfx + 1;
+ break;
+ case 'r':
+ APPEND_FMT("%u", (unsigned int)rand());
+ break;
+ case 'R':
+ APPEND_FMT("%x", (unsigned int)rand());
+ break;
+ case 's':
+ APPEND_FMT("%02d", tm->tm_sec);
+ break;
+ case 'T':
+ APPEND_FMT("%u", (unsigned int) now);
+ break;
+ case 'X':
+ APPEND_FMT("%x", (unsigned int) now);
+ break;
+ case 'Y': /* this will break in the year 10000 ;-) */
+ APPEND_FMT("%04d", tm->tm_year + 1900);
+ break;
+ case '%':
+ APPEND_BYTE('%');
+ break;
+ default: /* invalid formats are replaced by '.' */
+ APPEND_BYTE('.');
+ m_strncat(buf, len, ".", 1);
+ }
+ ++fmt;
+ } else {
+ APPEND_BYTE(mutt_normalized_char(*fmt));
+ }
+
+#undef APPEND_BYTE
+#undef APPEND_FMT
}
- }
}
char *mutt_gen_msgid (void)
if (!(fqdn = mutt_fqdn (0)))
fqdn = NONULL (Hostname);
- localpart_length = sizeof (buf) - str_len (fqdn) - 4; /* the 4 characters are '<', '@', '>' and '\0' */
+ localpart_length = sizeof (buf) - m_strlen(fqdn) - 4; /* the 4 characters are '<', '@', '>' and '\0' */
mutt_gen_localpart (localpart, localpart_length, MsgIdFormat);
snprintf (buf, sizeof (buf), "<%s@%s>", localpart, fqdn);
- return (str_dup (buf));
+ return (m_strdup(buf));
}
static RETSIGTYPE alarm_handler (int sig)
char tmp[_POSIX_PATH_MAX];
mutt_mktemp (tmp);
- *tempfile = str_dup (tmp);
+ *tempfile = m_strdup(tmp);
}
if ((pid = fork ()) == 0) {
/* weed out group mailboxes, since those are for display only */
if (addr->mailbox && !addr->group) {
if (*argslen == *argsmax)
- mem_realloc (&args, (*argsmax += 5) * sizeof (char *));
+ p_realloc(&args, *argsmax += 5);
args[(*argslen)++] = addr->mailbox;
}
}
add_option(const char **args, size_t *argslen, size_t *argsmax, const char *s)
{
if (*argslen == *argsmax) {
- mem_realloc(&args, (*argsmax += 5) * sizeof (char *));
+ p_realloc(&args, *argsmax += 5);
}
args[(*argslen)++] = s;
return (args);
return i;
}
- s = str_dup (cmd);
+ s = m_strdup(cmd);
}
else
#endif
- s = str_dup (Sendmail);
+ s = m_strdup(Sendmail);
ps = s;
i = 0;
while ((ps = strtok (ps, " "))) {
if (argslen == argsmax)
- mem_realloc (&args, sizeof (char *) * (argsmax += 5));
+ p_realloc(&args, argsmax += 5);
if (i)
args[argslen++] = ps;
else {
- path = str_dup (ps);
+ path = m_strdup(ps);
ps = strrchr (ps, '/');
if (ps)
ps++;
#endif
if (argslen == argsmax)
- mem_realloc (&args, sizeof (char *) * (++argsmax));
+ p_realloc(&args, ++argsmax);
args[argslen++] = NULL;
string. */
char *mutt_append_string (char *a, const char *b)
{
- size_t la = str_len (a);
+ size_t la = m_strlen(a);
- mem_realloc (&a, la + str_len (b) + 1);
+ p_realloc(&a, la + m_strlen(b) + 1);
strcpy (a + la, b); /* __STRCPY_CHECKED__ */
return (a);
}
char *r, *pr;
size_t rlen;
- rlen = str_len (s) + 3;
+ rlen = m_strlen(s) + 3;
pr = r = p_new(char, rlen);
*pr++ = '"';
while (*s) {
if (INVALID_CHAR (*s)) {
size_t o = pr - r;
- mem_realloc (&r, ++rlen);
+ p_realloc(&r, ++rlen);
pr = r + o;
*pr++ = '\\';
}
rfc822_cat (buffer, sizeof (buffer), "undisclosed-recipients",
RFC822Specials);
- env->to->mailbox = str_dup (buffer);
+ env->to->mailbox = m_strdup(buffer);
}
mutt_set_followup_to (env);