- a.n = 2;
- a.s = s;
- s[0] = config->smtp_server;
- s[1] = (char *)"smtp";
- if(!(ai = get_address(&a, &pref, &tag)))
- return -1;
- fdin = xsocket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
- if(connect(fdin, ai->ai_addr, ai->ai_addrlen) < 0) {
- error(errno, "error connecting to %s", tag);
- xclose(fdin);
- return -1;
+ if(config->sendmail && config->sendmail[0]) {
+ int inpipe[2], outpipe[2];
+
+ /* If it's a path name, use -bs mode. Exim, Postfix and Sendmail all claim
+ * to support this. */
+ xpipe(inpipe); /* sendmail's stdin */
+ xpipe(outpipe); /* sendmail's stdout */
+ if(!(pid = xfork())) {
+ exitfn = _exit;
+ signal(SIGPIPE, SIG_DFL);
+ xdup2(inpipe[0], 0);
+ xclose(inpipe[1]);
+ xclose(outpipe[0]);
+ xdup2(outpipe[1], 1);
+ execlp(config->sendmail,
+ config->sendmail, "-bs", (char *)0);
+ fatal(errno, "executing %s", config->sendmail);
+ }
+ xclose(inpipe[0]);
+ xclose(outpipe[1]);
+ fdin = outpipe[0]; /* read from sendmail's stdout */
+ fdout = inpipe[1]; /* write to sendmail's stdin */
+ tag = config->sendmail;
+ } else {
+ a.n = 2;
+ a.s = s;
+ s[0] = config->smtp_server;
+ s[1] = (char *)"smtp";
+ if(!(ai = get_address(&a, &pref, &tag)))
+ return -1;
+ fdin = xsocket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+ if(connect(fdin, ai->ai_addr, ai->ai_addrlen) < 0) {
+ error(errno, "error connecting to %s", tag);
+ xclose(fdin);
+ return -1;
+ }
+ if((fdout = dup(fdin)) < 0)
+ fatal(errno, "error calling dup2");