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