1 /*
2   Copyright 2021 Northern.tech AS
3 
4   This file is part of CFEngine 3 - written and maintained by Northern.tech AS.
5 
6   This program is free software; you can redistribute it and/or modify it
7   under the terms of the GNU General Public License as published by the
8   Free Software Foundation; version 3.
9 
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14 
15   You should have received a copy of the GNU General Public License
16   along with this program; if not, write to the Free Software
17   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
18 
19   To the extent this program is licensed as part of the Enterprise
20   versions of CFEngine, the applicable Commercial Open Source License
21   (COSL) may apply to this file if you as a licensee so wish it. See
22   included file COSL.txt.
23 */
24 
25 #ifndef CFENGINE_CF3_DEFS_H
26 #define CFENGINE_CF3_DEFS_H
27 
28 /* ALWAYS INCLUDE EITHER THIS FILE OR platform.h FIRST */
29 
30 
31 #include <platform.h>
32 
33 #include <compiler.h>
34 #include <hash_method.h>                                      /* HashMethod */
35 #include <sequence.h>
36 #include <logging.h>
37 
38 #include <definitions.h>                 /* CF_MAXVARSIZE, CF_BUFSIZE etc   */
39 #include <cfnet.h>                       /* ProtocolVersion, etc */
40 #include <misc_lib.h>                    /* xsnprintf, ProgrammingError etc */
41 
42 /*******************************************************************/
43 /* Undef platform specific defines that pollute our namespace      */
44 /*******************************************************************/
45 
46 #ifdef interface
47 #undef interface
48 #endif
49 
50 /*******************************************************************/
51 /* Various defines                                                 */
52 /*******************************************************************/
53 
54 #define CF_MAXFRAGMENT 19       /* abbreviate long promise names to 2*MAXFRAGMENT+3 */
55 #define CF_NONCELEN (CF_BUFSIZE/16)
56 #define CF_MAXLINKSIZE 256
57 #define CF_PROCCOLS 16
58 #define CF_MACROALPHABET 61     /* a-z, A-Z plus a bit */
59 #define CF_ALPHABETSIZE 256
60 #define CF_SAMEMODE 7777
61 /* CF_SAME_OWNER/GROUP should be -1; chown(-1) doesn't change ownership. */
62 #define CF_SAME_OWNER ((uid_t)-1)
63 #define CF_UNKNOWN_OWNER ((uid_t)-2)
64 #define CF_SAME_GROUP ((gid_t)-1)
65 #define CF_UNKNOWN_GROUP ((gid_t)-2)
66 #define CF_INFINITY ((int)999999999)
67 #define CF_MONDAY_MORNING 345600
68 
69 #define MINUTES_PER_HOUR 60
70 #define SECONDS_PER_MINUTE 60
71 #define SECONDS_PER_HOUR (60 * SECONDS_PER_MINUTE)
72 #define SECONDS_PER_DAY (24 * SECONDS_PER_HOUR)
73 #define SECONDS_PER_WEEK (7 * SECONDS_PER_DAY)
74 #define SECONDS_PER_YEAR (365 * SECONDS_PER_DAY)
75 
76 /* Long-term monitoring constants */
77 
78 #define HOURS_PER_SHIFT 6
79 #define SECONDS_PER_SHIFT (HOURS_PER_SHIFT * SECONDS_PER_HOUR)
80 #define SHIFTS_PER_DAY 4
81 #define SHIFTS_PER_WEEK (4*7)
82 
83 #define MAX_MONTH_NAME 9
84 
85 #define MAX_DIGEST_BYTES (512 / 8)  /* SHA-512 */
86 #define MAX_DIGEST_HEX (MAX_DIGEST_BYTES * 2)
87 
88 
89 /*******************************************************************/
90 
91 #define CF_FILECHANGE     "file_change.log"
92 #define CF_FILECHANGE_NEW "file_changes.log"
93 #define CF_PROMISE_LOG    "promise_summary.log"
94 
95 #define CF_ENV_FILE      "env_data"
96 
97 #define CF_DB_REPAIR_TRIGGER "db_repair_required"
98 
99 #define CF_SAVED ".cfsaved"
100 #define CF_EDITED ".cfedited"
101 #define CF_NEW ".cfnew"
102 #define CFD_TERMINATOR "---cfXen/gine/cfXen/gine---"
103 #define CFD_TRUE "CFD_TRUE"
104 #define CFD_FALSE "CFD_FALSE"
105 #define CFD_FALSE_SIZE sizeof(CFD_FALSE) // size of CFD_FALSE including terminator
106 #define CF_ANYCLASS "any"
107 #define CF_SMALL_OFFSET 2
108 
109 #define CF_NS ':'   // namespace character separator
110 
111 /* Mangled namespace and scope characters, in order for the iteration engine
112  * to VariablePut() to THIS scope single elements of namespaced iterables
113  * (slists/containers). See expand.c and iteration.c. */
114 #define CF_MANGLED_NS    '*'
115 #define CF_MANGLED_SCOPE '#'
116 
117 /*****************************************************************************/
118 
119 /* Auditing key */
120 
121 typedef enum
122 {                                     // Logging of outcomes in cf-agent.c:
123     PROMISE_RESULT_SKIPPED = 's',     // <Also skipped in logging>
124     PROMISE_RESULT_NOOP = 'n',        // Kept
125     PROMISE_RESULT_CHANGE = 'c',      // Repaired
126     PROMISE_RESULT_WARN = 'w',        // Not kept
127     PROMISE_RESULT_FAIL = 'f',        // Not kept
128     PROMISE_RESULT_DENIED = 'd',      // Not kept
129     PROMISE_RESULT_TIMEOUT = 't',     // Timed out
130     PROMISE_RESULT_INTERRUPTED = 'i'  // Not kept
131 } PromiseResult;
132 
133 /*****************************************************************************/
134 
135 #define CF_FAILEDSTR "BAD: Unspecified server refusal (see verbose server output)"
136 #define CF_CHANGEDSTR1 "BAD: File changed "     /* Split this so it cannot be recognized */
137 #define CF_CHANGEDSTR2 "while copying"
138 
139 #define CF_START_DOMAIN "undefined.domain"
140 
141 #define CF_GRAINS   64
142 #define CF_NETATTR   7          /* icmp udp dns tcpsyn tcpfin tcpack */
143 #define CF_MEASURE_INTERVAL (5.0*60.0)
144 #define CF_SHIFT_INTERVAL (6*3600)
145 
146 #define CF_OBSERVABLES 100
147 
148 /* Special exit codes */
149 #define EC_EVAL_ABORTED 6       /* like SIGABRT, but signal exit codes are 120+SIG */
150 
151 typedef struct
152 {
153     char *name;
154     char *description;
155     char *units;
156     double expected_minimum;
157     double expected_maximum;
158     bool consolidable;
159 } MonitoringSlot;
160 
161 enum observables
162 {
163     ob_users,
164     ob_rootprocs,
165     ob_otherprocs,
166     ob_diskfree,
167     ob_loadavg,
168     ob_netbiosns_in,
169     ob_netbiosns_out,
170     ob_netbiosdgm_in,
171     ob_netbiosdgm_out,
172     ob_netbiosssn_in,
173     ob_netbiosssn_out,
174     ob_imap_in,
175     ob_imap_out,
176     ob_cfengine_in,
177     ob_cfengine_out,
178     ob_nfsd_in,
179     ob_nfsd_out,
180     ob_smtp_in,
181     ob_smtp_out,
182     ob_www_in,
183     ob_www_out,
184     ob_ftp_in,
185     ob_ftp_out,
186     ob_ssh_in,
187     ob_ssh_out,
188     ob_wwws_in,
189     ob_wwws_out,
190     ob_icmp_in,
191     ob_icmp_out,
192     ob_udp_in,
193     ob_udp_out,
194     ob_dns_in,
195     ob_dns_out,
196     ob_tcpsyn_in,
197     ob_tcpsyn_out,
198     ob_tcpack_in,
199     ob_tcpack_out,
200     ob_tcpfin_in,
201     ob_tcpfin_out,
202     ob_tcpmisc_in,
203     ob_tcpmisc_out,
204     ob_webaccess,
205     ob_weberrors,
206     ob_syslog,
207     ob_messages,
208     ob_temp0,
209     ob_temp1,
210     ob_temp2,
211     ob_temp3,
212     ob_cpuall,
213     ob_cpu0,
214     ob_cpu1,
215     ob_cpu2,
216     ob_cpu3,
217     ob_microsoft_ds_in,
218     ob_microsoft_ds_out,
219     ob_www_alt_in,
220     ob_www_alt_out,
221     ob_imaps_in,
222     ob_imaps_out,
223     ob_ldap_in,
224     ob_ldap_out,
225     ob_ldaps_in,
226     ob_ldaps_out,
227     ob_mongo_in,
228     ob_mongo_out,
229     ob_mysql_in,
230     ob_mysql_out,
231     ob_postgresql_in,
232     ob_postgresql_out,
233     ob_ipp_in,
234     ob_ipp_out,
235     ob_spare
236 };
237 
238 #include <statistics.h>                                         /* QPoint */
239 
240 typedef struct
241 {
242     time_t t;
243     QPoint Q;
244 } Event;
245 
246 typedef struct
247 {
248     time_t last_seen;
249     QPoint Q[CF_OBSERVABLES];
250 } Averages;
251 
252 
253 /******************************************************************/
254 
255 /** Data for an individual promise (lock), as it's stored in the lock DB
256  * (/var/cfengine/state/cf_lock.lmdb). This is the value, the key is an MD5
257  * hash of various strings identifying the promise.
258  *
259  * Most C code doesn't use this struct directly, instead AcquireLock() is called
260  * which uses functions in locks.c to read the LockData from LMDB and create a
261  * new CfLock struct.
262  *
263  * Please ensure the padding in this struct is initialized to 0
264  * LockData lock = { 0 }; // Will zero padding as well as members
265  * lock.pid = [...]
266  */
267 typedef struct
268 {
269     pid_t pid;                  // 4 bytes
270                                 // 4 bytes padding
271     time_t time;                // 8 bytes
272     time_t process_start_time;  // 8 bytes
273 } LockData;
274 
275 /*****************************************************************************/
276 
277 #ifdef __MINGW32__
278 # define NULLFILE "nul"
279 # define EXEC_SUFFIX ".exe"
280 #else
281 # define NULLFILE "/dev/null"
282 # define EXEC_SUFFIX ""
283 #endif /* !__MINGW32__ */
284 
285 #define CF_WORDSIZE 8           /* Number of bytes in a word */
286 
287 /*******************************************************************/
288 
289 typedef struct Item_ Item;
290 
291 /*******************************************************************/
292 
293 typedef enum
294 {
295     CF_SIZE_ABS,
296     CF_SIZE_PERCENT
297 } CfSize;
298 
299 /*******************************************************************/
300 
301 typedef enum
302 {
303     CONTEXT_STATE_POLICY_RESET,                    /* Policy when trying to add already defined persistent states */
304     CONTEXT_STATE_POLICY_PRESERVE
305 } PersistentClassPolicy;
306 
307 /*******************************************************************/
308 
309 typedef struct UidList_ UidList;
310 
311 // TODO: why do UIDs have their own list type? Clean up.
312 struct UidList_
313 {
314 #ifdef __MINGW32__  // TODO: remove uid for NT ?
315     char sid[CF_MAXSIDSIZE];    /* Invalid sid indicates unset */
316 #endif /* __MINGW32__ */
317     uid_t uid;
318     char *uidname;              /* when uid is -2 */
319     UidList *next;
320 };
321 
322 /*******************************************************************/
323 
324 typedef struct GidList_ GidList;
325 
326 // TODO: why do UIDs have their own list type? Clean up.
327 struct GidList_
328 {
329     gid_t gid;
330     char *gidname;              /* when gid is -2 */
331     GidList *next;
332 };
333 
334 /*************************************************************************/
335 /* Fundamental (meta) types                                              */
336 /*************************************************************************/
337 
338 #define CF_UNDEFINED -1
339 #define CF_NOINT    -678L
340 #define CF_UNDEFINED_ITEM (void *)0x1234
341 
342 #define DEFAULTMODE ((mode_t)0755)
343 
344 #define CF_DONEPASSES  4
345 
346 #define CFPULSETIME 60
347 
348 /*************************************************************************/
349 /* Parsing and syntax tree structures                                    */
350 /*************************************************************************/
351 
352 extern const int CF3_MODULES;
353 
354 /*************************************************************************/
355 
356 typedef struct Policy_ Policy;
357 typedef struct Bundle_ Bundle;
358 typedef struct Body_ Body;
359 typedef struct Promise_ Promise;
360 typedef struct BundleSection_ BundleSection;
361 typedef struct FnCall_ FnCall;
362 
363 /*************************************************************************/
364 /* Abstract datatypes                                                    */
365 /*************************************************************************/
366 
367 typedef enum
368 {
369     CF_DATA_TYPE_STRING,
370     CF_DATA_TYPE_INT,
371     CF_DATA_TYPE_REAL,
372     CF_DATA_TYPE_STRING_LIST,
373     CF_DATA_TYPE_INT_LIST,
374     CF_DATA_TYPE_REAL_LIST,
375     CF_DATA_TYPE_OPTION,
376     CF_DATA_TYPE_OPTION_LIST,
377     CF_DATA_TYPE_BODY,
378     CF_DATA_TYPE_BUNDLE,
379     CF_DATA_TYPE_CONTEXT,
380     CF_DATA_TYPE_CONTEXT_LIST,
381     CF_DATA_TYPE_INT_RANGE,
382     CF_DATA_TYPE_REAL_RANGE,
383     CF_DATA_TYPE_COUNTER,
384     CF_DATA_TYPE_CONTAINER,
385     CF_DATA_TYPE_NONE
386 } DataType;
387 
388 /*************************************************************************/
389 
390 #define CF_COMMONC  "common"
391 #define CF_AGENTC   "agent"
392 #define CF_SERVERC  "server"
393 #define CF_MONITORC "monitor"
394 #define CF_EXECC    "executor"
395 #define CF_RUNC     "runagent"
396 #define CF_KEYGEN   "keygenerator"
397 #define CF_HUBC     "hub"
398 
399 typedef enum
400 {
401     AGENT_TYPE_COMMON,
402     AGENT_TYPE_AGENT,
403     AGENT_TYPE_SERVER,
404     AGENT_TYPE_MONITOR,
405     AGENT_TYPE_EXECUTOR,
406     AGENT_TYPE_RUNAGENT,
407     AGENT_TYPE_KEYGEN,
408     AGENT_TYPE_HUB,
409     AGENT_TYPE_NOAGENT
410 } AgentType;
411 
412 /*************************************************************************/
413 
414 typedef enum
415 {
416     COMMON_CONTROL_BUNDLESEQUENCE,
417     COMMON_CONTROL_GOALPATTERNS,
418     COMMON_CONTROL_IGNORE_MISSING_BUNDLES,
419     COMMON_CONTROL_IGNORE_MISSING_INPUTS,
420     COMMON_CONTROL_INPUTS,
421     COMMON_CONTROL_VERSION,
422     COMMON_CONTROL_LASTSEEN_EXPIRE_AFTER,
423     COMMON_CONTROL_OUTPUT_PREFIX,
424     COMMON_CONTROL_DOMAIN,
425     COMMON_CONTROL_REQUIRE_COMMENTS,
426     COMMON_CONTROL_LICENSES,
427     COMMON_CONTROL_SITE_CLASSES,
428     COMMON_CONTROL_SYSLOG_HOST,
429     COMMON_CONTROL_SYSLOG_PORT,
430     COMMON_CONTROL_SYSTEM_LOG_LEVEL,
431     COMMON_CONTROL_FIPS_MODE,
432     COMMON_CONTROL_BWLIMIT,
433     COMMON_CONTROL_CACHE_SYSTEM_FUNCTIONS,
434     COMMON_CONTROL_PROTOCOL_VERSION,
435     COMMON_CONTROL_TLS_CIPHERS,
436     COMMON_CONTROL_TLS_MIN_VERSION,
437     COMMON_CONTROL_PACKAGE_INVENTORY,
438     COMMON_CONTROL_PACKAGE_MODULE,
439     COMMON_CONTROL_MAX
440 } CommonControl;
441 
442 /*************************************************************************/
443 
444 typedef enum
445 {
446     AGENT_CONTROL_ABORTCLASSES,
447     AGENT_CONTROL_ABORTBUNDLECLASSES,
448     AGENT_CONTROL_ADDCLASSES,
449     AGENT_CONTROL_AGENTACCESS,
450     AGENT_CONTROL_AGENTFACILITY,
451     AGENT_CONTROL_ALLCLASSESREPORT,
452     AGENT_CONTROL_ALWAYSVALIDATE,
453     AGENT_CONTROL_AUDITING,
454     AGENT_CONTROL_BINARYPADDINGCHAR,
455     AGENT_CONTROL_BINDTOINTERFACE,
456     AGENT_CONTROL_HASHUPDATES,
457     AGENT_CONTROL_CHILDLIBPATH,
458     AGENT_CONTROL_CHECKSUM_ALERT_TIME,
459     AGENT_CONTROL_DEFAULTCOPYTYPE,
460     AGENT_CONTROL_DRYRUN,
461     AGENT_CONTROL_EDITBINARYFILESIZE,
462     AGENT_CONTROL_EDITFILESIZE,
463     AGENT_CONTROL_ENVIRONMENT,
464     AGENT_CONTROL_EXCLAMATION,
465     AGENT_CONTROL_EXPIREAFTER,
466     AGENT_CONTROL_FSINGLECOPY,
467     AGENT_CONTROL_FAUTODEFINE,
468     AGENT_CONTROL_HOSTNAMEKEYS,
469     AGENT_CONTROL_IFELAPSED,
470     AGENT_CONTROL_INFORM,
471     AGENT_CONTROL_INTERMITTENCY,
472     AGENT_CONTROL_MAX_CHILDREN,
473     AGENT_CONTROL_MAXCONNECTIONS,
474     AGENT_CONTROL_MOUNTFILESYSTEMS,
475     AGENT_CONTROL_NONALPHANUMFILES,
476     AGENT_CONTROL_REPCHAR,
477     AGENT_CONTROL_REFRESH_PROCESSES,
478     AGENT_CONTROL_REPOSITORY,
479     AGENT_CONTROL_SECUREINPUT,
480     AGENT_CONTROL_SENSIBLECOUNT,
481     AGENT_CONTROL_SENSIBLESIZE,
482     AGENT_CONTROL_SKIPIDENTIFY,
483     AGENT_CONTROL_SUSPICIOUSNAMES,
484     AGENT_CONTROL_SYSLOG,
485     AGENT_CONTROL_TRACK_VALUE,
486     AGENT_CONTROL_TIMEZONE,
487     AGENT_CONTROL_TIMEOUT,
488     AGENT_CONTROL_VERBOSE,
489     AGENT_CONTROL_REPORTCLASSLOG,
490     AGENT_CONTROL_SELECT_END_MATCH_EOF,
491     AGENT_CONTROL_NONE
492 } AgentControl;
493 
494 /*************************************************************************/
495 
496 typedef enum
497 {
498     EXEC_CONTROL_SPLAYTIME,
499     EXEC_CONTROL_MAILFROM,
500     EXEC_CONTROL_MAILTO,
501     EXEC_CONTROL_MAILSUBJECT,
502     EXEC_CONTROL_SMTPSERVER,
503     EXEC_CONTROL_MAILMAXLINES,
504     EXEC_CONTROL_MAILFILTER_INCLUDE,
505     EXEC_CONTROL_MAILFILTER_EXCLUDE,
506     EXEC_CONTROL_SCHEDULE,
507     EXEC_CONTROL_EXECUTORFACILITY,
508     EXEC_CONTROL_EXECCOMMAND,
509     EXEC_CONTROL_AGENT_EXPIREAFTER,
510     EXEC_CONTROL_RUNAGENT_ALLOW_USERS,
511     EXEC_CONTROL_NONE
512 } ExecControl;
513 
514 typedef enum
515 {
516     EDIT_ORDER_BEFORE,
517     EDIT_ORDER_AFTER
518 } EditOrder;
519 
520 /*************************************************************************/
521 
522 typedef enum
523 {
524     TYPE_SEQUENCE_META,
525     TYPE_SEQUENCE_VARS,
526     TYPE_SEQUENCE_DEFAULTS,
527     TYPE_SEQUENCE_CONTEXTS,
528     TYPE_SEQUENCE_USERS,
529     TYPE_SEQUENCE_FILES,
530     TYPE_SEQUENCE_PACKAGES,
531     TYPE_SEQUENCE_ENVIRONMENTS,
532     TYPE_SEQUENCE_METHODS,
533     TYPE_SEQUENCE_PROCESSES,
534     TYPE_SEQUENCE_SERVICES,
535     TYPE_SEQUENCE_COMMANDS,
536     TYPE_SEQUENCE_STORAGE,
537     TYPE_SEQUENCE_DATABASES,
538     TYPE_SEQUENCE_REPORTS,
539     TYPE_SEQUENCE_NONE
540 } TypeSequence;
541 
542 /*************************************************************************/
543 /* Syntax module range/pattern constants for type validation             */
544 /*************************************************************************/
545 
546 #define CF_BUNDLE  (void*)1234  /* any non-null value, not used */
547 
548 /* Initial values for max=low, min=high when determining a range, for
549  * which we'll revise max upwards and in downwards if given meaningful
550  * bounds for them.  Quite why they're these values, rather than 9999
551  * (longest string of 9s to fit in an int16) or 999999999 (similar for
552  * int32) remains a mystery. */
553 #define CF_HIGHINIT 999999L
554 #define CF_LOWINIT -999999L
555 
556 #define CF_SIGNALRANGE "hup,int,trap,kill,pipe,cont,abrt,stop,quit,term,child,usr1,usr2,bus,segv"
557 #define CF_BOOL      "true,false,yes,no,on,off"
558 #define CF_LINKRANGE "symlink,hardlink,relative,absolute"
559 #define CF_TIMERANGE "0,2147483647" /* i.e. "0,0x7fffffff" */
560 
561 /* Syntax checker accepts absurdly big numbers for backwards
562  * compatibility. WARNING: internally they are stored as longs, possibly
563  * being truncated to LONG_MAX within IntFromString(). */
564 #define CF_VALRANGE            "0,99999999999"
565 #define CF_INTRANGE  "-99999999999,99999999999"
566 
567 #define CF_INTLISTRANGE  "[-0-9_$(){}\\[\\].]+"
568 #define CF_REALRANGE "-9.99999E100,9.99999E100"
569 #define CF_CHARRANGE "^.$"
570 
571 #define CF_MODERANGE   "[0-7augorwxst,+-=]+"
572 #define CF_BSDFLAGRANGE "[+-]*[(arch|archived|nodump|opaque|sappnd|sappend|schg|schange|simmutable|sunlnk|sunlink|uappnd|uappend|uchg|uchange|uimmutable|uunlnk|uunlink)]+"
573 #define CF_CLASSRANGE  "[a-zA-Z0-9_!&@@$|.()\\[\\]{}:]+"
574 #define CF_IDRANGE     "[a-zA-Z0-9_$(){}\\[\\].:]+"
575 #define CF_USERRANGE   "[a-zA-Z0-9_$.-]+"
576 #define CF_IPRANGE     "[a-zA-Z0-9_$(){}.:-]+"
577 #define CF_FNCALLRANGE "[a-zA-Z0-9_(){}.$@]+"
578 #define CF_NAKEDLRANGE "@[(][a-zA-Z0-9_$(){}\\[\\].:]+[)]"
579 #define CF_ANYSTRING   ".*"
580 
581 #define CF_KEYSTRING   "^(SHA|MD5)=[0123456789abcdef]*$"
582 
583 
584 #ifndef __MINGW32__
585 # define CF_ABSPATHRANGE   "\"?(/.*)"
586 #else
587 // can start with e.g. c:\... or "c:\...  |  unix (for Cygwin-style paths)
588 # define CF_ABSPATHRANGE   "\"?(([a-zA-Z]:\\\\.*)|(/.*))"
589 #endif
590 
591 /* Any non-empty string can be an absolute path under Unix */
592 #define CF_PATHRANGE ".+"
593 
594 // Put this here now for caching efficiency
595 
596 #define SOFTWARE_PACKAGES_CACHE "software_packages.csv"
597 #define SOFTWARE_PATCHES_CACHE "software_patches_avail.csv"
598 
599 #define PACKAGES_CONTEXT "cf_pack_context"
600 #define PACKAGES_CONTEXT_ANYVER "cf_pack_context_anyver"
601 
602 /*************************************************************************/
603 
604 typedef struct EvalContext_ EvalContext;
605 
606 typedef enum
607 {
608     RVAL_TYPE_SCALAR = 's',
609     RVAL_TYPE_LIST = 'l',
610     RVAL_TYPE_FNCALL = 'f',
611     RVAL_TYPE_CONTAINER = 'c',
612     RVAL_TYPE_NOPROMISEE = 'X' // TODO: must be another hack
613 } RvalType;
614 
615 typedef struct
616 {
617     void *item;
618     RvalType type;
619 } Rval;
620 
621 typedef struct Rlist_ Rlist;
622 
623 typedef struct ConstraintSyntax_ ConstraintSyntax;
624 typedef struct BodySyntax_ BodySyntax;
625 
626 /*
627  * Promise types or bodies may optionally provide parse-tree check function, called after
628  * parsing to do a preliminary syntax/semantic checking of unexpanded promises.
629  *
630  * This check function should populate #errors sequence with errors it finds and
631  * return false in case it has found at least one error.
632  *
633  * If the check function has not found any errors, it should return true.
634  */
635 typedef bool (*PromiseCheckFn)(const Promise *pp, Seq *errors);
636 typedef bool (*BodyCheckFn)(const Body *body, Seq *errors);
637 
638 typedef enum
639 {
640     SYNTAX_STATUS_NORMAL,
641     SYNTAX_STATUS_DEPRECATED,
642     SYNTAX_STATUS_REMOVED
643 } SyntaxStatus;
644 
645 typedef enum
646 {
647     FNCALL_CATEGORY_SYSTEM,
648     FNCALL_CATEGORY_FILES,
649     FNCALL_CATEGORY_IO,
650     FNCALL_CATEGORY_COMM,
651     FNCALL_CATEGORY_DATA,
652     FNCALL_CATEGORY_UTILS,
653     FNCALL_CATEGORY_INTERNAL
654 } FnCallCategory;
655 
656 struct ConstraintSyntax_
657 {
658     const char *lval;
659     const DataType dtype;
660     union
661     {
662         const char *validation_string;
663         const BodySyntax *body_type_syntax;
664     } range;
665     const char *description;
666     SyntaxStatus status;
667 };
668 
669 struct BodySyntax_
670 {
671     const char *body_type;
672     const ConstraintSyntax *constraints;
673     BodyCheckFn check_body;
674     SyntaxStatus status;
675 };
676 
677 typedef struct
678 {
679     const char *bundle_type;
680     const char *promise_type;
681     const ConstraintSyntax *constraints;
682     const PromiseCheckFn check_promise;
683     SyntaxStatus status;
684 } PromiseTypeSyntax;
685 
686 /*************************************************************************/
687 
688 typedef struct Constraint_ Constraint;
689 
690 typedef enum
691 {
692     INTERVAL_HOURLY,
693     INTERVAL_DAILY,
694     INTERVAL_NONE
695 } Interval;
696 
697 typedef enum
698 {
699     FILE_COMPARATOR_ATIME,
700     FILE_COMPARATOR_MTIME,
701     FILE_COMPARATOR_CTIME,
702     FILE_COMPARATOR_CHECKSUM,
703     FILE_COMPARATOR_HASH,
704     FILE_COMPARATOR_BINARY,
705     FILE_COMPARATOR_EXISTS,
706     FILE_COMPARATOR_NONE
707 } FileComparator;
708 
709 typedef enum
710 {
711     FILE_LINK_TYPE_SYMLINK,
712     FILE_LINK_TYPE_HARDLINK,
713     FILE_LINK_TYPE_RELATIVE,
714     FILE_LINK_TYPE_ABSOLUTE,
715     FILE_LINK_TYPE_NONE
716 } FileLinkType;
717 
718 enum cfopaction
719 {
720     cfa_fix,
721     cfa_warn,
722 };
723 
724 typedef enum
725 {
726     BACKUP_OPTION_BACKUP,
727     BACKUP_OPTION_NO_BACKUP,
728     BACKUP_OPTION_TIMESTAMP,
729     BACKUP_OPTION_ROTATE,
730     BACKUP_OPTION_REPOSITORY_STORE             /* for internal use only */
731 } BackupOption;
732 
733 enum cfnofile
734 {
735     cfa_force,
736     cfa_delete,
737     cfa_skip
738 };
739 
740 enum cflinkchildren
741 {
742     cfa_override,
743     cfa_onlynonexisting
744 };
745 
746 typedef enum
747 {
748     FILE_CHANGE_REPORT_NONE,
749     FILE_CHANGE_REPORT_CONTENT_CHANGE,
750     FILE_CHANGE_REPORT_STATS_CHANGE,
751     FILE_CHANGE_REPORT_ALL
752 } FileChangeReport;
753 
754 enum signalnames
755 {
756     cfa_hup,
757     cfa_int,
758     cfa_trap,
759     cfa_kill,
760     cfa_pipe,
761     cfa_cont,
762     cfa_abrt,
763     cfa_stop,
764     cfa_quit,
765     cfa_term,
766     cfa_child,
767     cfa_usr1,
768     cfa_usr2,
769     cfa_bus,
770     cfa_segv
771 };
772 
773 typedef enum
774 {
775     PACKAGE_ACTION_ADD,
776     PACKAGE_ACTION_DELETE,
777     PACKAGE_ACTION_REINSTALL,
778     PACKAGE_ACTION_UPDATE,
779     PACKAGE_ACTION_ADDUPDATE,
780     PACKAGE_ACTION_PATCH,
781     PACKAGE_ACTION_VERIFY,
782     PACKAGE_ACTION_NONE
783 } PackageAction;
784 
785 typedef enum
786 {
787     NEW_PACKAGE_ACTION_ABSENT,
788     NEW_PACKAGE_ACTION_PRESENT,
789     NEW_PACKAGE_ACTION_NONE
790 } NewPackageAction;
791 
792 typedef enum
793 {
794     PACKAGE_VERSION_COMPARATOR_EQ,
795     PACKAGE_VERSION_COMPARATOR_NEQ,
796     PACKAGE_VERSION_COMPARATOR_GT,
797     PACKAGE_VERSION_COMPARATOR_LT,
798     PACKAGE_VERSION_COMPARATOR_GE,
799     PACKAGE_VERSION_COMPARATOR_LE,
800     PACKAGE_VERSION_COMPARATOR_NONE
801 } PackageVersionComparator;
802 
803 typedef enum
804 {
805     PACKAGE_ACTION_POLICY_INDIVIDUAL,
806     PACKAGE_ACTION_POLICY_BULK,
807     PACKAGE_ACTION_POLICY_NONE
808 } PackageActionPolicy;
809 
810 typedef enum
811 {
812     PROMISE_STATE_REPAIRED = 'r',
813     PROMISE_STATE_NOTKEPT = 'n',
814     PROMISE_STATE_KEPT = 'c',
815     PROMISE_STATE_ANY = 'x'
816 } PromiseState;
817 
818 /************************************************************************************/
819 
820 typedef enum
821 {
822     LAST_SEEN_DIRECTION_INCOMING = '-',
823     LAST_SEEN_DIRECTION_OUTGOING = '+'
824 } LastSeenDirection;
825 
826 /************************************************************************************/
827 
828 typedef enum
829 {
830     ACL_METHOD_APPEND,
831     ACL_METHOD_OVERWRITE,
832     ACL_METHOD_NONE
833 } AclMethod;
834 
835 typedef enum
836 {
837     ACL_TYPE_GENERIC,
838     ACL_TYPE_POSIX,
839     ACL_TYPE_NTFS_,
840     ACL_TYPE_NONE
841 } AclType;
842 
843 typedef enum
844 {
845     ACL_DEFAULT_NO_CHANGE,
846     ACL_DEFAULT_SPECIFY,
847     ACL_DEFAULT_ACCESS,
848     ACL_DEFAULT_CLEAR,
849     ACL_DEFAULT_NONE
850 } AclDefault;
851 
852 typedef enum
853 {
854     ACL_INHERIT_FALSE,
855     ACL_INHERIT_TRUE,
856     ACL_INHERIT_NOCHANGE
857 } AclInherit;
858 
859 typedef struct
860 {
861     AclMethod acl_method;
862     AclType acl_type;
863     AclDefault acl_default;
864     Rlist *acl_entries;
865     Rlist *acl_default_entries;
866     /* Only used on Windows */
867     AclInherit acl_inherit;
868 } Acl;
869 
870 typedef enum
871 {
872     INHERIT_ACCESS_ONLY,
873     INHERIT_DEFAULT_ONLY,
874     INHERIT_ACCESS_AND_DEFAULT
875 }
876 inherit_t;
877 
878 typedef enum
879 {
880     INSERT_MATCH_TYPE_IGNORE_LEADING,
881     INSERT_MATCH_TYPE_IGNORE_TRAILING,
882     INSERT_MATCH_TYPE_IGNORE_EMBEDDED,
883     INSERT_MATCH_TYPE_EXACT
884 } InsertMatchType;
885 
886 /*************************************************************************/
887 /* Runtime constraint structures                                         */
888 /*************************************************************************/
889 
890 #define OVECCOUNT 30
891 
892 /*******************************************************************/
893 
894 typedef struct
895 {
896     char *last;
897     char *lock;
898     bool is_dummy;
899 } CfLock;
900 
901 /*************************************************************************/
902 
903 typedef struct
904 {
905     char *host;
906     char *source;
907     char *mounton;
908     char *options;
909     int unmount;
910 } Mount;
911 
912 /*************************************************************************/
913 
914 typedef struct
915 {
916     int travlinks;
917     int rmdeadlinks;
918     int depth;
919     int xdev;
920     int include_basedir;
921     Rlist *include_dirs;
922     Rlist *exclude_dirs;
923 } DirectoryRecursion;
924 
925 /*************************************************************************/
926 
927 typedef struct
928 {
929     enum cfopaction action;
930     int ifelapsed;
931     int expireafter;
932     int background;
933     char *log_string;
934     char *log_kept;
935     char *log_repaired;
936     char *log_failed;
937     int log_priority;
938     char *measure_id;
939     int audit;
940     LogLevel report_level;
941     LogLevel log_level;
942 } TransactionContext;
943 
944 /*************************************************************************/
945 
946 typedef enum
947 {
948     CONTEXT_SCOPE_NAMESPACE,
949     CONTEXT_SCOPE_BUNDLE,
950     CONTEXT_SCOPE_NONE
951 } ContextScope;
952 
953 typedef struct
954 {
955     ContextScope scope;
956     Rlist *change;
957     Rlist *failure;
958     Rlist *denied;
959     Rlist *timeout;
960     Rlist *kept;
961     int persist;
962     PersistentClassPolicy timer;
963     Rlist *del_change;
964     Rlist *del_kept;
965     Rlist *del_notkept;
966     Rlist *retcode_kept;
967     Rlist *retcode_repaired;
968     Rlist *retcode_failed;
969 } DefineClasses;
970 
971 /*************************************************************************/
972 /* SQL Database connectors                                               */
973 /*************************************************************************/
974 
975 typedef enum
976 {
977     DATABASE_TYPE_MYSQL,
978     DATABASE_TYPE_POSTGRES,
979     DATABASE_TYPE_NONE
980 } DatabaseType;
981 
982 /*************************************************************************/
983 /* Package promises                                                      */
984 /*************************************************************************/
985 
986 typedef struct PackageItem_ PackageItem;
987 typedef struct PackageManager_ PackageManager;
988 
989 struct PackageManager_
990 {
991     char *manager;
992     PackageAction action;
993     PackageActionPolicy policy;
994     PackageItem *pack_list;
995     PackageItem *patch_list;
996     PackageItem *patch_avail;
997     PackageManager *next;
998 };
999 
1000 /*************************************************************************/
1001 
1002 struct PackageItem_
1003 {
1004     char *name;
1005     char *version;
1006     char *arch;
1007     Promise *pp;
1008     PackageItem *next;
1009 };
1010 
1011 
1012 typedef struct
1013 {
1014     unsigned int expires;
1015     PersistentClassPolicy policy;
1016     char tags[]; // variable length, must be zero terminated
1017 } PersistentClassInfo;
1018 
1019 /*************************************************************************/
1020 
1021 typedef struct
1022 {
1023     mode_t plus;
1024     mode_t minus;
1025     UidList *owners;
1026     GidList *groups;
1027     char *findertype;
1028     u_long plus_flags;          /* for *BSD chflags */
1029     u_long minus_flags;         /* for *BSD chflags */
1030     int rxdirs;
1031 } FilePerms;
1032 
1033 /*************************************************************************/
1034 
1035 typedef struct
1036 {
1037     Rlist *name;
1038     Rlist *path;
1039     Rlist *perms;
1040     Rlist *bsdflags;
1041     Rlist *owners;
1042     Rlist *groups;
1043     long max_size;
1044     long min_size;
1045     time_t max_ctime;
1046     time_t min_ctime;
1047     time_t max_mtime;
1048     time_t min_mtime;
1049     time_t max_atime;
1050     time_t min_atime;
1051     char *exec_regex;
1052     char *exec_program;
1053     Rlist *filetypes;
1054     Rlist *issymlinkto;
1055     char *result;
1056 } FileSelect;
1057 
1058 /*************************************************************************/
1059 
1060 typedef struct
1061 {
1062     enum
1063     {
1064         TIDY_LINK_DELETE,
1065         TIDY_LINK_KEEP
1066     } dirlinks;
1067     int rmdirs;
1068 } FileDelete;
1069 
1070 /*************************************************************************/
1071 
1072 typedef struct
1073 {
1074     char *newname;
1075     char *disable_suffix;
1076     int disable;
1077     int rotate;
1078     mode_t plus;
1079     mode_t minus;
1080 } FileRename;
1081 
1082 /*************************************************************************/
1083 
1084 typedef struct
1085 {
1086     HashMethod hash;
1087     FileChangeReport report_changes;
1088     int report_diffs;
1089     int update;
1090 } FileChange;
1091 
1092 /*************************************************************************/
1093 
1094 typedef struct
1095 {
1096     char *source;
1097     FileLinkType link_type;
1098     Rlist *copy_patterns;
1099     enum cfnofile when_no_file;
1100     enum cflinkchildren when_linking_children;
1101     int link_children;
1102 } FileLink;
1103 
1104 /*************************************************************************/
1105 
1106 typedef enum
1107 {
1108     SHELL_TYPE_NONE,
1109     SHELL_TYPE_USE,
1110     SHELL_TYPE_POWERSHELL
1111 } ShellType;
1112 
1113 typedef struct
1114 {
1115     ShellType shelltype;
1116     mode_t umask;
1117     uid_t owner;
1118     gid_t group;
1119     char *chdir;
1120     char *chroot;
1121     int preview;
1122     bool nooutput;
1123     int timeout;
1124 } ExecContain;
1125 
1126 /*************************************************************************/
1127 
1128 typedef struct
1129 {
1130     long min_range;
1131     long max_range;
1132     Rlist *in_range_define;
1133     Rlist *out_of_range_define;
1134 } ProcessCount;
1135 
1136 /*************************************************************************/
1137 
1138 typedef struct
1139 {
1140     Rlist *owner;
1141     long min_pid;
1142     long max_pid;
1143     long min_ppid;
1144     long max_ppid;
1145     long min_pgid;
1146     long max_pgid;
1147     long min_rsize;
1148     long max_rsize;
1149     long min_vsize;
1150     long max_vsize;
1151     time_t min_ttime;
1152     time_t max_ttime;
1153     time_t min_stime;
1154     time_t max_stime;
1155     long min_pri;
1156     long max_pri;
1157     long min_thread;
1158     long max_thread;
1159     char *status;
1160     char *command;
1161     char *tty;
1162     char *process_result;
1163 } ProcessSelect;
1164 
1165 #define PROCESS_SELECT_INIT { \
1166     .owner = NULL,          \
1167     .min_pid = CF_NOINT,    \
1168     .max_pid = CF_NOINT,    \
1169     .min_ppid = CF_NOINT,   \
1170     .max_ppid = CF_NOINT,   \
1171     .min_pgid = CF_NOINT,   \
1172     .max_pgid = CF_NOINT,   \
1173     .min_rsize = CF_NOINT,  \
1174     .max_rsize = CF_NOINT,  \
1175     .min_vsize = CF_NOINT,  \
1176     .max_vsize = CF_NOINT,  \
1177     .min_ttime = CF_NOINT,  \
1178     .max_ttime = CF_NOINT,  \
1179     .min_stime = CF_NOINT,  \
1180     .max_stime = CF_NOINT,  \
1181     .min_pri = CF_NOINT,    \
1182     .max_pri = CF_NOINT,    \
1183     .min_thread = CF_NOINT, \
1184     .max_thread = CF_NOINT, \
1185     .status = NULL,         \
1186     .command = NULL,        \
1187     .tty = NULL,            \
1188     .process_result = NULL, \
1189 }
1190 
1191 /*************************************************************************/
1192 
1193 typedef struct
1194 {
1195     Constraint *expression;
1196     ContextScope scope;
1197     int nconstraints;
1198     int persistent;
1199 } ContextConstraint;
1200 
1201 /*************************************************************************/
1202 
1203 typedef struct
1204 {
1205     BackupOption backup;
1206     int empty_before_use;
1207     int maxfilesize;
1208     int joinlines;
1209     int rotate;
1210     int inherit;
1211 } EditDefaults;
1212 
1213 /*************************************************************************/
1214 
1215 typedef struct
1216 {
1217     Rlist *startwith_from_list;
1218     Rlist *not_startwith_from_list;
1219     Rlist *match_from_list;
1220     Rlist *not_match_from_list;
1221     Rlist *contains_from_list;
1222     Rlist *not_contains_from_list;
1223 } LineSelect;
1224 
1225 typedef struct
1226 {
1227     char *build_xpath;
1228     char *select_xpath;
1229     char *attribute_value;
1230     int havebuildxpath;
1231     int haveselectxpath;
1232     int haveattributevalue;
1233 } EditXml;
1234 
1235 typedef struct
1236 {
1237     char *line_matching;
1238     EditOrder before_after;
1239     char *first_last;
1240 } EditLocation;
1241 
1242 typedef struct
1243 {
1244     char *select_start;
1245     char *select_end;
1246     int include_start;
1247     int include_end;
1248     bool select_end_match_eof;
1249 } EditRegion;
1250 
1251 typedef struct
1252 {
1253     char *column_separator;
1254     int select_column;
1255     char value_separator;
1256     char *column_value;
1257     char *column_operation;
1258     int extend_columns;
1259     int blanks_ok;
1260 } EditColumn;
1261 
1262 typedef struct
1263 {
1264     char *replace_value;
1265     char *occurrences;
1266 } EditReplace;
1267 
1268 /*************************************************************************/
1269 
1270 typedef struct
1271 {
1272     char *mount_type;
1273     char *mount_source;
1274     char *mount_server;
1275     Rlist *mount_options;
1276     int editfstab;
1277     int unmount;
1278 } StorageMount;
1279 
1280 typedef struct
1281 {
1282     int check_foreign;
1283     long freespace;
1284     int sensible_size;
1285     int sensible_count;
1286     int scan_arrivals;
1287 } StorageVolume;
1288 
1289 /*************************************************************************/
1290 
1291 typedef struct
1292 {
1293     int haveprintfile;
1294     int havelastseen;
1295     int lastseen;
1296     char *result;
1297     double intermittency;
1298     char *friend_pattern;
1299     char *filename;
1300     char *to_file;
1301     int numlines;
1302     Rlist *showstate;
1303 } Report;
1304 
1305 /*************************************************************************/
1306 
1307 typedef struct
1308 {
1309     PackageAction package_policy;
1310     char *package_version;
1311     Rlist *package_architectures;
1312     PackageVersionComparator package_select;
1313     PackageActionPolicy package_changes;
1314     Rlist *package_file_repositories;
1315 
1316     char *package_default_arch_command;
1317 
1318     char *package_list_command;
1319     char *package_list_version_regex;
1320     char *package_list_name_regex;
1321     char *package_list_arch_regex;
1322     char *package_patch_list_command;
1323 
1324     char *package_patch_version_regex;
1325     char *package_patch_name_regex;
1326     char *package_patch_arch_regex;
1327     char *package_patch_installed_regex;
1328 
1329     char *package_list_update_command;
1330     int package_list_update_ifelapsed;
1331 
1332     char *package_version_regex;
1333     char *package_name_regex;
1334     char *package_arch_regex;
1335     char *package_installed_regex;
1336 
1337     char *package_add_command;
1338     char *package_delete_command;
1339     char *package_update_command;
1340     char *package_patch_command;
1341     char *package_verify_command;
1342     char *package_noverify_regex;
1343     char *package_name_convention;
1344     char *package_delete_convention;
1345 
1346     bool package_commands_useshell;
1347 
1348     char *package_multiline_start;
1349 
1350     char *package_version_less_command;
1351     char *package_version_equal_command;
1352 
1353     int package_noverify_returncode;
1354 
1355     bool has_package_method;
1356     bool is_empty;
1357 } Packages;
1358 
1359 /*************************************************************************/
1360 
1361 typedef struct
1362 {
1363     char *name;
1364     int updates_ifelapsed;
1365     int installed_ifelapsed;
1366     Rlist *options;
1367     char *interpreter;
1368     char *module_path;
1369 } PackageModuleBody;
1370 
1371 
1372 typedef struct
1373 {
1374     Rlist *control_package_inventory; /* list of all inventory used package managers
1375                                        * names taken from common control */
1376     char *control_package_module;    /* policy default package manager name */
1377     Seq *package_modules_bodies; /* list of all discovered in policy PackageManagerBody
1378                                    * bodies taken from common control */
1379 } PackagePromiseContext;
1380 
1381 
1382 typedef struct
1383 {
1384     NewPackageAction package_policy;
1385     PackageModuleBody *module_body;
1386     Rlist *package_inventory;
1387     char *package_version;
1388     char *package_architecture;
1389     Rlist *package_options;
1390 
1391     bool is_empty;
1392 } NewPackages;
1393 
1394 /*************************************************************************/
1395 
1396 typedef enum
1397 {
1398     MEASURE_POLICY_AVERAGE,
1399     MEASURE_POLICY_SUM,
1400     MEASURE_POLICY_FIRST,
1401     MEASURE_POLICY_LAST,
1402     MEASURE_POLICY_NONE
1403 } MeasurePolicy;
1404 
1405 typedef struct
1406 {
1407     char *stream_type;
1408     DataType data_type;
1409     MeasurePolicy policy;
1410     char *history_type;
1411     char *select_line_matching;
1412     int select_line_number;
1413     char *extraction_regex;
1414     char *units;
1415     int growing;
1416 } Measurement;
1417 
1418 typedef struct
1419 {
1420     char *db_server_owner;
1421     char *db_server_password;
1422     char *db_server_host;
1423     char *db_connect_db;
1424     DatabaseType db_server_type;
1425     char *server;
1426     char *type;
1427     char *operation;
1428     Rlist *columns;
1429     Rlist *rows;
1430     Rlist *exclude;
1431 } Database;
1432 
1433 /*************************************************************************/
1434 typedef enum
1435 {
1436     USER_STATE_PRESENT,
1437     USER_STATE_ABSENT,
1438     USER_STATE_LOCKED,
1439     USER_STATE_NONE
1440 } UserState;
1441 
1442 typedef enum
1443 {
1444     PASSWORD_FORMAT_PLAINTEXT,
1445     PASSWORD_FORMAT_HASH,
1446     PASSWORD_FORMAT_NONE
1447 } PasswordFormat;
1448 
1449 typedef struct
1450 {
1451     UserState policy;
1452     char *uid;
1453     PasswordFormat password_format;
1454     char *password;
1455     char *description;
1456     char *group_primary;
1457     Rlist *groups_secondary;
1458     bool   groups_secondary_given;
1459     char *home_dir;
1460     char *shell;
1461 } User;
1462 
1463 /*************************************************************************/
1464 
1465 typedef struct
1466 {
1467     Rlist *service_depend;
1468     char *service_type;
1469     char *service_args;
1470     char *service_policy;
1471     char *service_autostart_policy;
1472     char *service_depend_chain;
1473     FnCall *service_method;
1474 } Services;
1475 
1476 /*************************************************************************/
1477 
1478 typedef enum
1479 {
1480     ENVIRONMENT_STATE_CREATE,
1481     ENVIRONMENT_STATE_DELETE,
1482     ENVIRONMENT_STATE_RUNNING,
1483     ENVIRONMENT_STATE_SUSPENDED,
1484     ENVIRONMENT_STATE_DOWN,
1485     ENVIRONMENT_STATE_NONE
1486 } EnvironmentState;
1487 
1488 typedef struct
1489 {
1490     int cpus;
1491     int memory;
1492     int disk;
1493     char *baseline;
1494     char *spec;
1495     Rlist *addresses;
1496     char *name;
1497     char *host;
1498     char *type;
1499     EnvironmentState state;
1500 } Environments;
1501 
1502 /* This is huge, but the simplification of logic is huge too
1503     so we leave it to the compiler to optimize */
1504 
1505 #include <json.h>
1506 
1507 typedef struct
1508 {
1509     const char *source;
1510     const char *port;                               /* port or service name */
1511     char *destination;
1512     FileComparator compare;
1513     FileLinkType link_type;
1514     Rlist *servers;
1515     Rlist *link_instead;
1516     Rlist *copy_links;
1517     BackupOption backup;
1518     int stealth;
1519     int preserve;
1520     int collapse;                               /* collapse_destination_dir */
1521     int check_root;
1522     int type_check;
1523     int force_update;
1524     int force_ipv4;
1525     size_t min_size;            /* Safety margin not search criterion */
1526     size_t max_size;
1527     int trustkey;
1528     int encrypt;
1529     int verify;
1530     int purge;
1531     short timeout;
1532     ProtocolVersion protocol_version;
1533     bool missing_ok;
1534 } FileCopy;
1535 
1536 typedef struct
1537 {
1538     FileSelect select;
1539     FilePerms perms;
1540     FileCopy copy;
1541     FileDelete delete;
1542     char *content;
1543     FileRename rename;
1544     FileChange change;
1545     FileLink link;
1546     EditDefaults edits;
1547     Packages packages;
1548     NewPackages new_packages;
1549     ContextConstraint context;
1550     Measurement measure;
1551     Acl acl;
1552     Database database;
1553     Services service;
1554     User users;
1555     Environments env;
1556     char *transformer;
1557     char *pathtype;
1558     char *file_type;
1559     char *repository;
1560     char *edit_template;
1561     char *edit_template_string;
1562     char *template_method;
1563     JsonElement *template_data;
1564     int touch;
1565     int create;
1566     int move_obstructions;
1567     int inherit;
1568 
1569     DirectoryRecursion recursion;
1570     TransactionContext transaction;
1571     DefineClasses classes;
1572 
1573     ExecContain contain;
1574     char *args;
1575     Rlist *arglist;
1576     int module;
1577     bool inform;
1578 
1579     Rlist *signals;
1580     char *process_stop;
1581     char *restart_class;
1582     ProcessCount process_count;
1583     ProcessSelect process_select;
1584 
1585     Report report;
1586     StorageMount mount;
1587     StorageVolume volume;
1588 
1589     int havedepthsearch;
1590     int haveselect;
1591     int haverename;
1592     int havedelete;
1593     int haveperms;
1594     int havechange;
1595     int havecopy;
1596     int havelink;
1597     int haveeditline;
1598     int haveeditxml;
1599     int haveedit;
1600     int havecontain;
1601     int haveclasses;
1602     int havetrans;
1603     int haveprocess_count;
1604     int havemount;
1605     int havevolume;
1606     int havebundle;
1607     int havepackages;
1608 
1609     /* editline */
1610 
1611     EditRegion region;
1612     EditLocation location;
1613     EditColumn column;
1614     EditReplace replace;
1615     EditXml xml;
1616     int haveregion;
1617     int havelocation;
1618     int havecolumn;
1619     int havereplace;
1620     int haveinsertselect;
1621     int havedeleteselect;
1622     LineSelect line_select;
1623     char *sourcetype;
1624     int expandvars;
1625     int not_matching;
1626     Rlist *insert_match;
1627 } Attributes;
1628 
1629 #define ZeroAttributes {\
1630     .select = {0},\
1631     .perms = {0},\
1632     .copy = {0},\
1633     .delete = {0},\
1634     .content = NULL,\
1635     .rename = {0},\
1636     .change = {0},\
1637     .link = {0},\
1638     .edits = {0},\
1639     .packages = {0},\
1640     .new_packages = {0},\
1641     .context = {0},\
1642     .measure = {0},\
1643     .acl = {0},\
1644     .database = {0},\
1645     .service = {0},\
1646     .users = {0},\
1647     .env = {0},\
1648     .transformer = NULL,\
1649     .pathtype = NULL,\
1650     .file_type = NULL,\
1651     .repository = NULL,\
1652     .edit_template = NULL,\
1653     .edit_template_string = NULL,\
1654     .template_method = NULL,\
1655     .template_data = NULL,\
1656     .touch = 0,\
1657     .create = 0,\
1658     .move_obstructions = 0,\
1659     .inherit = 0,\
1660     .recursion = { 0 },\
1661     .transaction = { 0 },\
1662     .classes = { 0 },\
1663     .contain = { 0 },\
1664     .args = NULL,\
1665     .arglist = NULL,\
1666     .module = 0,\
1667     .inform = false,\
1668     .signals = NULL,\
1669     .process_stop = NULL,\
1670     .restart_class = NULL,\
1671     .process_count = { 0 },\
1672     .process_select = { 0 },\
1673     .report = { 0 },\
1674     .mount = { 0 },\
1675     .volume = { 0 },\
1676     .havedepthsearch = 0,\
1677     .haveselect = 0,\
1678     .haverename = 0,\
1679     .havedelete = 0,\
1680     .haveperms = 0,\
1681     .havechange = 0,\
1682     .havecopy = 0,\
1683     .havelink = 0,\
1684     .haveeditline = 0,\
1685     .haveeditxml = 0,\
1686     .haveedit = 0,\
1687     .havecontain = 0,\
1688     .haveclasses = 0,\
1689     .havetrans = 0,\
1690     .haveprocess_count = 0,\
1691     .havemount = 0,\
1692     .havevolume = 0,\
1693     .havebundle = 0,\
1694     .havepackages = 0,\
1695     .region = { 0 },\
1696     .location = { 0 },\
1697     .column = { 0 },\
1698     .replace = { 0 },\
1699     .xml = { 0 },\
1700     .haveregion = 0,\
1701     .havelocation = 0,\
1702     .havecolumn = 0,\
1703     .havereplace = 0,\
1704     .haveinsertselect = 0,\
1705     .havedeleteselect = 0,\
1706     .line_select = { 0 },\
1707     .sourcetype = NULL,\
1708     .expandvars = 0,\
1709     .not_matching = 0,\
1710     .insert_match = NULL\
1711 }
1712 
1713 /*************************************************************************/
1714 /* common macros                                                         */
1715 /*************************************************************************/
1716 
1717 #include <rlist.h>
1718 #include <dbm_api.h>
1719 #include <sequence.h>
1720 #include <prototypes3.h>
1721 #include <alloc.h>
1722 #include <cf3.extern.h>
1723 
1724 extern const ConstraintSyntax CF_COMMON_BODIES[];
1725 extern const ConstraintSyntax CF_VARBODY[];
1726 extern const PromiseTypeSyntax *const CF_ALL_PROMISE_TYPES[];
1727 extern const ConstraintSyntax CFG_CONTROLBODY[];
1728 extern const BodySyntax CONTROL_BODIES[];
1729 extern const ConstraintSyntax CFH_CONTROLBODY[];
1730 extern const PromiseTypeSyntax CF_COMMON_PROMISE_TYPES[];
1731 extern const ConstraintSyntax CF_CLASSBODY[];
1732 extern const ConstraintSyntax CFA_CONTROLBODY[];
1733 extern const ConstraintSyntax CFEX_CONTROLBODY[];
1734 
1735 typedef struct ServerConnectionState_ ServerConnectionState;
1736 
1737 #endif
1738