Home | History | Annotate | Line # | Download | only in master
      1 /*	$NetBSD: master.h,v 1.3 2025/02/25 19:15:46 christos Exp $	*/
      2 
      3 /*++
      4 /* NAME
      5 /*	master 3h
      6 /* SUMMARY
      7 /*	Postfix master - data structures and prototypes
      8 /* SYNOPSIS
      9 /*	#include "master.h"
     10 /* DESCRIPTION
     11 /* .nf
     12 
     13  /*
     14   * Server processes that provide the same service share a common "listen"
     15   * socket to accept connection requests, and share a common pipe to the
     16   * master process to send status reports. Server processes die voluntarily
     17   * when idle for a configurable amount of time, or after servicing a
     18   * configurable number of requests; the master process spawns new processes
     19   * on demand up to a configurable concurrency limit and/or periodically.
     20   *
     21   * The canonical service name is what we use internally, so that we correctly
     22   * handle a request to "reload" after someone changes "smtp" into "25".
     23   *
     24   * We use the external service name from master.cf when reporting problems, so
     25   * that the user can figure out what we are talking about. Of course we also
     26   * include the canonical service name so that the UNIX-domain smtp service
     27   * can be distinguished from the Internet smtp service.
     28   */
     29 typedef struct MASTER_SERV {
     30     int     flags;			/* status, features, etc. */
     31     char   *ext_name;			/* service endpoint name (master.cf) */
     32     char   *name;			/* service endpoint name (canonical) */
     33     int     type;			/* UNIX-domain, INET, etc. */
     34     time_t  busy_warn_time;		/* limit "all servers busy" warning */
     35     int     wakeup_time;		/* wakeup interval */
     36     int    *listen_fd;			/* incoming requests */
     37     int     listen_fd_count;		/* nr of descriptors */
     38     union {
     39 	struct {
     40 	    char   *port;		/* inet listen port */
     41 	    struct INET_ADDR_LIST *addr;/* inet listen address */
     42 	}       inet_ep;
     43 #define MASTER_INET_ADDRLIST(s)	((s)->endpoint.inet_ep.addr)
     44 #define MASTER_INET_PORT(s)	((s)->endpoint.inet_ep.port)
     45     }       endpoint;
     46     int     max_proc;			/* upper bound on # processes */
     47     char   *path;			/* command pathname */
     48     struct ARGV *args;			/* argument vector */
     49     char   *stress_param_val;		/* stress value: "yes" or empty */
     50     time_t  stress_expire_time;		/* stress pulse stretcher */
     51     int     avail_proc;			/* idle processes */
     52     int     total_proc;			/* number of processes */
     53     int     throttle_delay;		/* failure recovery parameter */
     54     int     status_fd[2];		/* child status reports */
     55     struct BINHASH *children;		/* linkage */
     56     struct MASTER_SERV *next;		/* linkage */
     57 } MASTER_SERV;
     58 
     59  /*
     60   * Per-service flag bits. We assume trouble when a child process terminates
     61   * before completing its first request: either the program is defective,
     62   * some configuration is wrong, or the system is out of resources.
     63   */
     64 #define MASTER_FLAG_THROTTLE	(1<<0)	/* we're having trouble */
     65 #define MASTER_FLAG_MARK	(1<<1)	/* garbage collection support */
     66 #define MASTER_FLAG_CONDWAKE	(1<<2)	/* wake up if actually used */
     67 #define MASTER_FLAG_INETHOST	(1<<3)	/* endpoint name specifies host */
     68 #define MASTER_FLAG_LOCAL_ONLY	(1<<4)	/* no remote clients */
     69 #define MASTER_FLAG_LISTEN	(1<<5)	/* monitor this port */
     70 
     71 #define MASTER_THROTTLED(f)	((f)->flags & MASTER_FLAG_THROTTLE)
     72 #define MASTER_MARKED_FOR_DELETION(f) ((f)->flags & MASTER_FLAG_MARK)
     73 #define MASTER_LISTENING(f)	((f)->flags & MASTER_FLAG_LISTEN)
     74 
     75 #define MASTER_LIMIT_OK(limit, count) ((limit) == 0 || ((count) < (limit)))
     76 
     77  /*
     78   * Service types, stream sockets unless indicated otherwise.
     79   */
     80 #define MASTER_SERV_TYPE_UNIX	1	/* AF_UNIX domain socket */
     81 #define MASTER_SERV_TYPE_INET	2	/* AF_INET domain socket */
     82 #define MASTER_SERV_TYPE_FIFO	3	/* fifo (named pipe) */
     83 #define MASTER_SERV_TYPE_PASS	4	/* AF_UNIX domain socket */
     84 #define MASTER_SERV_TYPE_UXDG	5	/* AF_UNIX domain datagram socket */
     85 
     86  /*
     87   * Default process management policy values. This is only the bare minimum.
     88   * Most policy management is delegated to child processes. The process
     89   * manager runs at high privilege level and has to be kept simple.
     90   */
     91 #define MASTER_DEF_MIN_IDLE	1	/* preferred # of idle processes */
     92 
     93  /*
     94   * Structure of child process.
     95   */
     96 typedef int MASTER_PID;			/* pid is key into binhash table */
     97 
     98 typedef struct MASTER_PROC {
     99     MASTER_PID pid;			/* child process id */
    100     unsigned gen;			/* child generation number */
    101     int     avail;			/* availability */
    102     MASTER_SERV *serv;			/* parent linkage */
    103     int     use_count;			/* number of service requests */
    104 } MASTER_PROC;
    105 
    106  /*
    107   * Other manifest constants.
    108   */
    109 #define MASTER_BUF_LEN	2048		/* logical config line length */
    110 
    111  /*
    112   * master.c
    113   */
    114 extern int master_detach;
    115 extern int init_mode;
    116 
    117  /*
    118   * master_ent.c
    119   */
    120 extern void fset_master_ent(char *);
    121 extern void set_master_ent(void);
    122 extern void end_master_ent(void);
    123 extern void print_master_ent(MASTER_SERV *);
    124 extern MASTER_SERV *get_master_ent(void);
    125 extern void free_master_ent(MASTER_SERV *);
    126 
    127  /*
    128   * master_conf.c
    129   */
    130 extern void master_config(void);
    131 extern void master_refresh(void);
    132 
    133  /*
    134   * master_vars.c
    135   */
    136 extern void master_vars_init(void);
    137 
    138  /*
    139   * master_service.c
    140   */
    141 extern MASTER_SERV *master_head;
    142 extern void master_start_service(MASTER_SERV *);
    143 extern void master_stop_service(MASTER_SERV *);
    144 extern void master_restart_service(MASTER_SERV *, int);
    145 
    146 #define DO_CONF_RELOAD	1		/* config files were reloaded */
    147 #define NO_CONF_RELOAD	0		/* no config file was reloaded */
    148 
    149  /*
    150   * master_events.c
    151   */
    152 extern int master_gotsighup;
    153 extern int master_gotsigchld;
    154 extern void master_sigsetup(void);
    155 
    156  /*
    157   * master_status.c
    158   */
    159 extern void master_status_init(MASTER_SERV *);
    160 extern void master_status_cleanup(MASTER_SERV *);
    161 
    162  /*
    163   * master_wakeup.c
    164   */
    165 extern void master_wakeup_init(MASTER_SERV *);
    166 extern void master_wakeup_cleanup(MASTER_SERV *);
    167 
    168 
    169  /*
    170   * master_listen.c
    171   */
    172 extern void master_listen_init(MASTER_SERV *);
    173 extern void master_listen_cleanup(MASTER_SERV *);
    174 
    175  /*
    176   * master_avail.c
    177   */
    178 extern void master_avail_listen(MASTER_SERV *);
    179 extern void master_avail_cleanup(MASTER_SERV *);
    180 extern void master_avail_more(MASTER_SERV *, MASTER_PROC *);
    181 extern void master_avail_less(MASTER_SERV *, MASTER_PROC *);
    182 
    183  /*
    184   * master_spawn.c
    185   */
    186 extern struct BINHASH *master_child_table;
    187 extern void master_spawn(MASTER_SERV *);
    188 extern void master_reap_child(void);
    189 extern void master_delete_children(MASTER_SERV *);
    190 
    191  /*
    192   * master_flow.c
    193   */
    194 extern void master_flow_init(void);
    195 extern int master_flow_pipe[2];
    196 
    197  /*
    198   * master_watch.c
    199   *
    200   * Support to warn about main.cf parameters that can only be initialized but
    201   * not updated, and to initialize or update data structures that derive
    202   * values from main.cf parameters.
    203   */
    204 typedef struct {
    205     const char *name;			/* parameter name */
    206     char  **value;			/* current main.cf value */
    207     char  **backup;			/* actual value that is being used */
    208     int     flags;			/* see below */
    209     void    (*notify) (void);		/* init or update data structure */
    210 } MASTER_STR_WATCH;
    211 
    212 typedef struct {
    213     const char *name;			/* parameter name */
    214     int    *value;			/* current main.cf value */
    215     int     backup;			/* actual value that is being used */
    216     int     flags;			/* see below */
    217     void    (*notify) (void);		/* init or update data structure */
    218 } MASTER_INT_WATCH;
    219 
    220 #define MASTER_WATCH_FLAG_UPDATABLE (1<<0)	/* support update after init */
    221 #define MASTER_WATCH_FLAG_ISSET    (1<<1)	/* backup is initialized */
    222 
    223 extern void master_str_watch(const MASTER_STR_WATCH *);
    224 extern void master_int_watch(MASTER_INT_WATCH *);
    225 
    226  /*
    227   * master_monitor.c
    228   */
    229 extern int master_monitor(int);
    230 
    231 /* DIAGNOSTICS
    232 /* BUGS
    233 /* SEE ALSO
    234 /* LICENSE
    235 /* .ad
    236 /* .fi
    237 /*	The Secure Mailer license must be distributed with this software.
    238 /* AUTHOR(S)
    239 /*	Wietse Venema
    240 /*	IBM T.J. Watson Research
    241 /*	P.O. Box 704
    242 /*	Yorktown Heights, NY 10598, USA
    243 /*
    244 /*	Wietse Venema
    245 /*	Google, Inc.
    246 /*	111 8th Avenue
    247 /*	New York, NY 10011, USA
    248 /*--*/
    249