/* <@LICENSE>
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* </@LICENSE>
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#define MAXOPTS 16
#define TRY(exp) do { \
if
((
exp
) == -1) { \
fprintf
(stderr,
"%s:%d: '%s' failed: "
, \
__FILE__, \
__LINE__, \
#exp \
);
perror
(NULL); \
exit
(81); \
} \
}
while
(0)
int
main(
int
argc,
char
**argv)
{
char
*options[MAXOPTS];
char
*val = NULL;
int
opt = 0;
pid_t childpid;
int
pfds[2];
#ifdef HAVE_QMAIL_RELAYCLIENT
/*
* bug 2927: use standard qmail-queue if this is a RELAYCLIENT
*/
if
(
getenv
(
"RELAYCLIENT"
)) {
TRY(execlp(
"qmail-queue"
,
"qmail-queue"
, NULL));
}
#endif
/* create the array of options */
options[opt++] =
"spamc"
;
/* set zeroth argument */
if
((val =
getenv
(
"SPAMDSOCK"
)) != NULL) {
/* Unix Domain Socket path */
options[opt++] =
"-U"
;
options[opt++] = val;
}
if
((val =
getenv
(
"SPAMDHOST"
)) != NULL) {
/* remote spamd host name */
options[opt++] =
"-d"
;
options[opt++] = val;
}
if
((val =
getenv
(
"SPAMDPORT"
)) != NULL) {
/* remote spamd port number */
options[opt++] =
"-p"
;
options[opt++] = val;
}
if
((val =
getenv
(
"SPAMDSSL"
)) != NULL) {
/* use ssl for spamc/spamd */
options[opt++] =
"-S"
;
}
if
((val =
getenv
(
"SPAMDLIMIT"
)) != NULL) {
/* message size limit */
options[opt++] =
"-s"
;
options[opt++] = val;
}
if
((val =
getenv
(
"SPAMDUSER"
)) != NULL) {
/* spamc user configuration */
options[opt++] =
"-u"
;
options[opt++] = val;
}
options[opt] = NULL;
/* terminate argument list */
TRY(pipe(pfds));
TRY(childpid = fork());
if
(childpid == 0) {
/* the child ... */
TRY(close(1));
/* close normal stdout */
TRY(dup(pfds[1]));
/* make stdout same as pfds[1] */
TRY(close(pfds[0]));
/* we don't need this */
TRY(execvp(
"spamc"
, options));
}
else
{
/* the parent ... */
TRY(close(0));
/* close normal stdin */
TRY(dup(pfds[0]));
/* make stdin same as pfds[0] */
TRY(close(pfds[1]));
/* we don't need this */
TRY(execlp(
"qmail-queue"
,
"qmail-queue"
, NULL));
}
/* never reached */
return
81;
}