#include "config.h"
#endif
-#define _GNU_SOURCE
#include <string.h>
#include <log/log.h>
static int event_parse_ad_header(char *buf, int len, enum event_action *action,
char **device)
{
+ int headerlen;
char *sep;
*action = 0;
*device = NULL;
+ headerlen = strnlen(buf, len);
+
+ if (!headerlen) {
+ pb_log_fn("bad header, no data\n");
+ return -1;
+ }
/* we should see an <action>@<device>\0 at the head of the buffer */
sep = strchr(buf, '@');
if (!sep) {
- pb_log("%s: bad header: %s\n", __func__, buf);
+ pb_log_fn("bad header: %s\n", buf);
return -1;
}
/* terminate the action string */
*sep = '\0';
- len -= sep - buf + 1;
if (streq(buf, "add"))
*action = EVENT_ACTION_ADD;
else if (streq(buf, "remove"))
*action = EVENT_ACTION_REMOVE;
- else if (streq(buf, "conf"))
- *action = EVENT_ACTION_CONF;
+ else if (streq(buf, "url"))
+ *action = EVENT_ACTION_URL;
+ else if (streq(buf, "dhcp"))
+ *action = EVENT_ACTION_DHCP;
+ else if (streq(buf, "boot"))
+ *action = EVENT_ACTION_BOOT;
+ else if (streq(buf, "sync"))
+ *action = EVENT_ACTION_SYNC;
+ else if (streq(buf, "plugin"))
+ *action = EVENT_ACTION_PLUGIN;
else {
- pb_log("%s: unknown action: %s\n", __func__, buf);
+ pb_log_fn("unknown action: %s\n", buf);
return -1;
}
if (!*(sep + 1)) {
- pb_log("%s: bad device: %s\n", __func__, buf);
+ pb_log_fn("bad device: %s\n", buf);
return -1;
}
*device = sep + 1;
- return 0;
+ return headerlen;
}
/**
static void event_parse_params(struct event *event, const char *buf, int len)
{
int param_len, name_len, value_len;
- struct param *param;
+ struct event_param *param;
char *sep;
for (; len > 0; len -= param_len + 1, buf += param_len + 1) {
continue;
}
- /* find the separator */
- sep = memchr(buf, '=', param_len);
- if (!sep)
- continue;
-
- name_len = sep - buf;
- value_len = param_len - name_len - 1;
-
/* update the params array */
event->params = talloc_realloc(event, event->params,
- struct param, ++event->n_params);
+ struct event_param, ++event->n_params);
param = &event->params[event->n_params - 1];
+ sep = memchr(buf, '=', param_len);
+ if (!sep) {
+ name_len = param_len;
+ value_len = 0;
+ param->value = "";
+ } else {
+ name_len = sep - buf;
+ value_len = param_len - name_len - 1;
+ param->value = talloc_strndup(event, sep + 1,
+ value_len);
+ }
param->name = talloc_strndup(event, buf, name_len);
- param->value = talloc_strndup(event, sep + 1, value_len);
}
}
int event_parse_ad_message(struct event *event, char *buf, int len)
{
- int result;
- char *device;
enum event_action action;
- int device_len;
+ int headerlen;
+ char *device;
- result = event_parse_ad_header(buf, len, &action, &device);
+ headerlen = event_parse_ad_header(buf, len, &action, &device);
- if (result)
+ if (headerlen <= 0)
return -1;
- device_len = strlen(device);
-
/* now we have an action and a device, we can construct the event */
event->action = action;
- event->device = talloc_strndup(event, device, device_len);
+ event->device = talloc_strdup(event, device);
event->n_params = 0;
event->params = NULL;
- len -= device_len + 1;
- event_parse_params(event, device + device_len + 1, len);
+ len -= headerlen + 1;
+ buf += headerlen + 1;
+ event_parse_params(event, buf, len);
return 0;
}
return NULL;
}
+
+void event_set_param(struct event *event, const char *name, const char *value)
+{
+ struct event_param *param;
+ int i;
+
+ /* if it's already present, replace the value of the old param */
+ for (i = 0; i < event->n_params; i++) {
+ param = &event->params[i];
+ if (!strcasecmp(param->name, name)) {
+ talloc_free(param->value);
+ param->value = talloc_strdup(event, value);
+ return;
+ }
+ }
+
+ /* not found - create a new param */
+ event->params = talloc_realloc(event, event->params,
+ struct event_param, ++event->n_params);
+ param = &event->params[event->n_params - 1];
+
+ param->name = talloc_strdup(event, name);
+ param->value = talloc_strdup(event, value);
+}