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

Generated by: LCOV version 1.13