34 if (pipe(pim) == -1)
return -1;
35 if (pipe(pie) == -1) { close(pim[0]); close(pim[1]);
return -1; }
37 switch (
qq->pid = vfork()) {
38 case -1: close(pim[0]); close(pim[1]);
39 close(pie[0]); close(pie[1]);
41 case 0: close(pim[1]);
43 if (fd_move(0,pim[0]) == -1) _exit(120);
44 if (fd_move(1,pie[0]) == -1) _exit(120);
46 if ((
cp = env_get(
"QMAILQUEUE")) != 0)
48 else if (sa && sa->len) {
50 for (i = 0; i < sa->len; i++) {
51 if (sa->s[i] ==
'\0') j++;
53 if (!(cpp = (
const char **) alloc(j *
sizeof (
char *)))) _exit(51);
57 for (i = 0; i < sa->len; i++) {
58 if (sa->s[i])
continue;
63 execv(*cpp,(
char**)cpp);
66 execv(*binqqargs,(
char**)binqqargs);
70 qq->fdm = pim[1]; close(pim[0]);
71 qq->fde = pie[1]; close(pie[0]);
72 buffer_init(&
qq->ss,buffer_unixwrite,
qq->fdm,
qq->buf,
sizeof(
qq->buf));
90 if (buffer_put(&
qq->ss,s,
len) == -1)
qq->flagerr = 1;
98 if (buffer_put(&
qq->ss,s,
len) == -1)
qq->flagerr = 1;
105 if (buffer_flush(&
qq->ss) == -1)
qq->flagerr = 1;
107 buffer_init(&
qq->ss,buffer_unixwrite,
qq->fde,
qq->buf,
sizeof(
qq->buf));
126 if (!
qq->flagerr)
if (buffer_flush(&
qq->ss) == -1)
qq->flagerr = 1;
130 return "Zqq waitpid surprise (#4.3.0)";
131 if (wait_crashed(
wstat))
132 return "Zqq crashed (#4.3.0)";
133 exitcode = wait_exitcode(
wstat);
136 case 11:
return "Denvelope address too long for qq (#5.1.3)";
137 case 31:
return "Dmail server permanently rejected message (#5.3.0)";
138 case 51:
return "Zqq out of memory (#4.3.0)";
139 case 52:
return "Zqq timeout (#4.3.0)";
140 case 53:
return "Zqq write error or disk full (#4.3.0)";
141 case 0:
if (!
qq->flagerr)
return "";
142 case 54:
return "Zqq read error (#4.3.0)";
143 case 55:
return "Zqq unable to read configuration (#4.3.0)";
144 case 56:
return "Zqq trouble making network connection (#4.3.0)";
145 case 61:
return "Zqq trouble in home directory (#4.3.0)";
150 case 62:
return "Zqq trouble creating files in queue (#4.3.0)";
151 case 71:
return "Zmail server temporarily rejected message (#4.3.0)";
152 case 72:
return "Zconnection to mail server timed out (#4.4.1)";
153 case 73:
return "Zconnection to mail server rejected (#4.4.1)";
154 case 74:
return "Zcommunication with mail server failed (#4.4.2)";
156 case 81:
return "Zqq internal bug (#4.3.0)";
158 case 120:
return "Zunable to exec qq (#4.3.0)";
159 default:
if ((exitcode >= 11) && (exitcode <= 40))
160 return "Dqq permanent problem (#5.3.0)";
161 return "Zqq temporary problem (#4.3.0)";
int execv(char *, char **)
void qmail_puts(struct qmail *qq, const char *s)
int qmail_open(struct qmail *qq, const stralloc *sa)
void qmail_from(struct qmail *qq, const char *s)
const char * qmail_close(struct qmail *qq)
void qmail_to(struct qmail *qq, const char *s)
void qmail_fail(struct qmail *qq)
void qmail_put(struct qmail *qq, const char *s, int len)
unsigned long qmail_qp(struct qmail *qq)