135 #include <sys/wait.h>
142 #ifdef STRCASECMP_IN_STRINGS_H
189 static void get_service_attr(
SPAWN_ATTR *attr,
char *service,
char **argv)
191 const char *myname =
"get_service_attr";
213 for ( ; *argv != 0; argv++) {
218 if (
strncasecmp(
"user=", *argv,
sizeof(
"user=") - 1) == 0) {
219 user = *argv +
sizeof(
"user=") - 1;
220 if ((group =
split_at(user,
':')) != 0)
223 if ((pwd = getpwnam(user)) == 0)
224 msg_fatal(
"unknown user name: %s", user);
225 attr->
uid = pwd->pw_uid;
227 if ((grp = getgrnam(group)) == 0)
228 msg_fatal(
"unknown group name: %s", group);
229 attr->
gid = grp->gr_gid;
231 attr->
gid = pwd->pw_gid;
238 else if (
strncasecmp(
"argv=", *argv,
sizeof(
"argv=") - 1) == 0) {
239 *argv +=
sizeof(
"argv=") - 1;
248 msg_fatal(
"unknown attribute name: %s", *argv);
261 msg_fatal(
"request to deliver as mail system owner");
263 msg_fatal(
"request to use privileged group id %ld", (
long) attr->
gid);
265 msg_fatal(
"request to use mail system owner group id %ld", (
long) attr->
gid);
266 if (attr->
uid == (uid_t) (-1))
267 msg_fatal(
"user must not have user ID -1");
268 if (attr->
gid == (gid_t) (-1))
269 msg_fatal(
"user must not have group ID -1");
275 msg_info(
"%s: uid %ld, gid %ld; time %d",
281 static void spawn_service(
VSTREAM *client_stream,
char *service,
char **argv)
283 const char *myname =
"spawn_service";
293 msg_info(
"%s: service=%s, command=%s...", myname, service, argv[0]);
299 if (attr.
argv == 0) {
300 get_service_attr(&attr, service, argv);
322 if (WIFEXITED(status))
323 msg_warn(
"command %s exit status %d",
324 attr.
argv[0], WEXITSTATUS(status));
325 if (WIFSIGNALED(status))
326 msg_warn(
"command %s killed by signal %d",
327 attr.
argv[0], WTERMSIG(status));
333 static void pre_accept(
char *unused_name,
char **unused_argv)
338 msg_info(
"table %s has changed -- restarting", table);
345 static void drop_privileges(
char *unused_name,
char **unused_argv)
354 int main(
int argc,
char **argv)
#define CA_SPAWN_CMD_GID(v)
ARGV * argv_free(ARGV *argvp)
WAIT_STATUS_T spawn_command(int key,...)
#define CA_SPAWN_CMD_STDIN(v)
MAIL_VERSION_STAMP_DECLARE
#define CA_SPAWN_CMD_STDERR(v)
int main(int argc, char **argv)
int strncasecmp(const char *s1, const char *s2, size_t n)
#define VAR_EXPORT_ENVIRON
#define CA_MAIL_SERVER_POST_INIT(v)
ARGV * mail_parm_split(const char *name, const char *value)
const char * dict_changed_name(void)
#define CA_SPAWN_CMD_STDOUT(v)
#define DEF_COMMAND_MAXTIME
#define CA_SPAWN_CMD_UID(v)
int get_mail_conf_time2(const char *, const char *, int, int, int, int)
void msg_warn(const char *fmt,...)
#define VAR_COMMAND_MAXTIME
#define MAIL_VERSION_STAMP_ALLOCATE
#define CA_MAIL_SERVER_TIME_TABLE(v)
NORETURN msg_fatal(const char *fmt,...)
#define CA_MAIL_SERVER_PRIVILEGED
void set_eugid(uid_t euid, gid_t egid)
#define CA_SPAWN_CMD_EXPORT(v)
#define CA_SPAWN_CMD_ARGV(v)
#define CA_SPAWN_CMD_TIME_LIMIT(v)
NORETURN single_server_main(int, char **, SINGLE_SERVER_FN,...)
char * split_at(char *string, int delimiter)
#define vstream_fileno(vp)
char * var_export_environ
#define CA_MAIL_SERVER_PRE_ACCEPT(v)
#define NORMAL_EXIT_STATUS(status)
void msg_info(const char *fmt,...)