LCOV - code coverage report
Current view: top level - src - conf.c (source / functions) Hit Total Coverage
Test: burp-coverage-clean.info Lines: 407 479 85.0 %
Date: 2016-05-01 Functions: 47 57 82.5 %

          Line data    Source code
       1             : #include "burp.h"
       2             : #include "strlist.h"
       3             : #include "conf.h"
       4             : #include "log.h"
       5             : #include "alloc.h"
       6             : #include "cntr.h"
       7             : #include "strlist.h"
       8             : #include "prepend.h"
       9             : #include "server/dpth.h"
      10             : 
      11             : #include <assert.h>
      12             : 
      13          54 : enum burp_mode str_to_burp_mode(const char *str)
      14             : {
      15          54 :         if(!strcmp(str, "server"))
      16             :                 return BURP_MODE_SERVER;
      17          30 :         else if(!strcmp(str, "client"))
      18             :                 return BURP_MODE_CLIENT;
      19           0 :         logp("Unknown mode setting: %s\n", str);
      20           0 :         return BURP_MODE_UNSET;
      21             : }
      22             : 
      23             : static const char *burp_mode_to_str(enum burp_mode bm)
      24             : {
      25             :         switch(bm)
      26             :         {
      27             :                 case BURP_MODE_UNSET: return "unset";
      28             :                 case BURP_MODE_SERVER: return "server";
      29             :                 case BURP_MODE_CLIENT: return "client";
      30             :                 default: return "unknown";
      31             :         }
      32             : }
      33             : 
      34           1 : enum recovery_method str_to_recovery_method(const char *str)
      35             : {
      36           1 :         if(!strcmp(str, "delete"))
      37             :                 return RECOVERY_METHOD_DELETE;
      38           1 :         else if(!strcmp(str, "resume"))
      39             :                 return RECOVERY_METHOD_RESUME;
      40           0 :         logp("Unknown working_dir_recovery_method setting: %s\n", str);
      41           0 :         return RECOVERY_METHOD_UNSET;
      42             : }
      43             : 
      44           0 : const char *recovery_method_to_str(enum recovery_method r)
      45             : {
      46           0 :         switch(r)
      47             :         {
      48             :                 case RECOVERY_METHOD_DELETE: return "delete";
      49           0 :                 case RECOVERY_METHOD_RESUME: return "resume";
      50           0 :                 default: return "unknown";
      51             :         }
      52             : }
      53             : 
      54           0 : const char *rshash_to_str(enum rshash r)
      55             : {
      56           0 :         switch(r)
      57             :         {
      58             :                 case RSHASH_UNSET: return "unset";
      59             :                 case RSHASH_MD4: return "md4";
      60             :                 case RSHASH_BLAKE2: return "blake2";
      61             :                 default: return "unknown";
      62             :         }
      63             : }
      64             : 
      65          14 : enum protocol str_to_protocol(const char *str)
      66             : {
      67          14 :         if(!strcmp(str, "0"))
      68             :                 return PROTO_AUTO;
      69          14 :         else if(!strcmp(str, "1"))
      70             :                 return PROTO_1;
      71           6 :         else if(!strcmp(str, "2"))
      72             :                 return PROTO_2;
      73           0 :         logp("Unknown protocol setting: %s\n", str);
      74           0 :         return PROTO_AUTO;
      75             : }
      76             : 
      77        2225 : struct strlist *get_strlist(struct conf *conf)
      78             : {
      79        2225 :         assert(conf->conf_type==CT_STRLIST);
      80        2225 :         return conf->data.sl;
      81             : }
      82             : 
      83        2008 : char *get_string(struct conf *conf)
      84             : {
      85        2008 :         assert(conf->conf_type==CT_STRING);
      86        2008 :         return conf->data.s;
      87             : }
      88             : 
      89        1180 : int get_int(struct conf *conf)
      90             : {
      91        1180 :         assert(conf->conf_type==CT_UINT);
      92        1180 :         return conf->data.i;
      93             : }
      94             : 
      95         128 : uint64_t get_uint64_t(struct conf *conf)
      96             : {
      97         128 :         assert(conf->conf_type==CT_SSIZE_T);
      98         128 :         return conf->data.uint64;
      99             : }
     100             : 
     101           1 : float get_float(struct conf *conf)
     102             : {
     103           1 :         assert(conf->conf_type==CT_FLOAT);
     104           1 :         return conf->data.f;
     105             : }
     106             : 
     107           1 : mode_t get_mode_t(struct conf *conf)
     108             : {
     109           1 :         assert(conf->conf_type==CT_MODE_T);
     110           1 :         return conf->data.mode;
     111             : }
     112             : 
     113         134 : enum burp_mode get_e_burp_mode(struct conf *conf)
     114             : {
     115         134 :         assert(conf->conf_type==CT_E_BURP_MODE);
     116         134 :         return conf->data.burp_mode;
     117             : }
     118             : 
     119          27 : enum protocol get_e_protocol(struct conf *conf)
     120             : {
     121         141 :         assert(conf->conf_type==CT_E_PROTOCOL);
     122         141 :         return conf->data.protocol;
     123             : }
     124             : 
     125         114 : enum protocol get_protocol(struct conf **confs)
     126             : {
     127         228 :         return get_e_protocol(confs[OPT_PROTOCOL]);
     128             : }
     129             : 
     130          51 : enum recovery_method get_e_recovery_method(struct conf *conf)
     131             : {
     132          51 :         assert(conf->conf_type==CT_E_RECOVERY_METHOD);
     133          51 :         return conf->data.recovery_method;
     134             : }
     135             : 
     136          26 : enum rshash get_e_rshash(struct conf *conf)
     137             : {
     138          26 :         assert(conf->conf_type==CT_E_RSHASH);
     139          26 :         return conf->data.rshash;
     140             : }
     141             : 
     142         393 : struct cntr *get_cntr(struct conf **confs)
     143             : {
     144         393 :         return confs[OPT_CNTR]->data.cntr;
     145             : }
     146             : 
     147        9541 : int set_string(struct conf *conf, const char *s)
     148             : {
     149        9541 :         assert(conf->conf_type==CT_STRING);
     150        9541 :         if(conf->data.s) free_w(&(conf->data.s));
     151        9541 :         if(s && !(conf->data.s=strdup_w(s, __func__)))
     152             :                 return -1;
     153        9541 :         return 0;
     154             : }
     155             : 
     156         710 : int set_int(struct conf *conf, unsigned int i)
     157             : {
     158        8494 :         assert(conf->conf_type==CT_UINT);
     159        8494 :         conf->data.i=i;
     160         710 :         return 0;
     161             : }
     162             : 
     163        4281 : int set_strlist(struct conf *conf, struct strlist *s)
     164             : {
     165        4281 :         assert(conf->conf_type==CT_STRLIST);
     166        4281 :         if(conf->data.sl) strlists_free(&conf->data.sl);
     167        4281 :         conf->data.sl=s;
     168        4281 :         return 0;
     169             : }
     170             : 
     171           0 : int set_float(struct conf *conf, float f)
     172             : {
     173         139 :         assert(conf->conf_type==CT_FLOAT);
     174         139 :         conf->data.f=f;
     175           0 :         return 0;
     176             : }
     177             : 
     178          54 : int set_e_burp_mode(struct conf *conf, enum burp_mode bm)
     179             : {
     180         193 :         assert(conf->conf_type==CT_E_BURP_MODE);
     181         193 :         conf->data.burp_mode=bm;
     182          54 :         return 0;
     183             : }
     184             : 
     185          39 : int set_e_protocol(struct conf *conf, enum protocol p)
     186             : {
     187         184 :         assert(conf->conf_type==CT_E_PROTOCOL);
     188         184 :         conf->data.protocol=p;
     189          39 :         return 0;
     190             : }
     191             : 
     192           6 : int set_protocol(struct conf **confs, enum protocol p)
     193             : {
     194          12 :         return set_e_protocol(confs[OPT_PROTOCOL], p);
     195             : }
     196             : 
     197          26 : int set_e_recovery_method(struct conf *conf, enum recovery_method r)
     198             : {
     199         165 :         assert(conf->conf_type==CT_E_RECOVERY_METHOD);
     200         165 :         conf->data.recovery_method=r;
     201          26 :         return 0;
     202             : }
     203             : 
     204          25 : int set_e_rshash(struct conf *conf, enum rshash r)
     205             : {
     206         164 :         assert(conf->conf_type==CT_E_RSHASH);
     207         164 :         conf->data.rshash=r;
     208          25 :         return 0;
     209             : }
     210             : 
     211           0 : int set_mode_t(struct conf *conf, mode_t m)
     212             : {
     213         139 :         assert(conf->conf_type==CT_MODE_T);
     214         139 :         conf->data.mode=m;
     215           0 :         return 0;
     216             : }
     217             : 
     218          52 : int set_uint64_t(struct conf *conf, uint64_t s)
     219             : {
     220         608 :         assert(conf->conf_type==CT_SSIZE_T);
     221         608 :         conf->data.uint64=s;
     222          52 :         return 0;
     223             : }
     224             : 
     225           2 : int set_cntr(struct conf *conf, struct cntr *cntr)
     226             : {
     227         141 :         assert(conf->conf_type==CT_CNTR);
     228         141 :         conf->data.cntr=cntr;
     229           2 :         return 0;
     230             : }
     231             : 
     232         284 : int add_to_strlist(struct conf *conf, const char *value, int include)
     233             : {
     234         284 :         assert(conf->conf_type==CT_STRLIST);
     235         284 :         if(conf->flags & CONF_FLAG_STRLIST_SORTED)
     236         120 :                 return strlist_add_sorted(&(conf->data.sl), value, include);
     237             :         else
     238         164 :                 return strlist_add(&(conf->data.sl), value, include);
     239             : }
     240             : 
     241           3 : int add_to_strlist_include_uniq(struct conf *conf, const char *value)
     242             : {
     243           3 :         return strlist_add_sorted_uniq(&(conf->data.sl), value, 1);
     244             : }
     245             : 
     246           0 : int add_to_strlist_include(struct conf *conf, const char *value)
     247             : {
     248           0 :         return add_to_strlist(conf, value, 1);
     249             : }
     250             : 
     251           0 : int add_to_strlist_exclude(struct conf *conf, const char *value)
     252             : {
     253           0 :         return add_to_strlist(conf, value, 0);
     254             : }
     255             : 
     256       21480 : void conf_free_content(struct conf *c)
     257             : {
     258       42960 :         if(!c) return;
     259       21324 :         switch(c->conf_type)
     260             :         {
     261             :                 case CT_STRING:
     262        8220 :                         free_w(&c->data.s);
     263        8220 :                         break;
     264             :                 case CT_STRLIST:
     265        4113 :                         strlists_free(&c->data.sl);
     266        4113 :                         break;
     267             :                 case CT_CNTR:
     268         134 :                         cntr_free(&c->data.cntr);
     269         134 :                         break;
     270             :                 case CT_FLOAT:
     271             :                 case CT_E_BURP_MODE:
     272             :                 case CT_E_PROTOCOL:
     273             :                 case CT_E_RECOVERY_METHOD:
     274             :                 case CT_E_RSHASH:
     275             :                 case CT_UINT:
     276             :                 case CT_MODE_T:
     277             :                 case CT_SSIZE_T:
     278        8857 :                         memset(&c->data, 0, sizeof(c->data));
     279             :                         break;
     280             :         }
     281             : }
     282             : 
     283           1 : void confs_memcpy(struct conf **dst, struct conf **src)
     284             : {
     285           1 :         int i=0;
     286         157 :         for(i=0; i<OPT_MAX; i++)
     287             :         {
     288         156 :                 free_v((void **)&(dst[i]));
     289         156 :                 dst[i]=src[i];
     290             :         }
     291           1 : }
     292             : 
     293           1 : void confs_null(struct conf **confs)
     294             : {
     295           1 :         int i=0;
     296           2 :         if(!confs) return;
     297         156 :         for(i=0; i<OPT_MAX; i++) confs[i]=NULL;
     298             : }
     299             : 
     300         137 : void confs_free_content(struct conf **confs)
     301             : {
     302         137 :         int i=0;
     303         274 :         if(!confs) return;
     304       21372 :         for(i=0; i<OPT_MAX; i++) conf_free_content(confs[i]);
     305             : }
     306             : 
     307             : /* Free only stuff related to includes/excludes.
     308             :    This is so that the server can override them all on the client. */
     309           1 : void free_incexcs(struct conf **confs)
     310             : {
     311           1 :         int i=0;
     312           2 :         if(!confs) return;
     313         156 :         for(i=0; i<OPT_MAX; i++)
     314         156 :                 if(confs[i]->flags & CONF_FLAG_INCEXC)
     315          28 :                         conf_free_content(confs[i]);
     316             : }
     317             : 
     318             : static void sc(struct conf *conf, uint8_t flags,
     319             :         enum conf_type conf_type, const char *field)
     320             : {
     321       21684 :         conf->conf_type=conf_type;
     322       21684 :         conf->field=field;
     323       21684 :         conf->flags=flags;
     324       21684 :         memset(&conf->data, 0, sizeof(conf->data));
     325             : }
     326             : 
     327        8201 : static int sc_str(struct conf *conf, const char *def,
     328             :         uint8_t flags, const char *field)
     329             : {
     330        8201 :         sc(conf, flags, CT_STRING, field);
     331        8201 :         return set_string(conf, def);
     332             : }
     333             : 
     334        7784 : static int sc_int(struct conf *conf, unsigned int def,
     335             :         uint8_t flags, const char *field)
     336             : {
     337        7784 :         sc(conf, flags, CT_UINT, field);
     338        7784 :         return set_int(conf, def);
     339             : }
     340             : 
     341        4170 : static int sc_lst(struct conf *conf, struct strlist *def,
     342             :         uint8_t flags, const char *field)
     343             : {
     344        4170 :         sc(conf, flags, CT_STRLIST, field);
     345        4170 :         return set_strlist(conf, def);
     346             : }
     347             : 
     348         139 : static int sc_flt(struct conf *conf, float def,
     349             :         uint8_t flags, const char *field)
     350             : {
     351         139 :         sc(conf, flags, CT_FLOAT, field);
     352         139 :         return set_float(conf, def);
     353             : }
     354             : 
     355         139 : static int sc_ebm(struct conf *conf, enum burp_mode def,
     356             :         uint8_t flags, const char *field)
     357             : {
     358         139 :         sc(conf, flags, CT_E_BURP_MODE, field);
     359         139 :         return set_e_burp_mode(conf, def);
     360             : }
     361             : 
     362         139 : static int sc_epr(struct conf *conf, enum protocol def,
     363             :         uint8_t flags, const char *field)
     364             : {
     365         139 :         sc(conf, flags, CT_E_PROTOCOL, field);
     366         139 :         return set_e_protocol(conf, def);
     367             : }
     368             : 
     369         139 : static int sc_rec(struct conf *conf, enum recovery_method def,
     370             :         uint8_t flags, const char *field)
     371             : {
     372         139 :         sc(conf, flags, CT_E_RECOVERY_METHOD, field);
     373         139 :         return set_e_recovery_method(conf, def);
     374             : }
     375             : 
     376         139 : static int sc_rsh(struct conf *conf, enum rshash def,
     377             :         uint8_t flags, const char *field)
     378             : {
     379         139 :         sc(conf, flags, CT_E_RSHASH, field);
     380         139 :         return set_e_rshash(conf, def);
     381             : }
     382             : 
     383         139 : static int sc_mod(struct conf *conf, mode_t def,
     384             :         uint8_t flags, const char *field)
     385             : {
     386         139 :         sc(conf, flags, CT_MODE_T, field);
     387         139 :         return set_mode_t(conf, def);
     388             : }
     389             : 
     390         556 : static int sc_u64(struct conf *conf, uint64_t def,
     391             :         uint8_t flags, const char *field)
     392             : {
     393         556 :         sc(conf, flags, CT_SSIZE_T, field);
     394         556 :         return set_uint64_t(conf, def);
     395             : }
     396             : 
     397         139 : static int sc_cntr(struct conf *conf, struct cntr *def,
     398             :         uint8_t flags, const char *field)
     399             : {
     400         139 :         sc(conf, flags, CT_CNTR, field);
     401         139 :         return set_cntr(conf, def);
     402             : }
     403             : 
     404       21684 : static int reset_conf(struct conf **c, enum conf_opt o)
     405             : {
     406             :         // Do this with a switch statement, so that we get compiler warnings
     407             :         // if anything is missed.
     408       21684 :         switch(o)
     409             :         {
     410             :         case OPT_BURP_MODE:
     411         139 :           return sc_ebm(c[o], BURP_MODE_UNSET, 0, "mode");
     412             :         case OPT_LOCKFILE:
     413         139 :           return sc_str(c[o], 0, 0, "lockfile");
     414             :         case OPT_PIDFILE:
     415         139 :           return sc_str(c[o], 0, 0, "pidfile");
     416             :         case OPT_SSL_CERT_CA:
     417         139 :           return sc_str(c[o], 0, 0, "ssl_cert_ca");
     418             :         case OPT_SSL_CERT:
     419         139 :           return sc_str(c[o], 0, 0, "ssl_cert");
     420             :         case OPT_SSL_KEY:
     421         139 :           return sc_str(c[o], 0, 0, "ssl_key");
     422             :         case OPT_SSL_KEY_PASSWORD:
     423             :           // FIX THIS: synonym: ssl_cert_password
     424         139 :           return sc_str(c[o], 0, 0, "ssl_key_password");
     425             :         case OPT_SSL_PEER_CN:
     426         139 :           return sc_str(c[o], 0, 0, "ssl_peer_cn");
     427             :         case OPT_SSL_CIPHERS:
     428         139 :           return sc_str(c[o], 0, 0, "ssl_ciphers");
     429             :         case OPT_SSL_COMPRESSION:
     430         139 :           return sc_int(c[o], 5, 0, "ssl_compression");
     431             :         case OPT_RATELIMIT:
     432         139 :           return sc_flt(c[o], 0, 0, "ratelimit");
     433             :         case OPT_NETWORK_TIMEOUT:
     434         139 :           return sc_int(c[o], 60*60*2, 0, "network_timeout");
     435             :         case OPT_CLIENT_IS_WINDOWS:
     436         139 :           return sc_int(c[o], 0, 0, "client_is_windows");
     437             :         case OPT_PEER_VERSION:
     438         139 :           return sc_str(c[o], 0, 0, "peer_version");
     439             :         case OPT_ADDRESS:
     440         139 :           return sc_str(c[o], 0, 0, "address");
     441             :         case OPT_PORT:
     442         139 :           return sc_str(c[o], 0, 0, "port");
     443             :         case OPT_STATUS_ADDRESS:
     444         139 :           return sc_str(c[o], 0, 0, "status_address");
     445             :         case OPT_STATUS_PORT:
     446         139 :           return sc_str(c[o], 0, 0, "status_port");
     447             :         case OPT_SSL_DHFILE:
     448         139 :           return sc_str(c[o], 0, 0, "ssl_dhfile");
     449             :         case OPT_MAX_CHILDREN:
     450         139 :           return sc_int(c[o], 5, 0, "max_children");
     451             :         case OPT_MAX_STATUS_CHILDREN:
     452         139 :           return sc_int(c[o], 5, 0, "max_status_children");
     453             :         case OPT_CLIENT_LOCKDIR:
     454         139 :           return sc_str(c[o], 0, 0, "client_lockdir");
     455             :         case OPT_UMASK:
     456         139 :           return sc_mod(c[o], 0022, 0, "umask");
     457             :         case OPT_MAX_HARDLINKS:
     458         139 :           return sc_int(c[o], 10000, 0, "max_hardlinks");
     459             :         case OPT_MAX_STORAGE_SUBDIRS:
     460         139 :           return sc_int(c[o], MAX_STORAGE_SUBDIRS, 0, "max_storage_subdirs");
     461             :         case OPT_DAEMON:
     462         139 :           return sc_int(c[o], 1, 0, "daemon");
     463             :         case OPT_CA_CONF:
     464         139 :           return sc_str(c[o], 0, 0, "ca_conf");
     465             :         case OPT_CA_NAME:
     466         139 :           return sc_str(c[o], 0, 0, "ca_name");
     467             :         case OPT_CA_SERVER_NAME:
     468         139 :           return sc_str(c[o], 0, 0, "ca_server_name");
     469             :         case OPT_CA_BURP_CA:
     470         139 :           return sc_str(c[o], 0, 0, "ca_burp_ca");
     471             :         case OPT_CA_CRL_CHECK:
     472         139 :           return sc_int(c[o], 0, 0, "ca_crl_check");
     473             :         case OPT_MONITOR_LOGFILE:
     474         139 :           return sc_str(c[o], 0, 0, "monitor_logfile");
     475             :         case OPT_CNAME:
     476         139 :           return sc_str(c[o], 0, 0, "cname");
     477             :         case OPT_PASSWORD:
     478         139 :           return sc_str(c[o], 0, 0, "password");
     479             :         case OPT_PASSWD:
     480         139 :           return sc_str(c[o], 0, 0, "passwd");
     481             :         case OPT_SERVER:
     482         139 :           return sc_str(c[o], 0, 0, "server");
     483             :         case OPT_ENCRYPTION_PASSWORD:
     484         139 :           return sc_str(c[o], 0, 0, "encryption_password");
     485             :         case OPT_AUTOUPGRADE_OS:
     486         139 :           return sc_str(c[o], 0, 0, "autoupgrade_os");
     487             :         case OPT_AUTOUPGRADE_DIR:
     488         139 :           return sc_str(c[o], 0, 0, "autoupgrade_dir");
     489             :         case OPT_CA_CSR_DIR:
     490         139 :           return sc_str(c[o], 0, 0, "ca_csr_dir");
     491             :         case OPT_RANDOMISE:
     492         139 :           return sc_int(c[o], 0, 0, "randomise");
     493             :         case OPT_ENABLED:
     494         139 :           return sc_int(c[o], 1, 0, "enabled");
     495             :         case OPT_SERVER_CAN_OVERRIDE_INCLUDES:
     496         139 :           return sc_int(c[o], 1, 0, "server_can_override_includes");
     497             :         case OPT_BACKUP:
     498         139 :           return sc_str(c[o], 0, CONF_FLAG_INCEXC_RESTORE, "backup");
     499             :         case OPT_BACKUP2:
     500         139 :           return sc_str(c[o], 0, 0, "backup2");
     501             :         case OPT_RESTOREPREFIX:
     502         139 :           return sc_str(c[o], 0, CONF_FLAG_INCEXC_RESTORE, "restoreprefix");
     503             :         case OPT_RESTORE_SPOOL:
     504         139 :           return sc_str(c[o], 0, 0, "restore_spool");
     505             :         case OPT_BROWSEFILE:
     506         139 :           return sc_str(c[o], 0, 0, "browsefile");
     507             :         case OPT_BROWSEDIR:
     508         139 :           return sc_str(c[o], 0, 0, "browsedir");
     509             :         case OPT_GLOB_AFTER_SCRIPT_PRE:
     510         139 :           return sc_int(c[o], 1, 0, "glob_after_script_pre");
     511             :         case OPT_B_SCRIPT_PRE:
     512         139 :           return sc_str(c[o], 0, 0, "backup_script_pre");
     513             :         case OPT_B_SCRIPT_PRE_ARG:
     514         139 :           return sc_lst(c[o], 0, 0, "backup_script_pre_arg");
     515             :         case OPT_B_SCRIPT_POST:
     516         139 :           return sc_str(c[o], 0, 0, "backup_script_post");
     517             :         case OPT_B_SCRIPT_POST_ARG:
     518         139 :           return sc_lst(c[o], 0, 0, "backup_script_post_arg");
     519             :         case OPT_B_SCRIPT_POST_RUN_ON_FAIL:
     520         139 :           return sc_int(c[o], 0, 0, "backup_script_post_run_on_fail");
     521             :         case OPT_B_SCRIPT_RESERVED_ARGS:
     522         139 :           return sc_int(c[o], 1, 0, "backup_script_reserved_args");
     523             :         case OPT_R_SCRIPT_PRE:
     524         139 :           return sc_str(c[o], 0, 0, "restore_script_pre");
     525             :         case OPT_R_SCRIPT_PRE_ARG:
     526         139 :           return sc_lst(c[o], 0, 0, "restore_script_pre_arg");
     527             :         case OPT_R_SCRIPT_POST:
     528         139 :           return sc_str(c[o], 0, 0, "restore_script_post");
     529             :         case OPT_R_SCRIPT_POST_ARG:
     530         139 :           return sc_lst(c[o], 0, 0, "restore_script_post_arg");
     531             :         case OPT_R_SCRIPT_POST_RUN_ON_FAIL:
     532         139 :           return sc_int(c[o], 0, 0, "restore_script_post_run_on_fail");
     533             :         case OPT_B_SCRIPT:
     534         139 :           return sc_str(c[o], 0, 0, "backup_script");
     535             :         case OPT_B_SCRIPT_ARG:
     536         139 :           return sc_lst(c[o], 0, 0, "backup_script_arg");
     537             :         case OPT_R_SCRIPT:
     538         139 :           return sc_str(c[o], 0, 0, "restore_script");
     539             :         case OPT_R_SCRIPT_ARG:
     540         139 :           return sc_lst(c[o], 0, 0, "restore_script_arg");
     541             :         case OPT_R_SCRIPT_RESERVED_ARGS:
     542         139 :           return sc_int(c[o], 1, 0, "restore_script_reserved_args");
     543             :         case OPT_SEND_CLIENT_CNTR:
     544         139 :           return sc_int(c[o], 0, 0, "send_client_cntr");
     545             :         case OPT_RESTORE_CLIENT:
     546         139 :           return sc_str(c[o], 0, 0, "");
     547             :         case OPT_RESTORE_PATH:
     548         139 :           return sc_str(c[o], 0, 0, "restore_path");
     549             :         case OPT_ORIG_CLIENT:
     550         139 :           return sc_str(c[o], 0, CONF_FLAG_INCEXC_RESTORE, "orig_client");
     551             :         case OPT_CNTR:
     552         139 :           return sc_cntr(c[o], 0, 0, "");
     553             :         case OPT_BREAKPOINT:
     554         139 :           return sc_int(c[o], 0,
     555         139 :                 CONF_FLAG_CC_OVERRIDE, "breakpoint");
     556             :         case OPT_CONFFILE:
     557         139 :           return sc_str(c[o], 0,
     558         139 :                 CONF_FLAG_CC_OVERRIDE, "conffile");
     559             :         case OPT_SYSLOG:
     560         139 :           return sc_int(c[o], 0,
     561         139 :                 CONF_FLAG_CC_OVERRIDE, "syslog");
     562             :         case OPT_STDOUT:
     563         139 :           return sc_int(c[o], 1,
     564         139 :                 CONF_FLAG_CC_OVERRIDE, "stdout");
     565             :         case OPT_PROGRESS_COUNTER:
     566         139 :           return sc_int(c[o], 0,
     567         139 :                 CONF_FLAG_CC_OVERRIDE, "progress_counter");
     568             :         case OPT_USER:
     569         139 :           return sc_str(c[o], 0,
     570         139 :                 CONF_FLAG_CC_OVERRIDE, "user");
     571             :         case OPT_GROUP:
     572         139 :           return sc_str(c[o], 0,
     573         139 :                 CONF_FLAG_CC_OVERRIDE, "group");
     574             :         case OPT_PROTOCOL:
     575         139 :           return sc_epr(c[o], PROTO_AUTO,
     576         139 :                 CONF_FLAG_CC_OVERRIDE, "protocol");
     577             :         case OPT_DIRECTORY:
     578         139 :           return sc_str(c[o], 0,
     579         139 :                 CONF_FLAG_CC_OVERRIDE, "directory");
     580             :         case OPT_TIMESTAMP_FORMAT:
     581         139 :           return sc_str(c[o], 0,
     582         139 :                 CONF_FLAG_CC_OVERRIDE, "timestamp_format");
     583             :         case OPT_CLIENTCONFDIR:
     584         139 :           return sc_str(c[o], 0,
     585         139 :                 CONF_FLAG_CC_OVERRIDE, "clientconfdir");
     586             :         case OPT_FORK:
     587         139 :           return sc_int(c[o], 1, 0, "fork");
     588             :         case OPT_DIRECTORY_TREE:
     589         139 :           return sc_int(c[o], 1,
     590         139 :                 CONF_FLAG_CC_OVERRIDE, "directory_tree");
     591             :         case OPT_PASSWORD_CHECK:
     592         139 :           return sc_int(c[o], 1,
     593         139 :                 CONF_FLAG_CC_OVERRIDE, "password_check");
     594             :         case OPT_MANUAL_DELETE:
     595         139 :           return sc_str(c[o], 0,
     596         139 :                 CONF_FLAG_CC_OVERRIDE, "manual_delete");
     597             :         case OPT_MONITOR_BROWSE_CACHE:
     598         139 :           return sc_int(c[o], 0,
     599         139 :                 CONF_FLAG_CC_OVERRIDE, "monitor_browse_cache");
     600             :         case OPT_S_SCRIPT_PRE:
     601         139 :           return sc_str(c[o], 0,
     602         139 :                 CONF_FLAG_CC_OVERRIDE, "server_script_pre");
     603             :         case OPT_S_SCRIPT_PRE_ARG:
     604         139 :           return sc_lst(c[o], 0,
     605         139 :                 CONF_FLAG_CC_OVERRIDE|CONF_FLAG_STRLIST_REPLACE, "server_script_pre_arg");
     606             :         case OPT_S_SCRIPT_PRE_NOTIFY:
     607         139 :           return sc_int(c[o], 0,
     608         139 :                 CONF_FLAG_CC_OVERRIDE, "server_script_pre_notify");
     609             :         case OPT_S_SCRIPT_POST:
     610         139 :           return sc_str(c[o], 0,
     611         139 :                 CONF_FLAG_CC_OVERRIDE, "server_script_post");
     612             :         case OPT_S_SCRIPT_POST_ARG:
     613         139 :           return sc_lst(c[o], 0,
     614         139 :                 CONF_FLAG_CC_OVERRIDE|CONF_FLAG_STRLIST_REPLACE, "server_script_post_arg");
     615             :         case OPT_S_SCRIPT_POST_RUN_ON_FAIL:
     616         139 :           return sc_int(c[o], 0,
     617         139 :                 CONF_FLAG_CC_OVERRIDE, "server_script_post_run_on_fail");
     618             :         case OPT_S_SCRIPT_POST_NOTIFY:
     619         139 :           return sc_int(c[o], 0,
     620         139 :                 CONF_FLAG_CC_OVERRIDE, "server_script_post_notify");
     621             :         case OPT_S_SCRIPT:
     622         139 :           return sc_str(c[o], 0,
     623         139 :                 CONF_FLAG_CC_OVERRIDE, "server_script");
     624             :         case OPT_S_SCRIPT_ARG:
     625         139 :           return sc_lst(c[o], 0,
     626         139 :                 CONF_FLAG_CC_OVERRIDE|CONF_FLAG_STRLIST_REPLACE, "server_script_arg");
     627             :         case OPT_S_SCRIPT_NOTIFY:
     628         139 :           return sc_int(c[o], 0,
     629         139 :                 CONF_FLAG_CC_OVERRIDE, "server_script_notify");
     630             :         case OPT_HARDLINKED_ARCHIVE:
     631         139 :           return sc_int(c[o], 0,
     632         139 :                 CONF_FLAG_CC_OVERRIDE, "hardlinked_archive");
     633             :         case OPT_KEEP:
     634         139 :           return sc_lst(c[o], 0,
     635         139 :                 CONF_FLAG_CC_OVERRIDE|CONF_FLAG_STRLIST_REPLACE, "keep");
     636             :         case OPT_LIBRSYNC:
     637         139 :           return sc_int(c[o], 1,
     638         139 :                 CONF_FLAG_CC_OVERRIDE, "librsync");
     639             :         case OPT_COMPRESSION:
     640         139 :           return sc_int(c[o], 9,
     641         139 :                 CONF_FLAG_CC_OVERRIDE, "compression");
     642             :         case OPT_VERSION_WARN:
     643         139 :           return sc_int(c[o], 1,
     644         139 :                 CONF_FLAG_CC_OVERRIDE, "version_warn");
     645             :         case OPT_PATH_LENGTH_WARN:
     646         139 :           return sc_int(c[o], 1,
     647         139 :                 CONF_FLAG_CC_OVERRIDE, "path_length_warn");
     648             :         case OPT_HARD_QUOTA:
     649         139 :           return sc_u64(c[o], 0,
     650         139 :                 CONF_FLAG_CC_OVERRIDE, "hard_quota");
     651             :         case OPT_SOFT_QUOTA:
     652         139 :           return sc_u64(c[o], 0,
     653         139 :                 CONF_FLAG_CC_OVERRIDE, "soft_quota");
     654             :         case OPT_TIMER_SCRIPT:
     655         139 :           return sc_str(c[o], 0,
     656         139 :                 CONF_FLAG_CC_OVERRIDE, "timer_script");
     657             :         case OPT_TIMER_ARG:
     658         139 :           return sc_lst(c[o], 0,
     659         139 :                 CONF_FLAG_CC_OVERRIDE|CONF_FLAG_STRLIST_REPLACE, "timer_arg");
     660             :         case OPT_LABEL:
     661         139 :           return sc_lst(c[o], 0,
     662         139 :                 CONF_FLAG_CC_OVERRIDE|CONF_FLAG_STRLIST_REPLACE, "label");
     663             :         case OPT_N_SUCCESS_SCRIPT:
     664         139 :           return sc_str(c[o], 0,
     665         139 :                 CONF_FLAG_CC_OVERRIDE, "notify_success_script");
     666             :         case OPT_N_SUCCESS_ARG:
     667         139 :           return sc_lst(c[o], 0,
     668         139 :                 CONF_FLAG_CC_OVERRIDE|CONF_FLAG_STRLIST_REPLACE, "notify_success_arg");
     669             :         case OPT_N_SUCCESS_WARNINGS_ONLY:
     670         139 :           return sc_int(c[o], 0,
     671         139 :                 CONF_FLAG_CC_OVERRIDE, "notify_success_warnings_only");
     672             :         case OPT_N_SUCCESS_CHANGES_ONLY:
     673         139 :           return sc_int(c[o], 0,
     674         139 :                 CONF_FLAG_CC_OVERRIDE, "notify_success_changes_only");
     675             :         case OPT_N_FAILURE_SCRIPT:
     676         139 :           return sc_str(c[o], 0,
     677         139 :                 CONF_FLAG_CC_OVERRIDE, "notify_failure_script");
     678             :         case OPT_N_FAILURE_ARG:
     679         139 :           return sc_lst(c[o], 0,
     680         139 :                 CONF_FLAG_CC_OVERRIDE|CONF_FLAG_STRLIST_REPLACE, "notify_failure_arg");
     681             :         case OPT_RESTORE_CLIENTS:
     682         139 :           return sc_lst(c[o], 0,
     683         139 :                 CONF_FLAG_CC_OVERRIDE|CONF_FLAG_STRLIST_SORTED, "restore_client");
     684             :         case OPT_DEDUP_GROUP:
     685         139 :           return sc_str(c[o], 0,
     686         139 :                 CONF_FLAG_CC_OVERRIDE, "dedup_group");
     687             :         case OPT_CLIENT_CAN_DELETE:
     688         139 :           return sc_int(c[o], 1,
     689         139 :                 CONF_FLAG_CC_OVERRIDE, "client_can_delete");
     690             :         case OPT_CLIENT_CAN_DIFF:
     691         139 :           return sc_int(c[o], 1,
     692         139 :                 CONF_FLAG_CC_OVERRIDE, "client_can_diff");
     693             :         case OPT_CLIENT_CAN_FORCE_BACKUP:
     694         139 :           return sc_int(c[o], 1,
     695         139 :                 CONF_FLAG_CC_OVERRIDE, "client_can_force_backup");
     696             :         case OPT_CLIENT_CAN_LIST:
     697         139 :           return sc_int(c[o], 1,
     698         139 :                 CONF_FLAG_CC_OVERRIDE, "client_can_list");
     699             :         case OPT_CLIENT_CAN_RESTORE:
     700         139 :           return sc_int(c[o], 1,
     701         139 :                 CONF_FLAG_CC_OVERRIDE, "client_can_restore");
     702             :         case OPT_CLIENT_CAN_VERIFY:
     703         139 :           return sc_int(c[o], 1,
     704         139 :                 CONF_FLAG_CC_OVERRIDE, "client_can_verify");
     705             :         case OPT_SERVER_CAN_RESTORE:
     706         139 :           return sc_int(c[o], 1,
     707         139 :                 CONF_FLAG_CC_OVERRIDE, "server_can_restore");
     708             :         case OPT_WORKING_DIR_RECOVERY_METHOD:
     709         139 :           return sc_rec(c[o], RECOVERY_METHOD_DELETE,
     710         139 :                 CONF_FLAG_CC_OVERRIDE, "working_dir_recovery_method");
     711             :         case OPT_RSHASH:
     712         139 :           return sc_rsh(c[o], RSHASH_UNSET,
     713         139 :                 CONF_FLAG_CC_OVERRIDE, "");
     714             :         case OPT_MESSAGE:
     715         139 :           return sc_int(c[o], 0,
     716         139 :                 CONF_FLAG_CC_OVERRIDE, "");
     717             :         case OPT_INCEXCDIR:
     718             :           // This is a combination of OPT_INCLUDE and OPT_EXCLUDE, so
     719             :           // no field name set for now.
     720         139 :           return sc_lst(c[o], 0, CONF_FLAG_STRLIST_SORTED, "incexcdir");
     721             :         case OPT_STARTDIR:
     722             :           // This is a combination of OPT_INCLUDE and OPT_EXCLUDE, so
     723             :           // no field name set for now.
     724             :           // Deliberately not using CONF_FLAG_STRLIST_SORTED because of the
     725             :           // way finalise_start_dirs() works.
     726         139 :           return sc_lst(c[o], 0, 0, "startdir");
     727             :         case OPT_INCLUDE:
     728             :           // Combines with OPT_EXCLUDE to make OPT_INCEXCDIR and OPT_STARTDIR.
     729         139 :           return sc_lst(c[o], 0,
     730         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_INCEXC_RESTORE|CONF_FLAG_STRLIST_SORTED, "include");
     731             :         case OPT_EXCLUDE:
     732             :           // Combines with OPT_INCLUDE to make OPT_INCEXCDIR and OPT_STARTDIR.
     733         139 :           return sc_lst(c[o], 0,
     734         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_INCEXC_RESTORE|CONF_FLAG_STRLIST_SORTED, "exclude");
     735             :         case OPT_FSCHGDIR:
     736         139 :           return sc_lst(c[o], 0,
     737         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_STRLIST_SORTED, "cross_filesystem");
     738             :         case OPT_NOBACKUP:
     739         139 :           return sc_lst(c[o], 0,
     740         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_STRLIST_SORTED, "nobackup");
     741             :         case OPT_INCEXT:
     742         139 :           return sc_lst(c[o], 0,
     743         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_STRLIST_SORTED, "include_ext");
     744             :         case OPT_EXCEXT:
     745         139 :           return sc_lst(c[o], 0,
     746         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_STRLIST_SORTED, "exclude_ext");
     747             :         case OPT_INCREG:
     748         139 :           return sc_lst(c[o], 0,
     749         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_STRLIST_SORTED, "include_regex");
     750             :         case OPT_EXCREG:
     751         139 :           return sc_lst(c[o], 0,
     752         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_STRLIST_SORTED, "exclude_regex");
     753             :         case OPT_EXCFS:
     754         139 :           return sc_lst(c[o], 0,
     755         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_STRLIST_SORTED, "exclude_fs");
     756             :         case OPT_EXCOM:
     757         139 :           return sc_lst(c[o], 0,
     758         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_STRLIST_SORTED, "exclude_comp");
     759             :         case OPT_INCGLOB:
     760         139 :           return sc_lst(c[o], 0,
     761         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_STRLIST_SORTED, "include_glob");
     762             :         case OPT_CROSS_ALL_FILESYSTEMS:
     763         139 :           return sc_int(c[o], 0, CONF_FLAG_INCEXC, "cross_all_filesystems");
     764             :         case OPT_READ_ALL_FIFOS:
     765         139 :           return sc_int(c[o], 0, CONF_FLAG_INCEXC, "read_all_fifos");
     766             :         case OPT_FIFOS:
     767         139 :           return sc_lst(c[o], 0, CONF_FLAG_INCEXC, "read_fifo");
     768             :         case OPT_READ_ALL_BLOCKDEVS:
     769         139 :           return sc_int(c[o], 0, CONF_FLAG_INCEXC, "read_all_blockdevs");
     770             :         case OPT_BLOCKDEVS:
     771         139 :           return sc_lst(c[o], 0, CONF_FLAG_INCEXC, "read_blockdev");
     772             :         case OPT_MIN_FILE_SIZE:
     773         139 :           return sc_u64(c[o], 0, CONF_FLAG_INCEXC, "min_file_size");
     774             :         case OPT_MAX_FILE_SIZE:
     775         139 :           return sc_u64(c[o], 0, CONF_FLAG_INCEXC, "max_file_size");
     776             :         case OPT_SPLIT_VSS:
     777         139 :           return sc_int(c[o], 0, CONF_FLAG_INCEXC, "split_vss");
     778             :         case OPT_STRIP_VSS:
     779         139 :           return sc_int(c[o], 0, CONF_FLAG_INCEXC, "strip_vss");
     780             :         case OPT_VSS_DRIVES:
     781         139 :           return sc_str(c[o], 0, CONF_FLAG_INCEXC, "vss_drives");
     782             :         case OPT_ACL:
     783         139 :           return sc_int(c[o], 1, CONF_FLAG_INCEXC, "acl");
     784             :         case OPT_XATTR:
     785         139 :           return sc_int(c[o], 1, CONF_FLAG_INCEXC, "xattr");
     786             :         case OPT_ATIME:
     787         139 :           return sc_int(c[o], 0, CONF_FLAG_INCEXC, "atime");
     788             :         case OPT_SCAN_PROBLEM_RAISES_ERROR:
     789         139 :           return sc_int(c[o], 0, CONF_FLAG_INCEXC, "scan_problem_raises_error");
     790             :         case OPT_OVERWRITE:
     791         139 :           return sc_int(c[o], 0,
     792         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_INCEXC_RESTORE, "overwrite");
     793             :         case OPT_STRIP:
     794         139 :           return sc_int(c[o], 0,
     795         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_INCEXC_RESTORE, "strip");
     796             :         case OPT_REGEX:
     797         139 :           return sc_str(c[o], 0,
     798         139 :                 CONF_FLAG_INCEXC|CONF_FLAG_INCEXC_RESTORE, "regex");
     799             :         case OPT_MAX:
     800             :           return 0;
     801             :         // No default, so we get compiler warnings if something was missed.
     802             :         }
     803           0 :         return -1;
     804             : }
     805             : 
     806           0 : static int set_conf(struct conf *c, const char *field, const char *value)
     807             : {
     808           0 :         switch(c->conf_type)
     809             :         {
     810             :                 case CT_STRING:
     811           0 :                         if(set_string(c, value)) return 1;
     812             :                         break;
     813             :                 case CT_FLOAT:
     814           0 :                         if(set_float(c, atof(value))) return 1;
     815             :                         break;
     816             :                 case CT_E_BURP_MODE:
     817             :                 {
     818             :                         enum burp_mode bm;
     819           0 :                         bm=str_to_burp_mode(value);
     820           0 :                         if(bm==BURP_MODE_UNSET
     821           0 :                           || set_e_burp_mode(c, bm))
     822             :                                 return 1;
     823             :                         break;
     824             :                 }
     825             :                 case CT_E_RECOVERY_METHOD:
     826             :                 {
     827             :                         enum recovery_method rm;
     828           0 :                         rm=str_to_recovery_method(value);
     829           0 :                         if(rm==RECOVERY_METHOD_UNSET
     830           0 :                           || set_e_recovery_method(c, rm))
     831             :                                 return 1;
     832             :                         break;
     833             :                 }
     834             :         // FIX THIS
     835             :                 case CT_E_RSHASH:
     836             :                 case CT_UINT:
     837             :                 case CT_MODE_T:
     838             :                 case CT_SSIZE_T:
     839             :                 case CT_E_PROTOCOL:
     840             :                 case CT_STRLIST:
     841             :                 case CT_CNTR:
     842             :                         break;
     843             :         }
     844             :         return 0;
     845             : }
     846             : 
     847           0 : int conf_set(struct conf **confs, const char *field, const char *value)
     848             : {
     849           0 :         int i=0;
     850           0 :         int r=0;
     851           0 :         for(i=0; i<OPT_MAX; i++)
     852             :         {
     853           0 :                 if(strcmp(confs[i]->field, field)) continue;
     854           0 :                 r+=set_conf(confs[i], field, value);
     855             :         }
     856           0 :         return r;
     857             : }
     858             : 
     859           0 : static char *conf_data_to_str(struct conf *conf)
     860             : {
     861           0 :         size_t l=256;
     862           0 :         char *ret=NULL;
     863           0 :         if(!(ret=(char *)calloc_w(1, l, __func__))) return ret;
     864           0 :         *ret='\0';
     865           0 :         switch(conf->conf_type)
     866             :         {
     867             :                 case CT_STRING:
     868             :                         snprintf(ret, l, "%32s: %s\n", conf->field,
     869           0 :                                 get_string(conf)?get_string(conf):"");
     870             :                         break;
     871             :                 case CT_FLOAT:
     872             :                         snprintf(ret, l, "%32s: %g\n", conf->field,
     873           0 :                                 get_float(conf));
     874             :                         break;
     875             :                 case CT_E_BURP_MODE:
     876             :                         snprintf(ret, l, "%32s: %s\n", conf->field,
     877           0 :                                 burp_mode_to_str(get_e_burp_mode(conf)));
     878             :                         break;
     879             :                 case CT_E_PROTOCOL:
     880             :                         snprintf(ret, l, "%32s: %d\n", conf->field,
     881           0 :                                 get_e_protocol(conf));
     882             :                         break;
     883             :                 case CT_E_RECOVERY_METHOD:
     884             :                         snprintf(ret, l, "%32s: %s\n", conf->field,
     885             :                                 recovery_method_to_str(
     886           0 :                                         get_e_recovery_method(conf)));
     887             :                         break;
     888             :                 case CT_E_RSHASH:
     889             :                         snprintf(ret, l, "%32s: %s\n", conf->field,
     890           0 :                                 rshash_to_str(get_e_rshash(conf)));
     891             :                         break;
     892             :                 case CT_UINT:
     893             :                         snprintf(ret, l, "%32s: %u\n", conf->field,
     894           0 :                                 get_int(conf));
     895             :                         break;
     896             :                 case CT_STRLIST:
     897             :                 {
     898           0 :                         int count=0;
     899           0 :                         char piece[256]="";
     900             :                         struct strlist *s;
     901           0 :                         for(s=get_strlist(conf); s; s=s->next)
     902             :                         {
     903             :                                 snprintf(piece, sizeof(piece),
     904           0 :                                         "%32s: %s\n", conf->field, s->path);
     905           0 :                                 if(astrcat(&ret, piece, __func__))
     906           0 :                                         return ret;
     907           0 :                                 count++;
     908             :                         }
     909           0 :                         if(!count)
     910           0 :                         snprintf(ret, l, "%32s:\n", conf->field);
     911           0 :                         break;
     912             :                 }
     913             :                 case CT_MODE_T:
     914             :                         snprintf(ret, l, "%32s: %o\n", conf->field,
     915           0 :                                 get_mode_t(conf));
     916             :                         break;
     917             :                 case CT_SSIZE_T:
     918             :                         // FIX THIS
     919             :                         break;
     920             :                 case CT_CNTR:
     921             :                         break;
     922             :         }
     923           0 :         return ret;
     924             : 
     925             : }
     926             : 
     927         120 : struct conf **confs_alloc(void)
     928             : {
     929         120 :         int i=0;
     930         120 :         struct conf **confs=NULL;
     931         120 :         if(!(confs=(struct conf **)
     932             :                 calloc_w(OPT_MAX, sizeof(struct conf *), __func__)))
     933             :                         return NULL;
     934       18720 :         for(i=0; i<OPT_MAX; i++)
     935             :         {
     936             :                 struct conf *c;
     937       18720 :                 if(!(c=(struct conf *)
     938             :                         calloc_w(1, sizeof(struct conf), __func__)))
     939             :                                 return NULL;
     940       18720 :                 confs[i]=c;
     941             :         }
     942             :         return confs;
     943             : };
     944             : 
     945         138 : void confs_free(struct conf ***confs)
     946             : {
     947         138 :         int i=0;
     948         276 :         if(!confs || !*confs) return;
     949         120 :         confs_free_content(*confs);
     950       18840 :         for(i=0; i<OPT_MAX; i++)
     951       18720 :                 free_v((void **)&((*confs)[i]));
     952         120 :         free_v((void **)confs);
     953         120 :         *confs=NULL;
     954             : }
     955             : 
     956         139 : int confs_init(struct conf **confs)
     957             : {
     958         139 :         int i=0;
     959       21823 :         for(i=0; i<OPT_MAX; i++)
     960       21684 :                 if(reset_conf(confs, (enum conf_opt)i))
     961             :                         return -1;
     962             :         return 0;
     963             : }
     964             : 
     965           0 : int confs_dump(struct conf **confs, int flags)
     966             : {
     967           0 :         int i=0;
     968           0 :         char *str=NULL;
     969           0 :         for(i=0; i<OPT_MAX; i++)
     970             :         {
     971           0 :                 if(flags && !(flags & confs[i]->flags)) continue;
     972             :         //      if(!*(confs[i]->field)) continue;
     973           0 :                 str=conf_data_to_str(confs[i]);
     974           0 :                 if(str && *str) printf("%s", str);
     975           0 :                 free_w(&str);
     976             :         }
     977           0 :         return 0;
     978             : }

Generated by: LCOV version 1.10