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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « dbus-dict.h ('k') | dhcpcd.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * dhcpcd-dbus
3 * Copyright 2009 Roy Marples <roy@marples.name>
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27 #include <arpa/inet.h>
28
29 #include <stdlib.h>
30 #include <string.h>
31
32 #include <dbus/dbus.h>
33
34 #include "config.h"
35 #include "dbus-dict.h"
36
37 #define S_EINVAL DHCPCD_SERVICE ".InvalidArgument"
38
39 static int
40 append_config_value(DBusMessageIter *entry, int type,
41 const char *data)
42 {
43 int retval;
44 DBusMessageIter var;
45 unsigned char byte;
46 dbus_uint16_t u16;
47 dbus_uint32_t u32;
48 dbus_int16_t i16;
49 dbus_int32_t i32;
50 struct in_addr in;
51
52 retval = -1;
53 switch (type) {
54 case DBUS_TYPE_BOOLEAN:
55 if (*data == '0' || *data == '\0')
56 u32 = 0;
57 else
58 u32 = 1;
59 dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
60 DBUS_TYPE_BOOLEAN_AS_STRING, &var);
61 if (dbus_message_iter_append_basic(&var,
62 DBUS_TYPE_BOOLEAN, &u32))
63 retval = 0;
64 break;
65 case DBUS_TYPE_BYTE:
66 byte = strtoul(data, NULL, 0);
67 dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
68 DBUS_TYPE_BYTE_AS_STRING, &var);
69 if (dbus_message_iter_append_basic(&var, DBUS_TYPE_BYTE,
70 &byte))
71 retval = 0;
72 break;
73 case DBUS_TYPE_STRING:
74 dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
75 DBUS_TYPE_STRING_AS_STRING, &var);
76 if (dbus_message_iter_append_basic(&var,
77 DBUS_TYPE_STRING, &data))
78 retval = 0;
79 break;
80 case DBUS_TYPE_INT16:
81 i16 = strtol(data, NULL, 0);
82 dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
83 DBUS_TYPE_INT16_AS_STRING, &var);
84 if (dbus_message_iter_append_basic(&var,
85 DBUS_TYPE_INT16, &i16))
86 retval = 0;
87 break;
88 case DBUS_TYPE_UINT16:
89 u16 = strtoul(data, NULL, 0);
90 dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
91 DBUS_TYPE_UINT16_AS_STRING, &var);
92 if (dbus_message_iter_append_basic(&var,
93 DBUS_TYPE_UINT16, &u16))
94 retval = 0;
95 break;
96 case DBUS_TYPE_INT32:
97 i32 = strtol(data, NULL, 0);
98 dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
99 DBUS_TYPE_INT32_AS_STRING, &var);
100 if (dbus_message_iter_append_basic(&var,
101 DBUS_TYPE_INT32, &i32))
102 retval = 0;
103 break;
104 case DBUS_TYPE_UINT32:
105 if (strchr(data, '.') != NULL && inet_aton(data, &in) == 1)
106 u32 = in.s_addr;
107 else
108 u32 = strtoul(data, NULL, 0);
109 dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
110 DBUS_TYPE_UINT32_AS_STRING, &var);
111 if (dbus_message_iter_append_basic(&var,
112 DBUS_TYPE_UINT32, &u32))
113 retval = 0;
114 break;
115 default:
116 retval = 1;
117 break;
118 }
119 if (retval == 0)
120 dbus_message_iter_close_container(entry, &var);
121 else if (retval == 1)
122 retval = 0;
123
124 return retval;
125 }
126
127 static int
128 append_config_array(DBusMessageIter *entry, int type, const char *data)
129 {
130 int retval;
131 char *ns, *p, *tok;
132 const char *tsa, *ts;
133 DBusMessageIter var, array;
134 dbus_bool_t ok;
135 dbus_uint32_t u32;
136 struct in_addr in;
137
138 switch (type) {
139 case DBUS_TYPE_STRING:
140 tsa = DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING;
141 ts = DBUS_TYPE_STRING_AS_STRING;
142 break;
143 case DBUS_TYPE_UINT32:
144 tsa = DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_UINT32_AS_STRING;
145 ts = DBUS_TYPE_UINT32_AS_STRING;
146 break;
147 default:
148 return -1;
149 }
150
151 ns = p = strdup(data);
152 if (ns == NULL)
153 return -1;
154 retval = 0;
155
156 dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT, tsa, &var);
157 dbus_message_iter_open_container(&var, DBUS_TYPE_ARRAY, ts, &array);
158 while ((tok = strsep(&p, " ")) != NULL) {
159 if (*tok == '\0')
160 continue;
161 switch(type) {
162 case DBUS_TYPE_STRING:
163 ok = dbus_message_iter_append_basic(&array,
164 DBUS_TYPE_STRING, &tok);
165 break;
166 case DBUS_TYPE_UINT32:
167 if (strchr(data, '.') != NULL &&
168 inet_aton(data, &in) == 1)
169 u32 = in.s_addr;
170 else
171 u32 = strtoul(tok, NULL, 0);
172 ok = dbus_message_iter_append_basic(&array,
173 DBUS_TYPE_UINT32, &u32);
174 default:
175 ok = FALSE;
176 break;
177 }
178 if (!ok)
179 break;
180 }
181 dbus_message_iter_close_container(&var, &array);
182 dbus_message_iter_close_container(entry, &var);
183 free(ns);
184 return retval;
185 }
186
187 int
188 dict_append_config_item(DBusMessageIter *iter, const struct o_dbus *op,
189 const char *data)
190 {
191 int retval;
192 DBusMessageIter entry;
193
194 retval = 0;
195 if (*data == '\0')
196 return retval;
197 dbus_message_iter_open_container(iter,
198 DBUS_TYPE_DICT_ENTRY,
199 NULL,
200 &entry);
201 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &op->name);
202 if (op->type == DBUS_TYPE_ARRAY)
203 retval = append_config_array(&entry, op->sub_type, data);
204 else
205 retval = append_config_value(&entry, op->type, data);
206 dbus_message_iter_close_container(iter, &entry);
207 return retval;
208 }
OLDNEW
« 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