#include <sysexits.h>
#include <h/mh.h>
+#include <h/utils.h>
#include <h/addrsbr.h>
#include <h/mf.h>
dftype = LOCALHOST;
}
- mp = (struct mailname *) calloc((size_t) 1, sizeof(*mp));
+ mp = mh_xcalloc(1, sizeof(*mp));
if (mp == NULL) {
if (eresult)
strcpy(eresult, "insufficient memory to represent address");
}
mp->m_next = NULL;
- mp->m_text = getcpy(str);
+ mp->m_text = mh_xstrdup(str);
if (pers)
- mp->m_pers = getcpy(pers);
+ mp->m_pers = mh_xstrdup(pers);
if (mbox == NULL) {
mp->m_type = BADHOST;
mp->m_nohost = 1;
mp->m_ingrp = ingrp;
- mp->m_gname = getcpy(grp);
+ mp->m_gname = mh_xstrdup(grp);
if (note)
- mp->m_note = getcpy(note);
+ mp->m_note = mh_xstrdup(note);
return mp;
}
if (host) {
- mp->m_mbox = getcpy(mbox);
- mp->m_host = getcpy(host);
+ mp->m_mbox = mh_xstrdup(mbox);
+ mp->m_host = mh_xstrdup(host);
} else {
mp->m_nohost = 1;
- mp->m_mbox = getcpy(mbox);
+ mp->m_mbox = mh_xstrdup(mbox);
if (route == NULL && dftype == LOCALHOST) {
mp->m_host = NULL;
mp->m_type = dftype;
} else {
- mp->m_host = route ? NULL : getcpy(dfhost);
+ mp->m_host = route ? NULL : mh_xstrdup(dfhost);
mp->m_type = route ? NETHOST : dftype;
}
goto got_host;
got_host: ;
if (route)
- mp->m_path = getcpy(route);
+ mp->m_path = mh_xstrdup(route);
mp->m_ingrp = ingrp;
if (grp)
- mp->m_gname = getcpy(grp);
+ mp->m_gname = mh_xstrdup(grp);
if (note)
- mp->m_note = getcpy(note);
+ mp->m_note = mh_xstrdup(note);
return mp;
}
return;
if (mp->m_text)
- free(mp->m_text);
+ mh_free0(&(mp->m_text));
if (mp->m_pers)
- free(mp->m_pers);
+ mh_free0(&(mp->m_pers));
if (mp->m_mbox)
- free(mp->m_mbox);
+ mh_free0(&(mp->m_mbox));
if (mp->m_host)
- free(mp->m_host);
+ mh_free0(&(mp->m_host));
if (mp->m_path)
- free(mp->m_path);
+ mh_free0(&(mp->m_path));
if (mp->m_gname)
- free(mp->m_gname);
+ mh_free0(&(mp->m_gname));
if (mp->m_note)
- free(mp->m_note);
+ mh_free0(&(mp->m_note));
- free((char *) mp);
+ mh_free0(&mp);
}
ismymbox(struct mailname *np)
{
int oops;
- register int len, i;
- register char *cp;
- register char *pp;
+ int len, i;
+ char *cp;
+ char *pp;
char buffer[BUFSIZ];
struct mailname *mp;
static char *am = NULL;
if (am == NULL) {
mq.m_next = NULL;
mq.m_mbox = getusername();
- if ((am = context_find("alternate-mailboxes")) == NULL)
+ mp = &mq;
+ if ((am = context_find("alternate-mailboxes")) == NULL) {
am = getusername();
- else {
- mp = &mq;
+ } else {
oops = 0;
while ((cp = getname(am))) {
if ((mp->m_next = getm(cp, NULL, 0, AD_NAME, NULL)) == NULL) {
*cp = '\0';
}
}
- if ((cp = getenv("MHWDEBUG")) && *cp)
+ if ((cp = getenv("MHWDEBUG")) && *cp) {
fprintf(stderr, "mbox=\"%s\" host=\"%s\" %s\n",
mp->m_mbox, mp->m_host,
snprintb(buffer, sizeof(buffer), (unsigned) mp->m_type, WBITS));
+ }
}
}
- if (oops)
+ if (oops != 0) {
advise(NULL, "please fix the profile entry %s",
"alternate-mailboxes");
+ }
+ }
+
+ if ((cp = context_find("Default-From")) != NULL) {
+ int i = 0;
+ char *cp2;
+ oops = 0;
+
+ while ((cp2 = getname(cp)) != NULL) {
+ i++;
+ if ((mp->m_next = getm(cp2, NULL, 0, AD_NAME, NULL)) == NULL) {
+ admonish(NULL, "illegal address: %s", cp);
+ oops++;
+ } else {
+ mp = mp->m_next;
+ if ((cp = getenv("MHWDEBUG")) && *cp) {
+ fprintf(stderr, "mbox=\"%s\" host=\"%s\" %s\n",
+ mp->m_mbox, mp->m_host,
+ snprintb(buffer, sizeof(buffer), (unsigned) mp->m_type, WBITS));
+ }
+ }
+
+ }
+
+ if (oops != 0 || i < 1) {
+ advise(NULL, "please fix the profile entry %s",
+ "Default-From");
+ }
+
}
}
return 0;
}
+
+/*
+ * Insert mailname after element and returns the
+ * number of parsed addresses. element is set to
+ * the last parsed addresse.
+ */
+ssize_t
+getmboxes(char *line, struct mailname **element)
+{
+ struct mailname *mp, *next, *first;
+ char *cp;
+ size_t i = 0;
+
+ first = *element;
+ next = first->m_next;
+
+ while ((cp = getname(line))) {
+ mp = getm(cp, NULL, 0, AD_HOST, NULL);
+ if (mp == NULL) {
+ goto error;
+ }
+ (*element)->m_next = mp;
+ *element = mp;
+ i++;
+ }
+
+ (*element)->m_next = next;
+ return i;
+error:
+ while (first->m_next != NULL && first->m_next != next) {
+ mp = first->m_next;
+ first->m_next = mp->m_next;
+ mh_free0(&mp);
+ }
+ first->m_next = next;
+ return -1;
+}