Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3276)

Unified Diff: dbus-dict.c

Issue 2428004: Overhaul dhcpcd for chrome os use (Closed) Base URL: ssh://git@chromiumos-git//dhcpcd.git
Patch Set: purge hooks from configure to silence complaint Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « dbus-dict.h ('k') | dhcpcd.c » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dbus-dict.c
diff --git a/dbus-dict.c b/dbus-dict.c
new file mode 100644
index 0000000000000000000000000000000000000000..67bbdc361897848fc27d1b43660bf01de2a39100
--- /dev/null
+++ b/dbus-dict.c
@@ -0,0 +1,208 @@
+/*
+ * dhcpcd-dbus
+ * Copyright 2009 Roy Marples <roy@marples.name>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <arpa/inet.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <dbus/dbus.h>
+
+#include "config.h"
+#include "dbus-dict.h"
+
+#define S_EINVAL DHCPCD_SERVICE ".InvalidArgument"
+
+static int
+append_config_value(DBusMessageIter *entry, int type,
+ const char *data)
+{
+ int retval;
+ DBusMessageIter var;
+ unsigned char byte;
+ dbus_uint16_t u16;
+ dbus_uint32_t u32;
+ dbus_int16_t i16;
+ dbus_int32_t i32;
+ struct in_addr in;
+
+ retval = -1;
+ switch (type) {
+ case DBUS_TYPE_BOOLEAN:
+ if (*data == '0' || *data == '\0')
+ u32 = 0;
+ else
+ u32 = 1;
+ dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_BOOLEAN_AS_STRING, &var);
+ if (dbus_message_iter_append_basic(&var,
+ DBUS_TYPE_BOOLEAN, &u32))
+ retval = 0;
+ break;
+ case DBUS_TYPE_BYTE:
+ byte = strtoul(data, NULL, 0);
+ dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_BYTE_AS_STRING, &var);
+ if (dbus_message_iter_append_basic(&var, DBUS_TYPE_BYTE,
+ &byte))
+ retval = 0;
+ break;
+ case DBUS_TYPE_STRING:
+ dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_STRING_AS_STRING, &var);
+ if (dbus_message_iter_append_basic(&var,
+ DBUS_TYPE_STRING, &data))
+ retval = 0;
+ break;
+ case DBUS_TYPE_INT16:
+ i16 = strtol(data, NULL, 0);
+ dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_INT16_AS_STRING, &var);
+ if (dbus_message_iter_append_basic(&var,
+ DBUS_TYPE_INT16, &i16))
+ retval = 0;
+ break;
+ case DBUS_TYPE_UINT16:
+ u16 = strtoul(data, NULL, 0);
+ dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_UINT16_AS_STRING, &var);
+ if (dbus_message_iter_append_basic(&var,
+ DBUS_TYPE_UINT16, &u16))
+ retval = 0;
+ break;
+ case DBUS_TYPE_INT32:
+ i32 = strtol(data, NULL, 0);
+ dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_INT32_AS_STRING, &var);
+ if (dbus_message_iter_append_basic(&var,
+ DBUS_TYPE_INT32, &i32))
+ retval = 0;
+ break;
+ case DBUS_TYPE_UINT32:
+ if (strchr(data, '.') != NULL && inet_aton(data, &in) == 1)
+ u32 = in.s_addr;
+ else
+ u32 = strtoul(data, NULL, 0);
+ dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_UINT32_AS_STRING, &var);
+ if (dbus_message_iter_append_basic(&var,
+ DBUS_TYPE_UINT32, &u32))
+ retval = 0;
+ break;
+ default:
+ retval = 1;
+ break;
+ }
+ if (retval == 0)
+ dbus_message_iter_close_container(entry, &var);
+ else if (retval == 1)
+ retval = 0;
+
+ return retval;
+}
+
+static int
+append_config_array(DBusMessageIter *entry, int type, const char *data)
+{
+ int retval;
+ char *ns, *p, *tok;
+ const char *tsa, *ts;
+ DBusMessageIter var, array;
+ dbus_bool_t ok;
+ dbus_uint32_t u32;
+ struct in_addr in;
+
+ switch (type) {
+ case DBUS_TYPE_STRING:
+ tsa = DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING;
+ ts = DBUS_TYPE_STRING_AS_STRING;
+ break;
+ case DBUS_TYPE_UINT32:
+ tsa = DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_UINT32_AS_STRING;
+ ts = DBUS_TYPE_UINT32_AS_STRING;
+ break;
+ default:
+ return -1;
+ }
+
+ ns = p = strdup(data);
+ if (ns == NULL)
+ return -1;
+ retval = 0;
+
+ dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT, tsa, &var);
+ dbus_message_iter_open_container(&var, DBUS_TYPE_ARRAY, ts, &array);
+ while ((tok = strsep(&p, " ")) != NULL) {
+ if (*tok == '\0')
+ continue;
+ switch(type) {
+ case DBUS_TYPE_STRING:
+ ok = dbus_message_iter_append_basic(&array,
+ DBUS_TYPE_STRING, &tok);
+ break;
+ case DBUS_TYPE_UINT32:
+ if (strchr(data, '.') != NULL &&
+ inet_aton(data, &in) == 1)
+ u32 = in.s_addr;
+ else
+ u32 = strtoul(tok, NULL, 0);
+ ok = dbus_message_iter_append_basic(&array,
+ DBUS_TYPE_UINT32, &u32);
+ default:
+ ok = FALSE;
+ break;
+ }
+ if (!ok)
+ break;
+ }
+ dbus_message_iter_close_container(&var, &array);
+ dbus_message_iter_close_container(entry, &var);
+ free(ns);
+ return retval;
+}
+
+int
+dict_append_config_item(DBusMessageIter *iter, const struct o_dbus *op,
+ const char *data)
+{
+ int retval;
+ DBusMessageIter entry;
+
+ retval = 0;
+ if (*data == '\0')
+ return retval;
+ dbus_message_iter_open_container(iter,
+ DBUS_TYPE_DICT_ENTRY,
+ NULL,
+ &entry);
+ dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &op->name);
+ if (op->type == DBUS_TYPE_ARRAY)
+ retval = append_config_array(&entry, op->sub_type, data);
+ else
+ retval = append_config_value(&entry, op->type, data);
+ dbus_message_iter_close_container(iter, &entry);
+ return retval;
+}
« no previous file with comments | « dbus-dict.h ('k') | dhcpcd.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698