|
suricata
|
#include "queue.h"
Go to the source code of this file.
Data Structures | |
| struct | SCConfNode_ |
Macros | |
| #define | DEFAULT_LOG_DIR "/var/log/suricata" |
| #define | DEFAULT_DATA_DIR DATA_DIR |
Typedefs | |
| typedef struct SCConfNode_ | SCConfNode |
Functions | |
| void | SCConfInit (void) |
| Initialize the configuration system. More... | |
| void | SCConfDeInit (void) |
| De-initializes the configuration system. More... | |
| SCConfNode * | SCConfGetRootNode (void) |
| Get the root configuration node. More... | |
| int | SCConfGet (const char *name, const char **vptr) |
| Retrieve the value of a configuration node. More... | |
| int | SCConfGetInt (const char *name, intmax_t *val) |
| Retrieve a configuration value as an integer. More... | |
| int | SCConfGetBool (const char *name, int *val) |
| Retrieve a configuration value as a boolean. More... | |
| int | SCConfGetDouble (const char *name, double *val) |
| Retrieve a configuration value as a double. More... | |
| int | SCConfGetFloat (const char *name, float *val) |
| Retrieve a configuration value as a float. More... | |
| int | SCConfGetTime (const char *name, uint64_t *val) |
| Retrieve a configuration value as a time duration in seconds. More... | |
| int | SCConfSet (const char *name, const char *val) |
| Set a configuration value. More... | |
| int | SCConfSetFromString (const char *input, int final) |
| Set a configuration parameter from a string. More... | |
| int | SCConfSetFinal (const char *name, const char *val) |
| Set a final configuration value. More... | |
| void | SCConfDump (void) |
| Dump configuration to stdout. More... | |
| void | SCConfNodeDump (const SCConfNode *node, const char *prefix) |
| Dump a configuration node and all its children. More... | |
| SCConfNode * | SCConfNodeNew (void) |
| Allocate a new configuration node. More... | |
| void | SCConfNodeFree (SCConfNode *) |
| Free a SCConfNode and all of its children. More... | |
| SCConfNode * | SCConfGetNode (const char *key) |
| Get a SCConfNode by name. More... | |
| void | SCConfCreateContextBackup (void) |
| Creates a backup of the conf_hash hash_table used by the conf API. More... | |
| void | SCConfRestoreContextBackup (void) |
| Restores the backup of the hash_table present in backup_conf_hash back to conf_hash. More... | |
| SCConfNode * | SCConfNodeLookupChild (const SCConfNode *node, const char *key) |
| Lookup a child configuration node by name. More... | |
| const char * | SCConfNodeLookupChildValue (const SCConfNode *node, const char *key) |
| Lookup the value of a child configuration node by name. More... | |
| void | SCConfNodeRemove (SCConfNode *) |
| Remove (and SCFree) the provided configuration node. More... | |
| void | SCConfRegisterTests (void) |
| int | SCConfNodeChildValueIsTrue (const SCConfNode *node, const char *key) |
| Test if a configuration node has a true value. More... | |
| int | SCConfNodeChildValueIsFalse (const SCConfNode *node, const char *key) |
| Test if a configuration node has a false value. More... | |
| int | SCConfValIsTrue (const char *val) |
| Check if a value is true. More... | |
| int | SCConfValIsFalse (const char *val) |
| Check if a value is false. More... | |
| void | SCConfNodePrune (SCConfNode *node) |
| Create the path for an include entry. More... | |
| int | SCConfRemove (const char *name) |
| Remove a configuration parameter from the configuration db. More... | |
| bool | SCConfNodeHasChildren (const SCConfNode *node) |
| Check if a node has any children. More... | |
| SCConfNode * | SCConfGetChildWithDefault (const SCConfNode *base, const SCConfNode *dflt, const char *name) |
| SCConfNode * | SCConfNodeLookupKeyValue (const SCConfNode *base, const char *key, const char *value) |
| Lookup for a key value under a specific node. More... | |
| int | SCConfGetChildValue (const SCConfNode *base, const char *name, const char **vptr) |
| int | SCConfGetChildValueInt (const SCConfNode *base, const char *name, intmax_t *val) |
| int | SCConfGetChildValueBool (const SCConfNode *base, const char *name, int *val) |
| int | SCConfGetChildValueWithDefault (const SCConfNode *base, const SCConfNode *dflt, const char *name, const char **vptr) |
| int | SCConfGetChildValueIntWithDefault (const SCConfNode *base, const SCConfNode *dflt, const char *name, intmax_t *val) |
| int | SCConfGetChildValueBoolWithDefault (const SCConfNode *base, const SCConfNode *dflt, const char *name, int *val) |
| int | SCConfNodeIsSequence (const SCConfNode *node) |
| Check if a node is a sequence or node. More... | |
| SCConfNode * | SCConfSetIfaceNode (const char *ifaces_node_name, const char *iface) |
| Finds an interface from the list of interfaces. More... | |
| int | SCConfSetRootAndDefaultNodes (const char *ifaces_node_name, const char *iface, SCConfNode **if_root, SCConfNode **if_default) |
| Finds and sets root and default node of the interface. More... | |
| SCConfNode * | SCConfNodeGetNodeOrCreate (SCConfNode *parent, const char *name, int final) |
| Helper function to get a node, creating it if it does not exist. More... | |
| SCConfNode * | SCConfGetFirstNode (const SCConfNode *parent) |
| SCConfNode * | SCConfGetNextNode (const SCConfNode *node) |
| const char * | SCConfGetValueNode (const SCConfNode *node) |
Definition in file conf.h.
| #define DEFAULT_LOG_DIR "/var/log/suricata" |
| typedef struct SCConfNode_ SCConfNode |
Structure of a configuration parameter.
| void SCConfCreateContextBackup | ( | void | ) |
| void SCConfDeInit | ( | void | ) |
De-initializes the configuration system.
Definition at line 734 of file conf.c.
Referenced by GlobalsDestroy().

| void SCConfDump | ( | void | ) |
Dump configuration to stdout.
Definition at line 792 of file conf.c.
References SCConfNodeDump().
Referenced by SuricataInit().


| int SCConfGet | ( | const char * | name, |
| const char ** | vptr | ||
| ) |
Retrieve the value of a configuration node.
This function will return the value for a configuration node based on the full name of the node. It is possible that the value returned could be NULL, this could happen if the requested node does exist but is not a node that contains a value, but contains children SCConfNodes instead.
| name | Name of configuration parameter to get. |
| vptr | Pointer that will be set to the configuration value parameter. Note that this is just a reference to the actual value, not a copy. |
| 1 | will be returned if the name is found, otherwise 0 will be returned. |
Definition at line 351 of file conf.c.
References name, SCConfGetNode(), SCLogDebug, and SCConfNode_::val.
Referenced by ConfigGetDataDirectory(), ConfSetBPFFilter(), ConfUnixSocketIsEnable(), CoredumpLoadConfig(), DatasetGetDefaultMemcap(), DatasetsInit(), DetectEngineMpmCachingGetPath(), FlowInitConfig(), HTPParseMemcap(), HttpRangeContainersInit(), NFQInitConfig(), OutputJsonInitCtx(), PatternMatchDefaultMatcher(), PcapFileGlobalInit(), PostConfLoadedSetup(), RunModeErfFileAutoFp(), RunModeErfFileSingle(), RunModeFilePcapAutoFp(), RunModeFilePcapSingle(), RunModeIdsAFPAutoFp(), RunModeIdsAFPSingle(), RunModeIdsAFPWorkers(), RunModeIdsAFXDPSingle(), RunModeIdsAFXDPWorkers(), RunModeIdsPcapAutoFp(), RunModeIdsPcapSingle(), RunModeIdsPcapWorkers(), RunModeInitializeThreadSettings(), SCConfGetBool(), SCConfGetDouble(), SCConfGetFloat(), SCConfGetInt(), SCConfGetTime(), SCConfigGetLogDirectory(), SCLogLoadConfig(), SCRuleVarsGetConfVar(), SinglePatternMatchDefaultMatcher(), StreamTcpInitConfig(), and TmqhFlowRegister().


| int SCConfGetBool | ( | const char * | name, |
| int * | val | ||
| ) |
Retrieve a configuration value as a boolean.
| name | Name of configuration parameter to get. |
| val | Pointer to an int that will be set to 1 for true, or 0 for false. |
| 1 | will be returned if the name is found and was properly converted to a boolean, otherwise 0 will be returned. |
Definition at line 498 of file conf.c.
References name, SCConfGet(), and SCConfValIsTrue().
Referenced by DecodeERSPANConfig(), DecodeGeneveConfig(), DecodeTeredoConfig(), DecodeVXLANConfig(), DetectEngineFrameMpmRegister(), DetectEngineMpmCachingEnabled(), NFQInitConfig(), PostConfLoadedSetup(), RunModeInitializeThreadSettings(), SigPrepareStage4(), StreamTcpInitConfig(), SuricataInit(), and SuricataPostInit().


| int SCConfGetChildValue | ( | const SCConfNode * | base, |
| const char * | name, | ||
| const char ** | vptr | ||
| ) |
| int SCConfGetChildValueBool | ( | const SCConfNode * | base, |
| const char * | name, | ||
| int * | val | ||
| ) |
| int SCConfGetChildValueBoolWithDefault | ( | const SCConfNode * | base, |
| const SCConfNode * | dflt, | ||
| const char * | name, | ||
| int * | val | ||
| ) |
| int SCConfGetChildValueInt | ( | const SCConfNode * | base, |
| const char * | name, | ||
| intmax_t * | val | ||
| ) |
| int SCConfGetChildValueIntWithDefault | ( | const SCConfNode * | base, |
| const SCConfNode * | dflt, | ||
| const char * | name, | ||
| intmax_t * | val | ||
| ) |
| int SCConfGetChildValueWithDefault | ( | const SCConfNode * | base, |
| const SCConfNode * | dflt, | ||
| const char * | name, | ||
| const char ** | vptr | ||
| ) |
Definition at line 394 of file conf.c.
Referenced by ConfSetBPFFilter().

| SCConfNode* SCConfGetChildWithDefault | ( | const SCConfNode * | base, |
| const SCConfNode * | dflt, | ||
| const char * | name | ||
| ) |
| int SCConfGetDouble | ( | const char * | name, |
| double * | val | ||
| ) |
Retrieve a configuration value as a double.
| name | Name of configuration parameter to get. |
| val | Pointer to an double that will be set the configuration value. |
| 1 | will be returned if the name is found and was properly converted to a double, otherwise 0 will be returned. |
Definition at line 601 of file conf.c.
References name, and SCConfGet().

| SCConfNode* SCConfGetFirstNode | ( | const SCConfNode * | parent | ) |
Definition at line 205 of file conf.c.
References TAILQ_FIRST.
| int SCConfGetFloat | ( | const char * | name, |
| float * | val | ||
| ) |
Retrieve a configuration value as a float.
| name | Name of configuration parameter to get. |
| val | Pointer to an float that will be set the configuration value. |
| 1 | will be returned if the name is found and was properly converted to a double, otherwise 0 will be returned. |
Definition at line 631 of file conf.c.
References name, and SCConfGet().
Referenced by RunModeInitializeThreadSettings().


| int SCConfGetInt | ( | const char * | name, |
| intmax_t * | val | ||
| ) |
Retrieve a configuration value as an integer.
| name | Name of configuration parameter to get. |
| val | Pointer to an intmax_t that will be set the configuration value. |
| 1 | will be returned if the name is found and was properly converted to an integer, otherwise 0 will be returned. |
Definition at line 415 of file conf.c.
References name, SCConfGet(), and SCLogError.
Referenced by DecodeGlobalConfig(), DefragInit(), DetectLoadersInit(), FlowInitConfig(), FlowManagerThreadSpawn(), FlowRecyclerThreadSpawn(), NFQInitConfig(), PacketAlertGetMaxConfig(), SCProfilingInit(), and StreamTcpInitConfig().


| SCConfNode* SCConfGetNextNode | ( | const SCConfNode * | node | ) |
Definition at line 210 of file conf.c.
References next, and TAILQ_NEXT.
| SCConfNode* SCConfGetNode | ( | const char * | name | ) |
Get a SCConfNode by name.
| name | The full name of the configuration node to lookup. |
| A | pointer to SCConfNode is found or NULL if the configuration node does not exist. |
Definition at line 182 of file conf.c.
Referenced by ActionInitConfig(), DatasetsInit(), DefragPolicyLoadFromConfig(), DetectAddressTestConfVars(), DetectPortTestConfVars(), FlowInitFlowProto(), JsonPgsqlLogRegister(), PcapLogProfileSetup(), PostConfLoadedSetup(), RunModeInitializeOutputs(), RunModeInitializeThreadSettings(), SCAppLayerParserConfParserEnabled(), SCAppLayerProtoDetectConfProtoDetectionEnabledDefault(), SCAppLayerProtoDetectPPParseConfPorts(), SCConfGet(), SCConfRemove(), SCConfSetIfaceNode(), SCLogLoadConfig(), SCProfilingKeywordsGlobalInit(), SCProfilingPrefilterGlobalInit(), SCProfilingSghsGlobalInit(), and StreamTcpInitConfig().

| SCConfNode* SCConfGetRootNode | ( | void | ) |
Get the root configuration node.
Definition at line 223 of file conf.c.
Referenced by SCLoadYamlConfig().

| int SCConfGetTime | ( | const char * | name, |
| uint64_t * | val | ||
| ) |
Retrieve a configuration value as a time duration in seconds.
The configuration value is expected to be a string with a number followed by an optional time-describing unit (e.g. s, seconds, weeks, years). If no unit is specified, seconds are assumed.
| name | Name of configuration parameter to get. |
| val | Pointer to an uint64_t that will be set the configuration value in seconds. |
| 1 | will be returned if the name is found and was properly converted to a time duration, otherwise 0 will be returned. |
Definition at line 665 of file conf.c.
References name, and SCConfGet().

| const char* SCConfGetValueNode | ( | const SCConfNode * | node | ) |
Definition at line 215 of file conf.c.
References SCConfNode_::val.
| void SCConfInit | ( | void | ) |
Initialize the configuration system.
Definition at line 121 of file conf.c.
Referenced by InitGlobal().

| int SCConfNodeChildValueIsFalse | ( | const SCConfNode * | node, |
| const char * | key | ||
| ) |
Test if a configuration node has a false value.
If the field does not exist, or has anything other than a false value, this function will return 0.
| node | The parent configuration node. |
| name | The name of the child node to test. |
| 1 | if the child node has a false value, otherwise 0. |
Definition at line 919 of file conf.c.
References SCConfNodeLookupChildValue(), and SCConfValIsFalse().

| int SCConfNodeChildValueIsTrue | ( | const SCConfNode * | node, |
| const char * | key | ||
| ) |
Test if a configuration node has a true value.
| node | The parent configuration node. |
| name | The name of the child node to test. |
| 1 | if the child node has a true value, otherwise 0 is returned, even if the child node does not exist. |
Definition at line 899 of file conf.c.
References SCConfNodeLookupChildValue(), and SCConfValIsTrue().
Referenced by HttpXFFGetCfg(), PcapLogProfileSetup(), PostConfLoadedSetup(), SCProfilingKeywordsGlobalInit(), SCProfilingPrefilterGlobalInit(), and SCProfilingSghsGlobalInit().


| void SCConfNodeDump | ( | const SCConfNode * | node, |
| const char * | prefix | ||
| ) |
Dump a configuration node and all its children.
Definition at line 762 of file conf.c.
References SCConfNode_::name, name, next, SCStrdup, TAILQ_FOREACH, and unlikely.
Referenced by SCConfDump().

| void SCConfNodeFree | ( | SCConfNode * | node | ) |
Free a SCConfNode and all of its children.
| node | The configuration node to SCFree. |
Definition at line 158 of file conf.c.
References SCConfNode_::name, next, SCConfNodeFree(), SCFree, TAILQ_FIRST, TAILQ_REMOVE, and SCConfNode_::val.
Referenced by SCConfNodeFree(), SCConfNodeGetNodeOrCreate(), and SCConfNodeRemove().


| SCConfNode* SCConfNodeGetNodeOrCreate | ( | SCConfNode * | parent, |
| const char * | name, | ||
| int | final | ||
| ) |
Helper function to get a node, creating it if it does not exist.
This function exits on memory failure as creating configuration nodes is usually part of application initialization.
| parent | The node to use as the parent |
| name | The name of the configuration node to get. |
| final | Flag to set created nodes as final or not. |
| The | existing configuration node if it exists, or a newly created node for the provided name. On error, NULL will be returned. |
Definition at line 67 of file conf.c.
References SCConfNode_::final, SCConfNode_::name, name, next, NODE_NAME_MAX, SCConfNode_::parent, SCConfNodeFree(), SCConfNodeLookupChild(), SCConfNodeNew(), SCLogError, SCLogWarning, SCStrdup, strlcpy(), TAILQ_INSERT_TAIL, and unlikely.

| bool SCConfNodeHasChildren | ( | const SCConfNode * | node | ) |
Check if a node has any children.
Checks if the provided node has any children. Any node that is a YAML map or array will have children.
| node | The node to check. |
| true | if node has children |
| false | if node does not have children |
Definition at line 808 of file conf.c.
References TAILQ_EMPTY.
| int SCConfNodeIsSequence | ( | const SCConfNode * | node | ) |
Check if a node is a sequence or node.
| node | the node to check. |
Definition at line 976 of file conf.c.
References SCConfNode_::is_seq.
| SCConfNode* SCConfNodeLookupChild | ( | const SCConfNode * | node, |
| const char * | name | ||
| ) |
Lookup a child configuration node by name.
Given a SCConfNode this function will lookup an immediate child SCConfNode by name and return the child ConfNode.
| node | The parent configuration node. |
| name | The name of the child node to lookup. |
| A | pointer the child SCConfNode if found otherwise NULL. |
Definition at line 827 of file conf.c.
References SCConfNode_::name, name, next, and TAILQ_FOREACH.
Referenced by DatasetsInit(), FileForceHashParseCfg(), FlowInitFlowProto(), HttpXFFGetCfg(), OutputEmailInitConf(), RunModeInitializeOutputs(), SCAppLayerProtoDetectPPParseConfPorts(), SCConfLogOpenGeneric(), SCConfNodeGetNodeOrCreate(), and SCConfNodeLookupChildValue().

| const char* SCConfNodeLookupChildValue | ( | const SCConfNode * | node, |
| const char * | name | ||
| ) |
Lookup the value of a child configuration node by name.
Given a parent SCConfNode this function will return the value of a child configuration node by name returning a reference to that value.
| node | The parent configuration node. |
| name | The name of the child node to lookup. |
| A | pointer the child SCConfNodes value if found otherwise NULL. |
Definition at line 855 of file conf.c.
References name, SCConfNodeLookupChild(), and SCConfNode_::val.
Referenced by FlowInitFlowProto(), HttpXFFGetCfg(), LogHttpLogInitCtx(), LogTcpDataLogInitCtx(), OutputEmailInitConf(), OutputJsonInitCtx(), RunModeInitializeOutputs(), SCConfLogOpenGeneric(), SCConfNodeChildValueIsFalse(), SCConfNodeChildValueIsTrue(), SCProfilingKeywordsGlobalInit(), SCProfilingPrefilterGlobalInit(), and SCProfilingSghsGlobalInit().


| SCConfNode* SCConfNodeLookupKeyValue | ( | const SCConfNode * | base, |
| const char * | key, | ||
| const char * | value | ||
| ) |
| SCConfNode* SCConfNodeNew | ( | void | ) |
Allocate a new configuration node.
| An | allocated configuration node on success, NULL on failure. |
Definition at line 140 of file conf.c.
References SCCalloc, TAILQ_INIT, and unlikely.
Referenced by SCConfNodeGetNodeOrCreate().

| void SCConfNodePrune | ( | SCConfNode * | node | ) |
Create the path for an include entry.
| file | The name of the file |
| str | Pointer to the string path + sig_file |
Prune a configuration node.
Pruning a configuration is similar to freeing, but only fields that may be overridden are, leaving final type parameters. Additional the value of the provided node is also free'd, but the node itself is left.
| node | The configuration node to prune. |
Definition at line 944 of file conf.c.
References SCConfNode_::final, SCConfNode_::name, next, SCConfNodePrune(), SCFree, TAILQ_EMPTY, TAILQ_FIRST, TAILQ_NEXT, TAILQ_REMOVE, and SCConfNode_::val.
Referenced by SCConfNodePrune().


| void SCConfNodeRemove | ( | SCConfNode * | ) |
Remove (and SCFree) the provided configuration node.
Definition at line 684 of file conf.c.
References next, SCConfNode_::parent, SCConfNodeFree(), and TAILQ_REMOVE.
Referenced by SCConfRemove().


| void SCConfRegisterTests | ( | void | ) |
Definition at line 1522 of file conf.c.
References UtRegisterTest().

| int SCConfRemove | ( | const char * | name | ) |
Remove a configuration parameter from the configuration db.
| name | The name of the configuration parameter to remove. |
| Returns | 1 if the parameter was removed, otherwise 0 is returned most likely indicating the parameter was not set. |
Definition at line 699 of file conf.c.
References name, SCConfGetNode(), and SCConfNodeRemove().

| void SCConfRestoreContextBackup | ( | void | ) |
| int SCConfSet | ( | const char * | name, |
| const char * | val | ||
| ) |
Set a configuration value.
Configuration values set with this function may be overridden by subsequent calls, or if the value appears multiple times in a configuration file.
| name | The name of the configuration parameter to set. |
| val | The value of the configuration parameter. |
| 1 | if the value was set otherwise 0. |
Definition at line 240 of file conf.c.
Referenced by PostConfLoadedSetup(), SCConfSetFromString(), and UTHPacketMatchSigMpm().

| int SCConfSetFinal | ( | const char * | name, |
| const char * | val | ||
| ) |
Set a final configuration value.
A final configuration value is a value that cannot be overridden by the configuration file. Its mainly useful for setting values that are supplied on the command line prior to the configuration file being loaded. However, a subsequent call to this function can override a previously set value.
| name | The name of the configuration parameter to set. |
| val | The value of the configuration parameter. |
| 1 | if the value was set otherwise 0. |
Definition at line 319 of file conf.c.
Referenced by ConfigSetDataDirectory(), ConfigSetLogDirectory(), SCConfSetFromString(), and SCParseCommandLine().

| int SCConfSetFromString | ( | const char * | input, |
| int | final | ||
| ) |
Set a configuration parameter from a string.
Where the input string is something like: stream.midstream=true
| input | the input string to be parsed. |
| 1 | if the value of set, otherwise 0. |
Definition at line 265 of file conf.c.
References name, SCConfSet(), SCConfSetFinal(), SCFree, SCStrdup, and unlikely.
Referenced by main().


| SCConfNode* SCConfSetIfaceNode | ( | const char * | ifaces_node_name, |
| const char * | iface | ||
| ) |
Finds an interface from the list of interfaces.
| ifaces_node_name | - name of the node which holds a list of interfaces |
| iface | - interfaces name |
Definition at line 987 of file conf.c.
References ConfFindDeviceConfig(), SCConfGetNode(), SCLogError, and SCLogNotice.
Referenced by SCConfSetRootAndDefaultNodes().


| int SCConfSetRootAndDefaultNodes | ( | const char * | ifaces_node_name, |
| const char * | iface, | ||
| SCConfNode ** | if_root, | ||
| SCConfNode ** | if_default | ||
| ) |
Finds and sets root and default node of the interface.
| ifaces_node_name | Node which holds list of interfaces |
| iface | Name of the interface e.g. eth3 |
| if_root | Node which will hold the interface configuration |
| if_default | Node which is the default configuration in the given list of interfaces |
Definition at line 1013 of file conf.c.
References SCConfSetIfaceNode(), and SCLogError.

| int SCConfValIsFalse | ( | const char * | val | ) |
Check if a value is false.
The value is considered false if it is a string with the value of 0, no, false or off. The test is not case sensitive, any other value is not false.
| val | The string to test for a false value. |
| 1 | If the value is false, 0 if not. |
Definition at line 577 of file conf.c.
Referenced by SCAppLayerParserConfParserEnabled(), SCAppLayerProtoDetectConfProtoDetectionEnabledDefault(), SCConfLogOpenGeneric(), and SCConfNodeChildValueIsFalse().

| int SCConfValIsTrue | ( | const char * | val | ) |
Check if a value is true.
The value is considered true if it is a string with the value of 1, yes, true or on. The test is not case sensitive, any other value is false.
| val | The string to test for a true value. |
| 1 | If the value is true, 0 if not. |
Definition at line 552 of file conf.c.
Referenced by ConfUnixSocketIsEnable(), LogHttpLogInitCtx(), OutputEmailInitConf(), RunModeInitializeOutputs(), SCAppLayerParserConfParserEnabled(), SCAppLayerProtoDetectConfProtoDetectionEnabledDefault(), SCConfGetBool(), and SCConfNodeChildValueIsTrue().
