summaryrefslogtreecommitdiffstats
path: root/common/elapi/elapi_event.c
diff options
context:
space:
mode:
authorDmitri Pal <dpal@redhat.com>2009-08-07 15:50:34 -0400
committerStephen Gallagher <sgallagh@redhat.com>2009-08-12 12:24:27 -0400
commit1771d32e945b758326951384f0e17121042ad74e (patch)
tree070df00bcb1e049a1bdf794922b9b970479942a8 /common/elapi/elapi_event.c
parentd59ba3139bba2d28c1209f62c01a7017c26dd635 (diff)
downloadsssd-1771d32e945b758326951384f0e17121042ad74e.tar.gz
sssd-1771d32e945b758326951384f0e17121042ad74e.tar.xz
sssd-1771d32e945b758326951384f0e17121042ad74e.zip
ELAPI Next round of functionality - logging part of the interface
a) Added the main logging interface which allows creating dispatcher and logging messages or events. Can't actully log anything yet since the sinks are stubbed out. b) Made default template be a part of the default dispatcher. c) Updated UNIT test. d) Some of the calls are stubbed out but they are there to indicate where next round of work will be.
Diffstat (limited to 'common/elapi/elapi_event.c')
-rw-r--r--common/elapi/elapi_event.c363
1 files changed, 134 insertions, 229 deletions
diff --git a/common/elapi/elapi_event.c b/common/elapi/elapi_event.c
index fe3b3a5e3..97cb2a13b 100644
--- a/common/elapi/elapi_event.c
+++ b/common/elapi/elapi_event.c
@@ -58,12 +58,9 @@ const char *str_no = "no";
const char *str_true = "true";
const char *str_false = "false";
-/* Default event template */
-struct collection_item *default_template = NULL;
-
/* Function to add host identity information to the template */
-int add_host_identity(struct collection_item *tpl, unsigned base)
+static int add_host_identity(struct collection_item *tpl, unsigned base)
{
char hostname[NI_MAXHOST + 1];
int error = EOK;
@@ -79,8 +76,6 @@ int add_host_identity(struct collection_item *tpl, unsigned base)
TRACE_FLOW_STRING("add_host_identity", "Entry");
- memset(hostname, 0, sizeof(hostname));
-
/* The goal here to collect information about the host.
* there is no need to actually use it for establishing
* any connections.
@@ -92,7 +87,7 @@ int add_host_identity(struct collection_item *tpl, unsigned base)
/* If we are not asked for ip then say we already have it */
if (!(base & E_HAVE_HOSTIP)) set_ip = 1;
- if (getifaddrs(&ifaddr) == 0) {
+ if (getifaddrs(&ifaddr) == EOK) {
TRACE_FLOW_STRING("getifaddrs", "Ok");
@@ -117,9 +112,11 @@ int add_host_identity(struct collection_item *tpl, unsigned base)
if (family == AF_INET || family == AF_INET6) {
TRACE_FLOW_NUMBER("Got right family", family);
- /* Make sure the address is cleared - will help in comparisons */
- memset(host, 0, sizeof(host));
- memset(address, 0, sizeof(address));
+
+ /* getnameinfo function claims that it returns NULL
+ * terminated strings. Well...
+ * We will trust it here and not clear memory using memset.
+ */
gai_ret_host = getnameinfo(ifa->ifa_addr,
(family == AF_INET) ? sizeof(struct sockaddr_in) :
@@ -146,10 +143,14 @@ int add_host_identity(struct collection_item *tpl, unsigned base)
hnm = NULL;
/* Use host name returned by gethostname() as main host name */
- if (!gethostname(hostname, NI_MAXHOST)) hnm = hostname;
+ if (gethostname(hostname, NI_MAXHOST) == EOK) {
+ /* Make sure hostname is NULL terminated */
+ hostname[NI_MAXHOST] = '\0';
+ hnm = hostname;
+ }
else {
/* We we able to get a host name ? */
- if (gai_ret_host == 0) {
+ if (gai_ret_host == EOK) {
TRACE_INFO_STRING("getnameinfo returned:", host);
hnm = host;
}
@@ -157,9 +158,9 @@ int add_host_identity(struct collection_item *tpl, unsigned base)
/* Do we have a host meaningful host name? */
if ((hnm) &&
- ((strncasecmp(hnm, LOCALHOST, sizeof(LOCALHOST)) == 0 ) ||
- (strncasecmp(hnm, LOCALHOSTDOMAIN, sizeof(LOCALHOSTDOMAIN)) == 0 ) ||
- (strncasecmp(hnm, address, sizeof(address) == 0)))) hnm = NULL;
+ ((strcasecmp(hnm, LOCALHOST) == 0 ) ||
+ (strcasecmp(hnm, LOCALHOSTDOMAIN) == 0 ) ||
+ (strcasecmp(hnm, address) == 0))) hnm = NULL;
/* If host name is not NULL it would work for us */
if (hnm) {
@@ -181,10 +182,10 @@ int add_host_identity(struct collection_item *tpl, unsigned base)
TRACE_FLOW_STRING("Address is not set", "");
haddr = NULL;
- if (gai_ret_addr == 0) {
+ if (gai_ret_addr == EOK) {
TRACE_INFO_STRING("getnameinfo returned:", address);
- if ((strncasecmp(address, LOCALADDRESS, sizeof(LOCALADDRESS)) != 0 ) &&
- (strncasecmp(address, LOCALADDRESSV6, sizeof(LOCALADDRESSV6)) != 0 )) {
+ if ((strcasecmp(address, LOCALADDRESS) != 0 ) &&
+ (strcasecmp(address, LOCALADDRESSV6) != 0 )) {
TRACE_INFO_STRING("Not an unhelpful address", "");
haddr = address;
}
@@ -211,11 +212,11 @@ int add_host_identity(struct collection_item *tpl, unsigned base)
TRACE_INFO_STRING("they are:", strncasecmp(host, address, sizeof(address)) == 0 ? "same" : "different");
/* Do we have a host meaningful host name? */
- if ((gai_ret_host != 0) ||
- ((gai_ret_host == 0) &&
- ((strncasecmp(host, LOCALHOST, sizeof(LOCALHOST)) == 0 ) ||
- (strncasecmp(host, LOCALHOSTDOMAIN, sizeof(LOCALHOSTDOMAIN)) == 0 ) ||
- (strncasecmp(host, address, sizeof(address)) == 0)))) hnm = NULL;
+ if ((gai_ret_host != EOK) ||
+ ((gai_ret_host == EOK) &&
+ ((strcasecmp(host, LOCALHOST) == 0 ) ||
+ (strcasecmp(host, LOCALHOSTDOMAIN) == 0 ) ||
+ (strcasecmp(host, address) == 0)))) hnm = NULL;
else hnm = host;
if (hnm) {
@@ -233,10 +234,10 @@ int add_host_identity(struct collection_item *tpl, unsigned base)
if ((set_ip) && (base & E_HAVE_HOSTIPS)) {
/* Do we have a host meaningful host name? */
- if ((gai_ret_addr != 0) ||
- ((gai_ret_addr == 0) &&
- ((strncasecmp(address, LOCALADDRESS, sizeof(LOCALADDRESS)) == 0 ) ||
- (strncasecmp(address, LOCALADDRESSV6, sizeof(LOCALADDRESSV6)) == 0 )))) haddr = address;
+ if ((gai_ret_addr != EOK) ||
+ ((gai_ret_addr == EOK) &&
+ ((strcasecmp(address, LOCALADDRESS) == 0 ) ||
+ (strcasecmp(address, LOCALADDRESSV6) == 0 )))) haddr = address;
else haddr = address;
if (haddr) {
@@ -286,7 +287,7 @@ int add_host_identity(struct collection_item *tpl, unsigned base)
static int add_base_elements(struct collection_item *tpl, unsigned base)
{
int error = EOK;
- int pass_base;
+ unsigned pass_base;
TRACE_FLOW_STRING("add_base_elements", "Entry");
@@ -309,6 +310,15 @@ static int add_base_elements(struct collection_item *tpl, unsigned base)
}
}
+ if (base & E_HAVE_OFFSET) {
+ /* Value does not matter */
+ error = col_add_int_property(tpl, NULL, E_OFFSET, 0);
+ if (error) {
+ TRACE_ERROR_NUMBER("Failed to add UTC time. Error", error);
+ return error;
+ }
+ }
+
if (base & E_HAVE_PID) {
/* Value is the current pid */
error = col_add_long_property(tpl, NULL, E_PID, (long)getpid());
@@ -361,12 +371,12 @@ static int add_base_elements(struct collection_item *tpl, unsigned base)
/* Internal untility function to tokenize a string */
-static int interprete_key(char *key,
- int *type,
- char **property,
- int *prop_len,
- int *has_len,
- int *bool_type)
+static int interpret_key(char *key,
+ int *type,
+ char **property,
+ int *prop_len,
+ int *has_len,
+ int *bool_type)
{
int adjust_by = 0;
char *start = NULL;
@@ -374,7 +384,7 @@ static int interprete_key(char *key,
char *end = NULL;
int ret = E_LIST_EMPTY;
- TRACE_FLOW_STRING("interprete_key", "Entry");
+ TRACE_FLOW_STRING("interpret_key", "Entry");
TRACE_INFO_STRING("Key", key);
@@ -533,7 +543,7 @@ static int interprete_key(char *key,
TRACE_INFO_NUMBER("Returning Has length:", *has_len);
- TRACE_FLOW_STRING("interprete_key", "Exit");
+ TRACE_FLOW_STRING("interpret_key", "Exit");
return ret;
}
@@ -544,14 +554,14 @@ static int convert_bool(char *data_str, unsigned char *data_bool)
TRACE_FLOW_STRING("convert_bool", "Called");
TRACE_INFO_STRING("Data", data_str);
- if ((strncasecmp(data_str, str_true, sizeof(str_true)) == 0) ||
- (strncasecmp(data_str, str_yes, sizeof(str_yes)) == 0)) {
+ if ((strcasecmp(data_str, str_true) == 0) ||
+ (strcasecmp(data_str, str_yes) == 0)) {
TRACE_INFO_STRING("Matched TRUE", "");
*data_bool = '\1';
return 1;
}
- if ((strncasecmp(data_str, str_false, sizeof(str_false)) == 0) ||
- (strncasecmp(data_str, str_no, sizeof(str_no)) == 0)) {
+ if ((strcasecmp(data_str, str_false) == 0) ||
+ (strcasecmp(data_str, str_no) == 0)) {
TRACE_INFO_STRING("Matched FALSE", "");
*data_bool = '\0';
return 1;
@@ -599,7 +609,7 @@ static int process_arg_list(struct collection_item *col,
return EINVAL;
}
- /* Interprete the key.
+ /* Interpret the key.
* It can be just " key ",
* it can be " - key ",
* or it can be a formatted string
@@ -607,12 +617,12 @@ static int process_arg_list(struct collection_item *col,
* Function will deal with all cases.
* Passed in variables initialized and updated inside
*/
- ret = interprete_key(arg,
- &type,
- &property,
- &prop_len,
- &has_len,
- &bool_type);
+ ret = interpret_key(arg,
+ &type,
+ &property,
+ &prop_len,
+ &has_len,
+ &bool_type);
if (ret == E_LIST_LAST) {
TRACE_INFO_STRING("Process found last key", arg);
@@ -621,12 +631,16 @@ static int process_arg_list(struct collection_item *col,
if ((ret == E_LIST_ADD) || (ret == E_LIST_REMOVE)) {
/* We need to create a dup of the string */
- propcopy = strndup(property, prop_len);
+ propcopy = malloc(prop_len + 1);
if (propcopy == NULL) {
TRACE_ERROR_STRING("Failed to allocate property", arg);
return ENOMEM;
}
+ /* Copy property */
+ memcpy(propcopy, property, prop_len);
+ propcopy[prop_len] = '\0';
+
TRACE_INFO_STRING("Processing property", propcopy);
/* Are we supposed to add? */
@@ -759,45 +773,18 @@ static int process_arg_list(struct collection_item *col,
return error;
}
-static int get_default_template(struct collection_item **template)
-{
- int error = EOK;
-
- TRACE_FLOW_STRING("get_default_template", "Entry");
-
- if (!default_template) {
- TRACE_INFO_STRING("Default template does not exit", "");
- error = elapi_set_default_template(E_BASE_DEFV1);
- if (error) {
- TRACE_ERROR_NUMBER("Set default template returned error", error);
- return error;
- }
- }
- *template = default_template;
- TRACE_FLOW_NUMBER("get_default_template. Exit returning", error);
- return error;
-}
-
-/* Cleanup callback installed when global template is used */
-void clean_template(void)
-{
- TRACE_FLOW_STRING("clean_template", "Entry");
- elapi_destroy_event_template(default_template);
- TRACE_FLOW_STRING("clean_template", "Exit");
-}
/*****************************************************************************/
-
/* Create event template */
-int elapi_create_event_template(struct collection_item **template,
- unsigned base, ...)
+int elapi_create_event_template_with_vargs(struct collection_item **template,
+ unsigned base,
+ va_list args)
{
int error = EOK;
struct collection_item *tpl = NULL;
- va_list args;
- TRACE_FLOW_STRING("elapi_create_event_template", "Entry");
+ TRACE_FLOW_STRING("elapi_create_event_template_with_vargs", "Entry");
if (template == NULL ) {
TRACE_ERROR_STRING("Template storage must be provided", "");
@@ -821,14 +808,9 @@ int elapi_create_event_template(struct collection_item **template,
return error;
}
- /* Process varible arguments */
- va_start(args, base);
-
/* Process variable argument list */
error = process_arg_list(tpl, args);
- va_end(args);
-
if (error) {
TRACE_ERROR_NUMBER("Failed to process argument list. Error", error);
col_destroy_collection(tpl);
@@ -837,6 +819,30 @@ int elapi_create_event_template(struct collection_item **template,
*template = tpl;
+ TRACE_FLOW_STRING("elapi_create_event_template_with_vargs", "Exit");
+ return error;
+}
+
+
+/* Create event template */
+int elapi_create_event_template(struct collection_item **template,
+ unsigned base, ...)
+{
+ int error = EOK;
+ va_list args;
+
+ TRACE_FLOW_STRING("elapi_create_event_template", "Entry");
+
+ /* Process varible arguments */
+ va_start(args, base);
+
+ /* Create template using arguments */
+ error = elapi_create_event_template_with_vargs(template,
+ base,
+ args);
+
+ va_end(args);
+
TRACE_FLOW_STRING("elapi_create_event_template", "Exit");
return error;
}
@@ -851,30 +857,24 @@ void elapi_destroy_event_template(struct collection_item *template)
TRACE_FLOW_STRING("elapi_destroy_event_template", "Exit");
}
-/* Create event */
-int elapi_create_event(struct collection_item **event,
- struct collection_item *template,
- struct collection_item *collection,
- int mode, ...)
+
+/* Create event from template, colection and arguments */
+int elapi_create_event_with_vargs(struct collection_item **event,
+ struct collection_item *template,
+ struct collection_item *collection,
+ int mode, va_list args)
{
int error = EOK;
struct collection_item *evt = NULL;
- va_list args;
- TRACE_FLOW_STRING("elapi_create_event", "Entry");
+ TRACE_FLOW_STRING("elapi_create_event_with_vargs", "Entry");
/* Check storage */
- if (event == NULL ) {
+ if (event == NULL) {
TRACE_ERROR_STRING("Event storage must be provided", "");
return EINVAL;
}
- /* Check for template */
- if (template == NULL ) {
- TRACE_ERROR_STRING("Template argument is missing", "");
- return EINVAL;
- }
-
*event = NULL;
/* Create collection */
@@ -885,13 +885,16 @@ int elapi_create_event(struct collection_item **event,
}
/* Add elements from the template */
- error = col_add_collection_to_collection(evt, NULL, NULL,
- (struct collection_item *)template,
- COL_ADD_MODE_FLAT);
- if (error) {
- TRACE_ERROR_NUMBER("Failed to add elements from the template. Error", error);
- col_destroy_collection(evt);
- return error;
+ /* Check for template */
+ if (template != NULL) {
+ error = col_add_collection_to_collection(evt, NULL, NULL,
+ (struct collection_item *)template,
+ COL_ADD_MODE_FLAT);
+ if (error) {
+ TRACE_ERROR_NUMBER("Failed to add elements from the template. Error", error);
+ col_destroy_collection(evt);
+ return error;
+ }
}
/* Add elements from the template */
@@ -904,14 +907,9 @@ int elapi_create_event(struct collection_item **event,
}
}
- /* Process varible arguments */
- va_start(args, mode);
-
/* Process variable argument list */
error = process_arg_list(evt, args);
- va_end(args);
-
if (error) {
TRACE_ERROR_NUMBER("Failed to process argument list. Error", error);
col_destroy_collection(evt);
@@ -920,6 +918,32 @@ int elapi_create_event(struct collection_item **event,
*event = evt;
+ TRACE_FLOW_STRING("elapi_create_event_with_vargs", "Exit");
+ return error;
+}
+
+
+/* Create event a wrapper around a function with arg list */
+int elapi_create_event(struct collection_item **event,
+ struct collection_item *template,
+ struct collection_item *collection,
+ int mode, ...)
+{
+ int error = EOK;
+ va_list args;
+
+ TRACE_FLOW_STRING("elapi_create_event", "Entry");
+
+ va_start(args, mode);
+
+ error = elapi_create_event_with_vargs(event,
+ template,
+ collection,
+ mode,
+ args);
+ va_end(args);
+
+
TRACE_FLOW_STRING("elapi_create_event", "Exit");
return error;
}
@@ -992,122 +1016,3 @@ void elapi_destroy_event(struct collection_item *event)
TRACE_FLOW_STRING("elapi_destroy_event", "Exit");
}
-
-/* Initializes default internal template */
-int elapi_set_default_template(unsigned base, ...)
-{
- int error = EOK;
- struct collection_item *tpl;
- va_list args;
-
- TRACE_FLOW_STRING("elapi_set_default_template", "Entry");
-
- /* Clean previous instance of the default template */
- elapi_destroy_event_template(default_template);
- default_template = NULL;
-
- /* Create collection */
- error = col_create_collection(&tpl, E_TEMPLATE_NAME, COL_CLASS_ELAPI_TEMPLATE);
- if (error) {
- TRACE_ERROR_NUMBER("Failed to create collection. Error", error);
- return error;
- }
-
- /* Add elements using base mask */
- error = add_base_elements(tpl, base);
- if (error) {
- TRACE_ERROR_NUMBER("Failed to add base elements. Error", error);
- col_destroy_collection(tpl);
- return error;
- }
-
- /* Process varible arguments */
- va_start(args, base);
-
- /* Process variable argument list */
- error = process_arg_list(tpl, args);
-
- va_end(args);
-
- if (error) {
- TRACE_ERROR_NUMBER("Failed to process argument list. Error", error);
- col_destroy_collection(tpl);
- return error;
- }
-
- /* Install a cleanup callback */
- if (atexit(clean_template)) {
- TRACE_ERROR_NUMBER("Failed to install cleanup callback. Error", ENOSYS);
- col_destroy_collection(tpl);
- /* NOTE: Could not find a better error for this case */
- return ENOSYS;
- }
-
- default_template = tpl;
-
- TRACE_FLOW_STRING("elapi_set_default_template", "Exit");
- return error;
-}
-
-
-/* This function will use internal default template */
-int elapi_create_simple_event(struct collection_item **event, ...)
-{
- int error = EOK;
- struct collection_item *evt = NULL;
- va_list args;
- struct collection_item *template;
-
- TRACE_FLOW_STRING("elapi_create_simple_event", "Entry");
-
- /* Check storage */
- if (event == NULL ) {
- TRACE_ERROR_STRING("Event storage must be provided", "");
- return EINVAL;
- }
-
- *event = NULL;
-
- error = get_default_template(&template);
- if (error) {
- TRACE_ERROR_NUMBER("Failed to get default template. Error", error);
- return error;
- }
-
- /* Create collection */
- error = col_create_collection(&evt, E_EVENT_NAME, COL_CLASS_ELAPI_EVENT);
- if (error) {
- TRACE_ERROR_NUMBER("Failed to create collection. Error", error);
- return error;
- }
-
- /* Add elements from the template */
- error = col_add_collection_to_collection(evt, NULL, NULL,
- template,
- COL_ADD_MODE_FLAT);
-
- if (error) {
- TRACE_ERROR_NUMBER("Failed to add elements from the template. Error", error);
- col_destroy_collection(evt);
- return error;
- }
-
- /* Process varible arguments */
- va_start(args, event);
-
- /* Process variable argument list */
- error = process_arg_list(evt, args);
-
- va_end(args);
-
- if (error) {
- TRACE_ERROR_NUMBER("Failed to process argument list. Error", error);
- col_destroy_collection(evt);
- return error;
- }
-
- *event = evt;
-
- TRACE_FLOW_STRING("elapi_create_simple_event", "Exit");
- return error;
-}