LCOV - code coverage report
Current view: top level - src - conf.c (source / functions) Hit Total Coverage
Test: burp-coverage-clean.info Lines: 406 518 78.4 %
Date: 2015-10-31 Functions: 48 58 82.8 %

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

Generated by: LCOV version 1.10