diff options
Diffstat (limited to 'src/pies.h')
-rw-r--r-- | src/pies.h | 131 |
1 files changed, 112 insertions, 19 deletions
@@ -1,23 +1,24 @@ -/* This file is part of Mailfromd. +/* This file is part of Pies. Copyright (C) 2008, 2009 Sergey Poznyakoff - This program is free software; you can redistribute it and/or modify + Pies is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + Pies is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ + along with Pies. If not, see <http://www.gnu.org/licenses/>. */ #ifdef HAVE_CONFIG_H # include <config.h> #endif #include <sys/types.h> +#include <sys/socket.h> #include <sys/wait.h> #include <sys/stat.h> #include <sys/time.h> @@ -35,18 +36,27 @@ #include <pwd.h> #include <grp.h> #include <signal.h> +#include <time.h> #include <sysexits.h> +#include <argp.h> -#include <mailutils/mailutils.h> -#include <mailutils/daemon.h> -#include <mailutils/libargp.h> -#include <mailutils/syslog.h> +#include <grecs.h> +#include <wordsplit.h> +#include "progname.h" #include "inttostr.h" #include "c-ctype.h" #include "xalloc.h" +#define obstack_chunk_alloc xmalloc +#define obstack_chunk_free free +#include "obstack.h" +#include "xvasprintf.h" + +#include "acl.h" #include "libpies.h" +#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0])) + #define TESTTIME 2*60 #define SLEEPTIME 5*60 #define MAXSPAWN 10 @@ -88,11 +98,20 @@ struct action size_t nstat; unsigned *status; enum return_action act; /* Action to take when the component terminates */ - mu_address_t addr; /* Addresses to notify about it. */ + char *addr; /* Addresses to notify about it. */ char *message; /* Notification mail. */ char *command; /* Execute this command */ }; + +/* user privs */ +struct pies_privs +{ + char *user; + int allgroups; + gl_list_t groups; +}; + enum pies_comp_mode { /* Execute the component, no sockets are opened. This is the default @@ -121,23 +140,23 @@ struct component char **argv; /* Program command line */ char **env; /* Program environment */ char *dir; /* Working directory */ - mu_list_t prereq; /* Prerequisites */ - mu_list_t depend; /* Dependency targets */ + gl_list_t prereq; /* Prerequisites */ + gl_list_t depend; /* Dependency targets */ unsigned settle_timeout; /* Time needed for started prerequisites to settle */ /* FIXME: disabled and precious can be encoded as bits in mode */ int disabled; /* The componenet is disabled */ int precious; /* The component is precious (cannot be disabled) */ char *rmfile; /* Try to remove this file before starting */ - struct mf_privs privs; /* UID/GIDS+groups to run under */ + struct pies_privs privs; /* UID/GIDS+groups to run under */ mode_t umask; /* Umask to install before starting */ limits_record_t limits; /* System limits */ - mu_url_t socket_url; /* Socket to listen on + struct pies_url *socket_url; /* Socket to listen on (if mode != pies_comp_exec) */ char *pass_fd_socket; /* Socket to pass fd on (if mode == pies_comp_pass_fd) */ - mu_acl_t acl; - /* Retranslators: */ + pies_acl_t acl; + /* Redirectors: */ int facility; /* Syslog facility. */ struct redirector redir[2]; /* Repeaters for stdout and stderr */ /* Actions to execute on various exit codes: */ @@ -145,11 +164,12 @@ struct component struct action act_temp; /* Auxiliary object used during configuration */ }; -extern char *syslog_tag; +extern int log_to_stderr; +extern char *log_tag; +extern int log_facility; extern unsigned long shutdown_timeout; extern struct component default_component; -extern mu_acl_t pies_acl; -extern mu_debug_t pies_debug; +pies_acl_t pies_acl; extern limits_record_t pies_limits; void register_prog (struct component *comp); @@ -187,11 +207,36 @@ unsigned depmap_first (pies_depmap_t dmap, enum pies_depmap_direction dir, unsigned coord, pies_depmap_pos_t *ppos); unsigned depmap_next (pies_depmap_t dmap, pies_depmap_pos_t pos); +int assert_grecs_value_type (grecs_locus_t *locus, + const grecs_value_t *value, int type); + +struct component *component_create (const char *name); +void component_finish (struct component *comp, grecs_locus_t *locus); +struct grecs_keyword *find_component_keyword (const char *ident); + + +/* url.c */ +struct pies_url +{ + char *string; + char *proto; + char *host; + int port; + char *path; + char *user; + char *passwd; + int argc; + char **argv; +}; + +int pies_url_create (struct pies_url **purl, const char *str); +void pies_url_destroy (struct pies_url **purl); +const char * pies_url_get_arg (struct pies_url *url, const char *argname); void pies_pause (void); int register_listener (int fd); int pass_fd (const char *socket, int fd); -int create_socket (mu_url_t url, const char *user, mode_t umask); +int create_socket (struct pies_url *url, const char *user, mode_t umask); int parse_limits (limits_record_t *plrec, char *str, char **endp); @@ -203,3 +248,51 @@ int meta1lex (void); int meta1error (char *s); int meta1parse (void); + +void logmsg (int prio, const char *fmt, ...); +void logmsg_printf (int prio, const char *fmt, ...); +void logmsg_vprintf (int prio, const char *fmt, va_list ap); + +extern unsigned debug_level; +extern int source_info_option; +void debug_msg (const char *fmt, ...); + +#define debug(lev, args) \ + do \ + if (debug_level >= lev) \ + { \ + if (source_info_option) \ + logmsg_printf (LOG_DEBUG, "%s:%lu:%s: ", \ + __FILE__, __LINE__, __FUNCTION__); \ + debug_msg args; \ + } \ + while (0) + + +/* meta.c */ +struct metadef +{ + char *kw; + char *value; + const char *(*expand) (struct metadef *, void *); + char *storage; + void *data; +}; + +char *meta_expand_string (const char *string, struct metadef *def, void *data); +void meta_free (struct metadef *def); + + +/* addrfmt.c */ +void sockaddr_to_str (const struct sockaddr *sa, int salen, + char *bufptr, size_t buflen, + size_t *plen); +char *sockaddr_to_astr (const struct sockaddr *sa, int salen); + + +/* userprivs.c */ +int switch_to_privs (uid_t uid, gid_t gid, gl_list_t retain_groups); + +void pies_priv_setup (struct pies_privs *); +void pies_epriv_setup (struct pies_privs *); + |