1 /* $NetBSD: postconf.c,v 1.4 2022/10/08 16:12:47 christos Exp $ */
2
3 /*++
4 /* NAME
5 /* postconf 1
6 /* SUMMARY
7 /* Postfix configuration utility
8 /* SYNOPSIS
9 /* .fi
10 /* .ti -4
11 /* \fBManaging main.cf:\fR
12 /*
13 /* \fBpostconf\fR [\fB-dfhHnopvx\fR] [\fB-c \fIconfig_dir\fR]
14 /* [\fB-C \fIclass,...\fR] [\fIparameter ...\fR]
15 /*
16 /* \fBpostconf\fR [\fB-epv\fR] [\fB-c \fIconfig_dir\fR]
17 /* \fIparameter\fB=\fIvalue ...\fR
18 /*
19 /* \fBpostconf\fR \fB-#\fR [\fB-pv\fR] [\fB-c \fIconfig_dir\fR]
20 /* \fIparameter ...\fR
21 /*
22 /* \fBpostconf\fR \fB-X\fR [\fB-pv\fR] [\fB-c \fIconfig_dir\fR]
23 /* \fIparameter ...\fR
24 /*
25 /* .ti -4
26 /* \fBManaging master.cf service entries:\fR
27 /*
28 /* \fBpostconf\fR \fB-M\fR [\fB-fovx\fR] [\fB-c \fIconfig_dir\fR]
29 /* [\fIservice\fR[\fB/\fItype\fR]\fI ...\fR]
30 /*
31 /* \fBpostconf\fR \fB-M\fR [\fB-ev\fR] [\fB-c \fIconfig_dir\fR]
32 /* \fIservice\fB/\fItype\fB=\fIvalue ...\fR
33 /*
34 /* \fBpostconf\fR \fB-M#\fR [\fB-v\fR] [\fB-c \fIconfig_dir\fR]
35 /* \fIservice\fB/\fItype ...\fR
36 /*
37 /* \fBpostconf\fR \fB-MX\fR [\fB-v\fR] [\fB-c \fIconfig_dir\fR]
38 /* \fIservice\fB/\fItype ...\fR
39 /*
40 /* .ti -4
41 /* \fBManaging master.cf service fields:\fR
42 /*
43 /* \fBpostconf\fR \fB-F\fR [\fB-fhHovx\fR] [\fB-c \fIconfig_dir\fR]
44 /* [\fIservice\fR[\fB/\fItype\fR[\fB/\fIfield\fR]]\fI ...\fR]
45 /*
46 /* \fBpostconf\fR \fB-F\fR [\fB-ev\fR] [\fB-c \fIconfig_dir\fR]
47 /* \fIservice\fB/\fItype\fB/\fIfield\fB=\fIvalue ...\fR
48 /*
49 /* .ti -4
50 /* \fBManaging master.cf service parameters:\fR
51 /*
52 /* \fBpostconf\fR \fB-P\fR [\fB-fhHovx\fR] [\fB-c \fIconfig_dir\fR]
53 /* [\fIservice\fR[\fB/\fItype\fR[\fB/\fIparameter\fR]]\fI ...\fR]
54 /*
55 /* \fBpostconf\fR \fB-P\fR [\fB-ev\fR] [\fB-c \fIconfig_dir\fR]
56 /* \fIservice\fB/\fItype\fB/\fIparameter\fB=\fIvalue ...\fR
57 /*
58 /* \fBpostconf\fR \fB-PX\fR [\fB-v\fR] [\fB-c \fIconfig_dir\fR]
59 /* \fIservice\fB/\fItype\fB/\fIparameter ...\fR
60 /*
61 /* .ti -4
62 /* \fBManaging bounce message templates:\fR
63 /*
64 /* \fBpostconf\fR \fB-b\fR [\fB-v\fR] [\fB-c \fIconfig_dir\fR]
65 /* [\fItemplate_file\fR]
66 /*
67 /* \fBpostconf\fR \fB-t\fR [\fB-v\fR] [\fB-c \fIconfig_dir\fR]
68 /* [\fItemplate_file\fR]
69 /*
70 /* .ti -4
71 /* \fBManaging TLS features:\fR
72 /*
73 /* \fBpostconf\fR \fB-T \fImode\fR [\fB-v\fR] [\fB-c \fIconfig_dir\fR]
74 /*
75 /* .ti -4
76 /* \fBManaging other configuration:\fR
77 /*
78 /* \fBpostconf\fR \fB-a\fR|\fB-A\fR|\fB-l\fR|\fB-m\fR [\fB-v\fR]
79 /* [\fB-c \fIconfig_dir\fR]
80 /* DESCRIPTION
81 /* By default, the \fBpostconf\fR(1) command displays the
82 /* values of \fBmain.cf\fR configuration parameters, and warns
83 /* about possible mis-typed parameter names (Postfix 2.9 and later).
84 /* The command can also change \fBmain.cf\fR configuration
85 /* parameter values, or display other configuration information
86 /* about the Postfix mail system.
87 /*
88 /* Options:
89 /* .IP \fB-a\fR
90 /* List the available SASL plug-in types for the Postfix SMTP
91 /* server. The plug-in type is selected with the \fBsmtpd_sasl_type\fR
92 /* configuration parameter by specifying one of the names
93 /* listed below.
94 /* .RS
95 /* .IP \fBcyrus\fR
96 /* This server plug-in is available when Postfix is built with
97 /* Cyrus SASL support.
98 /* .IP \fBdovecot\fR
99 /* This server plug-in uses the Dovecot authentication server,
100 /* and is available when Postfix is built with any form of SASL
101 /* support.
102 /* .RE
103 /* .IP
104 /* This feature is available with Postfix 2.3 and later.
105 /* .IP \fB-A\fR
106 /* List the available SASL plug-in types for the Postfix SMTP
107 /* client. The plug-in type is selected with the \fBsmtp_sasl_type\fR
108 /* or \fBlmtp_sasl_type\fR configuration parameters by specifying
109 /* one of the names listed below.
110 /* .RS
111 /* .IP \fBcyrus\fR
112 /* This client plug-in is available when Postfix is built with
113 /* Cyrus SASL support.
114 /* .RE
115 /* .IP
116 /* This feature is available with Postfix 2.3 and later.
117 /* .IP "\fB-b\fR [\fItemplate_file\fR]"
118 /* Display the message text that appears at the beginning of
119 /* delivery status notification (DSN) messages, expanding
120 /* $\fBname\fR expressions with actual values as described in
121 /* \fBbounce\fR(5).
122 /*
123 /* To override the \fBbounce_template_file\fR parameter setting,
124 /* specify a template file name at the end of the "\fBpostconf
125 /* -b\fR" command line. Specify an empty file name to display
126 /* built-in templates (in shell language: "").
127 /*
128 /* This feature is available with Postfix 2.3 and later.
129 /* .IP "\fB-c \fIconfig_dir\fR"
130 /* The \fBmain.cf\fR configuration file is in the named directory
131 /* instead of the default configuration directory.
132 /* .IP "\fB-C \fIclass,...\fR"
133 /* When displaying \fBmain.cf\fR parameters, select only
134 /* parameters from the specified class(es):
135 /* .RS
136 /* .IP \fBbuiltin\fR
137 /* Parameters with built-in names.
138 /* .IP \fBservice\fR
139 /* Parameters with service-defined names (the first field of
140 /* a \fBmaster.cf\fR entry plus a Postfix-defined suffix).
141 /* .IP \fBuser\fR
142 /* Parameters with user-defined names.
143 /* .IP \fBall\fR
144 /* All the above classes.
145 /* .RE
146 /* .IP
147 /* The default is as if "\fB-C all\fR" is
148 /* specified.
149 /*
150 /* This feature is available with Postfix 2.9 and later.
151 /* .IP \fB-d\fR
152 /* Print \fBmain.cf\fR default parameter settings instead of
153 /* actual settings.
154 /* Specify \fB-df\fR to fold long lines for human readability
155 /* (Postfix 2.9 and later).
156 /* .IP \fB-e\fR
157 /* Edit the \fBmain.cf\fR configuration file, and update
158 /* parameter settings with the "\fIname=value\fR" pairs on the
159 /* \fBpostconf\fR(1) command line.
160 /*
161 /* With \fB-M\fR, edit the \fBmaster.cf\fR configuration file,
162 /* and replace one or more service entries with new values as
163 /* specified with "\fIservice/type=value\fR" on the \fBpostconf\fR(1)
164 /* command line.
165 /*
166 /* With \fB-F\fR, edit the \fBmaster.cf\fR configuration file,
167 /* and replace one or more service fields with new values as
168 /* specified with "\fIservice/type/field=value\fR" on the
169 /* \fBpostconf\fR(1) command line. Currently, the "command"
170 /* field contains the command name and command arguments. This
171 /* may change in the near future, so that the "command" field
172 /* contains only the command name, and a new "arguments"
173 /* pseudofield contains the command arguments.
174 /*
175 /* With \fB-P\fR, edit the \fBmaster.cf\fR configuration file,
176 /* and add or update one or more service parameter settings
177 /* (-o parameter=value settings) with new values as specified
178 /* with "\fIservice/type/parameter=value\fR" on the \fBpostconf\fR(1)
179 /* command line.
180 /*
181 /* In all cases the file is copied to a temporary file then
182 /* renamed into place. Specify quotes to protect special
183 /* characters and whitespace on the \fBpostconf\fR(1) command
184 /* line.
185 /*
186 /* The \fB-e\fR option is no longer needed with Postfix version
187 /* 2.8 and later, as it is assumed whenever a value is specified
188 /* (empty or non-empty).
189 /* .IP \fB-f\fR
190 /* Fold long lines when printing \fBmain.cf\fR or \fBmaster.cf\fR
191 /* configuration file entries, for human readability.
192 /*
193 /* This feature is available with Postfix 2.9 and later.
194 /* .IP \fB-F\fR
195 /* Show \fBmaster.cf\fR per-entry field settings (by default
196 /* all services and all fields), formatted as
197 /* "\fIservice/type/field=value\fR", one per line. Specify
198 /* \fB-Ff\fR to fold long lines.
199 /*
200 /* Specify one or more "\fIservice/type/field\fR" instances
201 /* on the \fBpostconf\fR(1) command line to limit the output
202 /* to fields of interest. Trailing parameter name or service
203 /* type fields that are omitted will be handled as "*" wildcard
204 /* fields.
205 /*
206 /* This feature is available with Postfix 2.11 and later.
207 /* .IP \fB-h\fR
208 /* Show parameter or attribute values without the "\fIname\fR = "
209 /* label that normally precedes the value.
210 /* .IP \fB-H\fR
211 /* Show parameter or attribute names without the " = \fIvalue\fR"
212 /* that normally follows the name.
213 /*
214 /* This feature is available with Postfix 3.1 and later.
215 /* .IP \fB-l\fR
216 /* List the names of all supported mailbox locking methods.
217 /* Postfix supports the following methods:
218 /* .RS
219 /* .IP \fBflock\fR
220 /* A kernel-based advisory locking method for local files only.
221 /* This locking method is available on systems with a BSD
222 /* compatible library.
223 /* .IP \fBfcntl\fR
224 /* A kernel-based advisory locking method for local and remote
225 /* files.
226 /* .IP \fBdotlock\fR
227 /* An application-level locking method. An application locks
228 /* a file named \fIfilename\fR by creating a file named
229 /* \fIfilename\fB.lock\fR. The application is expected to
230 /* remove its own lock file, as well as stale lock files that
231 /* were left behind after abnormal program termination.
232 /* .RE
233 /* .IP \fB-m\fR
234 /* List the names of all supported lookup table types. In
235 /* Postfix configuration files, lookup tables are specified
236 /* as \fItype\fB:\fIname\fR, where \fItype\fR is one of the
237 /* types listed below. The table \fIname\fR syntax depends on
238 /* the lookup table type as described in the DATABASE_README
239 /* document.
240 /* .RS
241 /* .IP \fBbtree\fR
242 /* A sorted, balanced tree structure. Available on systems
243 /* with support for Berkeley DB databases.
244 /* .IP \fBcdb\fR
245 /* A read-optimized structure with no support for incremental
246 /* updates. Available on systems with support for CDB databases.
247 /*
248 /* This feature is available with Postfix 2.2 and later.
249 /* .IP \fBcidr\fR
250 /* A table that associates values with Classless Inter-Domain
251 /* Routing (CIDR) patterns. This is described in \fBcidr_table\fR(5).
252 /*
253 /* This feature is available with Postfix 2.2 and later.
254 /* .IP \fBdbm\fR
255 /* An indexed file type based on hashing. Available on systems
256 /* with support for DBM databases.
257 /* .IP \fBenviron\fR
258 /* The UNIX process environment array. The lookup key is the
259 /* environment variable name; the table name is ignored. Originally
260 /* implemented for testing, someone may find this useful someday.
261 /* .IP \fBfail\fR
262 /* A table that reliably fails all requests. The lookup table
263 /* name is used for logging. This table exists to simplify
264 /* Postfix error tests.
265 /*
266 /* This feature is available with Postfix 2.9 and later.
267 /* .IP \fBhash\fR
268 /* An indexed file type based on hashing. Available on systems
269 /* with support for Berkeley DB databases.
270 /* .IP "\fBinline\fR (read-only)"
271 /* A non-shared, in-memory lookup table. Example: "\fBinline:{
272 /* \fIkey\fB=\fIvalue\fB, { \fIkey\fB = \fItext with whitespace
273 /* or comma\fB }}\fR". Key-value pairs are separated by
274 /* whitespace or comma; with a key-value pair inside "\fB{}\fR",
275 /* whitespace is ignored after the opening "\fB{\fR", around
276 /* the "\fB=\fR" between key and value, and before the closing
277 /* "\fB}\fR". Inline tables eliminate the need to create a
278 /* database file for just a few fixed elements. See also the
279 /* \fIstatic:\fR map type.
280 /*
281 /* This feature is available with Postfix 3.0 and later.
282 /* .IP \fBinternal\fR
283 /* A non-shared, in-memory hash table. Its content are lost
284 /* when a process terminates.
285 /* .IP "\fBlmdb\fR"
286 /* OpenLDAP LMDB database (a memory-mapped, persistent file).
287 /* Available on systems with support for LMDB databases. This
288 /* is described in \fBlmdb_table\fR(5).
289 /*
290 /* This feature is available with Postfix 2.11 and later.
291 /* .IP "\fBldap\fR (read-only)"
292 /* LDAP database client. This is described in \fBldap_table\fR(5).
293 /* .IP "\fBmemcache\fR"
294 /* Memcache database client. This is described in
295 /* \fBmemcache_table\fR(5).
296 /*
297 /* This feature is available with Postfix 2.9 and later.
298 /* .IP "\fBmysql\fR (read-only)"
299 /* MySQL database client. Available on systems with support
300 /* for MySQL databases. This is described in \fBmysql_table\fR(5).
301 /* .IP "\fBpcre\fR (read-only)"
302 /* A lookup table based on Perl Compatible Regular Expressions.
303 /* The file format is described in \fBpcre_table\fR(5).
304 /* .IP "\fBpgsql\fR (read-only)"
305 /* PostgreSQL database client. This is described in
306 /* \fBpgsql_table\fR(5).
307 /*
308 /* This feature is available with Postfix 2.1 and later.
309 /* .IP "\fBpipemap\fR (read-only)"
310 /* A lookup table that constructs a pipeline of tables. Example:
311 /* "\fBpipemap:{\fItype_1:name_1, ..., type_n:name_n\fB}\fR".
312 /* Each "pipemap:" query is given to the first table. Each
313 /* lookup result becomes the query for the next table in the
314 /* pipeline, and the last table produces the final result.
315 /* When any table lookup produces no result, the pipeline
316 /* produces no result. The first and last characters of the
317 /* "pipemap:" table name must be "\fB{\fR" and "\fB}\fR".
318 /* Within these, individual maps are separated with comma or
319 /* whitespace.
320 /*
321 /* This feature is available with Postfix 3.0 and later.
322 /* .IP "\fBproxy\fR"
323 /* Postfix \fBproxymap\fR(8) client for shared access to Postfix
324 /* databases. The table name syntax is \fItype\fB:\fIname\fR.
325 /*
326 /* This feature is available with Postfix 2.0 and later.
327 /* .IP "\fBrandmap\fR (read-only)"
328 /* An in-memory table that performs random selection. Example:
329 /* "\fBrandmap:{\fIresult_1, ..., result_n\fB}\fR". Each table query
330 /* returns a random choice from the specified results. The first
331 /* and last characters of the "randmap:" table name must be
332 /* "\fB{\fR" and "\fB}\fR". Within these, individual results
333 /* are separated with comma or whitespace. To give a specific
334 /* result more weight, specify it multiple times.
335 /*
336 /* This feature is available with Postfix 3.0 and later.
337 /* .IP "\fBregexp\fR (read-only)"
338 /* A lookup table based on regular expressions. The file format
339 /* is described in \fBregexp_table\fR(5).
340 /* .IP \fBsdbm\fR
341 /* An indexed file type based on hashing. Available on systems
342 /* with support for SDBM databases.
343 /*
344 /* This feature is available with Postfix 2.2 and later.
345 /* .IP "\fBsocketmap\fR (read-only)"
346 /* Sendmail-style socketmap client. The table name is
347 /* \fBinet\fR:\fIhost\fR:\fIport\fR:\fIname\fR for a TCP/IP
348 /* server, or \fBunix\fR:\fIpathname\fR:\fIname\fR for a
349 /* UNIX-domain server. This is described in \fBsocketmap_table\fR(5).
350 /*
351 /* This feature is available with Postfix 2.10 and later.
352 /* .IP "\fBsqlite\fR (read-only)"
353 /* SQLite database. This is described in \fBsqlite_table\fR(5).
354 /*
355 /* This feature is available with Postfix 2.8 and later.
356 /* .IP "\fBstatic\fR (read-only)"
357 /* A table that always returns its name as lookup result. For
358 /* example, \fBstatic:foobar\fR always returns the string
359 /* \fBfoobar\fR as lookup result. Specify "\fBstatic:{ \fItext
360 /* with whitespace\fB }\fR" when the result contains whitespace;
361 /* this form ignores whitespace after the opening "\fB{\fR"
362 /* and before the closing
363 /* "\fB}\fR". See also the \fIinline:\fR map.
364 /*
365 /* The form "\fBstatic:{\fItext\fB}\fR is available with Postfix
366 /* 3.0 and later.
367 /* .IP "\fBtcp\fR (read-only)"
368 /* TCP/IP client. The protocol is described in \fBtcp_table\fR(5).
369 /* .IP "\fBtexthash\fR (read-only)"
370 /* Produces similar results as hash: files, except that you
371 /* don't need to run the \fBpostmap\fR(1) command before you
372 /* can use the file, and that it does not detect changes after
373 /* the file is read.
374 /*
375 /* This feature is available with Postfix 2.8 and later.
376 /* .IP "\fBunionmap\fR (read-only)"
377 /* A table that sends each query to multiple lookup tables and
378 /* that concatenates all found results, separated by comma.
379 /* The table name syntax is the same as for \fBpipemap\fR.
380 /*
381 /* This feature is available with Postfix 3.0 and later.
382 /* .IP "\fBunix\fR (read-only)"
383 /* A limited view of the UNIX authentication database. The
384 /* following tables are implemented:
385 /* .RS
386 /*. IP \fBunix:passwd.byname\fR
387 /* The table is the UNIX password database. The key is a login
388 /* name. The result is a password file entry in \fBpasswd\fR(5)
389 /* format.
390 /* .IP \fBunix:group.byname\fR
391 /* The table is the UNIX group database. The key is a group
392 /* name. The result is a group file entry in \fBgroup\fR(5)
393 /* format.
394 /* .RE
395 /* .RE
396 /* .IP
397 /* Other table types may exist depending on how Postfix was
398 /* built.
399 /* .IP \fB-M\fR
400 /* Show \fBmaster.cf\fR file contents instead of \fBmain.cf\fR
401 /* file contents. Specify \fB-Mf\fR to fold long lines for
402 /* human readability.
403 /*
404 /* Specify zero or more arguments, each with a \fIservice-name\fR
405 /* or \fIservice-name/service-type\fR pair, where \fIservice-name\fR
406 /* is the first field of a master.cf entry and \fIservice-type\fR
407 /* is one of (\fBinet\fR, \fBunix\fR, \fBfifo\fR, or \fBpass\fR).
408 /*
409 /* If \fIservice-name\fR or \fIservice-name/service-type\fR
410 /* is specified, only the matching master.cf entries will be
411 /* output. For example, "\fBpostconf -Mf smtp\fR" will output
412 /* all services named "smtp", and "\fBpostconf -Mf smtp/inet\fR"
413 /* will output only the smtp service that listens on the
414 /* network. Trailing service type fields that are omitted
415 /* will be handled as "*" wildcard fields.
416 /*
417 /* This feature is available with Postfix 2.9 and later. The
418 /* syntax was changed from "\fIname.type\fR" to "\fIname/type\fR",
419 /* and "*" wildcard support was added with Postfix 2.11.
420 /* .IP \fB-n\fR
421 /* Show only configuration parameters that have explicit
422 /* \fIname=value\fR settings in \fBmain.cf\fR. Specify \fB-nf\fR
423 /* to fold long lines for human readability (Postfix 2.9 and
424 /* later). To show settings that differ from built-in defaults
425 /* only, use the following bash syntax:
426 /* .nf
427 /* LANG=C comm -23 <(postconf -n) <(postconf -d)
428 /* .fi
429 /* Replace "-23" with "-12" to show settings that duplicate
430 /* built-in defaults.
431 /* .IP "\fB-o \fIname=value\fR"
432 /* Override \fBmain.cf\fR parameter settings. This lets you see
433 /* the effect changing a parameter would have when it is used in
434 /* other configuration parameters, e.g.:
435 /* .nf
436 /* postconf -x -o stress=yes
437 /* .fi
438 /*
439 /* This feature is available with Postfix 2.10 and later.
440 /* .IP \fB-p\fR
441 /* Show \fBmain.cf\fR parameter settings. This is the default.
442 /*
443 /* This feature is available with Postfix 2.11 and later.
444 /* .IP \fB-P\fR
445 /* Show \fBmaster.cf\fR service parameter settings (by default
446 /* all services and all parameters), formatted as
447 /* "\fIservice/type/parameter=value\fR", one per line. Specify
448 /* \fB-Pf\fR to fold long lines.
449 /*
450 /* Specify one or more "\fIservice/type/parameter\fR" instances
451 /* on the \fBpostconf\fR(1) command line to limit the output
452 /* to parameters of interest. Trailing parameter name or
453 /* service type fields that are omitted will be handled as "*"
454 /* wildcard fields.
455 /*
456 /* This feature is available with Postfix 2.11 and later.
457 /* .IP "\fB-t\fR [\fItemplate_file\fR]"
458 /* Display the templates for text that appears at the beginning
459 /* of delivery status notification (DSN) messages, without
460 /* expanding $\fBname\fR expressions.
461 /*
462 /* To override the \fBbounce_template_file\fR parameter setting,
463 /* specify a template file name at the end of the "\fBpostconf
464 /* -t\fR" command line. Specify an empty file name to display
465 /* built-in templates (in shell language: "").
466 /*
467 /* This feature is available with Postfix 2.3 and later.
468 /* .IP "\fB-T \fImode\fR"
469 /* If Postfix is compiled without TLS support, the \fB-T\fR option
470 /* produces no output. Otherwise, if an invalid \fImode\fR is specified,
471 /* the \fB-T\fR option reports an error and exits with a non-zero status
472 /* code. The valid modes are:
473 /* .RS
474 /* .IP \fBcompile-version\fR
475 /* Output the OpenSSL version that Postfix was compiled with
476 /* (i.e. the OpenSSL version in a header file). The output
477 /* format is the same as with the command "\fBopenssl version\fR".
478 /* .IP \fBrun-version\fR
479 /* Output the OpenSSL version that Postfix is linked with at
480 /* runtime (i.e. the OpenSSL version in a shared library).
481 /* .IP \fBpublic-key-algorithms\fR
482 /* Output the lower-case names of the supported public-key
483 /* algorithms, one per-line.
484 /* .RE
485 /* .IP
486 /* This feature is available with Postfix 3.1 and later.
487 /* .IP \fB-v\fR
488 /* Enable verbose logging for debugging purposes. Multiple
489 /* \fB-v\fR options make the software increasingly verbose.
490 /* .IP \fB-x\fR
491 /* Expand \fI$name\fR in \fBmain.cf\fR or \fBmaster.cf\fR
492 /* parameter values. The expansion is recursive.
493 /*
494 /* This feature is available with Postfix 2.10 and later.
495 /* .IP \fB-X\fR
496 /* Edit the \fBmain.cf\fR configuration file, and remove the
497 /* parameters named on the \fBpostconf\fR(1) command line.
498 /* Specify a list of parameter names, not "\fIname=value\fR"
499 /* pairs.
500 /*
501 /* With \fB-M\fR, edit the \fBmaster.cf\fR configuration file,
502 /* and remove one or more service entries as specified with
503 /* "\fIservice/type\fR" on the \fBpostconf\fR(1) command line.
504 /*
505 /* With \fB-P\fR, edit the \fBmaster.cf\fR configuration file,
506 /* and remove one or more service parameter settings (-o
507 /* parameter=value settings) as specified with
508 /* "\fIservice/type/parameter\fR" on the \fBpostconf\fR(1)
509 /* command line.
510 /*
511 /* In all cases the file is copied to a temporary file then
512 /* renamed into place. Specify quotes to protect special
513 /* characters on the \fBpostconf\fR(1) command line.
514 /*
515 /* There is no \fBpostconf\fR(1) command to perform the reverse
516 /* operation.
517 /*
518 /* This feature is available with Postfix 2.10 and later.
519 /* Support for -M and -P was added with Postfix 2.11.
520 /* .IP \fB-#\fR
521 /* Edit the \fBmain.cf\fR configuration file, and comment out
522 /* the parameters named on the \fBpostconf\fR(1) command line,
523 /* so that those parameters revert to their default values.
524 /* Specify a list of parameter names, not "\fIname=value\fR"
525 /* pairs.
526 /*
527 /* With \fB-M\fR, edit the \fBmaster.cf\fR configuration file,
528 /* and comment out one or more service entries as specified
529 /* with "\fIservice/type\fR" on the \fBpostconf\fR(1) command
530 /* line.
531 /*
532 /* In all cases the file is copied to a temporary file then
533 /* renamed into place. Specify quotes to protect special
534 /* characters on the \fBpostconf\fR(1) command line.
535 /*
536 /* There is no \fBpostconf\fR(1) command to perform the reverse
537 /* operation.
538 /*
539 /* This feature is available with Postfix 2.6 and later. Support
540 /* for -M was added with Postfix 2.11.
541 /* DIAGNOSTICS
542 /* Problems are reported to the standard error stream.
543 /* ENVIRONMENT
544 /* .ad
545 /* .fi
546 /* .IP \fBMAIL_CONFIG\fR
547 /* Directory with Postfix configuration files.
548 /* CONFIGURATION PARAMETERS
549 /* .ad
550 /* .fi
551 /* The following \fBmain.cf\fR parameters are especially
552 /* relevant to this program.
553 /*
554 /* The text below provides only a parameter summary. See
555 /* \fBpostconf\fR(5) for more details including examples.
556 /* .IP "\fBconfig_directory (see 'postconf -d' output)\fR"
557 /* The default location of the Postfix main.cf and master.cf
558 /* configuration files.
559 /* .IP "\fBbounce_template_file (empty)\fR"
560 /* Pathname of a configuration file with bounce message templates.
561 /* FILES
562 /* /etc/postfix/main.cf, Postfix configuration parameters
563 /* /etc/postfix/master.cf, Postfix master daemon configuration
564 /* SEE ALSO
565 /* bounce(5), bounce template file format
566 /* master(5), master.cf configuration file syntax
567 /* postconf(5), main.cf configuration file syntax
568 /* README FILES
569 /* .ad
570 /* .fi
571 /* Use "\fBpostconf readme_directory\fR" or "\fBpostconf
572 /* html_directory\fR" to locate this information.
573 /* .na
574 /* .nf
575 /* DATABASE_README, Postfix lookup table overview
576 /* LICENSE
577 /* .ad
578 /* .fi
579 /* The Secure Mailer license must be distributed with this
580 /* software.
581 /* AUTHOR(S)
582 /* Wietse Venema
583 /* IBM T.J. Watson Research
584 /* P.O. Box 704
585 /* Yorktown Heights, NY 10598, USA
586 /*
587 /* Wietse Venema
588 /* Google, Inc.
589 /* 111 8th Avenue
590 /* New York, NY 10011, USA
591 /*--*/
592
593 /* System library. */
594
595 #include <sys_defs.h>
596 #include <sys/stat.h>
597 #include <stdlib.h>
598
599 /* Utility library. */
600
601 #include <msg.h>
602 #include <msg_vstream.h>
603 #include <dict.h>
604 #include <htable.h>
605 #include <vstring.h>
606 #include <vstream.h>
607 #include <stringops.h>
608 #include <name_mask.h>
609 #include <warn_stat.h>
610 #include <mymalloc.h>
611
612 /* Global library. */
613
614 #include <mail_params.h>
615 #include <mail_conf.h>
616 #include <mail_version.h>
617 #include <mail_run.h>
618 #include <mail_dict.h>
619 #include <compat_level.h>
620
621 /* Application-specific. */
622
623 #include <postconf.h>
624
625 /*
626 * Global storage. See postconf.h for description.
627 */
628 PCF_PARAM_TABLE *pcf_param_table;
629 PCF_MASTER_ENT *pcf_master_table;
630 int pcf_cmd_mode = PCF_DEF_MODE;
631
632 /*
633 * Application fingerprinting.
634 */
635 MAIL_VERSION_STAMP_DECLARE;
636
637 /*
638 * This program has so many command-line options that we have to implement a
639 * compatibility matrix to weed out the conflicting option combinations, and
640 * to alert the user about option combinations that have no effect.
641 */
642
643 /*
644 * Options that are mutually-exclusive. First entry must specify the major
645 * modes. Other entries specify conflicts between option modifiers.
646 */
647 static const int pcf_incompat_options[] = {
648 /* Major modes. */
649 PCF_SHOW_SASL_SERV | PCF_SHOW_SASL_CLNT | PCF_EXP_DSN_TEMPL \
650 |PCF_SHOW_LOCKS | PCF_SHOW_MAPS | PCF_DUMP_DSN_TEMPL | PCF_MAIN_PARAM \
651 |PCF_MASTER_ENTRY | PCF_MASTER_FLD | PCF_MASTER_PARAM | PCF_SHOW_TLS,
652 /* Modifiers. */
653 PCF_SHOW_DEFS | PCF_EDIT_CONF | PCF_SHOW_NONDEF | PCF_COMMENT_OUT \
654 |PCF_EDIT_EXCL,
655 PCF_FOLD_LINE | PCF_EDIT_CONF | PCF_COMMENT_OUT | PCF_EDIT_EXCL,
656 PCF_SHOW_EVAL | PCF_EDIT_CONF | PCF_COMMENT_OUT | PCF_EDIT_EXCL,
657 PCF_MAIN_OVER | PCF_SHOW_DEFS | PCF_EDIT_CONF | PCF_COMMENT_OUT \
658 |PCF_EDIT_EXCL,
659 PCF_HIDE_NAME | PCF_EDIT_CONF | PCF_COMMENT_OUT | PCF_EDIT_EXCL \
660 |PCF_HIDE_VALUE,
661 0,
662 };
663
664 /*
665 * Options, and the only options that they are compatible with. There must
666 * be one entry for each major mode. Other entries specify compatibility
667 * between option modifiers.
668 */
669 static const int pcf_compat_options[][2] = {
670 /* Major modes. */
671 {PCF_SHOW_SASL_SERV, 0},
672 {PCF_SHOW_SASL_CLNT, 0},
673 {PCF_EXP_DSN_TEMPL, 0},
674 {PCF_SHOW_LOCKS, 0},
675 {PCF_SHOW_MAPS, 0,},
676 {PCF_SHOW_TLS, 0,},
677 {PCF_DUMP_DSN_TEMPL, 0},
678 {PCF_MAIN_PARAM, (PCF_EDIT_CONF | PCF_EDIT_EXCL | PCF_COMMENT_OUT \
679 |PCF_FOLD_LINE | PCF_HIDE_NAME | PCF_PARAM_CLASS \
680 |PCF_SHOW_EVAL | PCF_SHOW_DEFS | PCF_SHOW_NONDEF \
681 |PCF_MAIN_OVER | PCF_HIDE_VALUE)},
682 {PCF_MASTER_ENTRY, (PCF_EDIT_CONF | PCF_EDIT_EXCL | PCF_COMMENT_OUT \
683 |PCF_FOLD_LINE | PCF_MAIN_OVER | PCF_SHOW_EVAL)},
684 {PCF_MASTER_FLD, (PCF_EDIT_CONF | PCF_FOLD_LINE | PCF_HIDE_NAME \
685 |PCF_MAIN_OVER | PCF_SHOW_EVAL | PCF_HIDE_VALUE)},
686 {PCF_MASTER_PARAM, (PCF_EDIT_CONF | PCF_EDIT_EXCL | PCF_FOLD_LINE \
687 |PCF_HIDE_NAME | PCF_MAIN_OVER | PCF_SHOW_EVAL \
688 |PCF_HIDE_VALUE)},
689 /* Modifiers. */
690 {PCF_PARAM_CLASS, (PCF_MAIN_PARAM | PCF_SHOW_DEFS | PCF_SHOW_NONDEF)},
691 0,
692 };
693
694 /*
695 * Compatibility to string conversion support.
696 */
697 static const NAME_MASK pcf_compat_names[] = {
698 "-a", PCF_SHOW_SASL_SERV,
699 "-A", PCF_SHOW_SASL_CLNT,
700 "-b", PCF_EXP_DSN_TEMPL,
701 "-C", PCF_PARAM_CLASS,
702 "-d", PCF_SHOW_DEFS,
703 "-e", PCF_EDIT_CONF,
704 "-f", PCF_FOLD_LINE,
705 "-F", PCF_MASTER_FLD,
706 "-h", PCF_HIDE_NAME,
707 "-H", PCF_HIDE_VALUE,
708 "-l", PCF_SHOW_LOCKS,
709 "-m", PCF_SHOW_MAPS,
710 "-M", PCF_MASTER_ENTRY,
711 "-n", PCF_SHOW_NONDEF,
712 "-o", PCF_MAIN_OVER,
713 "-p", PCF_MAIN_PARAM,
714 "-P", PCF_MASTER_PARAM,
715 "-t", PCF_DUMP_DSN_TEMPL,
716 "-T", PCF_SHOW_TLS,
717 "-x", PCF_SHOW_EVAL,
718 "-X", PCF_EDIT_EXCL,
719 "-#", PCF_COMMENT_OUT,
720 0,
721 };
722
723 /* usage - enumerate parameters without compatibility info */
724
usage(const char * progname)725 static void usage(const char *progname)
726 {
727 msg_fatal("usage: %s"
728 " [-a (server SASL types)]"
729 " [-A (client SASL types)]"
730 " [-b (bounce templates)]"
731 " [-c config_dir]"
732 " [-c param_class]"
733 " [-d (parameter defaults)]"
734 " [-e (edit configuration)]"
735 " [-f (fold lines)]"
736 " [-F (master.cf fields)]"
737 " [-h (no names)]"
738 " [-H (no values)]"
739 " [-l (lock types)]"
740 " [-m (map types)]"
741 " [-M (master.cf)]"
742 " [-n (non-default parameters)]"
743 " [-o name=value (override parameter value)]"
744 " [-p (main.cf, default)]"
745 " [-P (master.cf parameters)]"
746 " [-t (bounce templates)]"
747 " [-T compile-version|run-version|public-key-algorithms]"
748 " [-v (verbose)]"
749 " [-x (expand parameter values)]"
750 " [-X (exclude)]"
751 " [-# (comment-out)]"
752 " [name...]", progname);
753 }
754
755 /* pcf_check_exclusive_options - complain about mutually-exclusive options */
756
pcf_check_exclusive_options(int optval)757 static void pcf_check_exclusive_options(int optval)
758 {
759 const char *myname = "pcf_check_exclusive_options";
760 const int *op;
761 int oval;
762 unsigned mask;
763
764 for (op = pcf_incompat_options; (oval = *op) != 0; op++) {
765 oval &= optval;
766 for (mask = ~0U; (mask & oval) != 0; mask >>= 1) {
767 if ((mask & oval) != oval)
768 msg_fatal("specify one of %s",
769 str_name_mask(myname, pcf_compat_names, oval));
770 }
771 }
772 }
773
774 /* pcf_check_compat_options - complain about incompatible options */
775
pcf_check_compat_options(int optval)776 static void pcf_check_compat_options(int optval)
777 {
778 const char *myname = "pcf_check_compat_options";
779 VSTRING *buf1 = vstring_alloc(10);
780 VSTRING *buf2 = vstring_alloc(10);
781 const int (*op)[2];
782 int excess;
783
784 for (op = pcf_compat_options; op[0][0] != 0; op++) {
785 if ((optval & *op[0]) != 0
786 && (excess = (optval & ~((*op)[0] | (*op)[1]))) != 0)
787 msg_fatal("with option %s, do not specify %s",
788 str_name_mask_opt(buf1, myname, pcf_compat_names,
789 (*op)[0], NAME_MASK_NUMBER),
790 str_name_mask_opt(buf2, myname, pcf_compat_names,
791 excess, NAME_MASK_NUMBER));
792 }
793 vstring_free(buf1);
794 vstring_free(buf2);
795 }
796
797 /* main */
798
main(int argc,char ** argv)799 int main(int argc, char **argv)
800 {
801 int ch;
802 int fd;
803 struct stat st;
804 ARGV *ext_argv = 0;
805 int param_class = PCF_PARAM_MASK_CLASS;
806 static const NAME_MASK param_class_table[] = {
807 "builtin", PCF_PARAM_FLAG_BUILTIN,
808 "service", PCF_PARAM_FLAG_SERVICE,
809 "user", PCF_PARAM_FLAG_USER,
810 "all", PCF_PARAM_MASK_CLASS,
811 0,
812 };
813 ARGV *override_params = 0;
814 const char *pcf_tls_arg = 0;
815
816 /*
817 * Fingerprint executables and core dumps.
818 */
819 MAIL_VERSION_STAMP_ALLOCATE;
820
821 /*
822 * Be consistent with file permissions.
823 */
824 umask(022);
825
826 /*
827 * To minimize confusion, make sure that the standard file descriptors
828 * are open before opening anything else. XXX Work around for 44BSD where
829 * fstat can return EBADF on an open file descriptor.
830 */
831 for (fd = 0; fd < 3; fd++)
832 if (fstat(fd, &st) == -1
833 && (close(fd), open("/dev/null", O_RDWR, 0)) != fd)
834 msg_fatal("open /dev/null: %m");
835
836 /*
837 * Set up logging.
838 */
839 msg_vstream_init(argv[0], VSTREAM_ERR);
840
841 /*
842 * Check the Postfix library version as soon as we enable logging.
843 */
844 MAIL_VERSION_CHECK;
845
846 /*
847 * Parse JCL.
848 */
849 while ((ch = GETOPT(argc, argv, "aAbc:C:deEfFhHlmMno:pPtT:vxX#")) > 0) {
850 switch (ch) {
851 case 'a':
852 pcf_cmd_mode |= PCF_SHOW_SASL_SERV;
853 break;
854 case 'A':
855 pcf_cmd_mode |= PCF_SHOW_SASL_CLNT;
856 break;
857 case 'b':
858 pcf_cmd_mode |= PCF_EXP_DSN_TEMPL;
859 if (ext_argv)
860 msg_fatal("specify one of -b and -t");
861 ext_argv = argv_alloc(2);
862 argv_add(ext_argv, "bounce", "-SVnexpand_templates", (char *) 0);
863 break;
864 case 'c':
865 if (setenv(CONF_ENV_PATH, optarg, 1) < 0)
866 msg_fatal("out of memory");
867 break;
868 case 'C':
869 param_class = name_mask_opt("-C option", param_class_table,
870 optarg, NAME_MASK_ANY_CASE | NAME_MASK_FATAL);
871 break;
872 case 'd':
873 pcf_cmd_mode |= PCF_SHOW_DEFS;
874 break;
875 case 'e':
876 pcf_cmd_mode |= PCF_EDIT_CONF;
877 break;
878 case 'f':
879 pcf_cmd_mode |= PCF_FOLD_LINE;
880 break;
881 case 'F':
882 pcf_cmd_mode |= PCF_MASTER_FLD;
883 break;
884 case '#':
885 pcf_cmd_mode |= PCF_COMMENT_OUT;
886 break;
887 case 'h':
888 pcf_cmd_mode |= PCF_HIDE_NAME;
889 break;
890 case 'H':
891 pcf_cmd_mode |= PCF_HIDE_VALUE;
892 break;
893 case 'l':
894 pcf_cmd_mode |= PCF_SHOW_LOCKS;
895 break;
896 case 'm':
897 pcf_cmd_mode |= PCF_SHOW_MAPS;
898 break;
899 case 'M':
900 pcf_cmd_mode |= PCF_MASTER_ENTRY;
901 break;
902 case 'n':
903 pcf_cmd_mode |= PCF_SHOW_NONDEF;
904 break;
905 case 'o':
906 pcf_cmd_mode |= PCF_MAIN_OVER;
907 if (override_params == 0)
908 override_params = argv_alloc(2);
909 argv_add(override_params, optarg, (char *) 0);
910 break;
911 case 'p':
912 pcf_cmd_mode |= PCF_MAIN_PARAM;
913 break;
914 case 'P':
915 pcf_cmd_mode |= PCF_MASTER_PARAM;
916 break;
917 case 't':
918 pcf_cmd_mode |= PCF_DUMP_DSN_TEMPL;
919 if (ext_argv)
920 msg_fatal("specify one of -b and -t");
921 ext_argv = argv_alloc(2);
922 argv_add(ext_argv, "bounce", "-SVndump_templates", (char *) 0);
923 break;
924 case 'T':
925 if (pcf_cmd_mode & PCF_SHOW_TLS)
926 msg_fatal("At most one -T <mode> option may be specified");
927 pcf_cmd_mode |= PCF_SHOW_TLS;
928 pcf_tls_arg = optarg;
929 break;
930 case 'x':
931 pcf_cmd_mode |= PCF_SHOW_EVAL;
932 break;
933 case 'X':
934 /* This is irreversible, therefore require two-finger action. */
935 pcf_cmd_mode |= PCF_EDIT_EXCL;
936 break;
937 case 'v':
938 msg_verbose++;
939 break;
940 default:
941 usage(argv[0]);
942 }
943 }
944
945 /*
946 * For consistency with mail_params_init().
947 */
948 compat_level_relop_register();
949
950 /*
951 * We don't enforce import_environment consistency in this program.
952 *
953 * We don't extract import_environment from main.cf, because the postconf
954 * command must be able to extract parameter settings from main.cf before
955 * all installation parameters such as mail_owner or setgid_group have a
956 * legitimate value.
957 *
958 * We would need the functionality of mail_params_init() including all the
959 * side effects of populating the CONFIG_DICT with default values so that
960 * $name expansion works correctly, but excluding all the parameter value
961 * sanity checks so that it would not abort at installation time.
962 */
963
964 /*
965 * Make all options explicit, before checking their compatibility.
966 */
967 #define PCF_MAIN_OR_MASTER \
968 (PCF_MAIN_PARAM | PCF_MASTER_ENTRY | PCF_MASTER_FLD | PCF_MASTER_PARAM)
969
970 if ((pcf_cmd_mode & pcf_incompat_options[0]) == 0)
971 pcf_cmd_mode |= PCF_MAIN_PARAM;
972 if ((pcf_cmd_mode & PCF_MAIN_OR_MASTER)
973 && argv[optind] && strchr(argv[optind], '='))
974 pcf_cmd_mode |= PCF_EDIT_CONF;
975
976 /*
977 * Sanity check.
978 */
979 pcf_check_exclusive_options(pcf_cmd_mode);
980 pcf_check_compat_options(pcf_cmd_mode);
981
982 if ((pcf_cmd_mode & PCF_EDIT_CONF) && argc == optind)
983 msg_fatal("-e requires name=value argument");
984
985 /*
986 * Display bounce template information and exit.
987 */
988 if (ext_argv) {
989 if (argv[optind]) {
990 if (argv[optind + 1])
991 msg_fatal("options -b and -t require at most one template file");
992 argv_add(ext_argv, "-o",
993 concatenate(VAR_BOUNCE_TMPL, "=",
994 argv[optind], (char *) 0),
995 (char *) 0);
996 }
997 /* Grr... */
998 argv_add(ext_argv, "-o",
999 concatenate(VAR_QUEUE_DIR, "=", ".", (char *) 0),
1000 (char *) 0);
1001 mail_conf_read();
1002 mail_run_replace(var_daemon_dir, ext_argv->argv);
1003 /* NOTREACHED */
1004 }
1005
1006 /*
1007 * If showing map types, show them and exit
1008 */
1009 if (pcf_cmd_mode & PCF_SHOW_MAPS) {
1010 mail_conf_read();
1011 mail_dict_init();
1012 pcf_show_maps();
1013 }
1014
1015 /*
1016 * If showing locking methods, show them and exit
1017 */
1018 else if (pcf_cmd_mode & PCF_SHOW_LOCKS) {
1019 pcf_show_locks();
1020 }
1021
1022 /*
1023 * If showing master.cf entries, show them and exit
1024 */
1025 else if ((pcf_cmd_mode & (PCF_MASTER_ENTRY | PCF_MASTER_FLD | PCF_MASTER_PARAM))
1026 && !(pcf_cmd_mode & (PCF_EDIT_CONF | PCF_EDIT_EXCL | PCF_COMMENT_OUT))) {
1027 pcf_read_master(PCF_FAIL_ON_OPEN_ERROR);
1028 pcf_read_parameters();
1029 if (override_params)
1030 pcf_set_parameters(override_params->argv);
1031 pcf_register_builtin_parameters(basename(argv[0]), getpid());
1032 pcf_register_service_parameters();
1033 pcf_register_user_parameters();
1034 if (pcf_cmd_mode & PCF_MASTER_FLD)
1035 pcf_show_master_fields(VSTREAM_OUT, pcf_cmd_mode, argc - optind,
1036 argv + optind);
1037 else if (pcf_cmd_mode & PCF_MASTER_PARAM)
1038 pcf_show_master_params(VSTREAM_OUT, pcf_cmd_mode, argc - optind,
1039 argv + optind);
1040 else
1041 pcf_show_master_entries(VSTREAM_OUT, pcf_cmd_mode, argc - optind,
1042 argv + optind);
1043 pcf_flag_unused_master_parameters();
1044 }
1045
1046 /*
1047 * If showing SASL plug-in types, show them and exit
1048 */
1049 else if (pcf_cmd_mode & PCF_SHOW_SASL_SERV) {
1050 pcf_show_sasl(PCF_SHOW_SASL_SERV);
1051 } else if (pcf_cmd_mode & PCF_SHOW_SASL_CLNT) {
1052 pcf_show_sasl(PCF_SHOW_SASL_CLNT);
1053 }
1054
1055 /*
1056 * Show TLS info and exit.
1057 */
1058 else if (pcf_cmd_mode & PCF_SHOW_TLS) {
1059 pcf_show_tls(pcf_tls_arg);
1060 }
1061
1062 /*
1063 * Edit main.cf or master.cf.
1064 */
1065 else if (pcf_cmd_mode & (PCF_EDIT_CONF | PCF_COMMENT_OUT | PCF_EDIT_EXCL)) {
1066 if (optind == argc)
1067 msg_fatal("missing service argument");
1068 if (pcf_cmd_mode & (PCF_MASTER_ENTRY | PCF_MASTER_FLD | PCF_MASTER_PARAM)) {
1069 pcf_edit_master(pcf_cmd_mode, argc - optind, argv + optind);
1070 } else {
1071 pcf_edit_main(pcf_cmd_mode, argc - optind, argv + optind);
1072 }
1073 }
1074
1075 /*
1076 * If showing non-default values, read main.cf.
1077 */
1078 else {
1079 if ((pcf_cmd_mode & PCF_SHOW_DEFS) == 0) {
1080 pcf_read_parameters();
1081 if (override_params)
1082 pcf_set_parameters(override_params->argv);
1083 }
1084 pcf_register_builtin_parameters(basename(argv[0]), getpid());
1085
1086 /*
1087 * Add service-dependent parameters (service names from master.cf)
1088 * and user-defined parameters ($name macros in parameter values in
1089 * main.cf and master.cf, but only if those names have a name=value
1090 * in main.cf or master.cf).
1091 */
1092 pcf_read_master(PCF_WARN_ON_OPEN_ERROR);
1093 pcf_register_service_parameters();
1094 if ((pcf_cmd_mode & PCF_SHOW_DEFS) == 0)
1095 pcf_register_user_parameters();
1096
1097 /*
1098 * Show the requested values.
1099 */
1100 pcf_show_parameters(VSTREAM_OUT, pcf_cmd_mode, param_class,
1101 argv + optind);
1102
1103 /*
1104 * Flag unused parameters. This makes no sense with "postconf -d",
1105 * because that ignores all the user-specified parameters and
1106 * user-specified macro expansions in main.cf.
1107 */
1108 if ((pcf_cmd_mode & PCF_SHOW_DEFS) == 0) {
1109 pcf_flag_unused_main_parameters();
1110 pcf_flag_unused_master_parameters();
1111 }
1112 }
1113 vstream_fflush(VSTREAM_OUT);
1114 exit(0);
1115 }
1116