Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Michael Black
OpenXG UE
Commits
38fb3140
Commit
38fb3140
authored
Nov 22, 2018
by
Raphael Defosseux
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Astyling the common files
Signed-off-by:
Raphael Defosseux
<
raphael.defosseux@eurecom.fr
>
parent
860c7b9a
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1420 additions
and
1333 deletions
+1420
-1333
common/config/config_cmdline.c
common/config/config_cmdline.c
+220
-199
common/config/config_load_configmodule.c
common/config/config_load_configmodule.c
+255
-234
common/config/config_load_configmodule.h
common/config/config_load_configmodule.h
+12
-13
common/config/config_paramdesc.h
common/config/config_paramdesc.h
+70
-71
common/config/config_userapi.c
common/config/config_userapi.c
+308
-268
common/config/config_userapi.h
common/config/config_userapi.h
+3
-3
common/utils/LOG/log.c
common/utils/LOG/log.c
+286
-340
common/utils/LOG/log.h
common/utils/LOG/log.h
+174
-170
common/utils/T/genids.c
common/utils/T/genids.c
+92
-35
No files found.
common/config/config_cmdline.c
View file @
38fb3140
...
...
@@ -20,7 +20,7 @@
*/
/*! \file common/config/cmdline/config_libconfig.c
* \brief configuration module, command line parsing implementation
* \brief configuration module, command line parsing implementation
* \author Francois TABURET
* \date 2017
* \version 0.1
...
...
@@ -39,223 +39,244 @@
#include "config_userapi.h"
int
parse_stringlist
(
paramdef_t
*
cfgoptions
,
char
*
val
)
{
char
*
atoken
;
char
*
tokctx
;
char
*
tmpval
=
strdup
(
val
)
;
int
numelt
=
0
;
cfgoptions
->
numelt
=
0
;
atoken
=
strtok_r
(
tmpval
,
","
,
&
tokctx
)
;
while
(
atoken
!=
NULL
)
{
numelt
++
;
atoken
=
strtok_r
(
NULL
,
","
,
&
tokctx
);
}
free
(
tmpval
);
config_check_valptr
(
cfgoptions
,(
char
**
)
&
(
cfgoptions
->
strlistptr
),
sizeof
(
char
*
)
*
numelt
)
;
cfgoptions
->
numelt
=
numelt
;
atoken
=
strtok_r
(
val
,
","
,
&
tokctx
);
for
(
int
i
=
0
;
i
<
cfgoptions
->
numelt
&&
atoken
!=
NULL
;
i
++
)
{
config_check_valptr
(
cfgoptions
,
&
(
cfgoptions
->
strlistptr
[
i
]),
strlen
(
atoken
)
+
1
);
sprintf
(
cfgoptions
->
strlistptr
[
i
],
"%s"
,
atoken
);
printf_params
(
"[LIBCONFIG] %s[%i]: %s
\n
"
,
cfgoptions
->
optname
,
i
,
cfgoptions
->
strlistptr
[
i
]
);
atoken
=
strtok_r
(
NULL
,
","
,
&
tokctx
);
}
return
(
cfgoptions
->
numelt
>
0
);
int
parse_stringlist
(
paramdef_t
*
cfgoptions
,
char
*
val
)
{
char
*
atoken
;
char
*
tokctx
;
char
*
tmpval
=
strdup
(
val
)
;
int
numelt
=
0
;
cfgoptions
->
numelt
=
0
;
atoken
=
strtok_r
(
tmpval
,
","
,
&
tokctx
);
while
(
atoken
!=
NULL
)
{
numelt
++
;
atoken
=
strtok_r
(
NULL
,
","
,
&
tokctx
);
}
free
(
tmpval
);
config_check_valptr
(
cfgoptions
,(
char
**
)
&
(
cfgoptions
->
strlistptr
),
sizeof
(
char
*
)
*
numelt
);
cfgoptions
->
numelt
=
numelt
;
atoken
=
strtok_r
(
val
,
","
,
&
tokctx
)
;
for
(
int
i
=
0
;
i
<
cfgoptions
->
numelt
&&
atoken
!=
NULL
;
i
++
)
{
config_check_valptr
(
cfgoptions
,
&
(
cfgoptions
->
strlistptr
[
i
]),
strlen
(
atoken
)
+
1
);
sprintf
(
cfgoptions
->
strlistptr
[
i
],
"%s"
,
atoken
);
printf_params
(
"[LIBCONFIG] %s[%i]: %s
\n
"
,
cfgoptions
->
optname
,
i
,
cfgoptions
->
strlistptr
[
i
]
);
atoken
=
strtok_r
(
NULL
,
","
,
&
tokctx
);
}
return
(
cfgoptions
->
numelt
>
0
);
}
int
processoption
(
paramdef_t
*
cfgoptions
,
char
*
value
)
{
char
*
tmpval
=
value
;
int
optisset
=
0
;
char
defbool
[
2
]
=
"1"
;
if
(
value
==
NULL
)
{
if
(
(
cfgoptions
->
paramflags
&
PARAMFLAG_BOOL
)
==
0
)
{
/* not a boolean, argument required */
fprintf
(
stderr
,
"[CONFIG] command line, option %s requires an argument
\n
"
,
cfgoptions
->
optname
);
return
0
;
}
else
{
/* boolean value option without argument, set value to true*/
tmpval
=
defbool
;
}
}
switch
(
cfgoptions
->
type
)
{
case
TYPE_STRING
:
if
(
cfgoptions
->
numelt
==
0
)
{
config_check_valptr
(
cfgoptions
,
cfgoptions
->
strptr
,
strlen
(
tmpval
)
+
1
);
sprintf
(
*
(
cfgoptions
->
strptr
),
"%s"
,
tmpval
);
}
else
{
sprintf
(
(
char
*
)(
cfgoptions
->
strptr
),
"%s"
,
tmpval
);
}
printf_cmdl
(
"[CONFIG] %s set to %s from command line
\n
"
,
cfgoptions
->
optname
,
tmpval
);
optisset
=
1
;
break
;
case
TYPE_STRINGLIST
:
optisset
=
parse_stringlist
(
cfgoptions
,
tmpval
);
break
;
case
TYPE_UINT32
:
case
TYPE_INT32
:
case
TYPE_UINT16
:
case
TYPE_INT16
:
case
TYPE_UINT8
:
case
TYPE_INT8
:
config_check_valptr
(
cfgoptions
,
(
char
**
)
&
(
cfgoptions
->
iptr
),
sizeof
(
int32_t
));
config_assign_int
(
cfgoptions
,
cfgoptions
->
optname
,(
int32_t
)
strtol
(
tmpval
,
NULL
,
0
));
optisset
=
1
;
break
;
case
TYPE_UINT64
:
case
TYPE_INT64
:
config_check_valptr
(
cfgoptions
,
(
char
**
)
&
(
cfgoptions
->
i64ptr
),
sizeof
(
uint64_t
));
*
(
cfgoptions
->
i64ptr
)
=
strtoll
(
tmpval
,
NULL
,
0
);
printf_cmdl
(
"[CONFIG] %s set to %lli from command line
\n
"
,
cfgoptions
->
optname
,
(
long
long
)
*
(
cfgoptions
->
i64ptr
));
optisset
=
1
;
break
;
case
TYPE_UINTARRAY
:
case
TYPE_INTARRAY
:
break
;
case
TYPE_DOUBLE
:
config_check_valptr
(
cfgoptions
,
(
char
**
)
&
(
cfgoptions
->
dblptr
),
sizeof
(
double
));
*
(
cfgoptions
->
dblptr
)
=
strtof
(
tmpval
,
NULL
);
printf_cmdl
(
"[CONFIG] %s set to %lf from command line
\n
"
,
cfgoptions
->
optname
,
*
(
cfgoptions
->
dblptr
));
optisset
=
1
;
break
;
case
TYPE_IPV4ADDR
:
break
;
default:
fprintf
(
stderr
,
"[CONFIG] command line, %s type %i not supported
\n
"
,
cfgoptions
->
optname
,
cfgoptions
->
type
);
break
;
}
/* switch on param type */
if
(
optisset
==
1
)
{
cfgoptions
->
paramflags
=
cfgoptions
->
paramflags
|
PARAMFLAG_PARAMSET
;
}
return
optisset
;
int
processoption
(
paramdef_t
*
cfgoptions
,
char
*
value
)
{
char
*
tmpval
=
value
;
int
optisset
=
0
;
char
defbool
[
2
]
=
"1"
;
if
(
value
==
NULL
)
{
if
(
(
cfgoptions
->
paramflags
&
PARAMFLAG_BOOL
)
==
0
)
{
/* not a boolean, argument required */
fprintf
(
stderr
,
"[CONFIG] command line, option %s requires an argument
\n
"
,
cfgoptions
->
optname
);
return
0
;
}
else
{
/* boolean value option without argument, set value to true*/
tmpval
=
defbool
;
}
}
switch
(
cfgoptions
->
type
)
{
case
TYPE_STRING
:
if
(
cfgoptions
->
numelt
==
0
)
{
config_check_valptr
(
cfgoptions
,
cfgoptions
->
strptr
,
strlen
(
tmpval
)
+
1
);
sprintf
(
*
(
cfgoptions
->
strptr
),
"%s"
,
tmpval
);
}
else
{
sprintf
(
(
char
*
)(
cfgoptions
->
strptr
),
"%s"
,
tmpval
);
}
printf_cmdl
(
"[CONFIG] %s set to %s from command line
\n
"
,
cfgoptions
->
optname
,
tmpval
);
optisset
=
1
;
break
;
case
TYPE_STRINGLIST
:
optisset
=
parse_stringlist
(
cfgoptions
,
tmpval
);
break
;
case
TYPE_UINT32
:
case
TYPE_INT32
:
case
TYPE_UINT16
:
case
TYPE_INT16
:
case
TYPE_UINT8
:
case
TYPE_INT8
:
config_check_valptr
(
cfgoptions
,
(
char
**
)
&
(
cfgoptions
->
iptr
),
sizeof
(
int32_t
));
config_assign_int
(
cfgoptions
,
cfgoptions
->
optname
,(
int32_t
)
strtol
(
tmpval
,
NULL
,
0
));
optisset
=
1
;
break
;
case
TYPE_UINT64
:
case
TYPE_INT64
:
config_check_valptr
(
cfgoptions
,
(
char
**
)
&
(
cfgoptions
->
i64ptr
),
sizeof
(
uint64_t
));
*
(
cfgoptions
->
i64ptr
)
=
strtoll
(
tmpval
,
NULL
,
0
);
printf_cmdl
(
"[CONFIG] %s set to %lli from command line
\n
"
,
cfgoptions
->
optname
,
(
long
long
)
*
(
cfgoptions
->
i64ptr
));
optisset
=
1
;
break
;
case
TYPE_UINTARRAY
:
case
TYPE_INTARRAY
:
break
;
case
TYPE_DOUBLE
:
config_check_valptr
(
cfgoptions
,
(
char
**
)
&
(
cfgoptions
->
dblptr
),
sizeof
(
double
));
*
(
cfgoptions
->
dblptr
)
=
strtof
(
tmpval
,
NULL
);
printf_cmdl
(
"[CONFIG] %s set to %lf from command line
\n
"
,
cfgoptions
->
optname
,
*
(
cfgoptions
->
dblptr
));
optisset
=
1
;
break
;
case
TYPE_IPV4ADDR
:
break
;
default:
fprintf
(
stderr
,
"[CONFIG] command line, %s type %i not supported
\n
"
,
cfgoptions
->
optname
,
cfgoptions
->
type
);
break
;
}
/* switch on param type */
if
(
optisset
==
1
)
{
cfgoptions
->
paramflags
=
cfgoptions
->
paramflags
|
PARAMFLAG_PARAMSET
;
}
return
optisset
;
}
int
config_check_cmdlineopt
(
char
*
prefix
)
{
int
unknowndetected
=
0
;
char
testprefix
[
CONFIG_MAXOPTLENGTH
]
=
""
;
int
finalcheck
=
0
;
if
(
prefix
!=
NULL
)
{
if
(
strcmp
(
prefix
,
CONFIG_CHECKALLSECTIONS
)
==
0
)
finalcheck
=
1
;
else
if
(
strlen
(
prefix
)
>
0
)
{
sprintf
(
testprefix
,
"--%s."
,
prefix
);
}
}
for
(
int
i
=
1
;
i
<
config_get_if
()
->
argc
;
i
++
)
{
if
(
!
finalcheck
&&
strstr
(
config_get_if
()
->
argv
[
i
],
testprefix
)
==
NULL
)
continue
;
if
(
!
finalcheck
&&
testprefix
[
0
]
==
0
&&
index
(
config_get_if
()
->
argv
[
i
],
'.'
)
!=
NULL
)
continue
;
if
(
!
finalcheck
&&
config_get_if
()
->
argv
[
i
][
0
]
==
'-'
&&
isdigit
(
config_get_if
()
->
argv
[
i
][
1
]))
continue
;
if
(
(
config_get_if
()
->
argv_info
[
i
]
&
CONFIG_CMDLINEOPT_PROCESSED
)
==
0
)
{
fprintf
(
stderr
,
"[CONFIG] unknown option: %s
\n
"
,
config_get_if
()
->
argv
[
i
]
);
unknowndetected
++
;
}
int
config_check_cmdlineopt
(
char
*
prefix
)
{
int
unknowndetected
=
0
;
char
testprefix
[
CONFIG_MAXOPTLENGTH
]
=
""
;
int
finalcheck
=
0
;
if
(
prefix
!=
NULL
)
{
if
(
strcmp
(
prefix
,
CONFIG_CHECKALLSECTIONS
)
==
0
)
finalcheck
=
1
;
else
if
(
strlen
(
prefix
)
>
0
)
{
sprintf
(
testprefix
,
"--%s."
,
prefix
);
}
}
for
(
int
i
=
1
;
i
<
config_get_if
()
->
argc
;
i
++
)
{
if
(
!
finalcheck
&&
strstr
(
config_get_if
()
->
argv
[
i
],
testprefix
)
==
NULL
)
continue
;
if
(
!
finalcheck
&&
testprefix
[
0
]
==
0
&&
index
(
config_get_if
()
->
argv
[
i
],
'.'
)
!=
NULL
)
continue
;
if
(
!
finalcheck
&&
config_get_if
()
->
argv
[
i
][
0
]
==
'-'
&&
isdigit
(
config_get_if
()
->
argv
[
i
][
1
]))
continue
;
if
(
(
config_get_if
()
->
argv_info
[
i
]
&
CONFIG_CMDLINEOPT_PROCESSED
)
==
0
)
{
fprintf
(
stderr
,
"[CONFIG] unknown option: %s
\n
"
,
config_get_if
()
->
argv
[
i
]
);
unknowndetected
++
;
}
}
printf_cmdl
(
"[CONFIG] %i unknown option(s) in command line starting with %s (section %s)
\n
"
,
unknowndetected
,
testprefix
,((
prefix
==
NULL
)
?
""
:
prefix
));
return
unknowndetected
;
return
unknowndetected
;
}
/* parse_cmdline*/
int
config_process_cmdline
(
paramdef_t
*
cfgoptions
,
int
numoptions
,
char
*
prefix
)
{
int
config_process_cmdline
(
paramdef_t
*
cfgoptions
,
int
numoptions
,
char
*
prefix
)
{
int
c
=
config_get_if
()
->
argc
;
int
i
,
j
;
char
*
pp
;
char
cfgpath
[
CONFIG_MAXOPTLENGTH
];
j
=
0
;
i
=
0
;
while
(
c
>
0
)
{
char
*
oneargv
=
strdup
(
config_get_if
()
->
argv
[
i
]);
/* we use strtok_r which modifies its string paramater, and we don't want argv to be modified */
/* first check help options, either --help, -h or --help_<section> */
if
(
strncmp
(
oneargv
,
"-h"
,
2
)
==
0
||
strncmp
(
oneargv
,
"--help"
,
6
)
==
0
)
{
char
*
tokctx
;
pp
=
strtok_r
(
oneargv
,
"_"
,
&
tokctx
);
while
(
c
>
0
)
{
char
*
oneargv
=
strdup
(
config_get_if
()
->
argv
[
i
]);
/* we use strtok_r which modifies its string paramater, and we don't want argv to be modified */
/* first check help options, either --help, -h or --help_<section> */
if
(
strncmp
(
oneargv
,
"-h"
,
2
)
==
0
||
strncmp
(
oneargv
,
"--help"
,
6
)
==
0
)
{
char
*
tokctx
;
pp
=
strtok_r
(
oneargv
,
"_"
,
&
tokctx
);
config_get_if
()
->
argv_info
[
i
]
|=
CONFIG_CMDLINEOPT_PROCESSED
;
if
(
pp
==
NULL
||
strcasecmp
(
pp
,
config_get_if
()
->
argv
[
i
]
)
==
0
)
{
if
(
prefix
==
NULL
)
{
config_printhelp
(
cfgoptions
,
numoptions
);
if
(
!
(
CONFIG_ISFLAGSET
(
CONFIG_NOEXITONHELP
)))
exit_fun
(
"[CONFIG] Exiting after displaying help
\n
"
);
}
}
else
{
pp
=
strtok_r
(
NULL
,
" "
,
&
tokctx
);
if
(
prefix
!=
NULL
&&
pp
!=
NULL
&&
strncasecmp
(
prefix
,
pp
,
strlen
(
pp
))
==
0
)
{
printf
(
"Help for %s section:
\n
"
,
prefix
);
config_printhelp
(
cfgoptions
,
numoptions
);
if
(
!
(
CONFIG_ISFLAGSET
(
CONFIG_NOEXITONHELP
)))
{
fprintf
(
stderr
,
"[CONFIG] %s %i section %s:"
,
__FILE__
,
__LINE__
,
prefix
);
exit_fun
(
" Exiting after displaying help
\n
"
);
}
}
}
}
/* now, check for non help options */
if
(
oneargv
[
0
]
==
'-'
)
{
for
(
int
n
=
0
;
n
<
numoptions
;
n
++
)
{
if
(
(
cfgoptions
[
n
].
paramflags
&
PARAMFLAG_DISABLECMDLINE
)
!=
0
)
{
continue
;
}
if
(
prefix
!=
NULL
)
{
sprintf
(
cfgpath
,
"%s.%s"
,
prefix
,
cfgoptions
[
n
].
optname
);
}
else
{
sprintf
(
cfgpath
,
"%s"
,
cfgoptions
[
n
].
optname
);
}
if
(
((
strlen
(
oneargv
)
==
2
)
&&
(
strcmp
(
oneargv
+
1
,
cfgpath
)
==
0
))
||
/* short option, one "-" */
((
strlen
(
oneargv
)
>
2
)
&&
(
strcmp
(
oneargv
+
2
,
cfgpath
)
==
0
))
)
{
char
*
valptr
=
NULL
;
int
ret
;
config_get_if
()
->
argv_info
[
i
]
|=
CONFIG_CMDLINEOPT_PROCESSED
;
if
(
c
>
0
)
{
pp
=
config_get_if
()
->
argv
[
i
+
1
];
if
(
pp
!=
NULL
)
{
ret
=
strlen
(
pp
);
if
(
ret
>
0
)
{
if
(
pp
[
0
]
!=
'-'
)
valptr
=
pp
;
else
if
(
ret
>
1
&&
pp
[
0
]
==
'-'
&&
isdigit
(
pp
[
1
])
)
valptr
=
pp
;
}
}
}
j
+=
processoption
(
&
(
cfgoptions
[
n
]),
valptr
);
if
(
valptr
!=
NULL
)
{
i
++
;
config_get_if
()
->
argv_info
[
i
]
|=
CONFIG_CMDLINEOPT_PROCESSED
;
if
(
pp
==
NULL
||
strcasecmp
(
pp
,
config_get_if
()
->
argv
[
i
]
)
==
0
)
{
if
(
prefix
==
NULL
)
{
config_printhelp
(
cfgoptions
,
numoptions
);
if
(
!
(
CONFIG_ISFLAGSET
(
CONFIG_NOEXITONHELP
)))
exit_fun
(
"[CONFIG] Exiting after displaying help
\n
"
);
}
}
else
{
pp
=
strtok_r
(
NULL
,
" "
,
&
tokctx
);
if
(
prefix
!=
NULL
&&
pp
!=
NULL
&&
strncasecmp
(
prefix
,
pp
,
strlen
(
pp
))
==
0
)
{
printf
(
"Help for %s section:
\n
"
,
prefix
);
config_printhelp
(
cfgoptions
,
numoptions
);
if
(
!
(
CONFIG_ISFLAGSET
(
CONFIG_NOEXITONHELP
)))
{
fprintf
(
stderr
,
"[CONFIG] %s %i section %s:"
,
__FILE__
,
__LINE__
,
prefix
);
exit_fun
(
" Exiting after displaying help
\n
"
);
}
}
}
c
--
;
}
break
;
}
}
/* for n... */
}
/* if (oneargv[0] == '-') */
free
(
oneargv
);
i
++
;
c
--
;
}
/* fin du while */
/* now, check for non help options */
if
(
oneargv
[
0
]
==
'-'
)
{
for
(
int
n
=
0
;
n
<
numoptions
;
n
++
)
{
if
(
(
cfgoptions
[
n
].
paramflags
&
PARAMFLAG_DISABLECMDLINE
)
!=
0
)
{
continue
;
}
if
(
prefix
!=
NULL
)
{
sprintf
(
cfgpath
,
"%s.%s"
,
prefix
,
cfgoptions
[
n
].
optname
);
}
else
{
sprintf
(
cfgpath
,
"%s"
,
cfgoptions
[
n
].
optname
);
}
if
(
((
strlen
(
oneargv
)
==
2
)
&&
(
strcmp
(
oneargv
+
1
,
cfgpath
)
==
0
))
||
/* short option, one "-" */
((
strlen
(
oneargv
)
>
2
)
&&
(
strcmp
(
oneargv
+
2
,
cfgpath
)
==
0
))
)
{
char
*
valptr
=
NULL
;
int
ret
;
config_get_if
()
->
argv_info
[
i
]
|=
CONFIG_CMDLINEOPT_PROCESSED
;
if
(
c
>
0
)
{
pp
=
config_get_if
()
->
argv
[
i
+
1
];
if
(
pp
!=
NULL
)
{
ret
=
strlen
(
pp
);
if
(
ret
>
0
)
{
if
(
pp
[
0
]
!=
'-'
)
valptr
=
pp
;
else
if
(
ret
>
1
&&
pp
[
0
]
==
'-'
&&
isdigit
(
pp
[
1
])
)
valptr
=
pp
;
}
}
}
j
+=
processoption
(
&
(
cfgoptions
[
n
]),
valptr
);
if
(
valptr
!=
NULL
)
{
i
++
;
config_get_if
()
->
argv_info
[
i
]
|=
CONFIG_CMDLINEOPT_PROCESSED
;
c
--
;
}
break
;
}
}
/* for n... */
}
/* if (oneargv[0] == '-') */
free
(
oneargv
);
i
++
;
c
--
;
}
/* fin du while */
printf_cmdl
(
"[CONFIG] %s %i options set from command line
\n
"
,((
prefix
==
NULL
)
?
"(root)"
:
prefix
),
j
);
if
(
!
(
CONFIG_ISFLAGSET
(
CONFIG_NOCHECKUNKOPT
))
)
{
i
=
config_check_cmdlineopt
(
prefix
);
if
(
i
>
0
)
{
fprintf
(
stderr
,
"[CONFIG] %i unknown options for section %s detected in command line
\n
"
,
i
,((
prefix
==
NULL
)
?
"
\"
root section
\"
"
:
prefix
));
exit_fun
(
" Exiting after detecting errors in command line
\n
"
);
}
i
=
config_check_cmdlineopt
(
prefix
);
if
(
i
>
0
)
{
fprintf
(
stderr
,
"[CONFIG] %i unknown options for section %s detected in command line
\n
"
,
i
,((
prefix
==
NULL
)
?
"
\"
root section
\"
"
:
prefix
));
exit_fun
(
" Exiting after detecting errors in command line
\n
"
);
}
}
return
j
;
return
j
;
}
/* parse_cmdline*/
common/config/config_load_configmodule.c
View file @
38fb3140
...
...
@@ -20,7 +20,7 @@
*/
/*! \file common/config/config_load_configmodule.c
* \brief configuration module, load the shared library implementing the configuration module
* \brief configuration module, load the shared library implementing the configuration module
* \author Francois TABURET
* \date 2017
* \version 0.1
...
...
@@ -42,293 +42,314 @@
#include "config_userapi.h"
#define CONFIG_SHAREDLIBFORMAT "libparams_%s.so"
int
load_config_sharedlib
(
configmodule_interface_t
*
cfgptr
)
{
void
*
lib_handle
;
char
fname
[
128
];
char
libname
[
FILENAME_MAX
];
int
st
;
int
load_config_sharedlib
(
configmodule_interface_t
*
cfgptr
)
{
void
*
lib_handle
;
char
fname
[
128
];
char
libname
[
FILENAME_MAX
];
int
st
;
st
=
0
;
sprintf
(
libname
,
CONFIG_SHAREDLIBFORMAT
,
cfgptr
->
cfgmode
);
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
{
sprintf
(
fname
,
"config_%s_init"
,
cfgptr
->
cfgmode
);
cfgptr
->
init
=
dlsym
(
lib_handle
,
fname
);
if
(
cfgptr
->
init
==
NULL
)
{
printf
(
"[CONFIG] %s %d no function %s for config mode %s
\n
"
,
__FILE__
,
__LINE__
,
fname
,
cfgptr
->
cfgmode
);
}
else
{
st
=
cfgptr
->
init
(
cfgptr
->
cfgP
,
cfgptr
->
num_cfgP
);
printf
(
"[CONFIG] function %s returned %i
\n
"
,
fname
,
st
);
}
st
=
0
;
sprintf
(
libname
,
CONFIG_SHAREDLIBFORMAT
,
cfgptr
->
cfgmod
e
);
sprintf
(
fname
,
"config_%s_get"
,
cfgptr
->
cfgmode
);
cfgptr
->
get
=
dlsym
(
lib_handle
,
fnam
e
);
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
()
);
if
(
cfgptr
->
get
==
NULL
)
{
printf
(
"[CONFIG] %s %d no function %s for config mode %s
\n
"
,
__FILE__
,
__LINE__
,
fname
,
cfgptr
->
cfgmode
);
st
=
-
1
;
}
else
{
sprintf
(
fname
,
"config_%s_init"
,
cfgptr
->
cfgmode
);
cfgptr
->
init
=
dlsym
(
lib_handle
,
fname
);
if
(
cfgptr
->
init
==
NULL
)
{
printf
(
"[CONFIG] %s %d no function %s for config mode %s
\n
"
,
__FILE__
,
__LINE__
,
fname
,
cfgptr
->
cfgmode
);
}
else
{
st
=
cfgptr
->
init
(
cfgptr
->
cfgP
,
cfgptr
->
num_cfgP
);
printf
(
"[CONFIG] function %s returned %i
\n
"
,
fname
,
st
);
}
}
sprintf
(
fname
,
"config_%s_get"
,
cfgptr
->
cfgmode
);
cfgptr
->
get
=
dlsym
(
lib_handle
,
fname
);
if
(
cfgptr
->
get
==
NULL
)
{
printf
(
"[CONFIG] %s %d no function %s for config mode %s
\n
"
,
__FILE__
,
__LINE__
,
fname
,
cfgptr
->
cfgmode
);
st
=
-
1
;
}
sprintf
(
fname
,
"config_%s_getlist"
,
cfgptr
->
cfgmode
);
cfgptr
->
getlist
=
dlsym
(
lib_handle
,
fname
);
if
(
cfgptr
->
getlist
==
NULL
)
{
printf
(
"[CONFIG] %s %d no function %s for config mode %s
\n
"
,
__FILE__
,
__LINE__
,
fname
,
cfgptr
->
cfgmode
);
st
=
-
1
;
}
sprintf
(
fname
,
"config_%s_getlist"
,
cfgptr
->
cfgmode
);
cfgptr
->
getlist
=
dlsym
(
lib_handle
,
fname
);
if
(
cfgptr
->
getlist
==
NULL
)
{
printf
(
"[CONFIG] %s %d no function %s for config mode %s
\n
"
,
__FILE__
,
__LINE__
,
fname
,
cfgptr
->
cfgmode
);
st
=
-
1
;
}
sprintf
(
fname
,
"config_%s_end"
,
cfgptr
->
cfgmode
);
cfgptr
->
end
=
dlsym
(
lib_handle
,
fname
);
if
(
cfgptr
->
getlist
==
NULL
)
{
printf
(
"[CONFIG] %s %d no function %s for config mode %s
\n
"
,
__FILE__
,
__LINE__
,
fname
,
cfgptr
->
cfgmode
);
}
}
return
st
;
sprintf
(
fname
,
"config_%s_end"
,
cfgptr
->
cfgmode
);
cfgptr
->
end
=
dlsym
(
lib_handle
,
fname
);
if
(
cfgptr
->
getlist
==
NULL
)
{
printf
(
"[CONFIG] %s %d no function %s for config mode %s
\n
"
,
__FILE__
,
__LINE__
,
fname
,
cfgptr
->
cfgmode
);
}
}
return
st
;
}
/*-----------------------------------------------------------------------------------*/
/* from here: interface implementtion of the configuration module */
int
nooptfunc
(
void
)
{
return
0
;
return
0
;
};
int
config_cmdlineonly_getlist
(
paramlist_def_t
*
ParamList
,
paramdef_t
*
params
,
int
numparams
,
char
*
prefix
)
{
ParamList
->
numelt
=
0
;
return
0
;
int
config_cmdlineonly_getlist
(
paramlist_def_t
*
ParamList
,
paramdef_t
*
params
,
int
numparams
,
char
*
prefix
)
{
ParamList
->
numelt
=
0
;
return
0
;
}
int
config_cmdlineonly_get
(
paramdef_t
*
cfgoptions
,
int
numoptions
,
char
*
prefix
)
{
int
config_cmdlineonly_get
(
paramdef_t
*
cfgoptions
,
int
numoptions
,
char
*
prefix
)
{
int
defval
;
int
fatalerror
=
0
;
int
numdefvals
=
0
;
for
(
int
i
=
0
;
i
<
numoptions
;
i
++
)
{
defval
=
0
;
switch
(
cfgoptions
[
i
].
type
)
{
case
TYPE_STRING
:
defval
=
config_setdefault_string
(
&
(
cfgoptions
[
i
]),
prefix
);
break
;
case
TYPE_STRINGLIST
:
defval
=
config_setdefault_stringlist
(
&
(
cfgoptions
[
i
]),
prefix
);
break
;
case
TYPE_UINT8
:
case
TYPE_INT8
:
case
TYPE_UINT16
:
case
TYPE_INT16
:
case
TYPE_UINT32
:
case
TYPE_INT32
:
case
TYPE_MASK
:
defval
=
config_setdefault_int
(
&
(
cfgoptions
[
i
]),
prefix
);
for
(
int
i
=
0
;
i
<
numoptions
;
i
++
)
{
defval
=
0
;
switch
(
cfgoptions
[
i
].
type
)
{
case
TYPE_STRING
:
defval
=
config_setdefault_string
(
&
(
cfgoptions
[
i
]),
prefix
);
break
;
case
TYPE_STRINGLIST
:
defval
=
config_setdefault_stringlist
(
&
(
cfgoptions
[
i
]),
prefix
);
break
;
case
TYPE_UINT8
:
case
TYPE_INT8
:
case
TYPE_UINT16
:
case
TYPE_INT16
:
case
TYPE_UINT32
:
case
TYPE_INT32
:
case
TYPE_MASK
:
defval
=
config_setdefault_int
(
&
(
cfgoptions
[
i
]),
prefix
);
break
;
case
TYPE_UINT64
:
case
TYPE_INT64
:
defval
=
config_setdefault_int64
(
&
(
cfgoptions
[
i
]),
prefix
);
break
;
case
TYPE_UINTARRAY
:
case
TYPE_INTARRAY
:
defval
=
config_setdefault_intlist
(
&
(
cfgoptions
[
i
]),
prefix
);
case
TYPE_UINT64
:
case
TYPE_INT64
:
defval
=
config_setdefault_int64
(
&
(
cfgoptions
[
i
]),
prefix
);
break
;
case
TYPE_DOUBLE
:
defval
=
config_setdefault_double
(
&
(
cfgoptions
[
i
]),
prefix
);
break
;
case
TYPE_IPV4ADDR
:
defval
=
config_setdefault_ipv4addr
(
&
(
cfgoptions
[
i
]),
prefix
);
case
TYPE_UINTARRAY
:
case
TYPE_INTARRAY
:
defval
=
config_setdefault_intlist
(
&
(
cfgoptions
[
i
]),
prefix
);
break
;
default:
fprintf
(
stderr
,
"[CONFIG] %s.%s type %i not supported
\n
"
,
prefix
,
cfgoptions
[
i
].
optname
,
cfgoptions
[
i
].
type
);
fatalerror
=
1
;
case
TYPE_DOUBLE
:
defval
=
config_setdefault_double
(
&
(
cfgoptions
[
i
]),
prefix
)
;
break
;
}
/* switch on param type */
case
TYPE_IPV4ADDR
:
defval
=
config_setdefault_ipv4addr
(
&
(
cfgoptions
[
i
]),
prefix
);
break
;
default:
fprintf
(
stderr
,
"[CONFIG] %s.%s type %i not supported
\n
"
,
prefix
,
cfgoptions
[
i
].
optname
,
cfgoptions
[
i
].
type
);
fatalerror
=
1
;
break
;
}
/* switch on param type */
if
(
defval
==
1
)
{
numdefvals
++
;
cfgoptions
[
i
].
paramflags
=
cfgoptions
[
i
].
paramflags
|
PARAMFLAG_PARAMSETDEF
;
numdefvals
++
;
cfgoptions
[
i
].
paramflags
=
cfgoptions
[
i
].
paramflags
|
PARAMFLAG_PARAMSETDEF
;
}
}
/* for loop on options */
printf
(
"[CONFIG] %s: %i/%i parameters successfully set
\n
"
,
((
prefix
==
NULL
)
?
"(root)"
:
prefix
),
((
prefix
==
NULL
)
?
"(root)"
:
prefix
),
numdefvals
,
numoptions
);
if
(
fatalerror
==
1
)
{
fprintf
(
stderr
,
"[CONFIG] fatal errors found when assigning %s parameters
\n
"
,
prefix
);
fprintf
(
stderr
,
"[CONFIG] fatal errors found when assigning %s parameters
\n
"
,
prefix
);
}
return
numdefvals
;
}
configmodule_interface_t
*
load_configmodule
(
int
argc
,
char
**
argv
,
uint32_t
initflags
)
{
char
*
cfgparam
=
NULL
;
char
*
modeparams
=
NULL
;
char
*
cfgmode
=
NULL
;
char
*
strtokctx
=
NULL
;
char
*
atoken
;
uint32_t
tmpflags
=
0
;
int
i
;
int
OoptIdx
=-
1
;
/* first parse the command line to look for the -O option */
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
if
(
strlen
(
argv
[
i
])
<
2
)
continue
;
if
(
argv
[
i
][
1
]
==
'O'
&&
i
<
(
argc
-
1
))
{
cfgparam
=
argv
[
i
+
1
];
OoptIdx
=
i
;
}
if
(
strstr
(
argv
[
i
],
"help_config"
)
!=
NULL
)
{
config_printhelp
(
Config_Params
,
CONFIG_PARAMLENGTH
(
Config_Params
));
exit
(
0
);
}
if
(
(
strcmp
(
argv
[
i
]
+
1
,
"h"
)
==
0
)
||
(
strstr
(
argv
[
i
]
+
1
,
"help_"
)
!=
NULL
)
)
{
tmpflags
=
CONFIG_HELP
;
}
}
/* look for the OAI_CONFIGMODULE environement variable */
configmodule_interface_t
*
load_configmodule
(
int
argc
,
char
**
argv
,
uint32_t
initflags
)
{
char
*
cfgparam
=
NULL
;
char
*
modeparams
=
NULL
;
char
*
cfgmode
=
NULL
;
char
*
strtokctx
=
NULL
;
char
*
atoken
;
uint32_t
tmpflags
=
0
;
int
i
;
int
OoptIdx
=-
1
;
/* first parse the command line to look for the -O option */
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
if
(
strlen
(
argv
[
i
])
<
2
)
continue
;
if
(
argv
[
i
][
1
]
==
'O'
&&
i
<
(
argc
-
1
))
{
cfgparam
=
argv
[
i
+
1
];
OoptIdx
=
i
;
}
if
(
strstr
(
argv
[
i
],
"help_config"
)
!=
NULL
)
{
config_printhelp
(
Config_Params
,
CONFIG_PARAMLENGTH
(
Config_Params
));
exit
(
0
);
}
if
(
(
strcmp
(
argv
[
i
]
+
1
,
"h"
)
==
0
)
||
(
strstr
(
argv
[
i
]
+
1
,
"help_"
)
!=
NULL
)
)
{
tmpflags
=
CONFIG_HELP
;
}
}
/* look for the OAI_CONFIGMODULE environement variable */
if
(
cfgparam
==
NULL
)
{
cfgparam
=
getenv
(
"OAI_CONFIGMODULE"
);
}
/* default different for UE and softmodem because UE doesn't use config file*/
/* and -O option is not mandatory for UE */
/* phy simulators behave as UE */
/* test of exec name would better be replaced by a parameter to the l */
/* oad_configmodule function */
cfgparam
=
getenv
(
"OAI_CONFIGMODULE"
);
}
/* default different for UE and softmodem because UE doesn't use config file*/
/* and -O option is not mandatory for UE */
/* phy simulators behave as UE */
/* test of exec name would better be replaced by a parameter to the l */
/* oad_configmodule function */
if
(
cfgparam
==
NULL
)
{
tmpflags
=
tmpflags
|
CONFIG_NOOOPT
;
if
(
initflags
&
CONFIG_ENABLECMDLINEONLY
)
{
cfgparam
=
CONFIG_CMDLINEONLY
":dbgl0"
;
cfgparam
=
CONFIG_CMDLINEONLY
":dbgl0"
;
}
else
{
cfgparam
=
CONFIG_CMDLINEONLY
":dbgl0"
;
cfgparam
=
CONFIG_LIBCONFIGFILE
":"
DEFAULT_CFGFILENAME
;
}
}
/* 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
));
exit
(
-
1
)
;
}
else
if
(
i
==
1
)
{
/* -O argument doesn't contain ":" separator, assume -O <conf file> option, default cfgmode to libconfig
with one parameter, the path to the configuration file cfgmode must not be NULL */
modeparams
=
cfgmode
;
cfgmode
=
strdup
(
CONFIG_LIBCONFIGFILE
);
}
cfgptr
=
calloc
(
sizeof
(
configmodule_interface_t
),
1
);
cfgptr
->
argv_info
=
calloc
(
sizeof
(
int32_t
),
argc
);
cfgptr
->
argv_info
[
0
]
|=
CONFIG_CMDLINEOPT_PROCESSED
;
if
(
OoptIdx
>=
0
)
{
cfgptr
->
argv_info
[
OoptIdx
]
|=
CONFIG_CMDLINEOPT_PROCESSED
;
cfgptr
->
argv_info
[
OoptIdx
+
1
]
|=
CONFIG_CMDLINEOPT_PROCESSED
;
}
cfgptr
->
rtflags
=
cfgptr
->
rtflags
|
tmpflags
;
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 */
char
*
aptr
;
aptr
=
strcasestr
(
atoken
,
"dbgl"
);
if
(
aptr
!=
NULL
)
{
cfgptr
->
rtflags
=
cfgptr
->
rtflags
|
strtol
(
aptr
+
4
,
NULL
,
0
);
}
else
{
cfgptr
->
cfgP
[
cfgptr
->
num_cfgP
]
=
strdup
(
atoken
);
cfgptr
->
num_cfgP
++
;
}
atoken
=
strtok_r
(
NULL
,
":"
,
&
strtokctx
);
}
printf
(
"[CONFIG] get parameters from %s "
,
cfgmode
);
for
(
i
=
0
;
i
<
cfgptr
->
num_cfgP
;
i
++
)
{
printf
(
"%s "
,
cfgptr
->
cfgP
[
i
]);
}
printf
(
", debug flags: 0x%08x
\n
"
,
cfgptr
->
rtflags
);
if
(
strstr
(
cfgparam
,
CONFIG_CMDLINEONLY
)
==
NULL
)
{
i
=
load_config_sharedlib
(
cfgptr
);
if
(
i
==
0
)
{
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
);
}
else
{
cfgparam
=
CONFIG_CMDLINEONLY
":dbgl0"
;
cfgparam
=
CONFIG_LIBCONFIGFILE
":"
DEFAULT_CFGFILENAME
;
fprintf
(
stderr
,
"[CONFIG] %s %d config module
\"
%s
\"
couldn't be loaded
\n
"
,
__FILE__
,
__LINE__
,
cfgmode
);
cfgptr
->
rtflags
=
cfgptr
->
rtflags
|
CONFIG_HELP
|
CONFIG_ABORT
;
}
}
else
{
cfgptr
->
init
=
(
configmodule_initfunc_t
)
nooptfunc
;
cfgptr
->
get
=
config_cmdlineonly_get
;
cfgptr
->
getlist
=
config_cmdlineonly_getlist
;
cfgptr
->
end
=
(
configmodule_endfunc_t
)
nooptfunc
;
}
if
(
modeparams
!=
NULL
)
free
(
modeparams
);
if
(
cfgmode
!=
NULL
)
free
(
cfgmode
);
if
(
CONFIG_ISFLAGSET
(
CONFIG_ABORT
))
{
config_printhelp
(
Config_Params
,
CONFIG_PARAMLENGTH
(
Config_Params
));
// exit(-1);
}
/* 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
));
exit
(
-
1
)
;
}
else
if
(
i
==
1
)
{
/* -O argument doesn't contain ":" separator, assume -O <conf file> option, default cfgmode to libconfig
with one parameter, the path to the configuration file cfgmode must not be NULL */
modeparams
=
cfgmode
;
cfgmode
=
strdup
(
CONFIG_LIBCONFIGFILE
);
}
cfgptr
=
calloc
(
sizeof
(
configmodule_interface_t
),
1
);
cfgptr
->
argv_info
=
calloc
(
sizeof
(
int32_t
),
argc
);
cfgptr
->
argv_info
[
0
]
|=
CONFIG_CMDLINEOPT_PROCESSED
;
if
(
OoptIdx
>=
0
)
{
cfgptr
->
argv_info
[
OoptIdx
]
|=
CONFIG_CMDLINEOPT_PROCESSED
;
cfgptr
->
argv_info
[
OoptIdx
+
1
]
|=
CONFIG_CMDLINEOPT_PROCESSED
;
}
cfgptr
->
rtflags
=
cfgptr
->
rtflags
|
tmpflags
;
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 */
char
*
aptr
;
aptr
=
strcasestr
(
atoken
,
"dbgl"
);
if
(
aptr
!=
NULL
)
{
cfgptr
->
rtflags
=
cfgptr
->
rtflags
|
strtol
(
aptr
+
4
,
NULL
,
0
);
}
else
{
cfgptr
->
cfgP
[
cfgptr
->
num_cfgP
]
=
strdup
(
atoken
);
cfgptr
->
num_cfgP
++
;
}
atoken
=
strtok_r
(
NULL
,
":"
,
&
strtokctx
);
}
printf
(
"[CONFIG] get parameters from %s "
,
cfgmode
);
for
(
i
=
0
;
i
<
cfgptr
->
num_cfgP
;
i
++
)
{
printf
(
"%s "
,
cfgptr
->
cfgP
[
i
]);
}
printf
(
", debug flags: 0x%08x
\n
"
,
cfgptr
->
rtflags
);
if
(
strstr
(
cfgparam
,
CONFIG_CMDLINEONLY
)
==
NULL
)
{
i
=
load_config_sharedlib
(
cfgptr
);
if
(
i
==
0
)
{
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
);
}
else
{
fprintf
(
stderr
,
"[CONFIG] %s %d config module
\"
%s
\"
couldn't be loaded
\n
"
,
__FILE__
,
__LINE__
,
cfgmode
);
cfgptr
->
rtflags
=
cfgptr
->
rtflags
|
CONFIG_HELP
|
CONFIG_ABORT
;
}
}
else
{
cfgptr
->
init
=
(
configmodule_initfunc_t
)
nooptfunc
;
cfgptr
->
get
=
config_cmdlineonly_get
;
cfgptr
->
getlist
=
config_cmdlineonly_getlist
;
cfgptr
->
end
=
(
configmodule_endfunc_t
)
nooptfunc
;
}
if
(
modeparams
!=
NULL
)
free
(
modeparams
);
if
(
cfgmode
!=
NULL
)
free
(
cfgmode
);
if
(
CONFIG_ISFLAGSET
(
CONFIG_ABORT
))
{
config_printhelp
(
Config_Params
,
CONFIG_PARAMLENGTH
(
Config_Params
));
// exit(-1);
}
return
cfgptr
;
return
cfgptr
;
}
/* free memory allocated when reading parameters */
/* config module could be initialized again after this call */
void
end_configmodule
(
void
)
{
void
end_configmodule
(
void
)
{
if
(
cfgptr
!=
NULL
)
{
if
(
cfgptr
->
end
!=
NULL
)
{
printf
(
"[CONFIG] calling config module end function...
\n
"
);
cfgptr
->
end
();
}
if
(
cfgptr
->
end
!=
NULL
)
{
printf
(
"[CONFIG] calling config module end function...
\n
"
);
cfgptr
->
end
();
}
printf
(
"[CONFIG] free %u config value pointers
\n
"
,
cfgptr
->
numptrs
);
for
(
int
i
=
0
;
i
<
cfgptr
->
numptrs
;
i
++
)
{
if
(
cfgptr
->
ptrs
[
i
]
!=
NULL
)
{
free
(
cfgptr
->
ptrs
[
i
]);
cfgptr
->
ptrs
[
i
]
=
NULL
;
}
printf
(
"[CONFIG] free %u config value pointers
\n
"
,
cfgptr
->
numptrs
);
for
(
int
i
=
0
;
i
<
cfgptr
->
numptrs
;
i
++
)
{
if
(
cfgptr
->
ptrs
[
i
]
!=
NULL
)
{
free
(
cfgptr
->
ptrs
[
i
])
;
cfgptr
->
ptrs
[
i
]
=
NULL
;
}
cfgptr
->
numptrs
=
0
;
}
cfgptr
->
numptrs
=
0
;
}
}
/* free all memory used by config module */
/* should be called only at program exit */
void
free_configmodule
(
void
)
{
void
free_configmodule
(
void
)
{
if
(
cfgptr
!=
NULL
)
{
end_configmodule
();
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
]);
}
end_configmodule
();
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
]);
}
free
(
cfgptr
);
cfgptr
=
NULL
;
free
(
cfgptr
);
cfgptr
=
NULL
;
}
}
...
...
common/config/config_load_configmodule.h
View file @
38fb3140
...
...
@@ -20,8 +20,8 @@
*/
/*! \file common/config/config_load_configmodule.h
* \brief: configuration module, include file to be used by the source code calling the
* configuration module initialization
* \brief: configuration module, include file to be used by the source code calling the
* configuration module initialization
* \author Francois TABURET
* \date 2017
* \version 0.1
...
...
@@ -31,7 +31,7 @@
* \warning
*/
#ifndef INCLUDE_CONFIG_LOADCONFIGMODULE_H
#define INCLUDE_CONFIG_LOADCONFIGMODULE_H
#define INCLUDE_CONFIG_LOADCONFIGMODULE_H
#include <string.h>
...
...
@@ -61,8 +61,7 @@ typedef int(*configmodule_initfunc_t)(char *cfgP[],int numP);
typedef
int
(
*
configmodule_getfunc_t
)(
paramdef_t
*
,
int
numparams
,
char
*
prefix
);
typedef
int
(
*
configmodule_getlistfunc_t
)(
paramlist_def_t
*
,
paramdef_t
*
,
int
numparams
,
char
*
prefix
);
typedef
void
(
*
configmodule_endfunc_t
)(
void
);
typedef
struct
configmodule_interface
{
typedef
struct
configmodule_interface
{
int
argc
;
char
**
argv
;
uint32_t
*
argv_info
;
...
...
@@ -75,7 +74,7 @@ typedef struct configmodule_interface
configmodule_endfunc_t
end
;
uint32_t
numptrs
;
uint32_t
rtflags
;
char
*
ptrs
[
CONFIG_MAX_ALLOCATEDPTRS
];
char
*
ptrs
[
CONFIG_MAX_ALLOCATEDPTRS
];
}
configmodule_interface_t
;
#ifdef CONFIG_LOADCONFIG_MAIN
...
...
@@ -85,17 +84,17 @@ static char config_helpstr [] = "\n lte-softmodem -O [config mode]<:dbgl[debugfl
debugflags can also be defined in the config_libconfig section of the config file
\n
\
debugflags: mask, 1->print parameters, 2->print memory allocations debug messages
\n
\
4->print command line processing debug messages
\n
"
;
#define CONFIG_SECTIONNAME "config"
#define CONFIGPARAM_DEBUGFLAGS_IDX 0
static
paramdef_t
Config_Params
[]
=
{
/*-----------------------------------------------------------------------------------------------------------------------*/
/* config parameters for config module */
/* optname helpstr paramflags XXXptr defXXXval type numelt */
/*-----------------------------------------------------------------------------------------------------------------------*/
{
"debugflags"
,
config_helpstr
,
0
,
uptr
:
NULL
,
defintval
:
0
,
TYPE_MASK
,
0
},
/*-----------------------------------------------------------------------------------------------------------------------*/
/* config parameters for config module */
/* optname helpstr paramflags XXXptr defXXXval type numelt */
/*-----------------------------------------------------------------------------------------------------------------------*/
{
"debugflags"
,
config_helpstr
,
0
,
uptr
:
NULL
,
defintval
:
0
,
TYPE_MASK
,
0
},
};
#else
...
...
@@ -104,7 +103,7 @@ extern configmodule_interface_t *cfgptr;
#define printf_params(...) if ( (cfgptr->rtflags & (CONFIG_PRINTPARAMS)) != 0 ) { printf ( __VA_ARGS__ ); }
#define printf_ptrs(...) if ( (cfgptr->rtflags & (CONFIG_DEBUGPTR)) != 0 ) { printf ( __VA_ARGS__ ); }
#define printf_ptrs(...) if ( (cfgptr->rtflags & (CONFIG_DEBUGPTR)) != 0 ) { printf ( __VA_ARGS__ ); }
#define printf_cmdl(...) if ( (cfgptr->rtflags & (CONFIG_DEBUGCMDLINE)) != 0 ) { printf ( __VA_ARGS__ ); }
#define CONFIG_ENABLECMDLINEONLY (1<<1)
...
...
common/config/config_paramdesc.h
View file @
38fb3140
...
...
@@ -59,78 +59,77 @@
#define CONFIG_MAX_NUMCHECKVAL 20
typedef
struct
paramdef
paramdef_t
;
typedef
union
checkedparam
{
struct
{
int
(
*
f1
)(
paramdef_t
*
param
);
/* check an integer against a list of authorized values */
int
okintval
[
CONFIG_MAX_NUMCHECKVAL
];
/* integer array, store possible values */
int
num_okintval
;
/* number of valid values in the checkingval array */
}
s1
;
struct
{
int
(
*
f1a
)(
paramdef_t
*
param
);
/* check an integer against a list of authorized values and set param value */
/* to the corresponding item in setintval array (mainly for RRC params) */
int
okintval
[
CONFIG_MAX_NUMCHECKVAL
];
/* integer array, store possible values in config file */
int
setintval
[
CONFIG_MAX_NUMCHECKVAL
];
/* integer array, values set in the paramdef structure */
int
num_okintval
;
/* number of valid values in the checkingval array */
}
s1a
;
struct
{
int
(
*
f2
)(
paramdef_t
*
param
);
/* check an integer against an authorized range, defined by its min and max value */
int
okintrange
[
CONFIG_MAX_NUMCHECKVAL
];
/* integer array, store min and max values */
}
s2
;
struct
{
int
(
*
f3
)(
paramdef_t
*
param
);
/* check a string against a list of authorized values */
char
*
okstrval
[
CONFIG_MAX_NUMCHECKVAL
];
/* string array, store possible values */
int
num_okstrval
;
/* number of valid values in the checkingval array */
}
s3
;
struct
{
int
(
*
f3a
)(
paramdef_t
*
param
);
/* check a string against a list of authorized values and set param value */
/* to the corresponding item in setintval array (mainly for RRC params) */
char
*
okstrval
[
CONFIG_MAX_NUMCHECKVAL
];
/* string array, store possible values */
int
setintval
[
CONFIG_MAX_NUMCHECKVAL
];
/* integer array, values set in the paramdef structure */
int
num_okstrval
;
/* number of valid values in the checkingval array */
}
s3a
;
struct
{
int
(
*
f4
)(
paramdef_t
*
param
);
/* generic check function, no arguments but the param description */
}
s4
;
struct
{
void
(
*
checkfunc
)(
void
)
;
}
s5
;
struct
{
int
(
*
f1
)(
paramdef_t
*
param
);
/* check an integer against a list of authorized values */
int
okintval
[
CONFIG_MAX_NUMCHECKVAL
];
/* integer array, store possible values */
int
num_okintval
;
/* number of valid values in the checkingval array */
}
s1
;
struct
{
int
(
*
f1a
)(
paramdef_t
*
param
);
/* check an integer against a list of authorized values and set param value */
/* to the corresponding item in setintval array (mainly for RRC params) */
int
okintval
[
CONFIG_MAX_NUMCHECKVAL
];
/* integer array, store possible values in config file */
int
setintval
[
CONFIG_MAX_NUMCHECKVAL
];
/* integer array, values set in the paramdef structure */
int
num_okintval
;
/* number of valid values in the checkingval array */
}
s1a
;
struct
{
int
(
*
f2
)(
paramdef_t
*
param
);
/* check an integer against an authorized range, defined by its min and max value */
int
okintrange
[
CONFIG_MAX_NUMCHECKVAL
];
/* integer array, store min and max values */
}
s2
;
struct
{
int
(
*
f3
)(
paramdef_t
*
param
);
/* check a string against a list of authorized values */
char
*
okstrval
[
CONFIG_MAX_NUMCHECKVAL
];
/* string array, store possible values */
int
num_okstrval
;
/* number of valid values in the checkingval array */
}
s3
;
struct
{
int
(
*
f3a
)(
paramdef_t
*
param
);
/* check a string against a list of authorized values and set param value */
/* to the corresponding item in setintval array (mainly for RRC params) */
char
*
okstrval
[
CONFIG_MAX_NUMCHECKVAL
];
/* string array, store possible values */
int
setintval
[
CONFIG_MAX_NUMCHECKVAL
];
/* integer array, values set in the paramdef structure */
int
num_okstrval
;
/* number of valid values in the checkingval array */
}
s3a
;
struct
{
int
(
*
f4
)(
paramdef_t
*
param
);
/* generic check function, no arguments but the param description */
}
s4
;
struct
{
void
(
*
checkfunc
)(
void
)
;
}
s5
;
}
checkedparam_t
;
/* paramdef is used to describe a parameter, array of paramdef_t strustures is used as the main parameter in */
/* config apis used to retrieve parameters values */
typedef
struct
paramdef
{
char
optname
[
MAX_OPTNAME_SIZE
];
/* parameter name, can be used as long command line option */
char
*
helpstr
;
/* help string */
unsigned
int
paramflags
;
/* value is a "ored" combination of above PARAMFLAG_XXXX values */
union
{
/* pointer to the parameter value, completed by the config module */
char
**
strptr
;
char
**
strlistptr
;
uint8_t
*
u8ptr
;
int8_t
*
i8ptr
;
uint16_t
*
u16ptr
;
int16_t
*
i16ptr
;
uint32_t
*
uptr
;
int32_t
*
iptr
;
uint64_t
*
u64ptr
;
int64_t
*
i64ptr
;
double
*
dblptr
;
void
*
voidptr
;
}
;
union
{
/* default parameter value, to be used when PARAMFLAG_MANDATORY is not specified */
char
*
defstrval
;
char
**
defstrlistval
;
uint32_t
defuintval
;
int
defintval
;
uint64_t
defint64val
;
int
*
defintarrayval
;
double
defdblval
;
}
;
char
type
;
/* parameter value type, as listed below as TYPE_XXXX macro */
int
numelt
;
/* number of elements in a list or array parameters or max size of string value */
checkedparam_t
*
chkPptr
;
/* possible pointer to the structure containing the info used to check parameter values */
int
*
processedvalue
;
/* used to store integer values computed from string original value */
typedef
struct
paramdef
{
char
optname
[
MAX_OPTNAME_SIZE
];
/* parameter name, can be used as long command line option */
char
*
helpstr
;
/* help string */
unsigned
int
paramflags
;
/* value is a "ored" combination of above PARAMFLAG_XXXX values */
union
{
/* pointer to the parameter value, completed by the config module */
char
**
strptr
;
char
**
strlistptr
;
uint8_t
*
u8ptr
;
int8_t
*
i8ptr
;
uint16_t
*
u16ptr
;
int16_t
*
i16ptr
;
uint32_t
*
uptr
;
int32_t
*
iptr
;
uint64_t
*
u64ptr
;
int64_t
*
i64ptr
;
double
*
dblptr
;
void
*
voidptr
;
}
;
union
{
/* default parameter value, to be used when PARAMFLAG_MANDATORY is not specified */
char
*
defstrval
;
char
**
defstrlistval
;
uint32_t
defuintval
;
int
defintval
;
uint64_t
defint64val
;
int
*
defintarrayval
;
double
defdblval
;
}
;
char
type
;
/* parameter value type, as listed below as TYPE_XXXX macro */
int
numelt
;
/* number of elements in a list or array parameters or max size of string value */
checkedparam_t
*
chkPptr
;
/* possible pointer to the structure containing the info used to check parameter values */
int
*
processedvalue
;
/* used to store integer values computed from string original value */
}
paramdef_t
;
#define TYPE_INT TYPE_INT32
...
...
@@ -160,9 +159,9 @@ typedef struct paramdef
#define ANY_IPV4ADDR_STRING "0.0.0.0"
typedef
struct
paramlist_def
{
char
listname
[
MAX_OPTNAME_SIZE
];
paramdef_t
**
paramarray
;
int
numelt
;
char
listname
[
MAX_OPTNAME_SIZE
];
paramdef_t
**
paramarray
;
int
numelt
;
}
paramlist_def_t
;
/* macro helpers for module users */
...
...
common/config/config_userapi.c
View file @
38fb3140
...
...
@@ -44,409 +44,449 @@
#include "config_userapi.h"
configmodule_interface_t
*
config_get_if
(
void
)
{
if
(
cfgptr
==
NULL
)
{
fprintf
(
stderr
,
"[CONFIG] %s %d config module not initialized
\n
"
,
__FILE__
,
__LINE__
);
exit
(
-
1
);
}
return
cfgptr
;
configmodule_interface_t
*
config_get_if
(
void
)
{
if
(
cfgptr
==
NULL
)
{
fprintf
(
stderr
,
"[CONFIG] %s %d config module not initialized
\n
"
,
__FILE__
,
__LINE__
);
exit
(
-
1
);
}
return
cfgptr
;
}
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
{
fprintf
(
stderr
,
"[CONFIG] %s %d option %s, cannot allocate pointer: %s
\n
"
,
__FILE__
,
__LINE__
,
cfgoptions
->
optname
,
strerror
(
errno
));
exit
(
-
1
);
}
}
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
{
fprintf
(
stderr
,
"[CONFIG] %s %d option %s, definition error: value pointer is NULL, declared as %i bytes allocated
\n
"
,
__FILE__
,
__LINE__
,
cfgoptions
->
optname
,
cfgoptions
->
numelt
);
exit
(
-
1
);
}
}
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
{
fprintf
(
stderr
,
"[CONFIG] %s %d malloc error
\n
"
,
__FILE__
,
__LINE__
);
exit
(
-
1
);
}
}
return
*
ptr
;
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
{
fprintf
(
stderr
,
"[CONFIG] %s %d option %s, cannot allocate pointer: %s
\n
"
,
__FILE__
,
__LINE__
,
cfgoptions
->
optname
,
strerror
(
errno
));
exit
(
-
1
);
}
}
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
{
fprintf
(
stderr
,
"[CONFIG] %s %d option %s, definition error: value pointer is NULL, declared as %i bytes allocated
\n
"
,
__FILE__
,
__LINE__
,
cfgoptions
->
optname
,
cfgoptions
->
numelt
);
exit
(
-
1
);
}
}
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
{
fprintf
(
stderr
,
"[CONFIG] %s %d malloc error
\n
"
,
__FILE__
,
__LINE__
);
exit
(
-
1
);
}
}
return
*
ptr
;
}
void
config_assign_int
(
paramdef_t
*
cfgoptions
,
char
*
fullname
,
int
val
)
{
int
tmpval
=
val
;
void
config_assign_int
(
paramdef_t
*
cfgoptions
,
char
*
fullname
,
int
val
)
{
int
tmpval
=
val
;
if
(
((
cfgoptions
->
paramflags
&
PARAMFLAG_BOOL
)
!=
0
)
&&
tmpval
>
0
)
{
tmpval
=
1
;
tmpval
=
1
;
}
switch
(
cfgoptions
->
type
)
{
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
;
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
;
}
}
void
config_assign_processedint
(
paramdef_t
*
cfgoption
,
int
val
)
{
cfgoption
->
processedvalue
=
malloc
(
sizeof
(
int
));
if
(
cfgoption
->
processedvalue
!=
NULL
)
{
*
(
cfgoption
->
processedvalue
)
=
val
;
}
else
{
fprintf
(
stderr
,
"[CONFIG] %s %d malloc error
\n
"
,
__FILE__
,
__LINE__
);
exit
(
-
1
);
}
cfgoption
->
processedvalue
=
malloc
(
sizeof
(
int
));
if
(
cfgoption
->
processedvalue
!=
NULL
)
{
*
(
cfgoption
->
processedvalue
)
=
val
;
}
else
{
fprintf
(
stderr
,
"[CONFIG] %s %d malloc error
\n
"
,
__FILE__
,
__LINE__
);
exit
(
-
1
);
}
}
int
config_get_processedint
(
paramdef_t
*
cfgoption
)
{
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
;
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
;
}
void
config_printhelp
(
paramdef_t
*
params
,
int
numparams
)
{
for
(
int
i
=
0
;
i
<
numparams
;
i
++
)
{
if
(
params
[
i
].
helpstr
!=
NULL
)
{
printf
(
"%s%s: %s"
,
(
strlen
(
params
[
i
].
optname
)
<=
1
)
?
"-"
:
"--"
,
params
[
i
].
optname
,
params
[
i
].
helpstr
);
}
}
void
config_printhelp
(
paramdef_t
*
params
,
int
numparams
)
{
for
(
int
i
=
0
;
i
<
numparams
;
i
++
)
{
if
(
params
[
i
].
helpstr
!=
NULL
)
{
printf
(
"%s%s: %s"
,
(
strlen
(
params
[
i
].
optname
)
<=
1
)
?
"-"
:
"--"
,
params
[
i
].
optname
,
params
[
i
].
helpstr
);
}
}
}
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
)
{
fprintf
(
stderr
,
"[CONFIG] config_execcheck: section %s %i parameters with wrong value
\n
"
,
prefix
,
-
st
);
if
(
CONFIG_ISFLAGSET
(
CONFIG_NOABORTONCHKF
)
==
0
)
{
exit_fun
(
"exit because configuration failed
\n
"
);
}
}
return
st
;
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
)
{
fprintf
(
stderr
,
"[CONFIG] config_execcheck: section %s %i parameters with wrong value
\n
"
,
prefix
,
-
st
);
if
(
CONFIG_ISFLAGSET
(
CONFIG_NOABORTONCHKF
)
==
0
)
{
exit_fun
(
"exit because configuration failed
\n
"
);
}
}
return
st
;
}
int
config_get
(
paramdef_t
*
params
,
int
numparams
,
char
*
prefix
)
{
int
ret
=
-
1
;
int
config_get
(
paramdef_t
*
params
,
int
numparams
,
char
*
prefix
)
{
int
ret
=
-
1
;
if
(
CONFIG_ISFLAGSET
(
CONFIG_ABORT
))
{
fprintf
(
stderr
,
"[CONFIG] config_get, section %s skipped, config module not properly initialized
\n
"
,
prefix
);
return
ret
;
}
configmodule_interface_t
*
cfgif
=
config_get_if
();
if
(
cfgif
!=
NULL
)
{
ret
=
config_get_if
()
->
get
(
params
,
numparams
,
prefix
);
if
(
ret
>=
0
)
{
config_process_cmdline
(
params
,
numparams
,
prefix
);
config_execcheck
(
params
,
numparams
,
prefix
);
}
return
ret
;
}
return
ret
;
}
int
config_getlist
(
paramlist_def_t
*
ParamList
,
paramdef_t
*
params
,
int
numparams
,
char
*
prefix
)
{
int
config_getlist
(
paramlist_def_t
*
ParamList
,
paramdef_t
*
params
,
int
numparams
,
char
*
prefix
)
{
if
(
CONFIG_ISFLAGSET
(
CONFIG_ABORT
))
{
fprintf
(
stderr
,
"[CONFIG] config_get skipped, config module not properly initialized
\n
"
);
return
-
1
;
}
if
(
!
config_get_if
())
return
-
1
;
const
int
ret
=
config_get_if
()
->
getlist
(
ParamList
,
params
,
numparams
,
prefix
);
if
(
ret
>=
0
&&
params
)
{
char
*
newprefix
;
if
(
prefix
)
{
int
rc
=
asprintf
(
&
newprefix
,
"%s.%s"
,
prefix
,
ParamList
->
listname
);
if
(
rc
<
0
)
newprefix
=
NULL
;
}
else
{
newprefix
=
ParamList
->
listname
;
}
char
cfgpath
[
MAX_OPTNAME_SIZE
*
2
+
6
];
/* prefix.listname.[listindex] */
for
(
int
i
=
0
;
i
<
ParamList
->
numelt
;
++
i
)
{
// TODO config_process_cmdline?
sprintf
(
cfgpath
,
"%s.[%i]"
,
newprefix
,
i
);
config_execcheck
(
ParamList
->
paramarray
[
i
],
numparams
,
cfgpath
);
}
if
(
prefix
)
free
(
newprefix
);
}
return
ret
;
}
int
config_isparamset
(
paramdef_t
*
params
,
int
paramidx
)
{
int
config_isparamset
(
paramdef_t
*
params
,
int
paramidx
)
{
if
((
params
[
paramidx
].
paramflags
&
PARAMFLAG_PARAMSET
)
!=
0
)
{
return
1
;
return
1
;
}
else
{
return
0
;
return
0
;
}
}
void
print_intvalueerror
(
paramdef_t
*
param
,
char
*
fname
,
int
*
okval
,
int
numokval
)
{
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
"
);
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
"
);
}
int
config_check_intval
(
paramdef_t
*
param
)
{
if
(
param
==
NULL
){
fprintf
(
stderr
,
"[CONFIG] config_check_intval: NULL param argument
\n
"
);
return
-
1
;
}
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
);
int
config_check_intval
(
paramdef_t
*
param
)
{
if
(
param
==
NULL
)
{
fprintf
(
stderr
,
"[CONFIG] config_check_intval: NULL param argument
\n
"
);
return
-
1
;
}
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
;
}
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
;
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
;
}
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
;
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
;
}
void
print_strvalueerror
(
paramdef_t
*
param
,
char
*
fname
,
char
**
okval
,
int
numokval
)
{
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
"
);
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
"
);
}
int
config_check_strval
(
paramdef_t
*
param
)
{
if
(
param
==
NULL
){
fprintf
(
stderr
,
"[CONFIG] config_check_strval: NULL param argument
\n
"
);
return
-
1
;
}
for
(
int
i
=
0
;
i
<
param
->
chkPptr
->
s3
.
num_okstrval
;
i
++
)
{
if
(
strcasecmp
(
*
(
param
->
strptr
),
param
->
chkPptr
->
s3
.
okstrval
[
i
]
)
==
0
)
{
return
0
;
}
}
print_strvalueerror
(
param
,
"config_check_strval"
,
param
->
chkPptr
->
s3
.
okstrval
,
param
->
chkPptr
->
s3
.
num_okstrval
);
int
config_check_strval
(
paramdef_t
*
param
)
{
if
(
param
==
NULL
)
{
fprintf
(
stderr
,
"[CONFIG] config_check_strval: NULL param argument
\n
"
);
return
-
1
;
}
}
int
config_checkstr_assign_integer
(
paramdef_t
*
param
)
{
for
(
int
i
=
0
;
i
<
param
->
chkPptr
->
s3
.
num_okstrval
;
i
++
)
{
if
(
strcasecmp
(
*
(
param
->
strptr
),
param
->
chkPptr
->
s3
.
okstrval
[
i
]
)
==
0
)
{
return
0
;
}
}
print_strvalueerror
(
param
,
"config_check_strval"
,
param
->
chkPptr
->
s3
.
okstrval
,
param
->
chkPptr
->
s3
.
num_okstrval
);
return
-
1
;
}
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
;
}
}
print_strvalueerror
(
param
,
"config_check_strval"
,
param
->
chkPptr
->
s3a
.
okstrval
,
param
->
chkPptr
->
s3a
.
num_okstrval
);
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
;
}
}
return
-
1
;
print_strvalueerror
(
param
,
"config_check_strval"
,
param
->
chkPptr
->
s3a
.
okstrval
,
param
->
chkPptr
->
s3a
.
num_okstrval
);
return
-
1
;
}
int
config_setdefault_string
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
config_setdefault_string
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
status
=
0
;
if
(
cfgoptions
->
defstrval
!=
NULL
)
{
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
));
}
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
));
}
}
return
status
;
}
int
config_setdefault_stringlist
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
config_setdefault_stringlist
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
status
=
0
;
if
(
cfgoptions
->
defstrlistval
!=
NULL
)
{
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
]);
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
]);
}
return
status
;
}
int
config_setdefault_int
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
config_setdefault_int
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
status
=
0
;
config_check_valptr
(
cfgoptions
,
(
char
**
)(
&
(
cfgoptions
->
iptr
)),
sizeof
(
int32_t
));
if
(
((
cfgoptions
->
paramflags
&
PARAMFLAG_MANDATORY
)
==
0
))
{
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
);
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
);
}
return
status
;
}
}
int
config_setdefault_int64
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
config_setdefault_int64
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
status
=
0
;
config_check_valptr
(
cfgoptions
,
(
char
**
)
&
(
cfgoptions
->
i64ptr
),
sizeof
(
long
long
));
if
(
((
cfgoptions
->
paramflags
&
PARAMFLAG_MANDATORY
)
==
0
))
{
*
(
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
)));
*
(
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
)));
}
return
status
;
}
int
config_setdefault_intlist
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
status
=
0
;
int
config_setdefault_intlist
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
status
=
0
;
if
(
cfgoptions
->
defintarrayval
!=
NULL
)
{
config_check_valptr
(
cfgoptions
,(
char
**
)
&
(
cfgoptions
->
iptr
),
sizeof
(
int32_t
*
));
config_check_valptr
(
cfgoptions
,(
char
**
)
&
(
cfgoptions
->
iptr
),
sizeof
(
int32_t
*
));
cfgoptions
->
iptr
=
cfgoptions
->
defintarrayval
;
status
=
1
;
for
(
int
j
=
0
;
j
<
cfgoptions
->
numelt
;
j
++
)
{
printf_params
(
"[CONFIG] %s[%i] set to default value %i
\n
"
,
cfgoptions
->
optname
,
j
,(
int
)
cfgoptions
->
iptr
[
j
]);
printf_params
(
"[CONFIG] %s[%i] set to default value %i
\n
"
,
cfgoptions
->
optname
,
j
,(
int
)
cfgoptions
->
iptr
[
j
]);
}
}
return
status
;
}
int
config_setdefault_double
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
config_setdefault_double
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
status
=
0
;
config_check_valptr
(
cfgoptions
,
(
char
**
)
&
(
cfgoptions
->
dblptr
),
sizeof
(
double
));
if
(
((
cfgoptions
->
paramflags
&
PARAMFLAG_MANDATORY
)
==
0
))
{
*
(
cfgoptions
->
u64ptr
)
=
cfgoptions
->
defdblval
;
status
=
1
;
printf_params
(
"[CONFIG] %s set to default value %lf
\n
"
,
cfgoptions
->
optname
,
*
(
cfgoptions
->
dblptr
));
*
(
cfgoptions
->
u64ptr
)
=
cfgoptions
->
defdblval
;
status
=
1
;
printf_params
(
"[CONFIG] %s set to default value %lf
\n
"
,
cfgoptions
->
optname
,
*
(
cfgoptions
->
dblptr
));
}
return
status
;
}
}
int
config_assign_ipv4addr
(
paramdef_t
*
cfgoptions
,
char
*
ipv4addr
)
{
int
config_assign_ipv4addr
(
paramdef_t
*
cfgoptions
,
char
*
ipv4addr
)
{
config_check_valptr
(
cfgoptions
,(
char
**
)
&
(
cfgoptions
->
uptr
),
sizeof
(
int
));
int
rst
=
inet_pton
(
AF_INET
,
ipv4addr
,
cfgoptions
->
uptr
);
int
rst
=
inet_pton
(
AF_INET
,
ipv4addr
,
cfgoptions
->
uptr
);
if
(
rst
==
1
&&
*
(
cfgoptions
->
uptr
)
>
0
)
{
printf_params
(
"[CONFIG] %s: %s
\n
"
,
cfgoptions
->
optname
,
ipv4addr
);
return
1
;
printf_params
(
"[CONFIG] %s: %s
\n
"
,
cfgoptions
->
optname
,
ipv4addr
);
return
1
;
}
else
{
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
;
}
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
;
}
}
return
0
;
}
int
config_setdefault_ipv4addr
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
config_setdefault_ipv4addr
(
paramdef_t
*
cfgoptions
,
char
*
prefix
)
{
int
status
=
0
;
if
(
cfgoptions
->
defstrval
!=
NULL
)
{
status
=
config_assign_ipv4addr
(
cfgoptions
,
cfgoptions
->
defstrval
);
status
=
config_assign_ipv4addr
(
cfgoptions
,
cfgoptions
->
defstrval
);
}
return
status
;
}
}
common/config/config_userapi.h
View file @
38fb3140
...
...
@@ -20,7 +20,7 @@
*/
/*! \file common/config/config_userapi.h
* \brief: configuration module, include file to be used by the source code calling the
* \brief: configuration module, include file to be used by the source code calling the
* configuration module to access configuration parameters
* \author Francois TABURET
* \date 2017
...
...
@@ -31,7 +31,7 @@
* \warning
*/
#ifndef INCLUDE_CONFIG_USERAPI_H
#define INCLUDE_CONFIG_USERAPI_H
#define INCLUDE_CONFIG_USERAPI_H
#include "config_load_configmodule.h"
#ifdef __cplusplus
...
...
@@ -48,7 +48,7 @@ extern "C"
#define CONFIG_ISPARAMFLAGSET(P,F) ( !!(P.paramflags & F))
/* utility functions, to be used by configuration module and/or configuration libraries */
extern
configmodule_interface_t
*
config_get_if
(
void
);
extern
char
*
config_check_valptr
(
paramdef_t
*
cfgoptions
,
char
**
ptr
,
int
length
)
;
extern
char
*
config_check_valptr
(
paramdef_t
*
cfgoptions
,
char
**
ptr
,
int
length
)
;
extern
void
config_printhelp
(
paramdef_t
*
,
int
numparams
);
extern
int
config_process_cmdline
(
paramdef_t
*
params
,
int
numparams
,
char
*
prefix
);
extern
void
config_assign_processedint
(
paramdef_t
*
cfgoption
,
int
val
);
...
...
common/utils/LOG/log.c
View file @
38fb3140
...
...
@@ -72,16 +72,14 @@ char *log_level_highlight_start[] = {LOG_RED, LOG_ORANGE, "", LOG_BLUE, LOG_CYBL
char
*
log_level_highlight_end
[]
=
{
LOG_RESET
,
LOG_RESET
,
LOG_RESET
,
LOG_RESET
,
LOG_RESET
};
/*!< \brief Optional end-format strings for highlighting */
int
write_file_matlab
(
const
char
*
fname
,
const
char
*
vname
,
void
*
data
,
int
length
,
int
dec
,
char
format
)
{
int
write_file_matlab
(
const
char
*
fname
,
const
char
*
vname
,
void
*
data
,
int
length
,
int
dec
,
char
format
)
{
FILE
*
fp
=
NULL
;
int
i
;
if
(
data
==
NULL
)
return
-
1
;
//printf("Writing %d elements of type %d to %s\n",length,format,fname);
return
-
1
;
//printf("Writing %d elements of type %d to %s\n",length,format,fname);
if
(
format
==
10
||
format
==
11
||
format
==
12
||
format
==
13
||
format
==
14
)
{
fp
=
fopen
(
fname
,
"a+"
);
...
...
@@ -89,8 +87,6 @@ int write_file_matlab(const char *fname,const char *vname,void *data,int length,
fp
=
fopen
(
fname
,
"w+"
);
}
if
(
fp
==
NULL
)
{
printf
(
"[OPENAIR][FILE OUTPUT] Cannot open file %s
\n
"
,
fname
);
return
(
-
1
);
...
...
@@ -99,121 +95,108 @@ int write_file_matlab(const char *fname,const char *vname,void *data,int length,
if
(
format
!=
10
&&
format
!=
11
&&
format
!=
12
&&
format
!=
13
&&
format
!=
14
)
fprintf
(
fp
,
"%s = ["
,
vname
);
switch
(
format
)
{
case
0
:
// real 16-bit
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
fprintf
(
fp
,
"%d
\n
"
,((
short
*
)
data
)[
i
]);
}
break
;
case
1
:
// complex 16-bit
case
13
:
case
14
:
case
15
:
for
(
i
=
0
;
i
<
length
<<
1
;
i
+=
(
2
*
dec
))
{
fprintf
(
fp
,
"%d + j*(%d)
\n
"
,((
short
*
)
data
)[
i
],((
short
*
)
data
)[
i
+
1
]);
}
break
;
case
2
:
// real 32-bit
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
fprintf
(
fp
,
"%d
\n
"
,((
int
*
)
data
)[
i
]);
}
break
;
case
3
:
// complex 32-bit
for
(
i
=
0
;
i
<
length
<<
1
;
i
+=
(
2
*
dec
))
{
fprintf
(
fp
,
"%d + j*(%d)
\n
"
,((
int
*
)
data
)[
i
],((
int
*
)
data
)[
i
+
1
]);
}
break
;
case
4
:
// real 8-bit
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
fprintf
(
fp
,
"%d
\n
"
,((
char
*
)
data
)[
i
]);
}
case
0
:
// real 16-bit
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
fprintf
(
fp
,
"%d
\n
"
,((
short
*
)
data
)[
i
]);
}
break
;
break
;
case
5
:
// complex 8-bit
for
(
i
=
0
;
i
<
length
<<
1
;
i
+=
(
2
*
dec
))
{
fprintf
(
fp
,
"%d + j*(%d)
\n
"
,((
char
*
)
data
)[
i
],((
char
*
)
data
)[
i
+
1
]);
}
case
1
:
// complex 16-bit
case
13
:
case
14
:
case
15
:
for
(
i
=
0
;
i
<
length
<<
1
;
i
+=
(
2
*
dec
))
{
fprintf
(
fp
,
"%d + j*(%d)
\n
"
,((
short
*
)
data
)[
i
],((
short
*
)
data
)[
i
+
1
]);
}
break
;
break
;
case
6
:
// real 64
-bit
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
fprintf
(
fp
,
"%lld
\n
"
,((
long
long
*
)
data
)[
i
]);
}
case
2
:
// real 32
-bit
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
fprintf
(
fp
,
"%d
\n
"
,((
int
*
)
data
)[
i
]);
}
break
;
break
;
case
7
:
// real double
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
fprintf
(
fp
,
"%g
\n
"
,((
double
*
)
data
)[
i
]);
}
case
3
:
// complex 32-bit
for
(
i
=
0
;
i
<
length
<<
1
;
i
+=
(
2
*
dec
)
)
{
fprintf
(
fp
,
"%d + j*(%d)
\n
"
,((
int
*
)
data
)[
i
],((
int
*
)
data
)[
i
+
1
]);
}
break
;
break
;
case
8
:
// complex double
for
(
i
=
0
;
i
<
length
<<
1
;
i
+=
2
*
dec
)
{
fprintf
(
fp
,
"%g + j*(%g)
\n
"
,((
double
*
)
data
)[
i
],
((
double
*
)
data
)[
i
+
1
]);
}
case
4
:
// real 8-bit
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
fprintf
(
fp
,
"%d
\n
"
,((
char
*
)
data
)[
i
]);
}
break
;
break
;
case
9
:
// real unsigned
8-bit
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
fprintf
(
fp
,
"%d
\n
"
,((
unsigned
char
*
)
data
)[
i
]);
}
case
5
:
// complex
8-bit
for
(
i
=
0
;
i
<
length
<<
1
;
i
+=
(
2
*
dec
)
)
{
fprintf
(
fp
,
"%d + j*(%d)
\n
"
,((
char
*
)
data
)[
i
],((
char
*
)
data
)[
i
+
1
]);
}
break
;
break
;
case
6
:
// real 64-bit
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
fprintf
(
fp
,
"%lld
\n
"
,((
long
long
*
)
data
)[
i
]);
}
case
10
:
// case eren 16 bit complex :
break
;
for
(
i
=
0
;
i
<
length
<<
1
;
i
+=
(
2
*
dec
))
{
case
7
:
// real double
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
fprintf
(
fp
,
"%g
\n
"
,((
double
*
)
data
)[
i
]);
}
if
((
i
<
2
*
(
length
-
1
))
&&
(
i
>
0
))
fprintf
(
fp
,
"%d + j*(%d),"
,((
short
*
)
data
)[
i
],((
short
*
)
data
)[
i
+
1
]);
else
if
(
i
==
2
*
(
length
-
1
))
fprintf
(
fp
,
"%d + j*(%d);"
,((
short
*
)
data
)[
i
],((
short
*
)
data
)[
i
+
1
]);
else
if
(
i
==
0
)
fprintf
(
fp
,
"
\n
%d + j*(%d),"
,((
short
*
)
data
)[
i
],((
short
*
)
data
)[
i
+
1
]);
break
;
case
8
:
// complex double
for
(
i
=
0
;
i
<
length
<<
1
;
i
+=
2
*
dec
)
{
fprintf
(
fp
,
"%g + j*(%g)
\n
"
,((
double
*
)
data
)[
i
],
((
double
*
)
data
)[
i
+
1
]);
}
break
;
}
case
9
:
// real unsigned 8-bit
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
fprintf
(
fp
,
"%d
\n
"
,((
unsigned
char
*
)
data
)[
i
]);
}
break
;
break
;
case
11
:
//case eren 16 bit real for channel magnitudes:
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
case
10
:
// case eren 16 bit complex :
for
(
i
=
0
;
i
<
length
<<
1
;
i
+=
(
2
*
dec
))
{
if
((
i
<
2
*
(
length
-
1
))
&&
(
i
>
0
))
fprintf
(
fp
,
"%d + j*(%d),"
,((
short
*
)
data
)[
i
],((
short
*
)
data
)[
i
+
1
]);
else
if
(
i
==
2
*
(
length
-
1
))
fprintf
(
fp
,
"%d + j*(%d);"
,((
short
*
)
data
)[
i
],((
short
*
)
data
)[
i
+
1
]);
else
if
(
i
==
0
)
fprintf
(
fp
,
"
\n
%d + j*(%d),"
,((
short
*
)
data
)[
i
],((
short
*
)
data
)[
i
+
1
]);
}
if
((
i
<
(
length
-
1
))
&&
(
i
>
0
))
fprintf
(
fp
,
"%d,"
,((
short
*
)
data
)[
i
]);
else
if
(
i
==
(
length
-
1
))
fprintf
(
fp
,
"%d;"
,((
short
*
)
data
)[
i
]);
else
if
(
i
==
0
)
fprintf
(
fp
,
"
\n
%d,"
,((
short
*
)
data
)[
i
]);
}
break
;
printf
(
"
\n
eren: length :%d"
,
length
);
break
;
case
11
:
//case eren 16 bit real for channel magnitudes:
for
(
i
=
0
;
i
<
length
;
i
+=
dec
)
{
if
((
i
<
(
length
-
1
))
&&
(
i
>
0
))
fprintf
(
fp
,
"%d,"
,((
short
*
)
data
)[
i
]);
else
if
(
i
==
(
length
-
1
))
fprintf
(
fp
,
"%d;"
,((
short
*
)
data
)[
i
]);
else
if
(
i
==
0
)
fprintf
(
fp
,
"
\n
%d,"
,((
short
*
)
data
)[
i
]);
}
case
12
:
// case eren for log2_maxh real unsigned 8 bit
fprintf
(
fp
,
"%d
\n
"
,((
unsigned
char
*
)
&
data
)[
0
]);
break
;
printf
(
"
\n
eren: length :%d"
,
length
);
break
;
case
12
:
// case eren for log2_maxh real unsigned 8 bit
fprintf
(
fp
,
"%d
\n
"
,((
unsigned
char
*
)
&
data
)[
0
]);
break
;
}
if
(
format
!=
10
&&
format
!=
11
&&
format
!=
12
&&
format
!=
13
&&
format
!=
15
)
{
...
...
@@ -232,8 +215,6 @@ int write_file_matlab(const char *fname,const char *vname,void *data,int length,
void
log_getconfig
(
log_t
*
g_log
)
{
char
*
gloglevel
=
NULL
;
int
consolelog
;
paramdef_t
logparams_defaults
[]
=
LOG_GLOBALPARAMS_DESC
;
paramdef_t
logparams_level
[
MAX_LOG_PREDEF_COMPONENTS
];
paramdef_t
logparams_logfile
[
MAX_LOG_PREDEF_COMPONENTS
];
...
...
@@ -241,131 +222,146 @@ void log_getconfig(log_t *g_log) {
paramdef_t
logparams_dump
[
sizeof
(
log_maskmap
)
/
sizeof
(
mapping
)];
CONFIG_SETRTFLAG
(
CONFIG_NOCHECKUNKOPT
);
int
ret
=
config_get
(
logparams_defaults
,
sizeof
(
logparams_defaults
)
/
sizeof
(
paramdef_t
),
CONFIG_STRING_LOG_PREFIX
);
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"[LOG] init aborted, configuration couldn't be performed"
);
return
;
}
fprintf
(
stderr
,
"[LOG] init aborted, configuration couldn't be performed"
);
return
;
}
/* set LOG display options (enable/disable color, thread name, level ) */
/* set LOG display options (enable/disable color, thread name, level ) */
for
(
int
i
=
0
;
i
<
logparams_defaults
[
LOG_OPTIONS_IDX
].
numelt
;
i
++
)
{
for
(
int
j
=
0
;
log_options
[
j
].
name
!=
NULL
;
j
++
)
{
if
(
strcmp
(
logparams_defaults
[
LOG_OPTIONS_IDX
].
strlistptr
[
i
],
log_options
[
j
].
name
)
==
0
)
{
g_log
->
flag
=
g_log
->
flag
|
log_options
[
j
].
value
;
break
;
}
else
if
(
log_options
[
j
+
1
].
name
==
NULL
)
{
fprintf
(
stderr
,
"Unknown log option: %s
\n
"
,
logparams_defaults
[
LOG_OPTIONS_IDX
].
strlistptr
[
i
]);
exit
(
-
1
);
}
}
}
/* build the parameter array for setting per component log level and infile options */
for
(
int
j
=
0
;
log_options
[
j
].
name
!=
NULL
;
j
++
)
{
if
(
strcmp
(
logparams_defaults
[
LOG_OPTIONS_IDX
].
strlistptr
[
i
],
log_options
[
j
].
name
)
==
0
)
{
g_log
->
flag
=
g_log
->
flag
|
log_options
[
j
].
value
;
break
;
}
else
if
(
log_options
[
j
+
1
].
name
==
NULL
)
{
fprintf
(
stderr
,
"Unknown log option: %s
\n
"
,
logparams_defaults
[
LOG_OPTIONS_IDX
].
strlistptr
[
i
]);
exit
(
-
1
);
}
}
}
/* build the parameter array for setting per component log level and infile options */
memset
(
logparams_level
,
0
,
sizeof
(
paramdef_t
)
*
MAX_LOG_PREDEF_COMPONENTS
);
memset
(
logparams_logfile
,
0
,
sizeof
(
paramdef_t
)
*
MAX_LOG_PREDEF_COMPONENTS
);
for
(
int
i
=
MIN_LOG_COMPONENTS
;
i
<
MAX_LOG_PREDEF_COMPONENTS
;
i
++
)
{
if
(
g_log
->
log_component
[
i
].
name
==
NULL
)
{
g_log
->
log_component
[
i
].
name
=
malloc
(
16
);
sprintf
((
char
*
)
g_log
->
log_component
[
i
].
name
,
"comp%i?"
,
i
);
logparams_logfile
[
i
].
paramflags
=
PARAMFLAG_DONOTREAD
;
logparams_level
[
i
].
paramflags
=
PARAMFLAG_DONOTREAD
;
g_log
->
log_component
[
i
].
name
=
malloc
(
16
);
sprintf
((
char
*
)
g_log
->
log_component
[
i
].
name
,
"comp%i?"
,
i
);
logparams_logfile
[
i
].
paramflags
=
PARAMFLAG_DONOTREAD
;
logparams_level
[
i
].
paramflags
=
PARAMFLAG_DONOTREAD
;
}
sprintf
(
logparams_level
[
i
].
optname
,
LOG_CONFIG_LEVEL_FORMAT
,
g_log
->
log_component
[
i
].
name
);
sprintf
(
logparams_logfile
[
i
].
optname
,
LOG_CONFIG_LOGFILE_FORMAT
,
g_log
->
log_component
[
i
].
name
);
/* workaround: all log options in existing configuration files use lower case component names
where component names include uppercase char in log.h.... */
for
(
int
j
=
0
;
j
<
strlen
(
logparams_level
[
i
].
optname
);
j
++
)
logparams_level
[
i
].
optname
[
j
]
=
tolower
(
logparams_level
[
i
].
optname
[
j
]);
for
(
int
j
=
0
;
j
<
strlen
(
logparams_level
[
i
].
optname
);
j
++
)
logparams_logfile
[
i
].
optname
[
j
]
=
tolower
(
logparams_logfile
[
i
].
optname
[
j
]);
/* */
/* workaround: all log options in existing configuration files use lower case component names
where component names include uppercase char in log.h.... */
for
(
int
j
=
0
;
j
<
strlen
(
logparams_level
[
i
].
optname
);
j
++
)
logparams_level
[
i
].
optname
[
j
]
=
tolower
(
logparams_level
[
i
].
optname
[
j
]);
for
(
int
j
=
0
;
j
<
strlen
(
logparams_level
[
i
].
optname
);
j
++
)
logparams_logfile
[
i
].
optname
[
j
]
=
tolower
(
logparams_logfile
[
i
].
optname
[
j
]);
/* */
logparams_level
[
i
].
defstrval
=
gloglevel
;
logparams_logfile
[
i
].
defuintval
=
0
;
logparams_logfile
[
i
].
numelt
=
0
;
logparams_level
[
i
].
numelt
=
0
;
logparams_level
[
i
].
type
=
TYPE_STRING
;
logparams_logfile
[
i
].
type
=
TYPE_UINT
;
logparams_logfile
[
i
].
paramflags
=
logparams_logfile
[
i
].
paramflags
|
PARAMFLAG_BOOL
;
}
/* read the per component parameters */
config_get
(
logparams_level
,
MAX_LOG_PREDEF_COMPONENTS
,
CONFIG_STRING_LOG_PREFIX
);
config_get
(
logparams_logfile
,
MAX_LOG_PREDEF_COMPONENTS
,
CONFIG_STRING_LOG_PREFIX
);
/* now set the log levels and infile option, according to what we read */
}
/* read the per component parameters */
config_get
(
logparams_level
,
MAX_LOG_PREDEF_COMPONENTS
,
CONFIG_STRING_LOG_PREFIX
);
config_get
(
logparams_logfile
,
MAX_LOG_PREDEF_COMPONENTS
,
CONFIG_STRING_LOG_PREFIX
);
/* now set the log levels and infile option, according to what we read */
for
(
int
i
=
MIN_LOG_COMPONENTS
;
i
<
MAX_LOG_PREDEF_COMPONENTS
;
i
++
)
{
g_log
->
log_component
[
i
].
level
=
map_str_to_int
(
log_level_names
,
*
(
logparams_level
[
i
].
strptr
));
set_log
(
i
,
g_log
->
log_component
[
i
].
level
);
if
(
*
(
logparams_logfile
[
i
].
uptr
)
==
1
)
set_component_filelog
(
i
);
set_component_filelog
(
i
);
}
/* build then read the debug and dump parameter array */
for
(
int
i
=
0
;
log_maskmap
[
i
].
name
!=
NULL
;
i
++
)
{
sprintf
(
logparams_debug
[
i
].
optname
,
LOG_CONFIG_DEBUG_FORMAT
,
log_maskmap
[
i
].
name
);
sprintf
(
logparams_dump
[
i
].
optname
,
LOG_CONFIG_DUMP_FORMAT
,
log_maskmap
[
i
].
name
);
logparams_debug
[
i
].
defuintval
=
0
;
logparams_debug
[
i
].
type
=
TYPE_UINT
;
logparams_debug
[
i
].
paramflags
=
PARAMFLAG_BOOL
;
logparams_debug
[
i
].
uptr
=
NULL
;
logparams_debug
[
i
].
chkPptr
=
NULL
;
logparams_debug
[
i
].
numelt
=
0
;
logparams_dump
[
i
].
defuintval
=
0
;
logparams_dump
[
i
].
type
=
TYPE_UINT
;
logparams_dump
[
i
].
paramflags
=
PARAMFLAG_BOOL
;
logparams_dump
[
i
].
uptr
=
NULL
;
logparams_dump
[
i
].
chkPptr
=
NULL
;
logparams_dump
[
i
].
numelt
=
0
;
/* build then read the debug and dump parameter array */
for
(
int
i
=
0
;
log_maskmap
[
i
].
name
!=
NULL
;
i
++
)
{
sprintf
(
logparams_debug
[
i
].
optname
,
LOG_CONFIG_DEBUG_FORMAT
,
log_maskmap
[
i
].
name
);
sprintf
(
logparams_dump
[
i
].
optname
,
LOG_CONFIG_DUMP_FORMAT
,
log_maskmap
[
i
].
name
);
logparams_debug
[
i
].
defuintval
=
0
;
logparams_debug
[
i
].
type
=
TYPE_UINT
;
logparams_debug
[
i
].
paramflags
=
PARAMFLAG_BOOL
;
logparams_debug
[
i
].
uptr
=
NULL
;
logparams_debug
[
i
].
chkPptr
=
NULL
;
logparams_debug
[
i
].
numelt
=
0
;
logparams_dump
[
i
].
defuintval
=
0
;
logparams_dump
[
i
].
type
=
TYPE_UINT
;
logparams_dump
[
i
].
paramflags
=
PARAMFLAG_BOOL
;
logparams_dump
[
i
].
uptr
=
NULL
;
logparams_dump
[
i
].
chkPptr
=
NULL
;
logparams_dump
[
i
].
numelt
=
0
;
}
config_get
(
logparams_debug
,(
sizeof
(
log_maskmap
)
/
sizeof
(
mapping
))
-
1
,
CONFIG_STRING_LOG_PREFIX
);
CONFIG_CLEARRTFLAG
(
CONFIG_NOCHECKUNKOPT
);
config_get
(
logparams_dump
,(
sizeof
(
log_maskmap
)
/
sizeof
(
mapping
))
-
1
,
CONFIG_STRING_LOG_PREFIX
);
/* set the debug mask according to the debug parameters values */
/* set the debug mask according to the debug parameters values */
for
(
int
i
=
0
;
log_maskmap
[
i
].
name
!=
NULL
;
i
++
)
{
if
(
*
(
logparams_debug
[
i
].
uptr
)
)
g_log
->
debug_mask
=
g_log
->
debug_mask
|
log_maskmap
[
i
].
value
;
g_log
->
debug_mask
=
g_log
->
debug_mask
|
log_maskmap
[
i
].
value
;
if
(
*
(
logparams_dump
[
i
].
uptr
)
)
g_log
->
dump_mask
=
g_log
->
dump_mask
|
log_maskmap
[
i
].
value
;
}
/* log globally enabled/disabled */
g_log
->
dump_mask
=
g_log
->
dump_mask
|
log_maskmap
[
i
].
value
;
}
/* log globally enabled/disabled */
set_glog_onlinelog
(
consolelog
);
}
int
register_log_component
(
char
*
name
,
char
*
fext
,
int
compidx
)
{
int
computed_compidx
=
compidx
;
int
register_log_component
(
char
*
name
,
char
*
fext
,
int
compidx
)
{
int
computed_compidx
=
compidx
;
if
(
strlen
(
fext
)
>
3
)
{
fext
[
3
]
=
0
;
/* limit log file extension to 3 chars */
fext
[
3
]
=
0
;
/* limit log file extension to 3 chars */
}
if
(
compidx
<
0
)
{
/* this is not a pre-defined component */
for
(
int
i
=
MAX_LOG_PREDEF_COMPONENTS
;
i
<
MAX_LOG_COMPONENTS
;
i
++
)
{
if
(
g_log
->
log_component
[
i
].
name
==
NULL
)
{
computed_compidx
=
i
;
break
;
}
for
(
int
i
=
MAX_LOG_PREDEF_COMPONENTS
;
i
<
MAX_LOG_COMPONENTS
;
i
++
)
{
if
(
g_log
->
log_component
[
i
].
name
==
NULL
)
{
computed_compidx
=
i
;
break
;
}
}
}
if
(
computed_compidx
>=
0
&&
computed_compidx
<
MAX_LOG_COMPONENTS
)
{
g_log
->
log_component
[
computed_compidx
].
name
=
strdup
(
name
);
g_log
->
log_component
[
computed_compidx
].
stream
=
stdout
;
g_log
->
log_component
[
computed_compidx
].
filelog
=
0
;
g_log
->
log_component
[
computed_compidx
].
filelog_name
=
malloc
(
strlen
(
name
)
+
16
);
/* /tmp/<name>.%s */
sprintf
(
g_log
->
log_component
[
computed_compidx
].
filelog_name
,
"/tmp/%s.%s"
,
name
,
fext
);
g_log
->
log_component
[
computed_compidx
].
name
=
strdup
(
name
);
g_log
->
log_component
[
computed_compidx
].
stream
=
stdout
;
g_log
->
log_component
[
computed_compidx
].
filelog
=
0
;
g_log
->
log_component
[
computed_compidx
].
filelog_name
=
malloc
(
strlen
(
name
)
+
16
);
/* /tmp/<name>.%s */
sprintf
(
g_log
->
log_component
[
computed_compidx
].
filelog_name
,
"/tmp/%s.%s"
,
name
,
fext
);
}
else
{
fprintf
(
stderr
,
"{LOG} %s %d Couldn't register componemt %s
\n
"
,
__FILE__
,
__LINE__
,
name
);
fprintf
(
stderr
,
"{LOG} %s %d Couldn't register componemt %s
\n
"
,
__FILE__
,
__LINE__
,
name
);
}
return
computed_compidx
;
return
computed_compidx
;
}
int
isLogInitDone
(
void
){
if
(
g_log
==
NULL
)
return
0
;
if
(
!
(
g_log
->
flag
&
FLAG_INITIALIZED
))
return
0
;
return
1
;
int
isLogInitDone
(
void
)
{
if
(
g_log
==
NULL
)
return
0
;
if
(
!
(
g_log
->
flag
&
FLAG_INITIALIZED
))
return
0
;
return
1
;
}
int
logInit
(
void
)
{
int
logInit
(
void
)
{
int
i
;
g_log
=
calloc
(
1
,
sizeof
(
log_t
));
...
...
@@ -373,10 +369,8 @@ int logInit (void)
perror
(
"cannot allocated memory for log generation module
\n
"
);
exit
(
EXIT_FAILURE
);
}
memset
(
g_log
,
0
,
sizeof
(
log_t
));
memset
(
g_log
,
0
,
sizeof
(
log_t
));
register_log_component
(
"PHY"
,
"log"
,
PHY
);
register_log_component
(
"MAC"
,
"log"
,
MAC
);
register_log_component
(
"OPT"
,
"log"
,
OPT
);
...
...
@@ -392,144 +386,121 @@ int logInit (void)
register_log_component
(
"OTG_JITTER"
,
"dat"
,
OTG_JITTER
);
register_log_component
(
"OCG"
,
""
,
OCG
);
register_log_component
(
"PERF"
,
""
,
PERF
);
register_log_component
(
"OIP"
,
""
,
OIP
);
register_log_component
(
"CLI"
,
""
,
CLI
);
register_log_component
(
"MSC"
,
"log"
,
MSC
);
register_log_component
(
"OCM"
,
"log"
,
OCM
);
register_log_component
(
"HW"
,
""
,
HW
);
register_log_component
(
"OSA"
,
""
,
OSA
);
register_log_component
(
"eRAL"
,
""
,
RAL_ENB
);
register_log_component
(
"mRAL"
,
""
,
RAL_UE
);
register_log_component
(
"ENB_APP"
,
"log"
,
ENB_APP
);
register_log_component
(
"FLEXRAN_AGENT"
,
"log"
,
FLEXRAN_AGENT
);
register_log_component
(
"TMR"
,
""
,
TMR
);
register_log_component
(
"USIM"
,
"txt"
,
USIM
);
register_log_component
(
"SIM"
,
"txt"
,
SIM
);
register_log_component
(
"OIP"
,
""
,
OIP
);
register_log_component
(
"CLI"
,
""
,
CLI
);
register_log_component
(
"MSC"
,
"log"
,
MSC
);
register_log_component
(
"OCM"
,
"log"
,
OCM
);
register_log_component
(
"HW"
,
""
,
HW
);
register_log_component
(
"OSA"
,
""
,
OSA
);
register_log_component
(
"eRAL"
,
""
,
RAL_ENB
);
register_log_component
(
"mRAL"
,
""
,
RAL_UE
);
register_log_component
(
"ENB_APP"
,
"log"
,
ENB_APP
);
register_log_component
(
"FLEXRAN_AGENT"
,
"log"
,
FLEXRAN_AGENT
);
register_log_component
(
"TMR"
,
""
,
TMR
);
register_log_component
(
"USIM"
,
"txt"
,
USIM
);
register_log_component
(
"SIM"
,
"txt"
,
SIM
);
/* following log component are used for the localization*/
register_log_component
(
"LOCALIZE"
,
"log"
,
LOCALIZE
);
register_log_component
(
"NAS"
,
"log"
,
NAS
);
register_log_component
(
"UDP"
,
""
,
UDP_
);
register_log_component
(
"GTPV1U"
,
""
,
GTPU
);
register_log_component
(
"S1AP"
,
""
,
S1AP
);
register_log_component
(
"X2AP"
,
""
,
X2AP
);
register_log_component
(
"SCTP"
,
""
,
SCTP
);
register_log_component
(
"X2AP"
,
""
,
X2AP
);
register_log_component
(
"LOADER"
,
"log"
,
LOADER
);
register_log_component
(
"ASN"
,
"log"
,
ASN
);
for
(
int
i
=
0
;
log_level_names
[
i
].
name
!=
NULL
;
i
++
)
g_log
->
level2string
[
i
]
=
toupper
(
log_level_names
[
i
].
name
[
0
]);
// uppercased first letter of level name
g_log
->
level2string
[
i
]
=
toupper
(
log_level_names
[
i
].
name
[
0
]);
// uppercased first letter of level name
g_log
->
filelog_name
=
"/tmp/openair.log"
;
log_getconfig
(
g_log
);
// set all unused component items to 0, they are for non predefined components
for
(
i
=
MAX_LOG_PREDEF_COMPONENTS
;
i
<
MAX_LOG_COMPONENTS
;
i
++
)
{
memset
(
&
(
g_log
->
log_component
[
i
]),
0
,
sizeof
(
log_component_t
));
memset
(
&
(
g_log
->
log_component
[
i
]),
0
,
sizeof
(
log_component_t
));
}
g_log
->
flag
=
g_log
->
flag
|
FLAG_INITIALIZED
;
printf
(
"log init done
\n
"
);
return
0
;
}
char
*
log_getthreadname
(
char
*
threadname
,
int
bufsize
)
{
int
rt
=
pthread_getname_np
(
pthread_self
(),
threadname
,
bufsize
)
;
int
rt
=
pthread_getname_np
(
pthread_self
(),
threadname
,
bufsize
)
;
if
(
rt
==
0
)
{
return
threadname
;
}
else
{
return
"thread?"
;
}
if
(
rt
==
0
)
{
return
threadname
;
}
else
{
return
"thread?"
;
}
}
static
int
log_header
(
char
*
log_buffer
,
int
buffsize
,
int
comp
,
int
level
,
const
char
*
format
)
{
char
threadname
[
PR_SET_NAME
];
return
snprintf
(
log_buffer
,
buffsize
,
"%s%s[%s]%c %s %s%s"
,
log_level_highlight_end
[
level
],
(
(
g_log
->
flag
&
FLAG_NOCOLOR
)
?
""
:
log_level_highlight_start
[
level
]),
g_log
->
log_component
[
comp
].
name
,
(
(
g_log
->
flag
&
FLAG_LEVEL
)
?
g_log
->
level2string
[
level
]
:
' '
),
(
(
g_log
->
flag
&
FLAG_THREAD
)
?
log_getthreadname
(
threadname
,
PR_SET_NAME
+
1
)
:
""
),
format
,
log_level_highlight_end
[
level
]);
return
snprintf
(
log_buffer
,
buffsize
,
"%s%s[%s]%c %s %s%s"
,
log_level_highlight_end
[
level
],
(
(
g_log
->
flag
&
FLAG_NOCOLOR
)
?
""
:
log_level_highlight_start
[
level
]),
g_log
->
log_component
[
comp
].
name
,
(
(
g_log
->
flag
&
FLAG_LEVEL
)
?
g_log
->
level2string
[
level
]
:
' '
),
(
(
g_log
->
flag
&
FLAG_THREAD
)
?
log_getthreadname
(
threadname
,
PR_SET_NAME
+
1
)
:
""
),
format
,
log_level_highlight_end
[
level
]);
}
void
logRecord_mt
(
const
char
*
file
,
const
char
*
func
,
int
line
,
int
comp
,
int
level
,
const
char
*
format
,
...
)
{
void
logRecord_mt
(
const
char
*
file
,
const
char
*
func
,
int
line
,
int
comp
,
int
level
,
const
char
*
format
,
...
)
{
char
log_buffer
[
MAX_LOG_TOTAL
];
va_list
args
;
va_start
(
args
,
format
);
log_header
(
log_buffer
,
MAX_LOG_TOTAL
,
comp
,
level
,
format
);
g_log
->
log_component
[
comp
].
vprint
(
g_log
->
log_component
[
comp
].
stream
,
log_buffer
,
args
);
va_end
(
args
);
}
void
log_dump
(
int
component
,
void
*
buffer
,
int
buffsize
,
int
datatype
,
const
char
*
format
,
...
)
{
va_list
args
;
char
*
wbuf
;
void
log_dump
(
int
component
,
void
*
buffer
,
int
buffsize
,
int
datatype
,
const
char
*
format
,
...
)
{
va_list
args
;
char
*
wbuf
;
switch
(
datatype
)
{
case
LOG_DUMP_DOUBLE
:
wbuf
=
malloc
((
buffsize
*
10
)
+
64
+
MAX_LOG_TOTAL
);
break
;
case
LOG_DUMP_CHAR
:
default:
wbuf
=
malloc
((
buffsize
*
3
)
+
64
+
MAX_LOG_TOTAL
);
break
;
}
switch
(
datatype
)
{
case
LOG_DUMP_DOUBLE
:
wbuf
=
malloc
((
buffsize
*
10
)
+
64
+
MAX_LOG_TOTAL
);
break
;
case
LOG_DUMP_CHAR
:
default:
wbuf
=
malloc
((
buffsize
*
3
)
+
64
+
MAX_LOG_TOTAL
);
break
;
if
(
wbuf
!=
NULL
)
{
va_start
(
args
,
format
);
int
pos
=
log_header
(
wbuf
,
MAX_LOG_TOTAL
,
component
,
OAILOG_INFO
,
""
);
int
pos2
=
vsprintf
(
wbuf
+
pos
,
format
,
args
);
pos
=
pos
+
pos2
;
va_end
(
args
);
for
(
int
i
=
0
;
i
<
buffsize
;
i
++
)
{
switch
(
datatype
)
{
case
LOG_DUMP_DOUBLE
:
pos
=
pos
+
sprintf
(
wbuf
+
pos
,
"%04.4lf "
,
(
double
)((
double
*
)
buffer
)[
i
]);
break
;
case
LOG_DUMP_CHAR
:
default:
pos
=
pos
+
sprintf
(
wbuf
+
pos
,
"%02x "
,
(
unsigned
char
)((
unsigned
char
*
)
buffer
)[
i
]);
break
;
}
}
if
(
wbuf
!=
NULL
)
{
va_start
(
args
,
format
);
int
pos
=
log_header
(
wbuf
,
MAX_LOG_TOTAL
,
component
,
OAILOG_INFO
,
""
);
int
pos2
=
vsprintf
(
wbuf
+
pos
,
format
,
args
);
pos
=
pos
+
pos2
;
va_end
(
args
);
for
(
int
i
=
0
;
i
<
buffsize
;
i
++
)
{
switch
(
datatype
)
{
case
LOG_DUMP_DOUBLE
:
pos
=
pos
+
sprintf
(
wbuf
+
pos
,
"%04.4lf "
,
(
double
)((
double
*
)
buffer
)[
i
]);
break
;
case
LOG_DUMP_CHAR
:
default:
pos
=
pos
+
sprintf
(
wbuf
+
pos
,
"%02x "
,
(
unsigned
char
)((
unsigned
char
*
)
buffer
)[
i
]);
break
;
}
}
sprintf
(
wbuf
+
pos
,
"
\n
"
);
g_log
->
log_component
[
component
].
print
(
g_log
->
log_component
[
component
].
stream
,
wbuf
);
free
(
wbuf
);
}
}
}
int
set_log
(
int
component
,
int
level
)
{
int
set_log
(
int
component
,
int
level
)
{
/* Checking parameters */
DevCheck
((
component
>=
MIN_LOG_COMPONENTS
)
&&
(
component
<
MAX_LOG_COMPONENTS
),
component
,
MIN_LOG_COMPONENTS
,
MAX_LOG_COMPONENTS
);
...
...
@@ -537,38 +508,34 @@ int set_log(int component, int level)
OAILOG_ERR
);
if
(
g_log
->
log_component
[
component
].
level
!=
OAILOG_DISABLE
)
g_log
->
log_component
[
component
].
savedlevel
=
g_log
->
log_component
[
component
].
level
;
g_log
->
log_component
[
component
].
level
=
level
;
g_log
->
log_component
[
component
].
savedlevel
=
g_log
->
log_component
[
component
].
level
;
g_log
->
log_component
[
component
].
level
=
level
;
return
0
;
}
void
set_glog
(
int
level
)
{
void
set_glog
(
int
level
)
{
for
(
int
c
=
0
;
c
<
MAX_LOG_COMPONENTS
;
c
++
)
{
set_log
(
c
,
level
);
set_log
(
c
,
level
);
}
}
void
set_glog_onlinelog
(
int
enable
)
{
void
set_glog_onlinelog
(
int
enable
)
{
for
(
int
c
=
0
;
c
<
MAX_LOG_COMPONENTS
;
c
++
)
{
if
(
enable
)
{
g_log
->
log_component
[
c
].
level
=
g_log
->
log_component
[
c
].
savedlevel
;
g_log
->
log_component
[
c
].
vprint
=
vfprintf
;
g_log
->
log_component
[
c
].
print
=
fprintf
;
g_log
->
log_component
[
c
].
stream
=
stdout
;
}
else
{
g_log
->
log_component
[
c
].
level
=
OAILOG_DISABLE
;
}
}
if
(
enable
)
{
g_log
->
log_component
[
c
].
level
=
g_log
->
log_component
[
c
].
savedlevel
;
g_log
->
log_component
[
c
].
vprint
=
vfprintf
;
g_log
->
log_component
[
c
].
print
=
fprintf
;
g_log
->
log_component
[
c
].
stream
=
stdout
;
}
else
{
g_log
->
log_component
[
c
].
level
=
OAILOG_DISABLE
;
}
}
}
void
set_glog_filelog
(
int
enable
)
{
static
FILE
*
fptr
;
void
set_glog_filelog
(
int
enable
)
{
static
FILE
*
fptr
;
if
(
enable
)
{
fptr
=
fopen
(
g_log
->
filelog_name
,
"w"
);
...
...
@@ -581,33 +548,35 @@ static FILE *fptr;
}
else
{
for
(
int
c
=
0
;
c
<
MAX_LOG_COMPONENTS
;
c
++
)
{
g_log
->
log_component
[
c
].
filelog
=
0
;
if
(
fptr
!=
NULL
)
{
fclose
(
fptr
);
}
g_log
->
log_component
[
c
].
stream
=
stdout
;
}
}
}
}
}
void
set_component_filelog
(
int
comp
)
{
if
(
g_log
->
log_component
[
comp
].
stream
==
NULL
||
g_log
->
log_component
[
comp
].
stream
==
stdout
)
{
g_log
->
log_component
[
comp
].
stream
=
fopen
(
g_log
->
log_component
[
comp
].
filelog_name
,
"w"
);
}
g_log
->
log_component
[
comp
].
vprint
=
vfprintf
;
g_log
->
log_component
[
comp
].
print
=
fprintf
;
g_log
->
log_component
[
comp
].
filelog
=
1
;
void
set_component_filelog
(
int
comp
)
{
if
(
g_log
->
log_component
[
comp
].
stream
==
NULL
||
g_log
->
log_component
[
comp
].
stream
==
stdout
)
{
g_log
->
log_component
[
comp
].
stream
=
fopen
(
g_log
->
log_component
[
comp
].
filelog_name
,
"w"
);
}
g_log
->
log_component
[
comp
].
vprint
=
vfprintf
;
g_log
->
log_component
[
comp
].
print
=
fprintf
;
g_log
->
log_component
[
comp
].
filelog
=
1
;
}
void
close_component_filelog
(
int
comp
)
{
g_log
->
log_component
[
comp
].
filelog
=
0
;
if
(
g_log
->
log_component
[
comp
].
stream
!=
NULL
&&
g_log
->
log_component
[
comp
].
stream
!=
stdout
)
{
fclose
(
g_log
->
log_component
[
comp
].
stream
);
g_log
->
log_component
[
comp
].
stream
=
stdout
;
}
g_log
->
log_component
[
comp
].
vprint
=
vfprintf
;
g_log
->
log_component
[
comp
].
print
=
fprintf
;
void
close_component_filelog
(
int
comp
)
{
g_log
->
log_component
[
comp
].
filelog
=
0
;
if
(
g_log
->
log_component
[
comp
].
stream
!=
NULL
&&
g_log
->
log_component
[
comp
].
stream
!=
stdout
)
{
fclose
(
g_log
->
log_component
[
comp
].
stream
);
g_log
->
log_component
[
comp
].
stream
=
stdout
;
}
g_log
->
log_component
[
comp
].
vprint
=
v
fprintf
;
g_log
->
log_component
[
comp
].
print
=
fprintf
;
}
/*
...
...
@@ -615,8 +584,7 @@ void close_component_filelog(int comp)
* with string value NULL
*/
/* map a string to an int. Takes a mapping array and a string as arg */
int
map_str_to_int
(
mapping
*
map
,
const
char
*
str
)
{
int
map_str_to_int
(
mapping
*
map
,
const
char
*
str
)
{
while
(
1
)
{
if
(
map
->
name
==
NULL
)
{
return
(
-
1
);
...
...
@@ -631,8 +599,7 @@ int map_str_to_int(mapping *map, const char *str)
}
/* map an int to a string. Takes a mapping array and a value */
char
*
map_int_to_str
(
mapping
*
map
,
int
val
)
{
char
*
map_int_to_str
(
mapping
*
map
,
int
val
)
{
while
(
1
)
{
if
(
map
->
name
==
NULL
)
{
return
NULL
;
...
...
@@ -646,8 +613,7 @@ char *map_int_to_str(mapping *map, int val)
}
}
int
is_newline
(
char
*
str
,
int
size
)
{
int
is_newline
(
char
*
str
,
int
size
)
{
int
i
;
for
(
i
=
0
;
i
<
size
;
i
++
)
{
...
...
@@ -660,84 +626,65 @@ int is_newline( char *str, int size)
return
0
;
}
void
logClean
(
void
)
{
void
logClean
(
void
)
{
int
i
;
if
(
isLogInitDone
())
{
LOG_UI
(
PHY
,
"
\n
"
);
for
(
i
=
MIN_LOG_COMPONENTS
;
i
<
MAX_LOG_COMPONENTS
;
i
++
)
{
close_component_filelog
(
i
);
}
}
}
#ifdef LOG_TEST
int
main
(
int
argc
,
char
*
argv
[])
{
#ifdef LOG_TEST
int
main
(
int
argc
,
char
*
argv
[])
{
logInit
();
test_log
();
return
1
;
}
int
test_log
(
void
)
{
int
test_log
(
void
)
{
LOG_ENTER
(
MAC
);
// because the default level is DEBUG
LOG_I
(
EMU
,
"1 Starting OAI logs version %s Build date: %s on %s
\n
"
,
BUILD_VERSION
,
BUILD_DATE
,
BUILD_HOST
);
LOG_D
(
MAC
,
"1 debug MAC
\n
"
);
LOG_W
(
MAC
,
"1 warning MAC
\n
"
);
set_log
(
EMU
,
OAILOG_INFO
);
set_log
(
MAC
,
OAILOG_WARNING
);
LOG_I
(
EMU
,
"2 Starting OAI logs version %s Build date: %s on %s
\n
"
,
BUILD_VERSION
,
BUILD_DATE
,
BUILD_HOST
);
LOG_E
(
MAC
,
"2 error MAC
\n
"
);
LOG_D
(
MAC
,
"2 debug MAC
\n
"
);
LOG_W
(
MAC
,
"2 warning MAC
\n
"
);
LOG_I
(
MAC
,
"2 info MAC
\n
"
);
set_log
(
MAC
,
OAILOG_NOTICE
);
LOG_ENTER
(
MAC
);
LOG_I
(
EMU
,
"3 Starting OAI logs version %s Build date: %s on %s
\n
"
,
BUILD_VERSION
,
BUILD_DATE
,
BUILD_HOST
);
LOG_D
(
MAC
,
"3 debug MAC
\n
"
);
LOG_W
(
MAC
,
"3 warning MAC
\n
"
);
LOG_I
(
MAC
,
"3 info MAC
\n
"
);
set_log
(
MAC
,
LOG_DEBUG
);
set_log
(
EMU
,
LOG_DEBUG
);
LOG_ENTER
(
MAC
);
LOG_I
(
EMU
,
"4 Starting OAI logs version %s Build date: %s on %s
\n
"
,
BUILD_VERSION
,
BUILD_DATE
,
BUILD_HOST
);
LOG_D
(
MAC
,
"4 debug MAC
\n
"
);
LOG_W
(
MAC
,
"4 warning MAC
\n
"
);
LOG_I
(
MAC
,
"4 info MAC
\n
"
);
set_log
(
MAC
,
LOG_DEBUG
);
set_log
(
EMU
,
LOG_DEBUG
);
LOG_I
(
LOG
,
"5 Starting OAI logs version %s Build date: %s on %s
\n
"
,
BUILD_VERSION
,
BUILD_DATE
,
BUILD_HOST
);
LOG_D
(
MAC
,
"5 debug MAC
\n
"
);
LOG_W
(
MAC
,
"5 warning MAC
\n
"
);
LOG_I
(
MAC
,
"5 info MAC
\n
"
);
set_log
(
MAC
,
LOG_TRACE
);
set_log
(
EMU
,
LOG_TRACE
);
LOG_ENTER
(
MAC
);
LOG_I
(
LOG
,
"6 Starting OAI logs version %s Build date: %s on %s
\n
"
,
BUILD_VERSION
,
BUILD_DATE
,
BUILD_HOST
);
...
...
@@ -745,7 +692,6 @@ int test_log(void)
LOG_W
(
MAC
,
"6 warning MAC
\n
"
);
LOG_I
(
MAC
,
"6 info MAC
\n
"
);
LOG_EXIT
(
MAC
);
return
0
;
}
#endif
common/utils/LOG/log.h
View file @
38fb3140
...
...
@@ -45,11 +45,11 @@
#include <time.h>
#include <stdint.h>
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#include <inttypes.h>
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <pthread.h>
#include "T.h"
...
...
@@ -126,11 +126,11 @@ extern "C" {
/** @defgroup macros to identify a debug entity
* @ingroup each macro is a bit mask where the unique bit set identifies an entity to be debugged
* it allows to dynamically activate or not blocks of code. The LOG_MASKMAP_INIT macro
* it allows to dynamically activate or not blocks of code. The LOG_MASKMAP_INIT macro
* is used to map a character string name to each debug bit, it allows to set or clear
* the corresponding bit via the defined name, from the configuration or from the telnet
* server.
* @brief
* @brief
* @{*/
#define DEBUG_PRACH (1<<0)
#define DEBUG_RU (1<<1)
...
...
@@ -149,22 +149,22 @@ extern "C" {
#define LOG_MASKMAP_INIT {\
{"PRACH", DEBUG_PRACH},\
{"RU", DEBUG_RU},\
{"UE_PHYPROC", DEBUG_UE_PHYPROC},\
{"LTEESTIM", DEBUG_LTEESTIM},\
{"DLCELLSPEC", DEBUG_DLCELLSPEC},\
{"ULSCH", DEBUG_ULSCH},\
{"RRC", DEBUG_RRC},\
{"PDCP", DEBUG_PDCP},\
{"DFT", DEBUG_DFT},\
{"ASN1", DEBUG_ASN1},\
{"CTRLSOCKET", DEBUG_CTRLSOCKET},\
{"SECURITY", DEBUG_SECURITY},\
{"NAS", DEBUG_NAS},\
{"UE_TIMING", UE_TIMING},\
{NULL,-1}\
}
{"PRACH", DEBUG_PRACH},\
{"RU", DEBUG_RU},\
{"UE_PHYPROC", DEBUG_UE_PHYPROC},\
{"LTEESTIM", DEBUG_LTEESTIM},\
{"DLCELLSPEC", DEBUG_DLCELLSPEC},\
{"ULSCH", DEBUG_ULSCH},\
{"RRC", DEBUG_RRC},\
{"PDCP", DEBUG_PDCP},\
{"DFT", DEBUG_DFT},\
{"ASN1", DEBUG_ASN1},\
{"CTRLSOCKET", DEBUG_CTRLSOCKET},\
{"SECURITY", DEBUG_SECURITY},\
{"NAS", DEBUG_NAS},\
{"UE_TIMING", UE_TIMING},\
{NULL,-1}\
}
...
...
@@ -177,46 +177,46 @@ extern "C" {
typedef
enum
{
MIN_LOG_COMPONENTS
=
0
,
PHY
=
MIN_LOG_COMPONENTS
,
MAC
,
SIM
,
OCG
,
OMG
,
OPT
,
OTG
,
OTG_LATENCY
,
OTG_LATENCY_BG
,
OTG_GP
,
OTG_GP_BG
,
OTG_JITTER
,
RLC
,
PDCP
,
RRC
,
NAS
,
PERF
,
OIP
,
CLI
,
MSC
,
OCM
,
UDP_
,
GTPU
,
SPGW
,
S1AP
,
SCTP
,
HW
,
OSA
,
RAL_ENB
,
RAL_UE
,
ENB_APP
,
FLEXRAN_AGENT
,
TMR
,
USIM
,
LOCALIZE
,
X2AP
,
LOADER
,
ASN
,
MAX_LOG_PREDEF_COMPONENTS
,
MIN_LOG_COMPONENTS
=
0
,
PHY
=
MIN_LOG_COMPONENTS
,
MAC
,
SIM
,
OCG
,
OMG
,
OPT
,
OTG
,
OTG_LATENCY
,
OTG_LATENCY_BG
,
OTG_GP
,
OTG_GP_BG
,
OTG_JITTER
,
RLC
,
PDCP
,
RRC
,
NAS
,
PERF
,
OIP
,
CLI
,
MSC
,
OCM
,
UDP_
,
GTPU
,
SPGW
,
S1AP
,
SCTP
,
HW
,
OSA
,
RAL_ENB
,
RAL_UE
,
ENB_APP
,
FLEXRAN_AGENT
,
TMR
,
USIM
,
LOCALIZE
,
X2AP
,
LOADER
,
ASN
,
MAX_LOG_PREDEF_COMPONENTS
,
}
comp_name_t
;
...
...
@@ -225,42 +225,42 @@ comp_name_t;
typedef
struct
{
char
*
name
;
/*!< \brief string name of item */
int
value
;
/*!< \brief integer value of mapping */
char
*
name
;
/*!< \brief string name of item */
int
value
;
/*!< \brief integer value of mapping */
}
mapping
;
typedef
int
(
*
log_vprint_func_t
)(
FILE
*
stream
,
const
char
*
format
,
va_list
ap
);
typedef
int
(
*
log_print_func_t
)(
FILE
*
stream
,
const
char
*
format
,
...
);
typedef
struct
{
const
char
*
name
;
int
level
;
int
savedlevel
;
int
flag
;
int
filelog
;
char
*
filelog_name
;
FILE
*
stream
;
log_vprint_func_t
vprint
;
log_print_func_t
print
;
/* SR: make the log buffer component relative */
char
log_buffer
[
MAX_LOG_TOTAL
];
const
char
*
name
;
int
level
;
int
savedlevel
;
int
flag
;
int
filelog
;
char
*
filelog_name
;
FILE
*
stream
;
log_vprint_func_t
vprint
;
log_print_func_t
print
;
/* SR: make the log buffer component relative */
char
log_buffer
[
MAX_LOG_TOTAL
];
}
log_component_t
;
typedef
struct
{
log_component_t
log_component
[
MAX_LOG_COMPONENTS
];
char
level2string
[
NUM_LOG_LEVEL
];
int
flag
;
char
*
filelog_name
;
uint64_t
debug_mask
;
uint64_t
dump_mask
;
log_component_t
log_component
[
MAX_LOG_COMPONENTS
];
char
level2string
[
NUM_LOG_LEVEL
];
int
flag
;
char
*
filelog_name
;
uint64_t
debug_mask
;
uint64_t
dump_mask
;
}
log_t
;
#if defined(ENABLE_ITTI)
typedef
enum
log_instance_type_e
{
LOG_INSTANCE_UNKNOWN
,
LOG_INSTANCE_ENB
,
LOG_INSTANCE_UE
,
LOG_INSTANCE_UNKNOWN
,
LOG_INSTANCE_ENB
,
LOG_INSTANCE_UE
,
}
log_instance_type_t
;
void
log_set_instance_type
(
log_instance_type_t
instance
);
...
...
@@ -271,9 +271,9 @@ void log_set_instance_type (log_instance_type_t instance);
log_t
*
g_log
;
#else
#ifdef __cplusplus
extern
"C"
{
extern
"C"
{
#endif
extern
log_t
*
g_log
;
extern
log_t
*
g_log
;
#ifdef __cplusplus
}
#endif
...
...
@@ -284,7 +284,7 @@ extern log_t *g_log;
int
logInit
(
void
);
int
isLogInitDone
(
void
);
void
logRecord_mt
(
const
char
*
file
,
const
char
*
func
,
int
line
,
int
comp
,
int
level
,
const
char
*
format
,
...)
__attribute__
((
format
(
printf
,
6
,
7
)));
void
log_dump
(
int
component
,
void
*
buffer
,
int
buffsize
,
int
datatype
,
const
char
*
format
,
...
);
void
log_dump
(
int
component
,
void
*
buffer
,
int
buffsize
,
int
datatype
,
const
char
*
format
,
...
);
int
set_log
(
int
component
,
int
level
);
void
set_glog
(
int
level
);
...
...
@@ -327,22 +327,22 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
#define LOG_CONFIG_DUMP_FORMAT "%s_dump"
#define LOG_CONFIG_HELP_OPTIONS " list of comma separated options to enable log module behavior. Available options: \n"\
" nocolor: disable color usage in log messages\n"\
" level: add log level indication in log messages\n"\
" thread: add threads names in log messages\n"
" nocolor: disable color usage in log messages\n"\
" level: add log level indication in log messages\n"\
" thread: add threads names in log messages\n"
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/* LOG globalconfiguration parameters
*/
/* optname help paramflags XXXptr
defXXXval type numelt
*/
/* LOG globalconfiguration parameters
*/
/* optname help paramflags XXXptr
defXXXval type numelt
*/
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
#define LOG_GLOBALPARAMS_DESC { \
{LOG_CONFIG_STRING_GLOBAL_LOG_LEVEL, "Default log level for all componemts\n", 0,
strptr:(char **)&gloglevel, defstrval:log_level_names[2].name, TYPE_STRING, 0}, \
{LOG_CONFIG_STRING_GLOBAL_LOG_ONLINE, "Default console output option, for all components\n", 0,
iptr:&(consolelog), defintval:1, TYPE_INT, 0}, \
{LOG_CONFIG_STRING_GLOBAL_LOG_OPTIONS, LOG_CONFIG_HELP_OPTIONS, 0,
strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0} \
}
{LOG_CONFIG_STRING_GLOBAL_LOG_LEVEL, "Default log level for all componemts\n", 0,
strptr:(char **)&gloglevel, defstrval:log_level_names[2].name, TYPE_STRING, 0}, \
{LOG_CONFIG_STRING_GLOBAL_LOG_ONLINE, "Default console output option, for all components\n", 0,
iptr:&(consolelog), defintval:1, TYPE_INT, 0}, \
{LOG_CONFIG_STRING_GLOBAL_LOG_OPTIONS, LOG_CONFIG_HELP_OPTIONS, 0,
strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0} \
}
#define LOG_OPTIONS_IDX 2
/*----------------------------------------------------------------------------------*/
...
...
@@ -354,23 +354,23 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
#define LOG_DUMP_DOUBLE 1
// debugging macros
#define LOG_F LOG_I
/* because LOG_F was originaly to dump a message or buffer but is also used as a regular level...., to dump use LOG_DUMPMSG */
# if T_TRACER
/* per component, level dependant macros */
# define LOG_E(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_ERR ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_ERR, x) ;} else { T(T_LEGACY_ ## c ## _ERROR, T_PRINTF(x)) ;}} while (0)
# define LOG_W(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_WARNING) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_WARNING, x) ;} else { T(T_LEGACY_ ## c ## _WARNING, T_PRINTF(x)) ;}} while (0)
# define LOG_I(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_INFO ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ;} else { T(T_LEGACY_ ## c ## _INFO, T_PRINTF(x)) ;}} while (0)
# define LOG_D(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_DEBUG ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_DEBUG, x) ;} else { T(T_LEGACY_ ## c ## _DEBUG, T_PRINTF(x)) ;}} while (0)
# define LOG_T(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_TRACE ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_TRACE, x) ;} else { T(T_LEGACY_ ## c ## _TRACE, T_PRINTF(x)) ;}} while (0)
/* macro used to dump a buffer or a message as in openair2/RRC/LTE/RRC_eNB.c, replaces LOG_F macro */
# if T_TRACER
/* per component, level dependant macros */
# define LOG_E(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_ERR ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_ERR, x) ;} else { T(T_LEGACY_ ## c ## _ERROR, T_PRINTF(x)) ;}} while (0)
# define LOG_W(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_WARNING) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_WARNING, x) ;} else { T(T_LEGACY_ ## c ## _WARNING, T_PRINTF(x)) ;}} while (0)
# define LOG_I(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_INFO ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ;} else { T(T_LEGACY_ ## c ## _INFO, T_PRINTF(x)) ;}} while (0)
# define LOG_D(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_DEBUG ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_DEBUG, x) ;} else { T(T_LEGACY_ ## c ## _DEBUG, T_PRINTF(x)) ;}} while (0)
# define LOG_T(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_TRACE ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_TRACE, x) ;} else { T(T_LEGACY_ ## c ## _TRACE, T_PRINTF(x)) ;}} while (0)
/* macro used to dump a buffer or a message as in openair2/RRC/LTE/RRC_eNB.c, replaces LOG_F macro */
# define LOG_DUMPMSG(c, f, b, s, x...) do { if(g_log->dump_mask & f) log_dump(c, b, s, LOG_DUMP_CHAR, x) ;} while (0)
/* */
# define nfapi_log(FILE, FNC, LN, COMP, LVL, F...) do { if (T_stdout) { logRecord_mt(__FILE__, __FUNCTION__, __LINE__,COMP, LVL, F) ;}} while (0)
/* */
/* bitmask dependant macros, to isolate debugging code */
/* bitmask dependant macros, to isolate debugging code */
# define LOG_DEBUGFLAG(D) (g_log->debug_mask & D)
/* bitmask dependant macros, to generate debug file such as matlab file or message dump */
/* bitmask dependant macros, to generate debug file such as matlab file or message dump */
# define LOG_DUMPFLAG(D) (g_log->dump_mask & D)
# define LOG_M(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format);} while(0)
/* */
/* define variable only used in LOG macro's */
/* define variable only used in LOG macro's */
# define LOG_VAR(A,B) A B
# else
/* T_TRACER: remove all debugging and tracing messages, except errors */
# define LOG_I(c, x...)
/* */
...
...
@@ -380,15 +380,15 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
# define LOG_T(c, x...)
/* */
# define LOG_DUMPMSG(c, b, s, x...)
/* */
# define nfapi_log(FILE, FNC, LN, COMP, LVL, FMT...)
# define nfapi_log(FILE, FNC, LN, COMP, LVL, FMT...)
# define LOG_DEBUGFLAG(D) ( 0 )
# define LOG_DUMPFLAG(D) ( 0 )
# define LOG_M(file, vector, data, len, dec, format)
# define LOG_DUMPFLAG(D) ( 0 )
# define LOG_M(file, vector, data, len, dec, format)
# define LOG_VAR(A,B)
# endif
/* T_TRACER */
/* avoid warnings for variables only used in LOG macro's but set outside debug section */
#define
GCC_NOTUSED
__attribute__((unused))
#define LOG_USEDINLOG_VAR(A,B) GCC_NOTUSED A B
#define
GCC_NOTUSED
__attribute__((unused))
#define LOG_USEDINLOG_VAR(A,B) GCC_NOTUSED A B
/* unfiltered macros, usefull for simulators or messages at init time, before log is configured */
#define LOG_UM(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format);} while(0)
...
...
@@ -420,78 +420,82 @@ static __inline__ uint64_t rdtsc(void) {
extern
double
cpuf
;
static
inline
uint64_t
checkTCPU
(
int
timeout
,
char
*
file
,
int
line
)
{
static
uint64_t
__thread
lastCPUTime
=
0
;
static
uint64_t
__thread
last
=
0
;
uint64_t
cur
=
rdtsc
();
struct
timespec
CPUt
;
clock_gettime
(
CLOCK_THREAD_CPUTIME_ID
,
&
CPUt
);
uint64_t
CPUTime
=
CPUt
.
tv_sec
*
1000
*
1000
+
CPUt
.
tv_nsec
/
1000
;
double
microCycles
=
(
double
)(
cpuf
*
1000
);
int
duration
=
(
int
)((
cur
-
last
)
/
microCycles
);
if
(
last
!=
0
&&
duration
>
timeout
)
{
//struct timespec ts;
//clock_gettime(CLOCK_MONOTONIC, &ts);
printf
(
"%s:%d lte-ue delay %d (exceed %d), CPU for this period: %lld
\n
"
,
file
,
line
,
duration
,
timeout
,
(
long
long
)
CPUTime
-
lastCPUTime
);
}
last
=
cur
;
lastCPUTime
=
CPUTime
;
return
cur
;
static
inline
uint64_t
checkTCPU
(
int
timeout
,
char
*
file
,
int
line
)
{
static
uint64_t
__thread
lastCPUTime
=
0
;
static
uint64_t
__thread
last
=
0
;
uint64_t
cur
=
rdtsc
();
struct
timespec
CPUt
;
clock_gettime
(
CLOCK_THREAD_CPUTIME_ID
,
&
CPUt
);
uint64_t
CPUTime
=
CPUt
.
tv_sec
*
1000
*
1000
+
CPUt
.
tv_nsec
/
1000
;
double
microCycles
=
(
double
)(
cpuf
*
1000
);
int
duration
=
(
int
)((
cur
-
last
)
/
microCycles
);
if
(
last
!=
0
&&
duration
>
timeout
)
{
//struct timespec ts;
//clock_gettime(CLOCK_MONOTONIC, &ts);
printf
(
"%s:%d lte-ue delay %d (exceed %d), CPU for this period: %lld
\n
"
,
file
,
line
,
duration
,
timeout
,
(
long
long
)
CPUTime
-
lastCPUTime
);
}
last
=
cur
;
lastCPUTime
=
CPUTime
;
return
cur
;
}
static
inline
unsigned
long
long
checkT
(
int
timeout
,
char
*
file
,
int
line
)
{
static
unsigned
long
long
__thread
last
=
0
;
unsigned
long
long
cur
=
rdtsc
();
int
microCycles
=
(
int
)(
cpuf
*
1000
);
int
duration
=
(
int
)((
cur
-
last
)
/
microCycles
);
if
(
last
!=
0
&&
duration
>
timeout
)
printf
(
"%s:%d lte-ue delay %d (exceed %d)
\n
"
,
file
,
line
,
duration
,
timeout
);
last
=
cur
;
return
cur
;
static
inline
unsigned
long
long
checkT
(
int
timeout
,
char
*
file
,
int
line
)
{
static
unsigned
long
long
__thread
last
=
0
;
unsigned
long
long
cur
=
rdtsc
();
int
microCycles
=
(
int
)(
cpuf
*
1000
);
int
duration
=
(
int
)((
cur
-
last
)
/
microCycles
);
if
(
last
!=
0
&&
duration
>
timeout
)
printf
(
"%s:%d lte-ue delay %d (exceed %d)
\n
"
,
file
,
line
,
duration
,
timeout
);
last
=
cur
;
return
cur
;
}
typedef
struct
m
{
uint64_t
iterations
;
uint64_t
sum
;
uint64_t
maxArray
[
11
];
uint64_t
iterations
;
uint64_t
sum
;
uint64_t
maxArray
[
11
];
}
Meas
;
static
inline
void
printMeas
(
char
*
txt
,
Meas
*
M
,
int
period
)
{
if
(
M
->
iterations
%
period
==
0
)
{
char
txt2
[
512
];
sprintf
(
txt2
,
"%s avg=%"
PRIu64
" iterations=%"
PRIu64
" max=%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
"
\n
"
,
txt
,
M
->
sum
/
M
->
iterations
,
M
->
iterations
,
M
->
maxArray
[
1
],
M
->
maxArray
[
2
],
M
->
maxArray
[
3
],
M
->
maxArray
[
4
],
M
->
maxArray
[
5
],
M
->
maxArray
[
6
],
M
->
maxArray
[
7
],
M
->
maxArray
[
8
],
M
->
maxArray
[
9
],
M
->
maxArray
[
10
]);
static
inline
void
printMeas
(
char
*
txt
,
Meas
*
M
,
int
period
)
{
if
(
M
->
iterations
%
period
==
0
)
{
char
txt2
[
512
];
sprintf
(
txt2
,
"%s avg=%"
PRIu64
" iterations=%"
PRIu64
" max=%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
":%"
PRIu64
"
\n
"
,
txt
,
M
->
sum
/
M
->
iterations
,
M
->
iterations
,
M
->
maxArray
[
1
],
M
->
maxArray
[
2
],
M
->
maxArray
[
3
],
M
->
maxArray
[
4
],
M
->
maxArray
[
5
],
M
->
maxArray
[
6
],
M
->
maxArray
[
7
],
M
->
maxArray
[
8
],
M
->
maxArray
[
9
],
M
->
maxArray
[
10
]);
#if DISABLE_LOG_X
printf
(
"%s"
,
txt2
);
printf
(
"%s"
,
txt2
);
#else
LOG_W
(
PHY
,
"%s"
,
txt2
);
LOG_W
(
PHY
,
"%s"
,
txt2
);
#endif
}
}
}
static
inline
int
cmpint
(
const
void
*
a
,
const
void
*
b
)
{
uint64_t
*
aa
=
(
uint64_t
*
)
a
;
uint64_t
*
bb
=
(
uint64_t
*
)
b
;
return
(
int
)(
*
aa
-*
bb
);
static
inline
int
cmpint
(
const
void
*
a
,
const
void
*
b
)
{
uint64_t
*
aa
=
(
uint64_t
*
)
a
;
uint64_t
*
bb
=
(
uint64_t
*
)
b
;
return
(
int
)(
*
aa
-*
bb
);
}
static
inline
void
updateTimes
(
uint64_t
start
,
Meas
*
M
,
int
period
,
char
*
txt
)
{
if
(
start
!=
0
)
{
uint64_t
end
=
rdtsc
();
long
long
diff
=
(
end
-
start
)
/
(
cpuf
*
1000
);
M
->
maxArray
[
0
]
=
diff
;
M
->
sum
+=
diff
;
M
->
iterations
++
;
qsort
(
M
->
maxArray
,
11
,
sizeof
(
uint64_t
),
cmpint
);
printMeas
(
txt
,
M
,
period
);
}
static
inline
void
updateTimes
(
uint64_t
start
,
Meas
*
M
,
int
period
,
char
*
txt
)
{
if
(
start
!=
0
)
{
uint64_t
end
=
rdtsc
();
long
long
diff
=
(
end
-
start
)
/
(
cpuf
*
1000
);
M
->
maxArray
[
0
]
=
diff
;
M
->
sum
+=
diff
;
M
->
iterations
++
;
qsort
(
M
->
maxArray
,
11
,
sizeof
(
uint64_t
),
cmpint
);
printMeas
(
txt
,
M
,
period
);
}
}
#define check(a) do { checkT(a,__FILE__,__LINE__); } while (0)
...
...
common/utils/T/genids.c
View file @
38fb3140
...
...
@@ -8,27 +8,35 @@ char **unique_ids;
int
unique_ids_size
;
int
unique_ids_maxsize
;
int
cmp
(
const
void
*
p1
,
const
void
*
p2
)
{
return
strcmp
(
*
(
char
*
const
*
)
p1
,
*
(
char
*
const
*
)
p2
);
int
cmp
(
const
void
*
p1
,
const
void
*
p2
)
{
return
strcmp
(
*
(
char
*
const
*
)
p1
,
*
(
char
*
const
*
)
p2
);
}
/* return 1 if s was not already known, 0 if it was */
int
new_unique_id
(
char
*
s
,
char
*
input_file
)
{
int
new_unique_id
(
char
*
s
,
char
*
input_file
)
{
if
(
unique_ids_size
)
if
(
bsearch
(
&
s
,
unique_ids
,
unique_ids_size
,
sizeof
(
char
*
),
cmp
)
!=
NULL
)
{
printf
(
"error: ID %s is not unique in %s
\n
"
,
s
,
input_file
);
return
0
;
}
if
(
bsearch
(
&
s
,
unique_ids
,
unique_ids_size
,
sizeof
(
char
*
),
cmp
)
!=
NULL
)
{
printf
(
"error: ID %s is not unique in %s
\n
"
,
s
,
input_file
);
return
0
;
}
if
(
unique_ids_size
==
unique_ids_maxsize
)
{
unique_ids_maxsize
+=
256
;
unique_ids
=
realloc
(
unique_ids
,
unique_ids_maxsize
*
sizeof
(
char
*
));
if
(
unique_ids
==
NULL
)
{
printf
(
"error: out of memory
\n
"
);
abort
();
}
if
(
unique_ids
==
NULL
)
{
printf
(
"error: out of memory
\n
"
);
abort
();
}
}
unique_ids
[
unique_ids_size
]
=
strdup
(
s
);
if
(
unique_ids
[
unique_ids_size
]
==
NULL
)
{
printf
(
"error: out of memory
\n
"
);
abort
();
}
if
(
unique_ids
[
unique_ids_size
]
==
NULL
)
{
printf
(
"error: out of memory
\n
"
);
abort
();
}
unique_ids_size
++
;
qsort
(
unique_ids
,
unique_ids_size
,
sizeof
(
char
*
),
cmp
);
return
1
;
...
...
@@ -38,14 +46,17 @@ char *bufname;
int
bufname_size
;
int
bufname_maxsize
;
void
putname
(
int
c
)
{
void
putname
(
int
c
)
{
if
(
bufname_size
==
bufname_maxsize
)
{
bufname_maxsize
+=
256
;
bufname
=
realloc
(
bufname
,
bufname_maxsize
);
if
(
bufname
==
NULL
)
{
printf
(
"error: memory allocation error
\n
"
);
exit
(
1
);
}
if
(
bufname
==
NULL
)
{
printf
(
"error: memory allocation error
\n
"
);
exit
(
1
);
}
}
bufname
[
bufname_size
]
=
c
;
bufname_size
++
;
}
...
...
@@ -54,42 +65,54 @@ char *bufvalue;
int
bufvalue_size
;
int
bufvalue_maxsize
;
void
putvalue
(
int
c
)
{
void
putvalue
(
int
c
)
{
if
(
bufvalue_size
==
bufvalue_maxsize
)
{
bufvalue_maxsize
+=
256
;
bufvalue
=
realloc
(
bufvalue
,
bufvalue_maxsize
);
if
(
bufvalue
==
NULL
)
{
printf
(
"error: memory allocation error
\n
"
);
exit
(
1
);
}
if
(
bufvalue
==
NULL
)
{
printf
(
"error: memory allocation error
\n
"
);
exit
(
1
);
}
}
bufvalue
[
bufvalue_size
]
=
c
;
bufvalue_size
++
;
}
void
smash_spaces
(
FILE
*
f
)
{
void
smash_spaces
(
FILE
*
f
)
{
int
c
;
while
(
1
)
{
c
=
fgetc
(
f
);
if
(
isspace
(
c
))
continue
;
if
(
c
==
' '
)
continue
;
if
(
c
==
'\t'
)
continue
;
if
(
c
==
'\n'
)
continue
;
if
(
c
==
10
||
c
==
13
)
continue
;
if
(
c
==
'#'
)
{
while
(
1
)
{
c
=
fgetc
(
f
);
if
(
c
==
'\n'
||
c
==
EOF
)
break
;
}
continue
;
}
break
;
}
if
(
c
!=
EOF
)
ungetc
(
c
,
f
);
}
void
get_line
(
FILE
*
f
,
char
**
name
,
char
**
value
)
{
void
get_line
(
FILE
*
f
,
char
**
name
,
char
**
value
)
{
int
c
;
bufname_size
=
0
;
bufvalue_size
=
0
;
...
...
@@ -97,23 +120,39 @@ void get_line(FILE *f, char **name, char **value)
*
value
=
NULL
;
smash_spaces
(
f
);
c
=
fgetc
(
f
);
while
(
!
(
c
==
'='
||
isspace
(
c
)
||
c
==
EOF
))
{
putname
(
c
);
c
=
fgetc
(
f
);
}
while
(
!
(
c
==
'='
||
isspace
(
c
)
||
c
==
EOF
))
{
putname
(
c
);
c
=
fgetc
(
f
);
}
if
(
c
==
EOF
)
return
;
putname
(
0
);
while
(
!
(
c
==
EOF
||
c
==
'='
))
c
=
fgetc
(
f
);
if
(
c
==
EOF
)
return
;
smash_spaces
(
f
);
c
=
fgetc
(
f
);
while
(
!
(
c
==
10
||
c
==
13
||
c
==
EOF
))
{
putvalue
(
c
);
c
=
fgetc
(
f
);
}
while
(
!
(
c
==
10
||
c
==
13
||
c
==
EOF
))
{
putvalue
(
c
);
c
=
fgetc
(
f
);
}
putvalue
(
0
);
if
(
bufname_size
<=
1
)
return
;
if
(
bufvalue_size
<=
1
)
return
;
*
name
=
bufname
;
*
value
=
bufvalue
;
}
int
main
(
int
n
,
char
**
v
)
{
int
main
(
int
n
,
char
**
v
)
{
FILE
*
in
;
FILE
*
out
;
char
*
name
;
...
...
@@ -121,36 +160,54 @@ int main(int n, char **v)
char
*
in_name
;
char
*
out_name
;
if
(
n
!=
3
)
{
printf
(
"error: gimme <source> <dest>
\n
"
);
exit
(
1
);
}
if
(
n
!=
3
)
{
printf
(
"error: gimme <source> <dest>
\n
"
);
exit
(
1
);
}
n
=
0
;
in_name
=
v
[
1
];
out_name
=
v
[
2
];
in
=
fopen
(
in_name
,
"r"
);
if
(
in
==
NULL
)
{
perror
(
in_name
);
exit
(
1
);
}
in
=
fopen
(
in_name
,
"r"
);
if
(
in
==
NULL
)
{
perror
(
in_name
);
exit
(
1
);
}
out
=
fopen
(
out_name
,
"w"
);
if
(
out
==
NULL
)
{
perror
(
out_name
);
exit
(
1
);
}
out
=
fopen
(
out_name
,
"w"
);
if
(
out
==
NULL
)
{
perror
(
out_name
);
exit
(
1
);
}
fprintf
(
out
,
"/* generated file, do not edit by hand */
\n\n
"
);
while
(
1
)
{
get_line
(
in
,
&
name
,
&
value
);
if
(
name
==
NULL
)
break
;
if
(
isspace
(
value
[
strlen
(
value
)
-
1
]))
{
printf
(
"error: bad value '%s' (no space at the end please!)
\n
"
,
value
);
unlink
(
out_name
);
exit
(
1
);
}
if
(
!
strcmp
(
name
,
"ID"
))
{
if
(
!
new_unique_id
(
value
,
in_name
))
{
unlink
(
out_name
);
exit
(
1
);
}
if
(
!
new_unique_id
(
value
,
in_name
))
{
unlink
(
out_name
);
exit
(
1
);
}
fprintf
(
out
,
"#define T_%s T_ID(%d)
\n
"
,
value
,
n
);
n
++
;
}
}
fprintf
(
out
,
"#define T_NUMBER_OF_IDS %d
\n
"
,
n
);
fprintf
(
out
,
"#define T_NUMBER_OF_IDS %d
\n
"
,
n
);
fclose
(
in
);
fclose
(
out
);
return
0
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment