static void error_service(VSTREAM *client_stream, char *service, char **argv) { DELIVER_REQUEST *request; int status; /* * Sanity check. This service takes no command-line arguments. */ if (argv[0]) msg_fatal("unexpected command-line argument: %s", argv[0]); /* * This routine runs whenever a client connects to the UNIX-domain socket * dedicated to the error mailer. What we see below is a little protocol * to (1) tell the queue manager that we are ready, (2) read a request * from the queue manager, and (3) report the completion status of that * request. All connection-management stuff is handled by the common code * in single_server.c. */ if ((request = deliver_request_read(client_stream)) != 0) { if (strcmp(service, MAIL_SERVICE_ERROR) == 0) status = deliver_message(request, "5.0.0", bounce_append); else if (strcmp(service, MAIL_SERVICE_RETRY) == 0) status = deliver_message(request, "4.0.0", defer_append); else msg_fatal("bad error service name: %s", service); deliver_request_done(client_stream, request, status); } }
DELIVER_REQUEST *deliver_request_read(VSTREAM *stream) { DELIVER_REQUEST *request; /* * Tell the queue manager that we are ready for this request. */ if (deliver_request_initial(stream) != 0) return (0); /* * Be prepared for the queue manager to change its mind after contacting * us. This can happen when a transport or host goes bad. */ (void) read_wait(vstream_fileno(stream), -1); if (peekfd(vstream_fileno(stream)) <= 0) return (0); /* * Allocate and read the queue manager's delivery request. */ #define XXX_DEFER_STATUS -1 request = deliver_request_alloc(); if (deliver_request_get(stream, request) < 0) { deliver_request_done(stream, request, XXX_DEFER_STATUS); request = 0; } return (request); }
static void pipe_service(VSTREAM *client_stream, char *service, char **argv) { DELIVER_REQUEST *request; int status; /* * This routine runs whenever a client connects to the UNIX-domain socket * dedicated to delivery via external command. What we see below is a * little protocol to (1) tell the queue manager that we are ready, (2) * read a request from the queue manager, and (3) report the completion * status of that request. All connection-management stuff is handled by * the common code in single_server.c. */ if ((request = deliver_request_read(client_stream)) != 0) { status = deliver_message(request, service, argv); deliver_request_done(client_stream, request, status); } }
static void local_service(VSTREAM *stream, char *service, char **argv) { DELIVER_REQUEST *request; int status; /* * Sanity check. This service takes no command-line arguments. */ if (argv[0]) msg_fatal("unexpected command-line argument: %s", argv[0]); /* * This routine runs whenever a client connects to the UNIX-domain socket * that is dedicated to local mail delivery service. What we see below is * a little protocol to (1) tell the client that we are ready, (2) read a * delivery request from the client, and (3) report the completion status * of that request. */ if ((request = deliver_request_read(stream)) != 0) { status = local_deliver(request, service); deliver_request_done(stream, request, status); } }
static void discard_service(VSTREAM *client_stream, char *unused_service, char **argv) { DELIVER_REQUEST *request; int status; /* * Sanity check. This service takes no command-line arguments. */ if (argv[0]) msg_fatal("unexpected command-line argument: %s", argv[0]); /* * This routine runs whenever a client connects to the UNIX-domain socket * dedicated to the discard mailer. What we see below is a little * protocol to (1) tell the queue manager that we are ready, (2) read a * request from the queue manager, and (3) report the completion status * of that request. All connection-management stuff is handled by the * common code in single_server.c. */ if ((request = deliver_request_read(client_stream)) != 0) { status = deliver_message(request); deliver_request_done(client_stream, request, status); } }