65 #include <netinet/in.h>
73 #ifdef STRCASECMP_IN_STRINGS_H
106 static char *master_path;
108 static int master_line_last;
109 static int master_line;
110 static ARGV *master_disable;
118 if (master_path != 0)
127 const char *myname =
"set_master_ent";
131 msg_panic(
"%s: configuration file still open", myname);
132 if (master_path == 0)
133 msg_panic(
"%s: no configuration file specified", myname);
134 if ((master_fp =
vstream_fopen(master_path, O_RDONLY, 0)) == 0)
136 master_line_last = 0;
137 if (master_disable != 0)
138 msg_panic(
"%s: service disable list still exists", myname);
140 msg_warn(
"all network protocols are disabled (%s = %s)",
142 msg_warn(
"disabling all type \"inet\" services in master.cf");
155 const char *myname =
"end_master_ent";
158 msg_panic(
"%s: configuration file not open", myname);
160 msg_fatal(
"%s: close configuration file: %m", myname);
162 if (master_disable == 0)
163 msg_panic(
"%s: no service disable list", myname);
170 static const char *master_conf_context(
void)
172 static VSTRING *context_buf = 0;
174 if (context_buf == 0)
184 const char *myname =
"fatal_with_context";
188 if (master_path == 0)
189 msg_panic(
"%s: no configuration file specified", myname);
191 va_start(ap, format);
199 static NORETURN fatal_invalid_field(
char *name,
char *value)
201 fatal_with_context(
"field \"%s\": bad value: \"%s\"", name, value);
206 static char *get_str_ent(
char **bufp,
char *name,
char *def_val)
210 if ((value =
mystrtok(bufp, master_blanks)) == 0)
211 fatal_with_context(
"missing \"%s\" field", name);
212 if (strcmp(value,
"-") == 0) {
214 fatal_with_context(
"field \"%s\" has no default value", name);
216 msg_info(
"%s: using backwards-compatible default setting "
217 "%s=%s", master_conf_context(), name, def_val);
226 static int get_bool_ent(
char **bufp,
char *name,
char *def_val)
230 value = get_str_ent(bufp, name, def_val);
231 if (strcmp(
"y", value) == 0) {
233 }
else if (strcmp(
"n", value) == 0) {
236 fatal_invalid_field(name, value);
243 static int get_int_ent(
char **bufp,
char *name,
char *def_val,
int min_val)
248 value = get_str_ent(bufp, name, def_val);
249 if (!
ISDIGIT(*value) || (n = atoi(value)) < min_val)
250 fatal_invalid_field(name, value);
273 const char *parse_err;
274 static char *saved_interfaces = 0;
278 msg_panic(
"get_master_ent: config file not open");
279 if (master_disable == 0)
280 msg_panic(
"get_master_ent: no service disable list");
294 if (saved_interfaces == 0)
301 if (
readllines(buf, master_fp, &master_line_last, &master_line) == 0) {
307 if ((cp =
mystrtok(&bufp, master_blanks)) == 0)
310 transport = get_str_ent(&bufp,
"transport type", (
char *) 0);
341 #define STR_SAME !strcmp
345 msg_warn(
"service %s: ignoring %s change",
347 msg_warn(
"to change %s, stop and start Postfix",
352 if ((parse_err =
host_port(atmp, &host,
"", &port, (
char *) 0)) != 0)
353 fatal_with_context(
"%s in \"%s\"", parse_err, name);
360 fatal_with_context(
"bad hostname or network address: %s", name);
388 #ifdef MASTER_SERV_TYPE_PASS
395 fatal_with_context(
"bad transport type: %s", transport);
401 private = get_bool_ent(&bufp,
"private",
"y");
410 struct addrinfo *res0;
413 fatal_with_context(
"inet service cannot be private");
427 serv_port.
buf, (
char *) 0) :
436 serv_port.
buf, (
char *) 0) :
450 #ifdef MASTER_SERV_TYPE_PASS
464 fatal_with_context(
"no valid IP address found: %s", name);
474 unprivileged = get_bool_ent(&bufp,
"unprivileged",
"y");
489 serv->
wakeup_time = get_int_ent(&bufp,
"wakeup_time",
"0", 0);
495 if (serv->
wakeup_time > 0 && bufp[*bufp ? -2 : -1] ==
'?')
507 command = get_str_ent(&bufp,
"command", (
char *) 0);
541 if (strcmp(
basename(command), name) != 0)
567 fatal_with_context(
"%s", err);
586 msg_info(
"====start service entry");
596 "unknown transport type");
601 for (cpp = serv->
args->
argv; *cpp; cpp++)
void freeaddrinfo(struct addrinfo *ai)
void inet_addr_list_uniq(INET_ADDR_LIST *list)
char * mystrdup(const char *str)
char * extpar(char **bp, const char *parens, int flags)
ARGV * argv_free(ARGV *argvp)
ARGV * match_service_init(const char *patterns)
NORETURN msg_panic(const char *fmt,...)
void inet_addr_list_free(INET_ADDR_LIST *list)
#define inet_proto_info()
#define MASTER_FLAG_LOCAL_ONLY
MASTER_SERV * get_master_ent()
int match_service_match(ARGV *list, const char *name_type)
#define MASTER_SERV_TYPE_PASS
#define EXTPAR_FLAG_STRIP
int warn_compat_break_chroot
#define SOCKADDR_TO_HOSTADDR(sa, salen, host, port, sock)
void argv_add(ARGV *argvp,...)
#define MASTER_INET_ADDRLIST(s)
char * mystrtokq(char **src, const char *sep, const char *parens)
#define VAR_INET_INTERFACES
#define MASTER_XPORT_NAME_PASS
void fset_master_ent(char *path)
char * mystrtok(char **src, const char *sep)
ARGV * argv_alloc(ssize_t len)
void free_master_ent(MASTER_SERV *serv)
char * var_master_disable
int hostaddr_to_sockaddr(const char *hostaddr, const char *service, int socktype, struct addrinfo **res)
VSTREAM * vstream_fopen(const char *path, int flags, mode_t mode)
#define MAIL_CLASS_PUBLIC
char buf[MAI_HOSTADDR_STRSIZE]
VSTRING * vstring_vsprintf(VSTRING *vp, const char *format, va_list ap)
int vstream_fclose(VSTREAM *stream)
char * mail_pathname(const char *service_class, const char *service_name)
int sock_addr_in_loopback(const struct sockaddr *sa)
struct MASTER_SERV * next
#define SOCK_ADDR_PTR(ptr)
void msg_warn(const char *fmt,...)
#define MASTER_SERV_TYPE_UNIX
void match_service_free(ARGV *list)
VSTRING * vstring_alloc(ssize_t len)
#define VAR_INET_PROTOCOLS
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
INET_ADDR_LIST * wildcard_inet_addr_list(void)
#define MASTER_XPORT_NAME_FIFO
#define MASTER_XPORT_NAME_INET
void inet_addr_list_init(INET_ADDR_LIST *list)
time_t stress_expire_time
NORETURN msg_fatal(const char *fmt,...)
#define MASTER_XPORT_NAME_UNIX
#define MASTER_SERV_TYPE_INET
VSTRING * readllines(VSTRING *buf, VSTREAM *fp, int *lineno, int *first_line)
void print_master_ent(MASTER_SERV *serv)
char * concatenate(const char *arg0,...)
#define INET_INTERFACES_ALL
int strcasecmp(const char *s1, const char *s2)
INET_ADDR_LIST * own_inet_addr_list(void)
const char * host_port(char *buf, char **host, char *def_host, char **port, char *def_service)
VSTRING * vstring_free(VSTRING *vp)
int inet_addr_host(INET_ADDR_LIST *addr_list, const char *hostname)
char * var_inet_protocols
#define MASTER_INET_PORT(s)
char buf[MAI_SERVPORT_STRSIZE]
#define MASTER_SERV_TYPE_FIFO
struct BINHASH * children
char * var_inet_interfaces
#define MASTER_FLAG_INETHOST
#define MAIL_CLASS_PRIVATE
#define MASTER_FLAG_CONDWAKE
void * mymalloc(ssize_t len)
void argv_terminate(ARGV *argvp)
void msg_info(const char *fmt,...)