xref: /netbsd-src/external/ibm-public/postfix/dist/src/global/mail_trigger.c (revision e6ca80d43962864f49719de05ed892793630d07f)
1 /*	$NetBSD: mail_trigger.c,v 1.1.1.3 2013/09/25 19:06:31 tron Exp $	*/
2 
3 /*++
4 /* NAME
5 /*	mail_trigger 3
6 /* SUMMARY
7 /*	trigger a mail service
8 /* SYNOPSIS
9 /*	#include <mail_proto.h>
10 /*
11 /*	int	mail_trigger(class, service, request, length)
12 /*	const char *class;
13 /*	const char *service;
14 /*	const char *request;
15 /*	ssize_t	length;
16 /* DESCRIPTION
17 /*	mail_trigger() wakes up the specified mail subsystem, by
18 /*	sending it the specified request. In the case of non-FIFO
19 /*	server endpoints, a short-running program should invoke
20 /*	event_drain() to ensure proper request delivery.
21 /*
22 /*	Arguments:
23 /* .IP class
24 /*	Name of a class of local transport channel endpoints,
25 /*	either \fIpublic\fR (accessible by any local user) or
26 /*	\fIprivate\fR (administrative access only).
27 /* .IP service
28 /*	The name of a local transport endpoint within the named class.
29 /* .IP request
30 /*	A string. The list of valid requests is service specific.
31 /* .IP length
32 /*	The length of the request string.
33 /* DIAGNOSTICS
34 /*	The result is -1 in case of problems, 0 otherwise.
35 /*	Warnings are logged.
36 /* BUGS
37 /*	Works with FIFO or UNIX-domain services only.
38 /*
39 /*	Should use master.cf to find out what transport to use.
40 /* SEE ALSO
41 /*	fifo_trigger(3) trigger a FIFO-based service
42 /*	unix_trigger(3) trigger a UNIX_domain service
43 /* LICENSE
44 /* .ad
45 /* .fi
46 /*	The Secure Mailer license must be distributed with this software.
47 /* AUTHOR(S)
48 /*	Wietse Venema
49 /*	IBM T.J. Watson Research
50 /*	P.O. Box 704
51 /*	Yorktown Heights, NY 10598, USA
52 /*--*/
53 
54 /* System library. */
55 
56 #include <sys_defs.h>
57 #include <sys/stat.h>
58 
59 /* Utility library. */
60 
61 #include <msg.h>
62 #include <mymalloc.h>
63 #include <iostuff.h>
64 #include <trigger.h>
65 #include <warn_stat.h>
66 
67 /* Global library. */
68 
69 #include "mail_params.h"
70 #include "mail_proto.h"
71 
72 /* mail_trigger - trigger a service */
73 
mail_trigger(const char * class,const char * service,const char * req_buf,ssize_t req_len)74 int     mail_trigger(const char *class, const char *service,
75 		             const char *req_buf, ssize_t req_len)
76 {
77     struct stat st;
78     char   *path;
79     int     status;
80 
81     /*
82      * XXX Some systems cannot tell the difference between a named pipe
83      * (fifo) or a UNIX-domain socket. So we may have to try both.
84      */
85     path = mail_pathname(class, service);
86     if ((status = stat(path, &st)) < 0) {
87 	 msg_warn("unable to look up %s: %m", path);
88     } else if (S_ISFIFO(st.st_mode)) {
89 	status = fifo_trigger(path, req_buf, req_len, var_trigger_timeout);
90 	if (status < 0 && S_ISSOCK(st.st_mode))
91 	    status = LOCAL_TRIGGER(path, req_buf, req_len, var_trigger_timeout);
92     } else if (S_ISSOCK(st.st_mode)) {
93 	status = LOCAL_TRIGGER(path, req_buf, req_len, var_trigger_timeout);
94     } else {
95 	msg_warn("%s is not a socket or a fifo", path);
96 	status = -1;
97     }
98     myfree(path);
99     return (status);
100 }
101