components/visual-panels/time/src/cmd/rad/mod/time/mod_time.c
branchs11-update
changeset 2805 4888f6212f94
parent 901 19b502ccabc8
equal deleted inserted replaced
2804:7546c836fd87 2805:4888f6212f94
    18  *
    18  *
    19  * CDDL HEADER END
    19  * CDDL HEADER END
    20  */
    20  */
    21 
    21 
    22 /*
    22 /*
    23  * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
    23  * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
    24  */
    24  */
    25 
    25 
    26 #include <sys/types.h>
    26 #include <sys/types.h>
    27 #include <sys/processor.h>
    27 #include <sys/processor.h>
    28 #include <sys/stat.h>
    28 #include <sys/stat.h>
    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,
   260 		(void) adr_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,
   293 		(void) adr_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);
   299 }
   299 }
   300 
   300 
   301 /*
   301 /*
   302  * Parse ISO 6709 -formatted coordinates
   302  * Parse ISO 6709 -formatted coordinates
   303  */
   303  */
   432 		(void) adr_array_add(result, timezone);
   432 		(void) adr_array_add(result, timezone);
   433 	}
   433 	}
   434 	(void) fclose(file);
   434 	(void) fclose(file);
   435 	*data = result;
   435 	*data = result;
   436 
   436 
   437 	return (ce_ok);
   437 	return (CE_OK);
   438 }
   438 }
   439 
   439 
   440 /*ARGSUSED*/
   440 /*ARGSUSED*/
   441 conerr_t
   441 conerr_t
   442 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,
   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 }