49 #define ZONEINFO_DIR "/usr/share/lib/zoneinfo/" /* trailing / essential */ |
49 #define ZONEINFO_DIR "/usr/share/lib/zoneinfo/" /* trailing / essential */ |
50 |
50 |
51 /*ARGSUSED*/ |
51 /*ARGSUSED*/ |
52 conerr_t |
52 conerr_t |
53 interface_Time_read_time(rad_instance_t *inst, adr_attribute_t *attr, |
53 interface_Time_read_time(rad_instance_t *inst, adr_attribute_t *attr, |
54 data_t **data, data_t **error) |
54 adr_data_t **data, adr_data_t **error) |
55 { |
55 { |
56 *data = data_new_time_now(); |
56 *data = adr_data_new_time_now(); |
57 return (ce_ok); |
57 return (ce_ok); |
58 } |
58 } |
59 |
59 |
60 #define NSPERUS (NANOSEC / MICROSEC) |
60 #define NSPERUS (NANOSEC / MICROSEC) |
61 |
61 |
62 /*ARGSUSED*/ |
62 /*ARGSUSED*/ |
63 conerr_t |
63 conerr_t |
64 interface_Time_write_time(rad_instance_t *inst, adr_attribute_t *attr, |
64 interface_Time_write_time(rad_instance_t *inst, adr_attribute_t *attr, |
65 data_t *data, data_t **error) |
65 adr_data_t *data, adr_data_t **error) |
66 { |
66 { |
67 long long seconds = data_to_time_secs(data); |
67 long long seconds = adr_data_to_time_secs(data); |
68 int nanos = data_to_time_nsecs(data); |
68 int nanos = adr_data_to_time_nsecs(data); |
69 int micros = nanos / NSPERUS; |
69 int micros = nanos / NSPERUS; |
70 time_t newtime; |
70 time_t newtime; |
71 struct timeval adj; |
71 struct timeval adj; |
72 |
72 |
73 if (nanos - (micros * NSPERUS) >= NSPERUS / 2) { |
73 if (nanos - (micros * NSPERUS) >= NSPERUS / 2) { |
114 char resolved[PATH_MAX]; |
114 char resolved[PATH_MAX]; |
115 if (realpath(zonefile, resolved) != NULL && |
115 if (realpath(zonefile, resolved) != NULL && |
116 strncmp(resolved, ZONEINFO_DIR, n) == 0) { |
116 strncmp(resolved, ZONEINFO_DIR, n) == 0) { |
117 tz = resolved + n; |
117 tz = resolved + n; |
118 } |
118 } |
119 *data = data_new_string(tz, lt_copy); |
119 *data = adr_data_new_string(tz, LT_COPY); |
120 } |
120 } |
121 |
121 |
122 return (err); |
122 return (err); |
123 } |
123 } |
124 |
124 |
125 /*ARGSUSED*/ |
125 /*ARGSUSED*/ |
126 conerr_t |
126 conerr_t |
127 interface_Time_write_defaultTimeZone(rad_instance_t *inst, |
127 interface_Time_write_defaultTimeZone(rad_instance_t *inst, |
128 adr_attribute_t *attr, data_t *data, data_t **error) |
128 adr_attribute_t *attr, adr_data_t *data, adr_data_t **error) |
129 { |
129 { |
130 conerr_t err = smfu_set_property((char *)SCF_INSTANCE_ENV, |
130 conerr_t err = smfu_set_property((char *)SCF_INSTANCE_ENV, |
131 SMF_TZ_PGNAME, SMF_TZ_PROPNAME, (char *)data_to_string(data)); |
131 SMF_TZ_PGNAME, SMF_TZ_PROPNAME, (char *)adr_data_to_string(data)); |
132 return (err); |
132 return (err); |
133 } |
133 } |
134 |
134 |
135 static void |
135 static void |
136 removenl(char *str) |
136 removenl(char *str) |
151 }; |
151 }; |
152 |
152 |
153 static const char * const si_server_path[] = { "server", NULL }; |
153 static const char * const si_server_path[] = { "server", NULL }; |
154 |
154 |
155 static void |
155 static void |
156 disable(data_t *array, const char *srv, int len) |
156 disable(adr_data_t *array, const char *srv, int len) |
157 { |
157 { |
158 if (array_nsearch(array, srv, len, si_server_path) >= 0) |
158 if (adr_array_nsearch(array, srv, len, si_server_path) >= 0) |
159 return; |
159 return; |
160 data_t *entry = data_new_struct(&t__ServerInfo); |
160 adr_data_t *entry = adr_data_new_struct(&t__ServerInfo); |
161 struct_set(entry, "server", data_new_nstring(srv, len)); |
161 adr_struct_set(entry, "server", adr_data_new_nstring(srv, len)); |
162 struct_set(entry, "enabled", data_new_boolean(B_FALSE)); |
162 adr_struct_set(entry, "enabled", adr_data_new_boolean(B_FALSE)); |
163 (void) array_add(array, entry); |
163 (void) adr_array_add(array, entry); |
164 } |
164 } |
165 |
165 |
166 static void |
166 static void |
167 enable(data_t *array, const char *srv, int len) |
167 enable(adr_data_t *array, const char *srv, int len) |
168 { |
168 { |
169 int index = array_nsearch(array, srv, len, si_server_path); |
169 int index = adr_array_nsearch(array, srv, len, si_server_path); |
170 if (index >= 0) { |
170 if (index >= 0) { |
171 struct_set(array_get(array, index), "enabled", |
171 adr_struct_set(adr_array_get(array, index), "enabled", |
172 data_new_boolean(B_TRUE)); |
172 adr_data_new_boolean(B_TRUE)); |
173 return; |
173 return; |
174 } |
174 } |
175 data_t *entry = data_new_struct(&t__ServerInfo); |
175 adr_data_t *entry = adr_data_new_struct(&t__ServerInfo); |
176 struct_set(entry, "server", data_new_nstring(srv, len)); |
176 adr_struct_set(entry, "server", adr_data_new_nstring(srv, len)); |
177 struct_set(entry, "enabled", data_new_boolean(B_TRUE)); |
177 adr_struct_set(entry, "enabled", adr_data_new_boolean(B_TRUE)); |
178 (void) array_add(array, entry); |
178 (void) adr_array_add(array, entry); |
179 } |
179 } |
180 |
180 |
181 /*ARGSUSED*/ |
181 /*ARGSUSED*/ |
182 conerr_t |
182 conerr_t |
183 interface_Time_read_ntpServers(rad_instance_t *inst, adr_attribute_t *attr, |
183 interface_Time_read_ntpServers(rad_instance_t *inst, adr_attribute_t *attr, |
184 data_t **data, data_t **error) |
184 adr_data_t **data, adr_data_t **error) |
185 { |
185 { |
186 data_t *result = data_new_array(&t_array__ServerInfo, 4); |
186 adr_data_t *result = adr_data_new_array(&t_array__ServerInfo, 4); |
187 for (int i = 0; i < RAD_COUNT(ntpservers); i++) { |
187 for (int i = 0; i < RAD_COUNT(ntpservers); i++) { |
188 data_t *si = data_new_struct(&t__ServerInfo); |
188 adr_data_t *si = adr_data_new_struct(&t__ServerInfo); |
189 struct_set(si, "server", |
189 adr_struct_set(si, "server", |
190 data_new_string(ntpservers[i], lt_copy)); |
190 adr_data_new_string(ntpservers[i], LT_COPY)); |
191 struct_set(si, "enabled", data_new_boolean(B_FALSE)); |
191 adr_struct_set(si, "enabled", adr_data_new_boolean(B_FALSE)); |
192 (void) array_add(result, si); |
192 (void) adr_array_add(result, si); |
193 } |
193 } |
194 |
194 |
195 FILE *file = fopen(NTP_CONF, "r"); |
195 FILE *file = fopen(NTP_CONF, "r"); |
196 if (file != NULL) { |
196 if (file != NULL) { |
197 char buf[1024]; |
197 char buf[1024]; |
227 } |
227 } |
228 |
228 |
229 /*ARGSUSED*/ |
229 /*ARGSUSED*/ |
230 conerr_t |
230 conerr_t |
231 interface_Time_read_sufficientlyPrivileged(rad_instance_t *inst, |
231 interface_Time_read_sufficientlyPrivileged(rad_instance_t *inst, |
232 adr_attribute_t *attr, data_t **data, data_t **error) |
232 adr_attribute_t *attr, adr_data_t **data, adr_data_t **error) |
233 { |
233 { |
234 /* XXX: Crude */ |
234 /* XXX: Crude */ |
235 *data = data_new_boolean(getuid() == 0); |
235 *data = adr_data_new_boolean(getuid() == 0); |
236 return (ce_ok); |
236 return (ce_ok); |
237 } |
237 } |
238 |
238 |
239 /*ARGSUSED*/ |
239 /*ARGSUSED*/ |
240 conerr_t |
240 conerr_t |
241 interface_Time_read_continents(rad_instance_t *inst, adr_attribute_t *attr, |
241 interface_Time_read_continents(rad_instance_t *inst, adr_attribute_t *attr, |
242 data_t **data, data_t **error) |
242 adr_data_t **data, adr_data_t **error) |
243 { |
243 { |
244 FILE *file = fopen("/usr/share/lib/zoneinfo/tab/continent.tab", "r"); |
244 FILE *file = fopen("/usr/share/lib/zoneinfo/tab/continent.tab", "r"); |
245 char str[1024]; |
245 char str[1024]; |
246 data_t *result = data_new_array(&t_array__Continent, 5); |
246 adr_data_t *result = adr_data_new_array(&t_array__Continent, 5); |
247 while (fgets(str, sizeof (str), file) != NULL) { |
247 while (fgets(str, sizeof (str), file) != NULL) { |
248 if (str[0] == '#') |
248 if (str[0] == '#') |
249 continue; |
249 continue; |
250 removenl(str); |
250 removenl(str); |
251 |
251 |
252 char *eq = strchr(str, '\t'); |
252 char *eq = strchr(str, '\t'); |
253 if (eq == NULL) |
253 if (eq == NULL) |
254 continue; |
254 continue; |
255 data_t *name = data_new_nstring(str, eq - str); |
255 adr_data_t *name = adr_data_new_nstring(str, eq - str); |
256 data_t *desc = data_new_string(eq + 1, lt_copy); |
256 adr_data_t *desc = adr_data_new_string(eq + 1, LT_COPY); |
257 data_t *cont = data_new_struct(&t__Continent); |
257 adr_data_t *cont = adr_data_new_struct(&t__Continent); |
258 struct_set(cont, "name", name); |
258 adr_struct_set(cont, "name", name); |
259 struct_set(cont, "description", desc); |
259 adr_struct_set(cont, "description", desc); |
260 (void) array_add(result, cont); |
260 (void) adr_array_add(result, cont); |
261 } |
261 } |
262 (void) fclose(file); |
262 (void) fclose(file); |
263 *data = result; |
263 *data = result; |
264 |
264 |
265 return (ce_ok); |
265 return (ce_ok); |
266 } |
266 } |
267 |
267 |
268 /*ARGSUSED*/ |
268 /*ARGSUSED*/ |
269 conerr_t |
269 conerr_t |
270 interface_Time_read_countries(rad_instance_t *inst, adr_attribute_t *attr, |
270 interface_Time_read_countries(rad_instance_t *inst, adr_attribute_t *attr, |
271 data_t **data, data_t **error) |
271 adr_data_t **data, adr_data_t **error) |
272 { |
272 { |
273 FILE *file = fopen("/usr/share/lib/zoneinfo/tab/country.tab", "r"); |
273 FILE *file = fopen("/usr/share/lib/zoneinfo/tab/country.tab", "r"); |
274 char str[1024]; |
274 char str[1024]; |
275 data_t *result = data_new_array(&t_array__Country, 5); |
275 adr_data_t *result = adr_data_new_array(&t_array__Country, 5); |
276 while (fgets(str, sizeof (str), file) != NULL) { |
276 while (fgets(str, sizeof (str), file) != NULL) { |
277 if (str[0] == '#') |
277 if (str[0] == '#') |
278 continue; |
278 continue; |
279 removenl(str); |
279 removenl(str); |
280 |
280 |
283 continue; |
283 continue; |
284 if (rad_strccmp("ee", str, eq - str) == 0 || |
284 if (rad_strccmp("ee", str, eq - str) == 0 || |
285 rad_strccmp("we", str, eq - str) == 0 || |
285 rad_strccmp("we", str, eq - str) == 0 || |
286 rad_strccmp("me", str, eq - str) == 0) |
286 rad_strccmp("me", str, eq - str) == 0) |
287 continue; |
287 continue; |
288 data_t *code = data_new_nstring(str, eq - str); |
288 adr_data_t *code = adr_data_new_nstring(str, eq - str); |
289 data_t *desc = data_new_string(eq + 1, lt_copy); |
289 adr_data_t *desc = adr_data_new_string(eq + 1, LT_COPY); |
290 data_t *country = data_new_struct(&t__Country); |
290 adr_data_t *country = adr_data_new_struct(&t__Country); |
291 struct_set(country, "code", code); |
291 adr_struct_set(country, "code", code); |
292 struct_set(country, "description", desc); |
292 adr_struct_set(country, "description", desc); |
293 (void) array_add(result, country); |
293 (void) adr_array_add(result, country); |
294 } |
294 } |
295 (void) fclose(file); |
295 (void) fclose(file); |
296 *data = result; |
296 *data = result; |
297 |
297 |
298 return (ce_ok); |
298 return (ce_ok); |
352 |
352 |
353 if (!parse_coord(str, eq - str, &north) || |
353 if (!parse_coord(str, eq - str, &north) || |
354 !parse_coord(eq + 1, len - (eq - str + 1), &east)) |
354 !parse_coord(eq + 1, len - (eq - str + 1), &east)) |
355 return (NULL); |
355 return (NULL); |
356 |
356 |
357 data_t *result = data_new_struct(&t__Coordinates); |
357 adr_data_t *result = adr_data_new_struct(&t__Coordinates); |
358 struct_set(result, "degreesE", data_new_integer(east.deg * iseast)); |
358 adr_struct_set(result, "degreesE", |
359 struct_set(result, "minutesE", data_new_integer(east.min)); |
359 adr_data_new_integer(east.deg * iseast)); |
360 struct_set(result, "secondsE", data_new_integer(east.sec)); |
360 adr_struct_set(result, "minutesE", adr_data_new_integer(east.min)); |
361 struct_set(result, "degreesN", data_new_integer(north.deg * isnorth)); |
361 adr_struct_set(result, "secondsE", adr_data_new_integer(east.sec)); |
362 struct_set(result, "minutesN", data_new_integer(north.min)); |
362 adr_struct_set(result, "degreesN", |
363 struct_set(result, "secondsN", data_new_integer(north.sec)); |
363 adr_data_new_integer(north.deg * isnorth)); |
|
364 adr_struct_set(result, "minutesN", adr_data_new_integer(north.min)); |
|
365 adr_struct_set(result, "secondsN", adr_data_new_integer(north.sec)); |
364 return (result); |
366 return (result); |
365 } |
367 } |
366 |
368 |
367 /*ARGSUSED*/ |
369 /*ARGSUSED*/ |
368 conerr_t |
370 conerr_t |
369 interface_Time_read_timeZones(rad_instance_t *inst, adr_attribute_t *attr, |
371 interface_Time_read_timeZones(rad_instance_t *inst, adr_attribute_t *attr, |
370 data_t **data, data_t **error) |
372 adr_data_t **data, adr_data_t **error) |
371 { |
373 { |
372 FILE *file = fopen("/usr/share/lib/zoneinfo/tab/zone_sun.tab", "r"); |
374 FILE *file = fopen("/usr/share/lib/zoneinfo/tab/zone_sun.tab", "r"); |
373 char buf[1024]; |
375 char buf[1024]; |
374 data_t *result = data_new_array(&t_array__TimeZoneInfo, 5); |
376 adr_data_t *result = adr_data_new_array(&t_array__TimeZoneInfo, 5); |
375 while (fgets(buf, sizeof (buf), file) != NULL) { |
377 while (fgets(buf, sizeof (buf), file) != NULL) { |
376 char *str = buf; |
378 char *str = buf; |
377 if (str[0] == '#') |
379 if (str[0] == '#') |
378 continue; |
380 continue; |
379 removenl(str); |
381 removenl(str); |
383 continue; |
385 continue; |
384 if (rad_strccmp("ee", str, eq - str) == 0 || |
386 if (rad_strccmp("ee", str, eq - str) == 0 || |
385 rad_strccmp("we", str, eq - str) == 0 || |
387 rad_strccmp("we", str, eq - str) == 0 || |
386 rad_strccmp("me", str, eq - str) == 0) |
388 rad_strccmp("me", str, eq - str) == 0) |
387 continue; |
389 continue; |
388 data_t *timezone = data_new_struct(&t__TimeZoneInfo); |
390 adr_data_t *timezone = adr_data_new_struct(&t__TimeZoneInfo); |
389 struct_set(timezone, "countryCode", |
391 adr_struct_set(timezone, "countryCode", |
390 data_new_nstring(str, eq - str)); |
392 adr_data_new_nstring(str, eq - str)); |
391 |
393 |
392 str = eq + 1; |
394 str = eq + 1; |
393 eq = strchr(str, '\t'); |
395 eq = strchr(str, '\t'); |
394 data_t *coords; |
396 adr_data_t *coords; |
395 if (eq == NULL || |
397 if (eq == NULL || |
396 (coords = parse_coords(str, eq - str)) == NULL) { |
398 (coords = parse_coords(str, eq - str)) == NULL) { |
397 data_free(timezone); |
399 adr_data_free(timezone); |
398 continue; |
400 continue; |
399 } |
401 } |
400 struct_set(timezone, "coordinates", coords); |
402 adr_struct_set(timezone, "coordinates", coords); |
401 |
403 |
402 str = eq + 1; |
404 str = eq + 1; |
403 eq = strchr(str, '\t'); |
405 eq = strchr(str, '\t'); |
404 data_t *tz = eq != NULL ? data_new_nstring(str, eq - str) : |
406 adr_data_t *tz = eq != NULL ? |
405 data_new_string(str, lt_copy); |
407 adr_data_new_nstring(str, eq - str) : |
406 struct_set(timezone, "name", tz); |
408 adr_data_new_string(str, LT_COPY); |
|
409 adr_struct_set(timezone, "name", tz); |
407 if (eq == NULL) |
410 if (eq == NULL) |
408 goto done; |
411 goto done; |
409 |
412 |
410 str = eq + 1; |
413 str = eq + 1; |
411 eq = strchr(str, '\t'); |
414 eq = strchr(str, '\t'); |
412 if (eq != NULL) { |
415 if (eq != NULL) { |
413 if (rad_strccmp("-", str, eq - str) != 0) |
416 if (rad_strccmp("-", str, eq - str) != 0) |
414 struct_set(timezone, "altName", |
417 adr_struct_set(timezone, "altName", |
415 data_new_nstring(str, eq - str)); |
418 adr_data_new_nstring(str, eq - str)); |
416 } else { |
419 } else { |
417 if (strcmp("-", str) != 0) |
420 if (strcmp("-", str) != 0) |
418 struct_set(timezone, "altName", |
421 adr_struct_set(timezone, "altName", |
419 data_new_string(str, lt_copy)); |
422 adr_data_new_string(str, LT_COPY)); |
420 goto done; |
423 goto done; |
421 } |
424 } |
422 |
425 |
423 str = eq + 1; |
426 str = eq + 1; |
424 if (*str != '\0' && strcmp(str, "-") != 0) |
427 if (*str != '\0' && strcmp(str, "-") != 0) |
425 struct_set(timezone, "comments", |
428 adr_struct_set(timezone, "comments", |
426 data_new_string(str, lt_copy)); |
429 adr_data_new_string(str, LT_COPY)); |
427 |
430 |
428 done: |
431 done: |
429 (void) array_add(result, timezone); |
432 (void) adr_array_add(result, timezone); |
430 } |
433 } |
431 (void) fclose(file); |
434 (void) fclose(file); |
432 *data = result; |
435 *data = result; |
433 |
436 |
434 return (ce_ok); |
437 return (ce_ok); |
435 } |
438 } |
436 |
439 |
437 /*ARGSUSED*/ |
440 /*ARGSUSED*/ |
438 conerr_t |
441 conerr_t |
439 interface_Time_write_ntpServers(rad_instance_t *inst, adr_attribute_t *attr, |
442 interface_Time_write_ntpServers(rad_instance_t *inst, adr_attribute_t *attr, |
440 data_t *data, data_t **error) |
443 adr_data_t *data, adr_data_t **error) |
441 { |
444 { |
442 FILE *from, *to, *tmp; /* Read, write, & temp files */ |
445 FILE *from, *to, *tmp; /* Read, write, & temp files */ |
443 int err = 0; /* Indicates an error */ |
446 int err = 0; /* Indicates an error */ |
444 int size = 256; /* Buffer size */ |
447 int size = 256; /* Buffer size */ |
445 char buffer[size]; /* Read buffer */ |
448 char buffer[size]; /* Read buffer */ |