config_userapi.c 15.1 KB
Newer Older
1
2
3
4
5
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
6
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */

/*! \file common/config/config_userapi.c
 * \brief configuration module, api implementation to access configuration parameters
 * \author Francois TABURET
 * \date 2017
 * \version 0.1
 * \company NOKIA BellLabs France
 * \email: francois.taburet@nokia-bell-labs.com
 * \note
 * \warning
 */
32
33
34

#define _GNU_SOURCE

35
36
37
38
39
40
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <dlfcn.h>
41
#include <arpa/inet.h>
42
#include <platform_types.h>
43
#include "config_userapi.h"
44
#include "../utils/LOG/log.h"
45

Raphael Defosseux's avatar
Raphael Defosseux committed
46
47
configmodule_interface_t *config_get_if(void) {
  if (cfgptr == NULL) {
48
    CONFIG_PRINTF_ERROR("[CONFIG] %s %d config module not initialized\n",__FILE__,__LINE__);
Raphael Defosseux's avatar
Raphael Defosseux committed
49
50
51
  }

  return cfgptr;
52
53
}

Raphael Defosseux's avatar
Raphael Defosseux committed
54
55
56
57
58
59
60
61
62
63
64
65
66
char *config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) {
  if (ptr == NULL ) {
    ptr = malloc(sizeof(char *));

    if (ptr != NULL) {
      *ptr=NULL;
      cfgoptions->strptr=ptr;

      if ( (cfgoptions->paramflags & PARAMFLAG_NOFREE) == 0) {
        config_get_if()->ptrs[config_get_if()->numptrs] = (char *)ptr;
        config_get_if()->numptrs++;
      }
    } else {
67
68
      CONFIG_PRINTF_ERROR("[CONFIG] %s %d option %s, cannot allocate pointer: %s \n",
                          __FILE__, __LINE__, cfgoptions->optname, strerror(errno));
Raphael Defosseux's avatar
Raphael Defosseux committed
69
70
71
72
73
74
75
76
77
    }
  }

  printf_ptrs("[CONFIG] %s ptr: 0x%08lx requested size: %i\n",cfgoptions->optname,(uintptr_t)(ptr),length);

  if(cfgoptions->numelt > 0 && PARAM_ISSCALAR(cfgoptions)  ) { /* already allocated */
    if (*ptr != NULL) {
      return *ptr;
    } else {
78
79
      CONFIG_PRINTF_ERROR("[CONFIG] %s %d option %s, definition error: value pointer is NULL, declared as %i bytes allocated\n",
                          __FILE__, __LINE__,cfgoptions->optname, cfgoptions->numelt);
Raphael Defosseux's avatar
Raphael Defosseux committed
80
81
82
83
84
85
86
87
88
89
90
91
92
93
    }
  }

  if (*ptr == NULL) {
    *ptr = malloc(length);

    if ( *ptr != NULL) {
      memset(*ptr,0,length);

      if ( (cfgoptions->paramflags & PARAMFLAG_NOFREE) == 0) {
        config_get_if()->ptrs[config_get_if()->numptrs] = *ptr;
        config_get_if()->numptrs++;
      }
    } else {
94
      CONFIG_PRINTF_ERROR("[CONFIG] %s %d malloc error\n",__FILE__, __LINE__);
Raphael Defosseux's avatar
Raphael Defosseux committed
95
96
97
98
    }
  }

  return *ptr;
99
100
}

Raphael Defosseux's avatar
Raphael Defosseux committed
101
102
103
void config_assign_int(paramdef_t *cfgoptions, char *fullname, int val) {
  int tmpval=val;

104
  if ( ((cfgoptions->paramflags &PARAMFLAG_BOOL) != 0) && tmpval >0) {
Raphael Defosseux's avatar
Raphael Defosseux committed
105
    tmpval =1;
106
  }
Raphael Defosseux's avatar
Raphael Defosseux committed
107

108
  switch (cfgoptions->type) {
Raphael Defosseux's avatar
Raphael Defosseux committed
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
    case TYPE_UINT8:
      *(cfgoptions->u8ptr) = (uint8_t)tmpval;
      printf_params("[CONFIG] %s: %u\n", fullname, (uint8_t)tmpval);
      break;

    case TYPE_INT8:
      *(cfgoptions->i8ptr) = (int8_t)tmpval;
      printf_params("[CONFIG] %s: %i\n", fullname, (int8_t)tmpval);
      break;

    case TYPE_UINT16:
      *(cfgoptions->u16ptr) = (uint16_t)tmpval;
      printf_params("[CONFIG] %s: %hu\n", fullname, (uint16_t)tmpval);
      break;

    case TYPE_INT16:
      *(cfgoptions->i16ptr) = (int16_t)tmpval;
      printf_params("[CONFIG] %s: %hi\n", fullname, (int16_t)tmpval);
      break;

    case TYPE_UINT32:
      *(cfgoptions->uptr) = (uint32_t)tmpval;
      printf_params("[CONFIG] %s: %u\n", fullname, (uint32_t)tmpval);
      break;

    case TYPE_MASK:
      *(cfgoptions->uptr) = *(cfgoptions->uptr) | (uint32_t)tmpval;
      printf_params("[CONFIG] %s: 0x%08x\n", fullname, (uint32_t)tmpval);
      break;

    case TYPE_INT32:
      *(cfgoptions->iptr) = (int32_t)tmpval;
      printf_params("[CONFIG] %s: %i\n", fullname, (int32_t)tmpval);
      break;

    default:
      fprintf (stderr,"[CONFIG] %s %i type %i non integer parameter %s not assigned\n",__FILE__, __LINE__,cfgoptions->type,fullname);
      break;
147
148
  }
}
149
void config_assign_processedint(paramdef_t *cfgoption, int val) {
Raphael Defosseux's avatar
Raphael Defosseux committed
150
151
152
153
154
  cfgoption->processedvalue = malloc(sizeof(int));

  if (  cfgoption->processedvalue != NULL) {
    *(cfgoption->processedvalue) = val;
  } else {
155
    CONFIG_PRINTF_ERROR("[CONFIG] %s %d malloc error\n",__FILE__, __LINE__);
Raphael Defosseux's avatar
Raphael Defosseux committed
156
  }
157
}
158

159
int config_get_processedint(paramdef_t *cfgoption) {
Raphael Defosseux's avatar
Raphael Defosseux committed
160
161
162
163
164
165
166
167
168
169
170
171
172
  int ret;

  if (  cfgoption->processedvalue != NULL) {
    ret=*(cfgoption->processedvalue);
    free( cfgoption->processedvalue);
    cfgoption->processedvalue=NULL;
    printf_params("[CONFIG] %s:  set from %s to %i\n",cfgoption->optname, *(cfgoption->strptr), ret);
  } else {
    fprintf (stderr,"[CONFIG] %s %d %s has no processed integer availablle\n",__FILE__, __LINE__, cfgoption->optname);
    ret=0;
  }

  return ret;
173
}
174
175
176
void config_printhelp(paramdef_t *params,int numparams, char *prefix) {
  printf("\n-----Help for section %-26s: %03i entries------\n",(prefix==NULL)?"(root section)":prefix ,numparams);

Raphael Defosseux's avatar
Raphael Defosseux committed
177
  for (int i=0 ; i<numparams ; i++) {
178
179
180
    printf("    %s%s: %s",
           (strlen(params[i].optname) <= 1) ? "-" : "--",
           params[i].optname,
181
           (params[i].helpstr != NULL)?params[i].helpstr:"Help string not specified\n");
182
183
184
  }   /* for on params entries */

  printf("--------------------------------------------------------------------\n\n");
185
186
}

Raphael Defosseux's avatar
Raphael Defosseux committed
187
188
189
190
191
192
193
194
195
196
197
198
199
200
int config_execcheck(paramdef_t *params,int numparams, char *prefix) {
  int st=0;

  for (int i=0 ; i<numparams ; i++) {
    if ( params[i].chkPptr == NULL) {
      continue;
    }

    if (params[i].chkPptr->s4.f4 != NULL) {
      st += params[i].chkPptr->s4.f4(&(params[i]));
    }
  }

  if (st != 0) {
201
    CONFIG_PRINTF_ERROR("[CONFIG] config_execcheck: section %s %i parameters with wrong value\n", prefix, -st);
Raphael Defosseux's avatar
Raphael Defosseux committed
202
203
204
  }

  return st;
205
206
}

Raphael Defosseux's avatar
Raphael Defosseux committed
207
208
int config_get(paramdef_t *params,int numparams, char *prefix) {
  int ret= -1;
209

210
  if (CONFIG_ISFLAGSET(CONFIG_ABORT)) {
211
    fprintf(stderr,"[CONFIG] config_get, section %s skipped, config module not properly initialized\n",prefix);
212
    return ret;
213
  }
Raphael Defosseux's avatar
Raphael Defosseux committed
214

215
  configmodule_interface_t *cfgif = config_get_if();
Raphael Defosseux's avatar
Raphael Defosseux committed
216

217
  if (cfgif != NULL) {
218
    ret = config_get_if()->get(params, numparams,prefix);
Raphael Defosseux's avatar
Raphael Defosseux committed
219

220
221
222
223
    if (ret >= 0) {
      config_process_cmdline(params,numparams,prefix);
      config_execcheck(params,numparams,prefix);
    }
Raphael Defosseux's avatar
Raphael Defosseux committed
224

225
    return ret;
226
  }
Raphael Defosseux's avatar
Raphael Defosseux committed
227

228
  return ret;
229
}
230

Raphael Defosseux's avatar
Raphael Defosseux committed
231
int config_getlist(paramlist_def_t *ParamList, paramdef_t *params, int numparams, char *prefix) {
232
233
234
235
  if (CONFIG_ISFLAGSET(CONFIG_ABORT)) {
    fprintf(stderr,"[CONFIG] config_get skipped, config module not properly initialized\n");
    return -1;
  }
Raphael Defosseux's avatar
Raphael Defosseux committed
236

237
238
239
240
  if (!config_get_if())
    return -1;

  const int ret = config_get_if()->getlist(ParamList, params, numparams, prefix);
Raphael Defosseux's avatar
Raphael Defosseux committed
241

242
243
  if (ret >= 0 && params) {
    char *newprefix;
Raphael Defosseux's avatar
Raphael Defosseux committed
244

245
246
    if (prefix) {
      int rc = asprintf(&newprefix, "%s.%s", prefix, ParamList->listname);
Raphael Defosseux's avatar
Raphael Defosseux committed
247

248
249
      if (rc < 0) newprefix = NULL;
    } else {
250
      newprefix = ParamList->listname;
251
    }
Raphael Defosseux's avatar
Raphael Defosseux committed
252

253
    char cfgpath[MAX_OPTNAME_SIZE*2 + 6]; /* prefix.listname.[listindex] */
Raphael Defosseux's avatar
Raphael Defosseux committed
254

255
256
257
    for (int i = 0; i < ParamList->numelt; ++i) {
      // TODO config_process_cmdline?
      sprintf(cfgpath, "%s.[%i]", newprefix, i);
258
      config_process_cmdline(ParamList->paramarray[i],numparams,cfgpath);
259
260
      config_execcheck(ParamList->paramarray[i], numparams, cfgpath);
    }
Raphael Defosseux's avatar
Raphael Defosseux committed
261

262
263
264
    if (prefix)
      free(newprefix);
  }
Raphael Defosseux's avatar
Raphael Defosseux committed
265

266
267
268
  return ret;
}

Raphael Defosseux's avatar
Raphael Defosseux committed
269
int config_isparamset(paramdef_t *params,int paramidx) {
270
  if ((params[paramidx].paramflags & PARAMFLAG_PARAMSET) != 0) {
Raphael Defosseux's avatar
Raphael Defosseux committed
271
    return 1;
272
  } else {
Raphael Defosseux's avatar
Raphael Defosseux committed
273
    return 0;
274
  }
275
}
276

277
void print_intvalueerror(paramdef_t *param, char *fname, int *okval, int numokval) {
Raphael Defosseux's avatar
Raphael Defosseux committed
278
279
280
281
282
283
284
285
  fprintf(stderr,"[CONFIG] %s: %s: %i invalid value, authorized values:\n       ",
          fname,param->optname, (int)*(param->uptr));

  for ( int i=0; i<numokval ; i++) {
    fprintf(stderr, " %i",okval[i]);
  }

  fprintf(stderr, " \n");
286
}
Raphael Defosseux's avatar
Raphael Defosseux committed
287
288
289
290

int config_check_intval(paramdef_t *param) {
  if ( param == NULL ) {
    fprintf(stderr,"[CONFIG] config_check_intval: NULL param argument\n");
291
    return -1;
Raphael Defosseux's avatar
Raphael Defosseux committed
292
293
294
295
296
297
298
299
300
301
  }

  for ( int i=0; i<param->chkPptr->s1.num_okintval ; i++) {
    if( *(param->uptr) == param->chkPptr->s1.okintval[i] ) {
      return 0;
    }
  }

  print_intvalueerror(param,"config_check_intval", param->chkPptr->s1.okintval,param->chkPptr->s1.num_okintval);
  return -1;
302
303
}

Raphael Defosseux's avatar
Raphael Defosseux committed
304
305
306
307
308
309
310
311
312
313
314
int config_check_modify_integer(paramdef_t *param) {
  for (int i=0; i < param->chkPptr->s1a.num_okintval ; i++) {
    if (*(param->uptr) == param->chkPptr->s1a.okintval[i] ) {
      printf_params("[CONFIG] %s:  read value %i, set to %i\n",param->optname,*(param->uptr),param->chkPptr->s1a.setintval [i]);
      *(param->uptr) = param->chkPptr->s1a.setintval [i];
      return 0;
    }
  }

  print_intvalueerror(param,"config_check_modify_integer", param->chkPptr->s1a.okintval,param->chkPptr->s1a.num_okintval);
  return -1;
315
316
}

Raphael Defosseux's avatar
Raphael Defosseux committed
317
318
319
320
321
322
323
324
int config_check_intrange(paramdef_t *param) {
  if( *(param->iptr) >= param->chkPptr->s2.okintrange[0]  && *(param->iptr) <= param->chkPptr->s2.okintrange[1]  ) {
    return 0;
  }

  fprintf(stderr,"[CONFIG] config_check_intrange: %s: %i invalid value, authorized range: %i %i\n",
          param->optname, (int)*(param->uptr), param->chkPptr->s2.okintrange[0], param->chkPptr->s2.okintrange[1]);
  return -1;
325
326
327
}

void print_strvalueerror(paramdef_t *param, char *fname, char **okval, int numokval) {
Raphael Defosseux's avatar
Raphael Defosseux committed
328
329
330
331
332
333
334
335
  fprintf(stderr,"[CONFIG] %s: %s: %s invalid value, authorized values:\n       ",
          fname,param->optname, *(param->strptr));

  for ( int i=0; i<numokval ; i++) {
    fprintf(stderr, " %s",okval[i]);
  }

  fprintf(stderr, " \n");
336
}
Raphael Defosseux's avatar
Raphael Defosseux committed
337
338
339
340

int config_check_strval(paramdef_t *param) {
  if ( param == NULL ) {
    fprintf(stderr,"[CONFIG] config_check_strval: NULL param argument\n");
341
    return -1;
Raphael Defosseux's avatar
Raphael Defosseux committed
342
  }
343

Raphael Defosseux's avatar
Raphael Defosseux committed
344
345
346
347
348
  for ( int i=0; i<param->chkPptr->s3.num_okstrval ; i++) {
    if( strcasecmp(*(param->strptr),param->chkPptr->s3.okstrval[i] ) == 0) {
      return 0;
    }
  }
349

Raphael Defosseux's avatar
Raphael Defosseux committed
350
351
352
  print_strvalueerror(param, "config_check_strval", param->chkPptr->s3.okstrval, param->chkPptr->s3.num_okstrval);
  return -1;
}
353

Raphael Defosseux's avatar
Raphael Defosseux committed
354
355
356
357
358
359
360
int config_checkstr_assign_integer(paramdef_t *param) {
  for (int i=0; i < param->chkPptr->s3a.num_okstrval ; i++) {
    if (strcasecmp(*(param->strptr),param->chkPptr->s3a.okstrval[i]  ) == 0) {
      config_assign_processedint(param, param->chkPptr->s3a.setintval[i]);
      return 0;
    }
  }
361

Raphael Defosseux's avatar
Raphael Defosseux committed
362
363
  print_strvalueerror(param, "config_check_strval", param->chkPptr->s3a.okstrval, param->chkPptr->s3a.num_okstrval);
  return -1;
364
}
365

366
367
368
369
370
371
void config_set_checkfunctions(paramdef_t *params, checkedparam_t *checkfunctions, int numparams) {
  for (int i=0; i< numparams ; i++ ) {
    params[i].chkPptr = &(checkfunctions[i]);
  }
}

Raphael Defosseux's avatar
Raphael Defosseux committed
372
int config_setdefault_string(paramdef_t *cfgoptions, char *prefix) {
373
  int status = 0;
Raphael Defosseux's avatar
Raphael Defosseux committed
374

375
  if( cfgoptions->defstrval != NULL) {
Raphael Defosseux's avatar
Raphael Defosseux committed
376
377
378
379
380
381
382
383
384
385
386
    status=1;

    if (cfgoptions->numelt == 0 ) {
      config_check_valptr(cfgoptions, (char **)(cfgoptions->strptr), sizeof(char *));
      config_check_valptr(cfgoptions, cfgoptions->strptr, strlen(cfgoptions->defstrval)+1);
      sprintf(*(cfgoptions->strptr), "%s",cfgoptions->defstrval);
      printf_params("[CONFIG] %s.%s set to default value \"%s\"\n", ((prefix == NULL) ? "" : prefix), cfgoptions->optname, *(cfgoptions->strptr));
    } else {
      sprintf((char *)*(cfgoptions->strptr), "%s",cfgoptions->defstrval);
      printf_params("[CONFIG] %s.%s set to default value \"%s\"\n", ((prefix == NULL) ? "" : prefix), cfgoptions->optname, (char *)*(cfgoptions->strptr));
    }
387
  }
Raphael Defosseux's avatar
Raphael Defosseux committed
388

389
390
391
  return status;
}

Raphael Defosseux's avatar
Raphael Defosseux committed
392
int config_setdefault_stringlist(paramdef_t *cfgoptions, char *prefix) {
393
  int status = 0;
Raphael Defosseux's avatar
Raphael Defosseux committed
394

395
  if( cfgoptions->defstrlistval != NULL) {
Raphael Defosseux's avatar
Raphael Defosseux committed
396
397
398
399
400
    cfgoptions->strlistptr=cfgoptions->defstrlistval;
    status=1;

    for(int j=0; j<cfgoptions->numelt; j++)
      printf_params("[CONFIG] %s.%s[%i] set to default value %s\n", ((prefix == NULL) ? "" : prefix), cfgoptions->optname,j, cfgoptions->strlistptr[j]);
401
  }
Raphael Defosseux's avatar
Raphael Defosseux committed
402

403
404
405
  return status;
}

Raphael Defosseux's avatar
Raphael Defosseux committed
406
int config_setdefault_int(paramdef_t *cfgoptions, char *prefix) {
407
408
  int status = 0;
  config_check_valptr(cfgoptions, (char **)(&(cfgoptions->iptr)),sizeof(int32_t));
Raphael Defosseux's avatar
Raphael Defosseux committed
409

410
  if( ((cfgoptions->paramflags & PARAMFLAG_MANDATORY) == 0)) {
Raphael Defosseux's avatar
Raphael Defosseux committed
411
412
413
    config_assign_int(cfgoptions,cfgoptions->optname,cfgoptions->defintval);
    status=1;
    printf_params("[CONFIG] %s.%s set to default value\n", ((prefix == NULL) ? "" : prefix), cfgoptions->optname);
414
  }
Raphael Defosseux's avatar
Raphael Defosseux committed
415

416
  return status;
Raphael Defosseux's avatar
Raphael Defosseux committed
417
}
418

Raphael Defosseux's avatar
Raphael Defosseux committed
419
int config_setdefault_int64(paramdef_t *cfgoptions, char *prefix) {
420
421
  int status = 0;
  config_check_valptr(cfgoptions, (char **)&(cfgoptions->i64ptr),sizeof(long long));
Raphael Defosseux's avatar
Raphael Defosseux committed
422

423
  if( ((cfgoptions->paramflags & PARAMFLAG_MANDATORY) == 0)) {
Raphael Defosseux's avatar
Raphael Defosseux committed
424
425
426
    *(cfgoptions->u64ptr)=cfgoptions->defuintval;
    status=1;
    printf_params("[CONFIG] %s.%s set to default value %llu\n", ((prefix == NULL) ? "" : prefix), cfgoptions->optname, (long long unsigned)(*(cfgoptions->u64ptr)));
427
  }
Raphael Defosseux's avatar
Raphael Defosseux committed
428

429
430
431
  return status;
}

Raphael Defosseux's avatar
Raphael Defosseux committed
432
433
434
int config_setdefault_intlist(paramdef_t *cfgoptions, char *prefix) {
  int status = 0;

435
  if( cfgoptions->defintarrayval != NULL) {
Raphael Defosseux's avatar
Raphael Defosseux committed
436
    config_check_valptr(cfgoptions,(char **)&(cfgoptions->iptr), sizeof(int32_t *));
437
438
    cfgoptions->iptr=cfgoptions->defintarrayval;
    status=1;
Raphael Defosseux's avatar
Raphael Defosseux committed
439

440
    for (int j=0; j<cfgoptions->numelt ; j++) {
Raphael Defosseux's avatar
Raphael Defosseux committed
441
      printf_params("[CONFIG] %s[%i] set to default value %i\n",cfgoptions->optname ,j,(int)cfgoptions->iptr[j]);
442
443
    }
  }
Raphael Defosseux's avatar
Raphael Defosseux committed
444

445
446
447
  return status;
}

Raphael Defosseux's avatar
Raphael Defosseux committed
448
int config_setdefault_double(paramdef_t *cfgoptions, char *prefix) {
449
450
  int status = 0;
  config_check_valptr(cfgoptions, (char **)&(cfgoptions->dblptr),sizeof(double));
Raphael Defosseux's avatar
Raphael Defosseux committed
451

452
  if( ((cfgoptions->paramflags & PARAMFLAG_MANDATORY) == 0)) {
Raphael Defosseux's avatar
Raphael Defosseux committed
453
454
455
    *(cfgoptions->u64ptr)=cfgoptions->defdblval;
    status=1;
    printf_params("[CONFIG] %s set to default value %lf\n",cfgoptions->optname , *(cfgoptions->dblptr));
456
  }
Raphael Defosseux's avatar
Raphael Defosseux committed
457

458
  return status;
Raphael Defosseux's avatar
Raphael Defosseux committed
459
}
460

Raphael Defosseux's avatar
Raphael Defosseux committed
461
int config_assign_ipv4addr(paramdef_t *cfgoptions, char *ipv4addr) {
462
  config_check_valptr(cfgoptions,(char **)&(cfgoptions->uptr), sizeof(int));
Raphael Defosseux's avatar
Raphael Defosseux committed
463
464
  int rst=inet_pton(AF_INET, ipv4addr ,cfgoptions->uptr );

465
  if (rst == 1 && *(cfgoptions->uptr) > 0) {
Raphael Defosseux's avatar
Raphael Defosseux committed
466
467
    printf_params("[CONFIG] %s: %s\n",cfgoptions->optname, ipv4addr);
    return 1;
468
  } else {
Raphael Defosseux's avatar
Raphael Defosseux committed
469
470
471
472
473
474
475
476
    if ( strncmp(ipv4addr,ANY_IPV4ADDR_STRING,sizeof(ANY_IPV4ADDR_STRING)) == 0) {
      printf_params("[CONFIG] %s:%s (INADDR_ANY) \n",cfgoptions->optname,ipv4addr);
      *cfgoptions->uptr=INADDR_ANY;
      return 1;
    } else {
      fprintf(stderr,"[CONFIG] %s not valid for %s \n", ipv4addr, cfgoptions->optname);
      return -1;
    }
477
  }
Raphael Defosseux's avatar
Raphael Defosseux committed
478

479
480
481
482
  return 0;
}


Raphael Defosseux's avatar
Raphael Defosseux committed
483
int config_setdefault_ipv4addr(paramdef_t *cfgoptions,  char *prefix) {
484
  int status = 0;
Raphael Defosseux's avatar
Raphael Defosseux committed
485

486
  if (cfgoptions->defstrval != NULL) {
Raphael Defosseux's avatar
Raphael Defosseux committed
487
    status = config_assign_ipv4addr(cfgoptions, cfgoptions->defstrval);
488
  }
Raphael Defosseux's avatar
Raphael Defosseux committed
489

490
  return status;
Raphael Defosseux's avatar
Raphael Defosseux committed
491
}