config_load_configmodule.c 6.96 KB
Newer Older
1
2
3
4
5
6
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
32
33
34
35
36
37
38
39
40
41
42
43
44
/*
 * 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
 * the OAI Public License, Version 1.0  (the "License"); you may not use this file
 * 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_load_configmodule.c
 * \brief configuration module, load the shared library implementing the configuration module 
 * \author Francois TABURET
 * \date 2017
 * \version 0.1
 * \company NOKIA BellLabs France
 * \email: francois.taburet@nokia-bell-labs.com
 * \note
 * \warning
 */
#define _GNU_SOURCE
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <dlfcn.h>

#define CONFIG_LOADCONFIG_MAIN
#include "config_load_configmodule.h"
#include "config_userapi.h"
#define CONFIG_SHAREDLIBFORMAT "libparams_%s.so"

45
int load_config_sharedlib(configmodule_interface_t *cfgptr)
46
47
48
49
50
51
52
{
void *lib_handle;
char fname[128];
char libname[FILENAME_MAX]; 
int st;

   st=0;  
53
   sprintf(libname,CONFIG_SHAREDLIBFORMAT,cfgptr->cfgmode);
54
55
56
57
58
59

   lib_handle = dlopen(libname,RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE);
   if (!lib_handle) {
      fprintf(stderr,"[CONFIG] %s %d Error calling dlopen(%s): %s\n",__FILE__, __LINE__, libname,dlerror());
      st = -1;
   } else { 
60
      sprintf (fname,"config_%s_init",cfgptr->cfgmode);
61
62
63
64
      cfgptr->init = dlsym(lib_handle,fname);

      if (cfgptr->init == NULL ) {
         printf("[CONFIG] %s %d no function %s for config mode %s\n",
65
               __FILE__, __LINE__,fname, cfgptr->cfgmode);
66
      } else {
67
         st=cfgptr->init(cfgptr->cfgP,cfgptr->num_cfgP); 
68
69
70
71
         printf("[CONFIG] function %s returned %i\n",
               fname, st);	 
      }

72
      sprintf (fname,"config_%s_get",cfgptr->cfgmode);
73
74
75
      cfgptr->get = dlsym(lib_handle,fname);
      if (cfgptr->get == NULL ) { 
         printf("[CONFIG] %s %d no function %s for config mode %s\n",
76
               __FILE__, __LINE__,fname, cfgptr->cfgmode);
77
78
79
	 st = -1;
      }
      
80
      sprintf (fname,"config_%s_getlist",cfgptr->cfgmode);
81
82
83
      cfgptr->getlist = dlsym(lib_handle,fname);
      if (cfgptr->getlist == NULL ) { 
         printf("[CONFIG] %s %d no function %s for config mode %s\n",
84
               __FILE__, __LINE__,fname, cfgptr->cfgmode);
85
86
87
	 st = -1;
      }

88
      sprintf (fname,"config_%s_end",cfgptr->cfgmode);
89
90
91
      cfgptr->end = dlsym(lib_handle,fname);
      if (cfgptr->getlist == NULL ) { 
         printf("[CONFIG] %s %d no function %s for config mode %s\n",
92
               __FILE__, __LINE__,fname, cfgptr->cfgmode);
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
      }      
   } 
   
   return st;	       
}
/*-----------------------------------------------------------------------------------*/
/* from here: interface implementtion of the configuration module */


configmodule_interface_t *load_configmodule(int argc, char **argv)
{
char *cfgparam=NULL;
char *modeparams=NULL;
char *cfgmode=NULL;
char *strtokctx=NULL;
108
char *atoken;
109

110
int i;
111
 
112

113
114
115
116
117
118
119
/* first parse the command line to look for the -O option */
  opterr=0;
  while ((i = getopt(argc, argv, "O:")) != -1) {
       if ( i == 'O' ) {
          cfgparam = optarg; 
       }      
   }
120
121
   optind=1;

122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/* look for the OAI_CONFIGMODULE environement variable */
  if ( cfgparam == NULL ) {
     cfgparam = getenv("OAI_CONFIGMODULE");
     }

/* default */
  if (cfgparam == NULL) {
     cfgparam = "libconfig:oaisoftmodem.conf";
     }
/* parse the config parameters to set the config source */
   i = sscanf(cfgparam,"%m[^':']:%ms",&cfgmode,&modeparams);
   if (i< 0) {
       fprintf(stderr,"[CONFIG] %s, %d, sscanf error parsing config source  %s: %s\n", __FILE__, __LINE__,cfgparam, strerror(errno));
       return NULL;
   }
   else if ( i == 1 ) {
138
139
  /* -O argument doesn't contain ":" separator, legacy -O <conf file> option, default cfgmode to libconfig
     with one parameter, the path to the configuration file */
140
141
142
143
144
       modeparams=cfgmode;
       cfgmode=strdup("libconfig");
   }

   cfgptr = malloc(sizeof(configmodule_interface_t));
145
146
147
148
149
150
151
152
153
154
155
156
157
   memset(cfgptr,0,sizeof(configmodule_interface_t));
/* temporary, legacy mode */
   if (i==1) cfgptr->rtflags = cfgptr->rtflags | CONFIG_LEGACY;
/*--*/
   cfgptr->argc   = argc;
   cfgptr->argv   = argv; 
   cfgptr->cfgmode=strdup(cfgmode);

   cfgptr->num_cfgP=0;
   atoken=strtok_r(modeparams,":",&strtokctx);     
   while ( cfgptr->num_cfgP< CONFIG_MAX_OOPT_PARAMS && atoken != NULL) {
       /* look for debug level in the config parameters, it is commom to all config mode 
          and will be removed frome the parameter array passed to the shared module */
158
       char *aptr;
159
       aptr=strcasestr(atoken,"dbgl");
160
       if (aptr != NULL) {
161
162
163
164
165
           cfgptr->rtflags = cfgptr->rtflags | strtol(aptr+4,NULL,0);

       } else {
           cfgptr->cfgP[cfgptr->num_cfgP] = strdup(atoken);
           cfgptr->num_cfgP++;
166
       }
167
       atoken = strtok_r(NULL,":",&strtokctx);
168
169
170
171
   }

   
   printf("[CONFIG] get parameters from %s ",cfgmode);
172
173
   for (i=0;i<cfgptr->num_cfgP; i++) {
        printf("%s ",cfgptr->cfgP[i]); 
174
175
176
177
   }
   printf("\n");

 
178
   i=load_config_sharedlib(cfgptr);
179
180
181
182
183
184
185
186
187
188
189
190
   if (i< 0) {
      fprintf(stderr,"[CONFIG] %s %d config module %s couldn't be loaded\n", __FILE__, __LINE__,cfgmode);
      return NULL;
   } else {
      printf("[CONFIG] config module %s loaded\n",cfgmode);
   }

   Config_Params[CONFIGPARAM_DEBUGFLAGS_IDX].uptr=&(cfgptr->rtflags);
   config_get(Config_Params,CONFIG_PARAMLENGTH(Config_Params), CONFIG_SECTIONNAME );   

   if (modeparams != NULL) free(modeparams);
   if (cfgmode != NULL) free(cfgmode);
191
   
192
193
194
195
196
197
   return cfgptr;
}

void end_configmodule()
{ 
  if (cfgptr != NULL) {
198
199
200
201
202
203
204
205
206
207
      if (cfgptr->end != NULL) {
         printf ("[CONFIG] calling config module end function...\n"); 
         cfgptr->end();
      }
      if( cfgptr->cfgmode != NULL) free(cfgptr->cfgmode);
      printf ("[CONFIG] free %u config parameter pointers\n",cfgptr->num_cfgP);  
      for (int i=0; i<cfgptr->num_cfgP; i++) {
          if ( cfgptr->cfgP[i] != NULL) free(cfgptr->cfgP[i]);
          }
      printf ("[CONFIG] free %u config value pointers\n",cfgptr->numptrs);  
208
209
210
211
212
213
      for(int i=0; i<cfgptr->numptrs ; i++) {
          if (cfgptr->ptrs[i] != NULL) {
             free(cfgptr->ptrs[i]);
          }
          cfgptr->ptrs[i]=NULL;
      }
214

215
216
217
218
219
220
221
222
  free(cfgptr);
  cfgptr=NULL;
  }
}