LCOV - code coverage report
Current view: top level - fwknop.git/server - config_init.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 296 304 97.4 %
Date: 2014-07-28 Functions: 11 11 100.0 %
Branches: 186 207 89.9 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  ******************************************************************************
       3                 :            :  *
       4                 :            :  * File:    config_init.c
       5                 :            :  *
       6                 :            :  * Purpose: Command-line and config file processing for fwknop server.
       7                 :            :  *
       8                 :            :  *  Fwknop is developed primarily by the people listed in the file 'AUTHORS'.
       9                 :            :  *  Copyright (C) 2009-2014 fwknop developers and contributors. For a full
      10                 :            :  *  list of contributors, see the file 'CREDITS'.
      11                 :            :  *
      12                 :            :  *  License (GNU General Public License):
      13                 :            :  *
      14                 :            :  *  This program is free software; you can redistribute it and/or
      15                 :            :  *  modify it under the terms of the GNU General Public License
      16                 :            :  *  as published by the Free Software Foundation; either version 2
      17                 :            :  *  of the License, or (at your option) any later version.
      18                 :            :  *
      19                 :            :  *  This program is distributed in the hope that it will be useful,
      20                 :            :  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
      21                 :            :  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      22                 :            :  *  GNU General Public License for more details.
      23                 :            :  *
      24                 :            :  *  You should have received a copy of the GNU General Public License
      25                 :            :  *  along with this program; if not, write to the Free Software
      26                 :            :  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
      27                 :            :  *  USA
      28                 :            :  *
      29                 :            :  ******************************************************************************
      30                 :            : */
      31                 :            : #include "fwknopd_common.h"
      32                 :            : #include "fwknopd_errors.h"
      33                 :            : #include "config_init.h"
      34                 :            : #include "access.h"
      35                 :            : #include "cmd_opts.h"
      36                 :            : #include "utils.h"
      37                 :            : #include "log_msg.h"
      38                 :            : 
      39                 :            : #if FIREWALL_IPTABLES
      40                 :            :   #include "fw_util_iptables.h"
      41                 :            : #endif
      42                 :            : 
      43                 :            : /* Check to see if an integer variable has a value that is within a
      44                 :            :  * specific range
      45                 :            : */
      46                 :            : static void
      47                 :      14433 : range_check(fko_srv_options_t *opts, char *var, char *val, int low, int high)
      48                 :            : {
      49                 :            :     int     is_err;
      50                 :            : 
      51                 :      14433 :     strtol_wrapper(val, low, high, NO_EXIT_UPON_ERR, &is_err);
      52         [ +  + ]:      14433 :     if(is_err != FKO_SUCCESS)
      53                 :            :     {
      54                 :          1 :         log_msg(LOG_ERR, "[*] var %s value '%s' not in the range %d-%d",
      55                 :            :             var, val, low, high);
      56                 :          1 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
      57                 :            :     }
      58                 :            : 
      59                 :      14432 :     return;
      60                 :            : }
      61                 :            : 
      62                 :            : /* Take an index and a string value. malloc the space for the value
      63                 :            :  * and assign it to the array at the specified index.
      64                 :            : */
      65                 :            : static void
      66                 :     156419 : set_config_entry(fko_srv_options_t *opts, const int var_ndx, const char *value)
      67                 :            : {
      68                 :            :     int space_needed;
      69                 :            : 
      70                 :            :     /* Sanity check the index value.
      71                 :            :     */
      72         [ -  + ]:     156419 :     if(var_ndx < 0 || var_ndx >= NUMBER_OF_CONFIG_ENTRIES)
      73                 :            :     {
      74                 :          0 :         log_msg(LOG_ERR, "[*] Index value of %i is not valid", var_ndx);
      75                 :          0 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
      76                 :            :     }
      77                 :            : 
      78                 :            :     /* If this particular entry was already set (i.e. not NULL), then
      79                 :            :      * assume it needs to be freed first.
      80                 :            :     */
      81         [ +  + ]:     156419 :     if(opts->config[var_ndx] != NULL)
      82                 :        351 :         free(opts->config[var_ndx]);
      83                 :            : 
      84                 :            :     /* If we are setting it to NULL, do it and be done.
      85                 :            :     */
      86         [ -  + ]:     156419 :     if(value == NULL)
      87                 :            :     {
      88                 :          0 :         opts->config[var_ndx] = NULL;
      89                 :          0 :         return;
      90                 :            :     }
      91                 :            : 
      92                 :            :     /* Otherwise, make the space we need and set it.
      93                 :            :     */
      94                 :     156419 :     space_needed = strlen(value) + 1;
      95                 :            : 
      96                 :     156419 :     opts->config[var_ndx] = calloc(1, space_needed);
      97                 :            : 
      98         [ +  + ]:     156419 :     if(opts->config[var_ndx] == NULL)
      99                 :            :     {
     100                 :       1539 :         log_msg(LOG_ERR, "[*] Fatal memory allocation error!");
     101                 :       1539 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     102                 :            :     }
     103                 :            : 
     104                 :     154880 :     strlcpy(opts->config[var_ndx], value, space_needed);
     105                 :            : 
     106                 :     154880 :     return;
     107                 :            : }
     108                 :            : 
     109                 :            : /* Given a config parameter name, return its index or -1 if not found.
     110                 :            : */
     111                 :            : static int
     112                 :          6 : config_entry_index(const fko_srv_options_t *opts, const char *var)
     113                 :            : {
     114                 :            :     int i;
     115                 :            : 
     116         [ +  + ]:        250 :     for(i=0; i<NUMBER_OF_CONFIG_ENTRIES; i++)
     117 [ +  + ][ +  + ]:        246 :         if(opts->config[i] != NULL && CONF_VAR_IS(var, config_map[i]))
     118                 :            :             return(i);
     119                 :            : 
     120                 :            :     return(-1);
     121                 :            : }
     122                 :            : 
     123                 :            : /* Free the config memory
     124                 :            : */
     125                 :            : void
     126                 :       5315 : free_configs(fko_srv_options_t *opts)
     127                 :            : {
     128                 :            :     int i;
     129                 :            : 
     130                 :       5315 :     free_acc_stanzas(opts);
     131                 :            : 
     132         [ +  + ]:     239175 :     for(i=0; i<NUMBER_OF_CONFIG_ENTRIES; i++)
     133         [ +  + ]:     233860 :         if(opts->config[i] != NULL)
     134                 :     154148 :             free(opts->config[i]);
     135                 :       5315 : }
     136                 :            : 
     137                 :            : static void
     138                 :       3609 : validate_int_var_ranges(fko_srv_options_t *opts)
     139                 :            : {
     140                 :            : #if FIREWALL_IPFW
     141                 :            :     int     is_err = FKO_SUCCESS;
     142                 :            : #endif
     143                 :            : 
     144                 :       3609 :     range_check(opts, "PCAP_LOOP_SLEEP", opts->config[CONF_PCAP_LOOP_SLEEP],
     145                 :            :         1, RCHK_MAX_PCAP_LOOP_SLEEP);
     146                 :       3608 :     range_check(opts, "MAX_SPA_PACKET_AGE", opts->config[CONF_MAX_SPA_PACKET_AGE],
     147                 :            :         1, RCHK_MAX_SPA_PACKET_AGE);
     148                 :       3608 :     range_check(opts, "MAX_SNIFF_BYTES", opts->config[CONF_MAX_SNIFF_BYTES],
     149                 :            :         1, RCHK_MAX_SNIFF_BYTES);
     150                 :       3608 :     range_check(opts, "TCPSERV_PORT", opts->config[CONF_TCPSERV_PORT],
     151                 :            :         1, RCHK_MAX_TCPSERV_PORT);
     152                 :            : 
     153                 :            : #if FIREWALL_IPFW
     154                 :            :     range_check(opts, "IPFW_START_RULE_NUM", opts->config[CONF_IPFW_START_RULE_NUM],
     155                 :            :         0, RCHK_MAX_IPFW_START_RULE_NUM);
     156                 :            :     range_check(opts, "IPFW_MAX_RULES", opts->config[CONF_IPFW_MAX_RULES],
     157                 :            :         1, RCHK_MAX_IPFW_MAX_RULES);
     158                 :            :     range_check(opts, "IPFW_ACTIVE_SET_NUM", opts->config[CONF_IPFW_ACTIVE_SET_NUM],
     159                 :            :         0, RCHK_MAX_IPFW_SET_NUM);
     160                 :            :     range_check(opts, "IPFW_EXPIRE_SET_NUM", opts->config[CONF_IPFW_EXPIRE_SET_NUM],
     161                 :            :         0, RCHK_MAX_IPFW_SET_NUM);
     162                 :            :     range_check(opts, "IPFW_EXPIRE_PURGE_INTERVAL",
     163                 :            :         opts->config[CONF_IPFW_EXPIRE_PURGE_INTERVAL],
     164                 :            :         1, RCHK_MAX_IPFW_PURGE_INTERVAL);
     165                 :            : 
     166                 :            :     /* Make sure the active and expire sets are not identical whenever
     167                 :            :      * they are non-zero
     168                 :            :     */
     169                 :            :     if((strtol_wrapper(opts->config[CONF_IPFW_ACTIVE_SET_NUM],
     170                 :            :                     0, RCHK_MAX_IPFW_SET_NUM, NO_EXIT_UPON_ERR, &is_err) > 0
     171                 :            :             && strtol_wrapper(opts->config[CONF_IPFW_EXPIRE_SET_NUM],
     172                 :            :                 0, RCHK_MAX_IPFW_SET_NUM, NO_EXIT_UPON_ERR, &is_err) > 0)
     173                 :            :             && strtol_wrapper(opts->config[CONF_IPFW_ACTIVE_SET_NUM],
     174                 :            :                 0, RCHK_MAX_IPFW_SET_NUM, NO_EXIT_UPON_ERR, &is_err)
     175                 :            :                 == strtol_wrapper(opts->config[CONF_IPFW_EXPIRE_SET_NUM],
     176                 :            :                     0, RCHK_MAX_IPFW_SET_NUM, NO_EXIT_UPON_ERR, &is_err))
     177                 :            :     {
     178                 :            :         log_msg(LOG_ERR,
     179                 :            :                 "[*] Cannot set identical ipfw active and expire sets.");
     180                 :            :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     181                 :            :     }
     182                 :            : 
     183                 :            :     if(is_err != FKO_SUCCESS)
     184                 :            :     {
     185                 :            :         log_msg(LOG_ERR, "[*] invalid integer conversion error.\n");
     186                 :            :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     187                 :            :     }
     188                 :            : 
     189                 :            : #elif FIREWALL_PF
     190                 :            :     range_check(opts, "PF_EXPIRE_INTERVAL", opts->config[CONF_PF_EXPIRE_INTERVAL],
     191                 :            :         1, RCHK_MAX_PF_EXPIRE_INTERVAL);
     192                 :            : 
     193                 :            : #endif /* FIREWALL type */
     194                 :            : 
     195                 :       3608 :     return;
     196                 :            : }
     197                 :            : 
     198                 :            : /* Parse the config file...
     199                 :            : */
     200                 :            : static void
     201                 :      10005 : parse_config_file(fko_srv_options_t *opts, const char *config_file)
     202                 :            : {
     203                 :            :     FILE           *cfile_ptr;
     204                 :      10005 :     unsigned int    numLines = 0;
     205                 :            :     unsigned int    i, good_ent;
     206                 :            :     int             cndx;
     207                 :            : 
     208                 :      10005 :     char            conf_line_buf[MAX_LINE_LEN] = {0};
     209                 :      10005 :     char            var[MAX_LINE_LEN]  = {0};
     210                 :      10005 :     char            val[MAX_LINE_LEN]  = {0};
     211                 :      10005 :     char            tmp1[MAX_LINE_LEN] = {0};
     212                 :      10005 :     char            tmp2[MAX_LINE_LEN] = {0};
     213                 :            : 
     214                 :            :     struct stat     st;
     215                 :            : 
     216                 :            :     /* Make sure the config file exists.
     217                 :            :     */
     218         [ +  + ]:      10005 :     if(stat(config_file, &st) != 0)
     219                 :            :     {
     220                 :          2 :         log_msg(LOG_ERR, "[*] Config file: '%s' was not found.",
     221                 :            :             config_file);
     222                 :          2 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     223                 :            :     }
     224                 :            : 
     225         [ -  + ]:      10003 :     if(verify_file_perms_ownership(config_file) != 1)
     226                 :          0 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     227                 :            : 
     228                 :            :     /* See the comment in the parse_access_file() function regarding security
     229                 :            :      * here relative to a TOCTOU bug flagged by Coverity.
     230                 :            :     */
     231         [ +  + ]:      10003 :     if ((cfile_ptr = fopen(config_file, "r")) == NULL)
     232                 :            :     {
     233                 :        158 :         log_msg(LOG_ERR, "[*] Could not open config file: %s",
     234                 :            :             config_file);
     235                 :        158 :         perror(NULL);
     236                 :            : 
     237                 :      10003 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     238                 :            :     }
     239                 :            : 
     240         [ +  + ]:      20681 :     while ((fgets(conf_line_buf, MAX_LINE_LEN, cfile_ptr)) != NULL)
     241                 :            :     {
     242                 :      10836 :         numLines++;
     243                 :      10836 :         conf_line_buf[MAX_LINE_LEN-1] = '\0';
     244                 :            : 
     245                 :            :         /* Get past comments and empty lines (note: we only look at the
     246                 :            :          * first character.
     247                 :            :         */
     248 [ +  + ][ +  - ]:      10836 :         if(IS_EMPTY_LINE(conf_line_buf[0]))
         [ +  - ][ -  + ]
     249                 :      10130 :             continue;
     250                 :            : 
     251         [ +  + ]:        706 :         if(sscanf(conf_line_buf, "%s %[^;\n\r]", var, val) != 2)
     252                 :            :         {
     253                 :          2 :             log_msg(LOG_ERR,
     254                 :            :                 "*Invalid config file entry in %s at line %i.\n - '%s'",
     255                 :            :                 config_file, numLines, conf_line_buf
     256                 :            :             );
     257                 :          2 :             continue;
     258                 :            :         }
     259                 :            : 
     260                 :            :         good_ent = 0;
     261         [ +  - ]:      13861 :         for(i=0; i<NUMBER_OF_CONFIG_ENTRIES; i++)
     262                 :            :         {
     263         [ +  + ]:      13861 :             if(CONF_VAR_IS(config_map[i], var))
     264                 :            :             {
     265                 :            :                 /* First check to see if we need to do a varable expansion
     266                 :            :                  * on this value.  Note: this only supports one expansion and
     267                 :            :                  * only if the value starts with the variable.
     268                 :            :                 */
     269         [ +  + ]:        704 :                 if(*val == '$')
     270                 :            :                 {
     271         [ +  - ]:          6 :                     if(sscanf((val+1), "%[A-Z_]%s", tmp1, tmp2))
     272                 :            :                     {
     273         [ +  + ]:          6 :                         if((cndx = config_entry_index(opts, tmp1)) >= 0)
     274                 :            :                         {
     275                 :          2 :                             strlcpy(val, opts->config[cndx], sizeof(val));
     276                 :          2 :                             strlcat(val, tmp2, sizeof(val));
     277                 :            :                         }
     278                 :            :                         else
     279                 :            :                         {
     280                 :            :                             /* We didn't map the embedded variable to a valid
     281                 :            :                              * config parameter
     282                 :            :                             */
     283                 :          4 :                             log_msg(LOG_ERR,
     284                 :            :                                 "[*] Invalid embedded variable in: '%s'", val);
     285                 :          4 :                             break;
     286                 :            :                         }
     287                 :            :                     }
     288                 :            :                 }
     289                 :            : 
     290                 :        700 :                 set_config_entry(opts, i, val);
     291                 :        700 :                 good_ent++;
     292                 :        700 :                 break;
     293                 :            :             }
     294                 :            :         }
     295                 :            : 
     296         [ +  + ]:        704 :         if(good_ent == 0)
     297                 :      10836 :             log_msg(LOG_ERR,
     298                 :            :                 "[*] Ignoring unknown configuration parameter: '%s' in %s",
     299                 :            :                 var, config_file
     300                 :            :             );
     301                 :            :     }
     302                 :            : 
     303                 :       9845 :     fclose(cfile_ptr);
     304                 :            : 
     305                 :       9845 :     return;
     306                 :            : }
     307                 :            : 
     308                 :            : /* Set defaults, and do sanity and bounds checks for the various options.
     309                 :            : */
     310                 :            : static void
     311                 :       4624 : validate_options(fko_srv_options_t *opts)
     312                 :            : {
     313                 :       4624 :     char tmp_path[MAX_PATH_LEN] = {0};
     314                 :            : 
     315                 :            :     /* If no conf dir is set in the config file, use the default.
     316                 :            :     */
     317         [ +  - ]:       4624 :     if(opts->config[CONF_FWKNOP_CONF_DIR] == NULL)
     318                 :       4624 :         set_config_entry(opts, CONF_FWKNOP_CONF_DIR, DEF_CONF_DIR);
     319                 :            : 
     320                 :            :     /* If no access.conf path was specified on the command line or set in
     321                 :            :      * the config file, use the default.
     322                 :            :     */
     323         [ -  + ]:       4565 :     if(opts->config[CONF_ACCESS_FILE] == NULL)
     324                 :          0 :         set_config_entry(opts, CONF_ACCESS_FILE, DEF_ACCESS_FILE);
     325                 :            : 
     326                 :            :     /* If the pid and digest cache files where not set in the config file or
     327                 :            :      * via command-line, then grab the defaults. Start with RUN_DIR as the
     328                 :            :      * files may depend on that.
     329                 :            :     */
     330         [ +  + ]:       4565 :     if(opts->config[CONF_FWKNOP_RUN_DIR] == NULL)
     331                 :       4561 :         set_config_entry(opts, CONF_FWKNOP_RUN_DIR, DEF_RUN_DIR);
     332                 :            : 
     333         [ +  + ]:       4506 :     if(opts->config[CONF_FWKNOP_PID_FILE] == NULL)
     334                 :            :     {
     335                 :         19 :         strlcpy(tmp_path, opts->config[CONF_FWKNOP_RUN_DIR], sizeof(tmp_path));
     336                 :            : 
     337         [ +  - ]:         19 :         if(tmp_path[strlen(tmp_path)-1] != '/')
     338                 :         19 :             strlcat(tmp_path, "/", sizeof(tmp_path));
     339                 :            : 
     340                 :         19 :         strlcat(tmp_path, DEF_PID_FILENAME, sizeof(tmp_path));
     341                 :            : 
     342                 :         19 :         set_config_entry(opts, CONF_FWKNOP_PID_FILE, tmp_path);
     343                 :            :     }
     344                 :            : 
     345                 :            : #if USE_FILE_CACHE
     346         [ +  + ]:       4506 :     if(opts->config[CONF_DIGEST_FILE] == NULL)
     347                 :            : #else
     348                 :            :     if(opts->config[CONF_DIGEST_DB_FILE] == NULL)
     349                 :            : #endif
     350                 :            :     {
     351                 :         18 :         strlcpy(tmp_path, opts->config[CONF_FWKNOP_RUN_DIR], sizeof(tmp_path));
     352                 :            : 
     353         [ +  - ]:         18 :         if(tmp_path[strlen(tmp_path)-1] != '/')
     354                 :         18 :             strlcat(tmp_path, "/", sizeof(tmp_path));
     355                 :            : 
     356                 :            : 
     357                 :            : #if USE_FILE_CACHE
     358                 :         18 :         strlcat(tmp_path, DEF_DIGEST_CACHE_FILENAME, sizeof(tmp_path));
     359                 :         18 :         set_config_entry(opts, CONF_DIGEST_FILE, tmp_path);
     360                 :            : #else
     361                 :            :         strlcat(tmp_path, DEF_DIGEST_CACHE_DB_FILENAME, sizeof(tmp_path));
     362                 :            :         set_config_entry(opts, CONF_DIGEST_DB_FILE, tmp_path);
     363                 :            : #endif
     364                 :            :     }
     365                 :            : 
     366                 :            :     /* Set remaining require CONF_ vars if they are not already set.  */
     367                 :            : 
     368                 :            :     /* PCAP capture interface - note that if '-r <pcap file>' is specified
     369                 :            :      * on the command line, then this will override the pcap interface setting.
     370                 :            :     */
     371         [ +  + ]:       4506 :     if(opts->config[CONF_PCAP_INTF] == NULL)
     372                 :       2499 :         set_config_entry(opts, CONF_PCAP_INTF, DEF_INTERFACE);
     373                 :            : 
     374                 :            :     /* PCAP Promiscuous mode.
     375                 :            :     */
     376         [ +  + ]:       4488 :     if(opts->config[CONF_ENABLE_PCAP_PROMISC] == NULL)
     377                 :       4485 :         set_config_entry(opts, CONF_ENABLE_PCAP_PROMISC,
     378                 :            :             DEF_ENABLE_PCAP_PROMISC);
     379                 :            : 
     380                 :            :     /* The packet count argument to pcap_dispatch()
     381                 :            :     */
     382         [ +  + ]:       4444 :     if(opts->config[CONF_PCAP_DISPATCH_COUNT] == NULL)
     383                 :       4443 :         set_config_entry(opts, CONF_PCAP_DISPATCH_COUNT,
     384                 :            :             DEF_PCAP_DISPATCH_COUNT);
     385                 :            : 
     386                 :            :     /* Microseconds to sleep between pcap loop iterations
     387                 :            :     */
     388         [ +  + ]:       4385 :     if(opts->config[CONF_PCAP_LOOP_SLEEP] == NULL)
     389                 :       4384 :         set_config_entry(opts, CONF_PCAP_LOOP_SLEEP,
     390                 :            :             DEF_PCAP_LOOP_SLEEP);
     391                 :            : 
     392                 :            :     /* PCAP Filter.
     393                 :            :     */
     394         [ +  + ]:       4332 :     if(opts->config[CONF_PCAP_FILTER] == NULL)
     395                 :       4318 :         set_config_entry(opts, CONF_PCAP_FILTER, DEF_PCAP_FILTER);
     396                 :            : 
     397                 :            :     /* Enable SPA packet aging unless we're getting packet data
     398                 :            :      * directly from a pcap file
     399                 :            :     */
     400         [ +  + ]:       4295 :     if(opts->config[CONF_ENABLE_SPA_PACKET_AGING] == NULL)
     401                 :            :     {
     402         [ +  + ]:       4215 :         if(opts->config[CONF_PCAP_FILE] == NULL)
     403                 :            :         {
     404                 :       3740 :             set_config_entry(opts, CONF_ENABLE_SPA_PACKET_AGING,
     405                 :            :                 DEF_ENABLE_SPA_PACKET_AGING);
     406                 :            :         }
     407                 :            :         else
     408                 :            :         {
     409                 :        475 :             set_config_entry(opts, CONF_ENABLE_SPA_PACKET_AGING, "N");
     410                 :            :         }
     411                 :            :     }
     412                 :            : 
     413                 :            :     /* SPA packet age.
     414                 :            :     */
     415         [ +  - ]:       4248 :     if(opts->config[CONF_MAX_SPA_PACKET_AGE] == NULL)
     416                 :       4248 :         set_config_entry(opts, CONF_MAX_SPA_PACKET_AGE,
     417                 :            :             DEF_MAX_SPA_PACKET_AGE);
     418                 :            : 
     419                 :            : 
     420                 :            :     /* Enable digest persistence.
     421                 :            :     */
     422         [ +  - ]:       4211 :     if(opts->config[CONF_ENABLE_DIGEST_PERSISTENCE] == NULL)
     423                 :       4211 :         set_config_entry(opts, CONF_ENABLE_DIGEST_PERSISTENCE,
     424                 :            :             DEF_ENABLE_DIGEST_PERSISTENCE);
     425                 :            : 
     426                 :            :     /* Max sniff bytes.
     427                 :            :     */
     428         [ +  - ]:       4171 :     if(opts->config[CONF_MAX_SNIFF_BYTES] == NULL)
     429                 :       4171 :         set_config_entry(opts, CONF_MAX_SNIFF_BYTES, DEF_MAX_SNIFF_BYTES);
     430                 :            : 
     431                 :            : #if FIREWALL_IPTABLES
     432                 :            :     /* Enable IPT forwarding.
     433                 :            :     */
     434         [ +  + ]:       4129 :     if(opts->config[CONF_ENABLE_IPT_FORWARDING] == NULL)
     435                 :       4011 :         set_config_entry(opts, CONF_ENABLE_IPT_FORWARDING,
     436                 :            :             DEF_ENABLE_IPT_FORWARDING);
     437                 :            : 
     438                 :            :     /* Enable IPT local NAT.
     439                 :            :     */
     440         [ +  + ]:       4091 :     if(opts->config[CONF_ENABLE_IPT_LOCAL_NAT] == NULL)
     441                 :       4058 :         set_config_entry(opts, CONF_ENABLE_IPT_LOCAL_NAT,
     442                 :            :             DEF_ENABLE_IPT_LOCAL_NAT);
     443                 :            : 
     444                 :            :     /* Enable IPT SNAT.
     445                 :            :     */
     446         [ +  + ]:       4059 :     if(opts->config[CONF_ENABLE_IPT_SNAT] == NULL)
     447                 :       4028 :         set_config_entry(opts, CONF_ENABLE_IPT_SNAT,
     448                 :            :             DEF_ENABLE_IPT_SNAT);
     449                 :            : 
     450                 :            :     /* Make sure we have a valid IP if SNAT is enabled
     451                 :            :     */
     452         [ +  + ]:       4026 :     if(strncasecmp(opts->config[CONF_ENABLE_IPT_SNAT], "Y", 1) == 0)
     453                 :            :     {
     454                 :            :         /* Note that fw_config_init() will set use_masquerade if necessary
     455                 :            :         */
     456         [ +  + ]:         31 :         if(opts->config[CONF_SNAT_TRANSLATE_IP] != NULL)
     457                 :            :         {
     458         [ +  + ]:         16 :             if(! is_valid_ipv4_addr(opts->config[CONF_SNAT_TRANSLATE_IP]))
     459                 :            :             {
     460                 :          1 :                 log_msg(LOG_ERR,
     461                 :            :                     "Invalid IPv4 addr for SNAT_TRANSLATE_IP"
     462                 :            :                 );
     463                 :          1 :                 clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     464                 :            :             }
     465                 :            :         }
     466                 :            :     }
     467                 :            : 
     468                 :            :     /* Enable IPT OUTPUT.
     469                 :            :     */
     470         [ +  + ]:       4025 :     if(opts->config[CONF_ENABLE_IPT_OUTPUT] == NULL)
     471                 :       4024 :         set_config_entry(opts, CONF_ENABLE_IPT_OUTPUT,
     472                 :            :             DEF_ENABLE_IPT_OUTPUT);
     473                 :            : 
     474                 :            :     /* Flush IPT at init.
     475                 :            :     */
     476         [ +  + ]:       3992 :     if(opts->config[CONF_FLUSH_IPT_AT_INIT] == NULL)
     477                 :       3984 :         set_config_entry(opts, CONF_FLUSH_IPT_AT_INIT, DEF_FLUSH_IPT_AT_INIT);
     478                 :            : 
     479                 :            :     /* Flush IPT at exit.
     480                 :            :     */
     481         [ +  + ]:       3969 :     if(opts->config[CONF_FLUSH_IPT_AT_EXIT] == NULL)
     482                 :       3961 :         set_config_entry(opts, CONF_FLUSH_IPT_AT_EXIT, DEF_FLUSH_IPT_AT_EXIT);
     483                 :            : 
     484                 :            :     /* IPT input access.
     485                 :            :     */
     486         [ +  + ]:       3943 :     if(opts->config[CONF_IPT_INPUT_ACCESS] == NULL)
     487                 :       3931 :         set_config_entry(opts, CONF_IPT_INPUT_ACCESS,
     488                 :            :             DEF_IPT_INPUT_ACCESS);
     489                 :            : 
     490         [ +  + ]:       3912 :     if(validate_ipt_chain_conf(opts->config[CONF_IPT_INPUT_ACCESS]) != 1)
     491                 :            :     {
     492                 :          3 :         log_msg(LOG_ERR,
     493                 :            :             "Invalid IPT_INPUT_ACCESS specification, see fwknopd.conf comments"
     494                 :            :         );
     495                 :          3 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     496                 :            :     }
     497                 :            : 
     498                 :            :     /* IPT output access.
     499                 :            :     */
     500         [ +  + ]:       3909 :     if(opts->config[CONF_IPT_OUTPUT_ACCESS] == NULL)
     501                 :       3907 :         set_config_entry(opts, CONF_IPT_OUTPUT_ACCESS,
     502                 :            :             DEF_IPT_OUTPUT_ACCESS);
     503                 :            : 
     504         [ +  + ]:       3876 :     if(validate_ipt_chain_conf(opts->config[CONF_IPT_OUTPUT_ACCESS]) != 1)
     505                 :            :     {
     506                 :          1 :         log_msg(LOG_ERR,
     507                 :            :             "Invalid IPT_OUTPUT_ACCESS specification, see fwknopd.conf comments"
     508                 :            :         );
     509                 :          1 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     510                 :            :     }
     511                 :            : 
     512                 :            :     /* IPT forward access.
     513                 :            :     */
     514         [ +  + ]:       3875 :     if(opts->config[CONF_IPT_FORWARD_ACCESS] == NULL)
     515                 :       3871 :         set_config_entry(opts, CONF_IPT_FORWARD_ACCESS,
     516                 :            :             DEF_IPT_FORWARD_ACCESS);
     517                 :            : 
     518         [ +  + ]:       3844 :     if(validate_ipt_chain_conf(opts->config[CONF_IPT_FORWARD_ACCESS]) != 1)
     519                 :            :     {
     520                 :          1 :         log_msg(LOG_ERR,
     521                 :            :             "Invalid IPT_FORWARD_ACCESS specification, see fwknopd.conf comments"
     522                 :            :         );
     523                 :          1 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     524                 :            :     }
     525                 :            : 
     526                 :            :     /* IPT dnat access.
     527                 :            :     */
     528         [ +  + ]:       3843 :     if(opts->config[CONF_IPT_DNAT_ACCESS] == NULL)
     529                 :       3839 :         set_config_entry(opts, CONF_IPT_DNAT_ACCESS,
     530                 :            :             DEF_IPT_DNAT_ACCESS);
     531                 :            : 
     532         [ +  + ]:       3812 :     if(validate_ipt_chain_conf(opts->config[CONF_IPT_DNAT_ACCESS]) != 1)
     533                 :            :     {
     534                 :          1 :         log_msg(LOG_ERR,
     535                 :            :             "Invalid IPT_DNAT_ACCESS specification, see fwknopd.conf comments"
     536                 :            :         );
     537                 :          1 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     538                 :            :     }
     539                 :            : 
     540                 :            :     /* IPT snat access.
     541                 :            :     */
     542         [ +  + ]:       3811 :     if(opts->config[CONF_IPT_SNAT_ACCESS] == NULL)
     543                 :       3810 :         set_config_entry(opts, CONF_IPT_SNAT_ACCESS,
     544                 :            :             DEF_IPT_SNAT_ACCESS);
     545                 :            : 
     546         [ +  + ]:       3779 :     if(validate_ipt_chain_conf(opts->config[CONF_IPT_SNAT_ACCESS]) != 1)
     547                 :            :     {
     548                 :          1 :         log_msg(LOG_ERR,
     549                 :            :             "Invalid IPT_SNAT_ACCESS specification, see fwknopd.conf comments"
     550                 :            :         );
     551                 :          1 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     552                 :            :     }
     553                 :            : 
     554                 :            :     /* IPT masquerade access.
     555                 :            :     */
     556         [ +  + ]:       3778 :     if(opts->config[CONF_IPT_MASQUERADE_ACCESS] == NULL)
     557                 :       3777 :         set_config_entry(opts, CONF_IPT_MASQUERADE_ACCESS,
     558                 :            :             DEF_IPT_MASQUERADE_ACCESS);
     559                 :            : 
     560         [ +  + ]:       3755 :     if(validate_ipt_chain_conf(opts->config[CONF_IPT_MASQUERADE_ACCESS]) != 1)
     561                 :            :     {
     562                 :          1 :         log_msg(LOG_ERR,
     563                 :            :             "Invalid IPT_MASQUERADE_ACCESS specification, see fwknopd.conf comments"
     564                 :            :         );
     565                 :          1 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     566                 :            :     }
     567                 :            : 
     568                 :            :     /* Check for the iptables 'comment' match at init time
     569                 :            :     */
     570         [ +  - ]:       3754 :     if(opts->config[CONF_ENABLE_IPT_COMMENT_CHECK] == NULL)
     571                 :       3754 :         set_config_entry(opts, CONF_ENABLE_IPT_COMMENT_CHECK,
     572                 :            :             DEF_ENABLE_IPT_COMMENT_CHECK);
     573                 :            : 
     574                 :            : #elif FIREWALL_IPFW
     575                 :            : 
     576                 :            :     /* Flush ipfw rules at init.
     577                 :            :     */
     578                 :            :     if(opts->config[CONF_FLUSH_IPFW_AT_INIT] == NULL)
     579                 :            :         set_config_entry(opts, CONF_FLUSH_IPFW_AT_INIT, DEF_FLUSH_IPFW_AT_INIT);
     580                 :            : 
     581                 :            :     /* Flush ipfw rules at exit.
     582                 :            :     */
     583                 :            :     if(opts->config[CONF_FLUSH_IPFW_AT_EXIT] == NULL)
     584                 :            :         set_config_entry(opts, CONF_FLUSH_IPFW_AT_EXIT, DEF_FLUSH_IPFW_AT_EXIT);
     585                 :            : 
     586                 :            :     /* Set IPFW start rule number.
     587                 :            :     */
     588                 :            :     if(opts->config[CONF_IPFW_START_RULE_NUM] == NULL)
     589                 :            :         set_config_entry(opts, CONF_IPFW_START_RULE_NUM,
     590                 :            :             DEF_IPFW_START_RULE_NUM);
     591                 :            : 
     592                 :            :     /* Set IPFW max rules.
     593                 :            :     */
     594                 :            :     if(opts->config[CONF_IPFW_MAX_RULES] == NULL)
     595                 :            :         set_config_entry(opts, CONF_IPFW_MAX_RULES,
     596                 :            :             DEF_IPFW_MAX_RULES);
     597                 :            : 
     598                 :            :     /* Set IPFW active set number.
     599                 :            :     */
     600                 :            :     if(opts->config[CONF_IPFW_ACTIVE_SET_NUM] == NULL)
     601                 :            :         set_config_entry(opts, CONF_IPFW_ACTIVE_SET_NUM,
     602                 :            :             DEF_IPFW_ACTIVE_SET_NUM);
     603                 :            : 
     604                 :            :     /* Set IPFW expire set number.
     605                 :            :     */
     606                 :            :     if(opts->config[CONF_IPFW_EXPIRE_SET_NUM] == NULL)
     607                 :            :         set_config_entry(opts, CONF_IPFW_EXPIRE_SET_NUM,
     608                 :            :             DEF_IPFW_EXPIRE_SET_NUM);
     609                 :            : 
     610                 :            :     /* Set IPFW Dynamic rule expiry interval.
     611                 :            :     */
     612                 :            :     if(opts->config[CONF_IPFW_EXPIRE_PURGE_INTERVAL] == NULL)
     613                 :            :         set_config_entry(opts, CONF_IPFW_EXPIRE_PURGE_INTERVAL,
     614                 :            :             DEF_IPFW_EXPIRE_PURGE_INTERVAL);
     615                 :            : 
     616                 :            :     /* Set IPFW Dynamic rule expiry interval.
     617                 :            :     */
     618                 :            :     if(opts->config[CONF_IPFW_ADD_CHECK_STATE] == NULL)
     619                 :            :         set_config_entry(opts, CONF_IPFW_ADD_CHECK_STATE,
     620                 :            :             DEF_IPFW_ADD_CHECK_STATE);
     621                 :            : 
     622                 :            : #elif FIREWALL_PF
     623                 :            :     /* Set PF anchor name
     624                 :            :     */
     625                 :            :     if(opts->config[CONF_PF_ANCHOR_NAME] == NULL)
     626                 :            :         set_config_entry(opts, CONF_PF_ANCHOR_NAME,
     627                 :            :             DEF_PF_ANCHOR_NAME);
     628                 :            : 
     629                 :            :     /* Set PF rule expiry interval.
     630                 :            :     */
     631                 :            :     if(opts->config[CONF_PF_EXPIRE_INTERVAL] == NULL)
     632                 :            :         set_config_entry(opts, CONF_PF_EXPIRE_INTERVAL,
     633                 :            :             DEF_PF_EXPIRE_INTERVAL);
     634                 :            : 
     635                 :            : #elif FIREWALL_IPF
     636                 :            :     /* --DSS Place-holder */
     637                 :            : 
     638                 :            : #endif /* FIREWALL type */
     639                 :            : 
     640                 :            :     /* GPG Home dir.
     641                 :            :     */
     642         [ +  + ]:       3731 :     if(opts->config[CONF_GPG_HOME_DIR] == NULL)
     643                 :       3730 :         set_config_entry(opts, CONF_GPG_HOME_DIR, DEF_GPG_HOME_DIR);
     644                 :            : 
     645                 :            :     /* GPG executable
     646                 :            :     */
     647         [ +  - ]:       3703 :     if(opts->config[CONF_GPG_EXE] == NULL)
     648                 :       3703 :         set_config_entry(opts, CONF_GPG_EXE, DEF_GPG_EXE);
     649                 :            : 
     650                 :            :     /* Enable SPA over HTTP.
     651                 :            :     */
     652         [ +  + ]:       3685 :     if(opts->config[CONF_ENABLE_SPA_OVER_HTTP] == NULL)
     653                 :       3684 :         set_config_entry(opts, CONF_ENABLE_SPA_OVER_HTTP,
     654                 :            :             DEF_ENABLE_SPA_OVER_HTTP);
     655                 :            : 
     656                 :            :     /* Enable TCP server.
     657                 :            :     */
     658         [ +  + ]:       3664 :     if(opts->config[CONF_ENABLE_TCP_SERVER] == NULL)
     659                 :       3663 :         set_config_entry(opts, CONF_ENABLE_TCP_SERVER, DEF_ENABLE_TCP_SERVER);
     660                 :            : 
     661                 :            :     /* TCP Server port.
     662                 :            :     */
     663         [ +  + ]:       3644 :     if(opts->config[CONF_TCPSERV_PORT] == NULL)
     664                 :       3643 :         set_config_entry(opts, CONF_TCPSERV_PORT, DEF_TCPSERV_PORT);
     665                 :            : 
     666                 :            :     /* Syslog identity.
     667                 :            :     */
     668         [ +  - ]:       3633 :     if(opts->config[CONF_SYSLOG_IDENTITY] == NULL)
     669                 :       3633 :         set_config_entry(opts, CONF_SYSLOG_IDENTITY, DEF_SYSLOG_IDENTITY);
     670                 :            : 
     671                 :            :     /* Syslog facility.
     672                 :            :     */
     673         [ +  + ]:       3618 :     if(opts->config[CONF_SYSLOG_FACILITY] == NULL)
     674                 :       3608 :         set_config_entry(opts, CONF_SYSLOG_FACILITY, DEF_SYSLOG_FACILITY);
     675                 :            : 
     676                 :            : 
     677                 :            :     /* Validate integer variable ranges
     678                 :            :     */
     679                 :       3609 :     validate_int_var_ranges(opts);
     680                 :            : 
     681                 :            :     /* Some options just trigger some output of information, or trigger an
     682                 :            :      * external function, but do not actually start fwknopd.  If any of those
     683                 :            :      * are set, we can return here an skip the validation routines as all
     684                 :            :      * other options will be ignored anyway.
     685                 :            :      *
     686                 :            :      * These are also mutually exclusive (for now).
     687                 :            :     */
     688         [ +  + ]:       3608 :     if((opts->dump_config + opts->kill + opts->restart + opts->status) == 1)
     689                 :            :         return;
     690                 :            : 
     691         [ +  + ]:       2547 :     if((opts->dump_config + opts->kill + opts->restart + opts->status) > 1)
     692                 :            :     {
     693                 :          2 :         log_msg(LOG_ERR,
     694                 :            :             "The -D, -K, -R, and -S options are mutually exclusive.  Pick only one."
     695                 :            :         );
     696                 :          2 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     697                 :            :     }
     698                 :            : 
     699         [ -  + ]:       2545 :     if(opts->config[CONF_FIREWALL_EXE] == NULL)
     700                 :            :     {
     701                 :          0 :         log_msg(LOG_ERR,
     702                 :            :             "[*] No firewall command executable is set. Please check FIREWALL_EXE in fwknopd.conf."
     703                 :            :         );
     704                 :          0 :         clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     705                 :            :     }
     706                 :            : 
     707                 :            :     return;
     708                 :            : }
     709                 :            : 
     710                 :            : void
     711                 :       5325 : set_preconfig_entries(fko_srv_options_t *opts)
     712                 :            : {
     713                 :            :     /* First, set any default or otherwise static settings here.  Some may
     714                 :            :      * end up being overwritten via config file or command-line.
     715                 :            :     */
     716                 :            : 
     717                 :            :     /* Setup the firewall executable based on build-time info.
     718                 :            :      * --DSS Note: We will want to either force external script mode, or
     719                 :            :      *             error out if we do not have a firewall executable defined.
     720                 :            :     */
     721                 :            : #ifdef FIREWALL_EXE
     722                 :       5325 :     set_config_entry(opts, CONF_FIREWALL_EXE, FIREWALL_EXE);
     723                 :            : #endif
     724                 :            : 
     725                 :       5226 : }
     726                 :            : 
     727                 :            : /* Initialize program configuration via config file and/or command-line
     728                 :            :  * switches.
     729                 :            : */
     730                 :            : void
     731                 :       5325 : config_init(fko_srv_options_t *opts, int argc, char **argv)
     732                 :            : {
     733                 :            :     int             cmd_arg, index, is_err;
     734                 :       5325 :     unsigned char   got_conf_file = 0, got_override_config = 0;
     735                 :            : 
     736                 :       5325 :     char            override_file[MAX_LINE_LEN] = {0};
     737                 :            :     char           *ndx, *cmrk;
     738                 :            : 
     739                 :            :     /* Zero out options and opts_track.
     740                 :            :     */
     741                 :            :     memset(opts, 0x00, sizeof(fko_srv_options_t));
     742                 :            : 
     743                 :            :     /* Set some preconfiguration options (i.e. build-time defaults)
     744                 :            :     */
     745                 :       5325 :     set_preconfig_entries(opts);
     746                 :            : 
     747                 :            :     /* In case this is a re-config.
     748                 :            :     */
     749                 :       5226 :     optind = 0;
     750                 :            : 
     751                 :            :     /* First, scan the command-line args for -h/--help or an alternate
     752                 :            :      * configuration file. If we find an alternate config file, use it,
     753                 :            :      * otherwise use the default.  We also grab any override config files
     754                 :            :      * as well.
     755                 :            :     */
     756         [ +  + ]:      49614 :     while ((cmd_arg = getopt_long(argc, argv,
     757                 :            :             GETOPTS_OPTION_STRING, cmd_opts, &index)) != -1) {
     758                 :            : 
     759                 :            :         /* If help is wanted, give it and exit.
     760                 :            :         */
     761   [ +  +  +  + ]:      39340 :         switch(cmd_arg) {
     762                 :            :             case 'h':
     763                 :          1 :                 usage();
     764                 :          1 :                 clean_exit(opts, NO_FW_CLEANUP, EXIT_SUCCESS);
     765                 :            : 
     766                 :            :             /* Look for configuration file arg.
     767                 :            :             */
     768                 :            :             case 'c':
     769                 :       5223 :                 set_config_entry(opts, CONF_CONFIG_FILE, optarg);
     770                 :       5125 :                 got_conf_file++;
     771                 :            : 
     772                 :            :                 /* If we already have the config_override option, we are done.
     773                 :            :                 */
     774         [ +  - ]:       5125 :                 if(got_override_config > 0)
     775                 :            :                     break;
     776                 :            : 
     777                 :            :             /* Look for override configuration file arg.
     778                 :            :             */
     779                 :            :             case 'O':
     780                 :       5127 :                 set_config_entry(opts, CONF_OVERRIDE_CONFIG, optarg);
     781                 :      10274 :                 got_override_config++;
     782                 :            : 
     783                 :            :                 /* If we already have the conf_file option, we are done.
     784                 :            :                 */
     785                 :            :                 if(got_conf_file > 0)
     786                 :            :                     break;
     787                 :            :         }
     788                 :            :     }
     789                 :            : 
     790                 :            :     /* If no alternate configuration file was specified, we use the
     791                 :            :      * default.
     792                 :            :     */
     793         [ +  + ]:       5048 :     if(opts->config[CONF_CONFIG_FILE] == NULL)
     794                 :          2 :         set_config_entry(opts, CONF_CONFIG_FILE, DEF_CONFIG_FILE);
     795                 :            : 
     796                 :            :     /* Parse configuration file to populate any params not already specified
     797                 :            :      * via command-line options.
     798                 :            :     */
     799                 :       5048 :     parse_config_file(opts, opts->config[CONF_CONFIG_FILE]);
     800                 :            : 
     801                 :            :     /* If there are override configuration entries, process them
     802                 :            :      * here.
     803                 :            :     */
     804         [ +  + ]:       4958 :     if(opts->config[CONF_OVERRIDE_CONFIG] != NULL)
     805                 :            :     {
     806                 :            :         /* Make a copy of the override_config string so we can munge it.
     807                 :            :         */
     808                 :       4956 :         strlcpy(override_file, opts->config[CONF_OVERRIDE_CONFIG], sizeof(override_file));
     809                 :            : 
     810                 :       4956 :         ndx  = override_file;
     811                 :       4956 :         cmrk = strchr(ndx, ',');
     812                 :            : 
     813         [ +  + ]:       4956 :         if(cmrk == NULL)
     814                 :            :         {
     815                 :            :             /* Only one to process...
     816                 :            :             */
     817                 :       4955 :             parse_config_file(opts, ndx);
     818                 :            : 
     819                 :            :         } else {
     820                 :            :             /* Walk the string pulling the next config override
     821                 :            :              * at the comma delimiters.
     822                 :            :             */
     823         [ +  + ]:          2 :             while(cmrk != NULL) {
     824                 :          1 :                 *cmrk = '\0';
     825                 :          1 :                 parse_config_file(opts, ndx);
     826                 :          1 :                 ndx = cmrk + 1;
     827                 :          1 :                 cmrk = strchr(ndx, ',');
     828                 :            :             }
     829                 :            : 
     830                 :            :             /* Process the last entry
     831                 :            :             */
     832                 :          1 :             parse_config_file(opts, ndx);
     833                 :            :         }
     834                 :            :     }
     835                 :            : 
     836                 :            :     /* Set up the verbosity level according to the value found in the
     837                 :            :      * config files */
     838         [ +  + ]:       4888 :     if (opts->config[CONF_VERBOSE] != NULL)
     839                 :            :     {
     840                 :          1 :         opts->verbose = strtol_wrapper(opts->config[CONF_VERBOSE], 0, -1,
     841                 :            :                                        NO_EXIT_UPON_ERR, &is_err);
     842         [ +  - ]:          1 :         if(is_err != FKO_SUCCESS)
     843                 :            :         {
     844                 :          1 :             log_msg(LOG_ERR, "[*] VERBOSE value '%s' not in the range (>0)",
     845                 :            :                 opts->config[CONF_VERBOSE]);
     846                 :          1 :             clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     847                 :            :         }
     848                 :            :     }
     849                 :            : 
     850                 :            :     /* Reset the options index so we can run through them again.
     851                 :            :     */
     852                 :       4887 :     optind = 0;
     853                 :            : 
     854                 :            :     /* Last, but not least, we process command-line options (some of which
     855                 :            :      * may override configuration file options.
     856                 :            :     */
     857         [ +  + ]:      45479 :     while ((cmd_arg = getopt_long(argc, argv,
     858                 :            :             GETOPTS_OPTION_STRING, cmd_opts, &index)) != -1) {
     859                 :            : 
     860   [ +  +  +  +  :      35968 :         switch(cmd_arg) {
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
             +  +  +  +  
                      + ]
     861                 :            :             case 'a':
     862                 :       4886 :                 set_config_entry(opts, CONF_ACCESS_FILE, optarg);
     863                 :       4816 :                 break;
     864                 :            :             case 'c':
     865                 :            :                 /* This was handled earlier */
     866                 :            :                 break;
     867                 :            :             case 'C':
     868                 :        756 :                 opts->packet_ctr_limit = strtol_wrapper(optarg,
     869                 :            :                         0, (2 << 30), NO_EXIT_UPON_ERR, &is_err);
     870         [ +  + ]:        756 :                 if(is_err != FKO_SUCCESS)
     871                 :            :                 {
     872                 :          1 :                     log_msg(LOG_ERR,
     873                 :            :                         "[*] invalid -C packet count limit '%s'",
     874                 :            :                         optarg);
     875                 :          1 :                     clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     876                 :            :                 }
     877                 :            :                 break;
     878                 :            :             case 'd':
     879                 :            : #if USE_FILE_CACHE
     880                 :       4797 :                 set_config_entry(opts, CONF_DIGEST_FILE, optarg);
     881                 :            : #else
     882                 :            :                 set_config_entry(opts, CONF_DIGEST_DB_FILE, optarg);
     883                 :            : #endif
     884                 :       4725 :                 break;
     885                 :            :             case 'D':
     886                 :         18 :                 opts->dump_config = 1;
     887                 :         18 :                 break;
     888                 :            :             case DUMP_SERVER_ERR_CODES:
     889                 :          1 :                 dump_server_errors();
     890                 :          1 :                 clean_exit(opts, NO_FW_CLEANUP, EXIT_SUCCESS);
     891                 :            :             case EXIT_AFTER_PARSE_CONFIG:
     892                 :       1663 :                 opts->exit_after_parse_config = 1;
     893                 :       1663 :                 opts->foreground = 1;
     894                 :       1663 :                 break;
     895                 :            :             case 'f':
     896                 :       2733 :                 opts->foreground = 1;
     897                 :       2733 :                 break;
     898                 :            :             case FAULT_INJECTION_TAG:
     899                 :            : #if HAVE_LIBFIU
     900                 :         35 :                 set_config_entry(opts, CONF_FAULT_INJECTION_TAG, optarg);
     901                 :            : #else
     902                 :            :                 log_msg(LOG_ERR, "[*] fwknopd not compiled with libfiu support");
     903                 :            :                 clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     904                 :            : #endif
     905                 :         35 :                 break;
     906                 :            :             case FW_LIST:
     907                 :        815 :                 opts->fw_list = 1;
     908                 :        815 :                 break;
     909                 :            :             case FW_LIST_ALL:
     910                 :          2 :                 opts->fw_list = 1;
     911                 :          2 :                 opts->fw_list_all = 1;
     912                 :          2 :                 break;
     913                 :            :             case FW_FLUSH:
     914                 :         18 :                 opts->fw_flush = 1;
     915                 :         18 :                 break;
     916                 :            :             case GPG_HOME_DIR:
     917         [ +  + ]:          3 :                 if (is_valid_dir(optarg))
     918                 :            :                 {
     919                 :          1 :                     set_config_entry(opts, CONF_GPG_HOME_DIR, optarg);
     920                 :            :                 }
     921                 :            :                 else
     922                 :            :                 {
     923                 :          2 :                     log_msg(LOG_ERR,
     924                 :            :                         "[*] Directory '%s' could not stat()/does not exist?",
     925                 :            :                         optarg);
     926                 :          2 :                     clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     927                 :            :                 }
     928                 :            :                 break;
     929                 :            :             case 'i':
     930                 :       2092 :                 set_config_entry(opts, CONF_PCAP_INTF, optarg);
     931                 :       2065 :                 break;
     932                 :            :             case IPT_DISABLE_CHECK_SUPPORT:
     933                 :        655 :                 opts->ipt_disable_check_support = 1;
     934                 :        655 :                 break;
     935                 :            :             case 'K':
     936                 :        349 :                 opts->kill = 1;
     937                 :        349 :                 break;
     938                 :            :             case 'l':
     939                 :          2 :                 set_config_entry(opts, CONF_LOCALE, optarg);
     940                 :          2 :                 break;
     941                 :            :             case 'O':
     942                 :            :                 /* This was handled earlier */
     943                 :            :                 break;
     944                 :            :             case 'p':
     945                 :       4723 :                 set_config_entry(opts, CONF_FWKNOP_PID_FILE, optarg);
     946                 :       4663 :                 break;
     947                 :            :             case 'P':
     948                 :          7 :                 set_config_entry(opts, CONF_PCAP_FILTER, optarg);
     949                 :          7 :                 break;
     950                 :            :             case PCAP_FILE:
     951                 :        684 :                 set_config_entry(opts, CONF_PCAP_FILE, optarg);
     952                 :        656 :                 break;
     953                 :            :             case ENABLE_PCAP_ANY_DIRECTION:
     954                 :          1 :                 opts->pcap_any_direction = 1;
     955                 :          1 :                 break;
     956                 :            :             case ROTATE_DIGEST_CACHE:
     957                 :          2 :                 opts->rotate_digest_cache = 1;
     958                 :          2 :                 break;
     959                 :            :             case 'R':
     960                 :          6 :                 opts->restart = 1;
     961                 :          6 :                 break;
     962                 :            :             case 'S':
     963                 :        692 :                 opts->status = 1;
     964                 :        692 :                 break;
     965                 :            :             case 't':
     966                 :        658 :                 opts->test = 1;
     967                 :        658 :                 break;
     968                 :            :             /* Verbosity level */
     969                 :            :             case 'v':
     970                 :       5479 :                 opts->verbose++;
     971                 :       5479 :                 break;
     972                 :            :             case SYSLOG_ENABLE:
     973                 :          2 :                 opts->syslog_enable = 1;
     974                 :          2 :                 break;
     975                 :            :             case 'V':
     976                 :          1 :                 fprintf(stdout, "fwknopd server %s\n", MY_VERSION);
     977                 :          1 :                 clean_exit(opts, NO_FW_CLEANUP, EXIT_SUCCESS);
     978                 :            :             default:
     979                 :          1 :                 usage();
     980                 :      35706 :                 clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
     981                 :            :         }
     982                 :            :     }
     983                 :            : 
     984                 :            :     /* Now that we have all of our options set, and we are actually going to
     985                 :            :      * start fwknopd, we can validate them.
     986                 :            :     */
     987                 :       4624 :     validate_options(opts);
     988                 :            : 
     989                 :       3606 :     return;
     990                 :            : }
     991                 :            : 
     992                 :            : /* Dump the configuration
     993                 :            : */
     994                 :            : void
     995                 :       1616 : dump_config(const fko_srv_options_t *opts)
     996                 :            : {
     997                 :            :     int i;
     998                 :            : 
     999                 :       1616 :     fprintf(stdout, "Current fwknopd config settings:\n");
    1000                 :            : 
    1001         [ +  + ]:      72720 :     for(i=0; i<NUMBER_OF_CONFIG_ENTRIES; i++)
    1002         [ +  + ]:      71104 :         fprintf(stdout, "%3i. %-28s =  '%s'\n",
    1003                 :            :             i,
    1004                 :            :             config_map[i],
    1005                 :      71104 :             (opts->config[i] == NULL) ? "<not set>" : opts->config[i]
    1006                 :            :         );
    1007                 :            : 
    1008                 :       1616 :     fprintf(stdout, "\n");
    1009                 :       1616 :     fflush(stdout);
    1010                 :       1616 : }
    1011                 :            : 
    1012                 :            : /* Print usage message...
    1013                 :            : */
    1014                 :            : void
    1015                 :          2 : usage(void)
    1016                 :            : {
    1017                 :          2 :     fprintf(stdout, "\n%s server version %s\n%s - http://www.cipherdyne.org/fwknop/\n\n",
    1018                 :            :             MY_NAME, MY_VERSION, MY_DESC);
    1019                 :          2 :     fprintf(stdout,
    1020                 :            :       "Usage: fwknopd [options]\n\n"
    1021                 :            :       " -h, --help              - Print this usage message and exit.\n"
    1022                 :            :       " -a, --access-file       - Specify an alternate access.conf file.\n"
    1023                 :            :       " -c, --config-file       - Specify an alternate configuration file.\n"
    1024                 :            :       " -C, --packet-limit      - Limit the number of candidate SPA packets to\n"
    1025                 :            :       "                           process and exit when this limit is reached.\n"
    1026                 :            :       " -d, --digest-file       - Specify an alternate digest.cache file.\n"
    1027                 :            :       " -D, --dump-config       - Dump the current fwknop configuration values.\n"
    1028                 :            :       " -f, --foreground        - Run fwknopd in the foreground (do not become\n"
    1029                 :            :       "                           a background daemon).\n"
    1030                 :            :       " -i, --interface         - Specify interface to listen for incoming SPA\n"
    1031                 :            :       "                           packets.\n"
    1032                 :            :       " -K, --kill              - Kill the currently running fwknopd.\n"
    1033                 :            :       " -l, --locale            - Provide a locale setting other than the system\n"
    1034                 :            :       "                           default.\n"
    1035                 :            :       " -O, --override-config   - Specify a file with configuration entries that will\n"
    1036                 :            :       "                           overide those in fwknopd.conf\n"
    1037                 :            :       " -p, --pid-file          - Specify an alternate fwknopd.pid file.\n"
    1038                 :            :       " -P, --pcap-filter       - Specify a Berkeley packet filter statement to\n"
    1039                 :            :       "                           override the PCAP_FILTER variable in fwknopd.conf.\n"
    1040                 :            :       " -R, --restart           - Force the currently running fwknopd to restart.\n"
    1041                 :            :       "     --rotate-digest-cache\n"
    1042                 :            :       "                         - Rotate the digest cache file by renaming it to\n"
    1043                 :            :       "                           '<name>-old', and starting a new one.\n"
    1044                 :            :       " -S, --status            - Display the status of any running fwknopd process.\n"
    1045                 :            :       " -t, --test              - Test mode, process SPA packets but do not make any\n"
    1046                 :            :       "                           firewall modifications.\n"
    1047                 :            :       " -v, --verbose           - Set verbose mode.\n"
    1048                 :            :       "     --syslog-enable     - Allow messages to be sent to syslog even if the\n"
    1049                 :            :       "                           foreground mode is set.\n"
    1050                 :            :       " -V, --version           - Print version number.\n"
    1051                 :            :       " --dump-serv-err-codes   - List all server error codes (only needed by the\n"
    1052                 :            :       "                           test suite).\n"
    1053                 :            :       " --exit-parse-config     - Parse config files and exit.\n"
    1054                 :            :       " --fault-injection-tag   - Enable a fault injection tag (only needed by the\n"
    1055                 :            :       "                           test suite).\n"
    1056                 :            :       " --pcap-file             - Read potential SPA packets from an existing pcap\n"
    1057                 :            :       "                           file.\n"
    1058                 :            :       " --pcap-any-direction    - By default fwknopd processes packets that are\n"
    1059                 :            :       "                           sent to the sniffing interface, but this option\n"
    1060                 :            :       "                           enables processing of packets that originate from\n"
    1061                 :            :       "                           an interface (such as in a forwarding situation).\n"
    1062                 :            :       "     --fw-list           - List all firewall rules that fwknop has created\n"
    1063                 :            :       "                           and then exit.\n"
    1064                 :            :       "     --fw-list-all       - List all firewall rules in the complete policy,\n"
    1065                 :            :       "                           including those that have nothing to do with\n"
    1066                 :            :       "                           fwknop.\n"
    1067                 :            :       "     --fw-flush          - Flush all firewall rules created by fwknop.\n"
    1068                 :            :       "     --gpg-home-dir      - Specify the GPG home directory (this is normally\n"
    1069                 :            :       "                           done in the access.conf file).\n"
    1070                 :            :       "     --gpg-exe           - Specify the path to GPG (this is normally done in\n"
    1071                 :            :       "                           the access.conf file).\n"
    1072                 :            :       " --no-ipt-check-support  - Disable test for 'iptables -C' support.\n"
    1073                 :            :       "\n"
    1074                 :            :     );
    1075                 :            : 
    1076                 :          2 :     return;
    1077                 :            : }
    1078                 :            : 
    1079                 :            : /***EOF***/

Generated by: LCOV version 1.9