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 adr_data_t **data, adr_data_t **error) |
54 adr_data_t **data, adr_data_t **error) |
55 { |
55 { |
56 *data = adr_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*/ |
77 micros = 0; |
77 micros = 0; |
78 } |
78 } |
79 } |
79 } |
80 |
80 |
81 if (seconds > LONG_MAX) |
81 if (seconds > LONG_MAX) |
82 return (ce_object); |
82 return (CE_OBJECT); |
83 |
83 |
84 newtime = (time_t)seconds; |
84 newtime = (time_t)seconds; |
85 adj.tv_sec = 0; |
85 adj.tv_sec = 0; |
86 adj.tv_usec = micros; |
86 adj.tv_usec = micros; |
87 |
87 |
88 if (stime(&newtime) == -1 || adjtime(&adj, NULL) == -1) { |
88 if (stime(&newtime) == -1 || adjtime(&adj, NULL) == -1) { |
89 if (errno == EPERM) |
89 if (errno == EPERM) |
90 return (ce_priv); |
90 return (CE_PRIV); |
91 return (ce_object); |
91 return (CE_OBJECT); |
92 } |
92 } |
93 |
93 |
94 return (ce_ok); |
94 return (CE_OK); |
95 } |
95 } |
96 |
96 |
97 /*ARGSUSED*/ |
97 /*ARGSUSED*/ |
98 conerr_t |
98 conerr_t |
99 interface_Time_read_defaultTimeZone(rad_instance_t *inst, adr_attribute_t *attr, |
99 interface_Time_read_defaultTimeZone(rad_instance_t *inst, adr_attribute_t *attr, |
103 int n = snprintf(zonefile, PATH_MAX, "%s", ZONEINFO_DIR); |
103 int n = snprintf(zonefile, PATH_MAX, "%s", ZONEINFO_DIR); |
104 char *tz = zonefile + n; |
104 char *tz = zonefile + n; |
105 conerr_t err = smfu_get_property((char *)SCF_INSTANCE_ENV, |
105 conerr_t err = smfu_get_property((char *)SCF_INSTANCE_ENV, |
106 SMF_TZ_PGNAME, SMF_TZ_PROPNAME, tz, PATH_MAX - n); |
106 SMF_TZ_PGNAME, SMF_TZ_PROPNAME, tz, PATH_MAX - n); |
107 |
107 |
108 if (err == ce_ok) { |
108 if (err == CE_OK) { |
109 /* |
109 /* |
110 * The stored time zone may be the name of a symlink |
110 * The stored time zone may be the name of a symlink |
111 * (i.e. "localtime"), under ZONEINFO_DIR. Resolve that symlink |
111 * (i.e. "localtime"), under ZONEINFO_DIR. Resolve that symlink |
112 * and pass the actual time zone to the client. |
112 * and pass the actual time zone to the client. |
113 */ |
113 */ |
221 } |
221 } |
222 (void) fclose(file); |
222 (void) fclose(file); |
223 } |
223 } |
224 |
224 |
225 *data = result; |
225 *data = result; |
226 return (ce_ok); |
226 return (CE_OK); |
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, adr_data_t **data, adr_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 = adr_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, |
504 goto writefailed; |
504 goto writefailed; |
505 |
505 |
506 /* Rename temp file */ |
506 /* Rename temp file */ |
507 if (chmod(NTP_CONF_TMP, 0644) == 0 && |
507 if (chmod(NTP_CONF_TMP, 0644) == 0 && |
508 rename(NTP_CONF_TMP, NTP_CONF) == 0) |
508 rename(NTP_CONF_TMP, NTP_CONF) == 0) |
509 return (ce_ok); |
509 return (CE_OK); |
510 |
510 |
511 writefailed: |
511 writefailed: |
512 err = errno; |
512 err = errno; |
513 (void) unlink(NTP_CONF_TMP); |
513 (void) unlink(NTP_CONF_TMP); |
514 |
514 |
515 errorout: |
515 errorout: |
516 return (err == EACCES ? ce_priv : ce_object); |
516 return (err == EACCES ? CE_PRIV : CE_OBJECT); |
517 } |
517 } |
518 |
|
519 static rad_modinfo_t modinfo = { "time", "Time panel support" }; |
|
520 |
518 |
521 int |
519 int |
522 _rad_init(void *handle) |
520 _rad_init(void) |
523 { |
521 { |
524 if (rad_module_register(handle, RAD_MODVERSION, &modinfo) == -1) |
522 adr_name_t *aname = adr_name_vcreate(MOD_DOMAIN, 1, "type", "Time"); |
|
523 conerr_t cerr = rad_cont_insert_singleton(rad_container, aname, |
|
524 &modinfo, &interface_Time_svr); |
|
525 adr_name_rele(aname); |
|
526 if (cerr != CE_OK) { |
|
527 rad_log(RL_ERROR, "(mod_time) failed to insert Time"); |
525 return (-1); |
528 return (-1); |
526 |
529 } |
527 if (rad_isproxy) |
|
528 return (0); |
|
529 |
|
530 (void) cont_insert_singleton(rad_container, |
|
531 adr_name_fromstr("com.oracle.solaris.vp.panels.time:type=Time"), |
|
532 &interface_Time_svr); |
|
533 |
530 |
534 return (0); |
531 return (0); |
535 } |
532 } |
|
533 |
|
534 /* |
|
535 * _rad_fini is called by the RAD daemon when the module is unloaded. Any |
|
536 * module finalisation is completed here. |
|
537 */ |
|
538 /*ARGSUSED*/ |
|
539 void |
|
540 _rad_fini(void *unused) |
|
541 { |
|
542 } |