Print this page
8225 passing invalid global pattern to coreadm wedges it nicely
@@ -19,10 +19,12 @@
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2017 RackTop Systems.
*/
#include <stdio.h>
#include <fcntl.h>
#include <ctype.h>
@@ -75,11 +77,11 @@
static size_t proc_size;
static core_content_t proc_content = CC_CONTENT_INVALID;
static int report_settings(void);
static int do_processes(int, char **);
-static int do_modify(boolean_t);
+static int do_modify(void);
static int do_update(void);
static int do_legacy(void);
static scf_propvec_t prop_gpattern = { GLOBAL_PATTERN, NULL, SCF_TYPE_ASTRING };
static scf_propvec_t prop_gcontent = { GLOBAL_CONTENT, NULL, SCF_TYPE_ASTRING };
@@ -87,11 +89,12 @@
static scf_propvec_t prop_icontent = { INIT_CONTENT, NULL, SCF_TYPE_ASTRING };
static scf_propvec_t prop_option[] = {
{ GLOBAL_ENABLED, NULL, SCF_TYPE_BOOLEAN, NULL, CC_GLOBAL_PATH },
{ PROCESS_ENABLED, NULL, SCF_TYPE_BOOLEAN, NULL, CC_PROCESS_PATH },
{ GLOBAL_SETID_ENABLED, NULL, SCF_TYPE_BOOLEAN, NULL, CC_GLOBAL_SETID },
- { PROCESS_SETID_ENABLED, NULL, SCF_TYPE_BOOLEAN, NULL, CC_PROCESS_SETID },
+ { PROCESS_SETID_ENABLED, NULL, SCF_TYPE_BOOLEAN, NULL,
+ CC_PROCESS_SETID },
{ GLOBAL_LOG_ENABLED, NULL, SCF_TYPE_BOOLEAN, NULL, CC_GLOBAL_LOG },
{ NULL }
};
#define MAX_PROPS (4 + (sizeof (prop_option) / sizeof (scf_propvec_t)))
@@ -241,10 +244,16 @@
(void) fprintf(stderr, gettext(
"%s: -[GIgied] options cannot have a process-id list\n"),
command);
usage();
}
+ if (glob_pattern != NULL && glob_pattern[0] != '/') {
+ (void) fprintf(stderr, gettext(
+ "%s: the -g option must specify an absolute path\n"),
+ command);
+ usage();
+ }
if ((proc_pattern != NULL || proc_content != CC_CONTENT_INVALID) &&
npids == 0) {
(void) sprintf(curpid, "%u", (uint_t)getppid());
npids = 1;
pidlist = &curpid_ptr;
@@ -253,11 +262,11 @@
if (legacy_update)
return (do_legacy());
if (update)
return (do_update());
if (modify)
- return (do_modify(B_FALSE));
+ return (do_modify());
if (npids != 0)
return (do_processes(npids, pidlist));
return (report_settings());
}
@@ -380,19 +389,53 @@
assert(count + 1 < size);
props[count] = *pv;
props[count].pv_ptr = ptr;
}
-static boolean_t
-is_online(const char *fmri)
+static int
+make_active(void)
{
- char *state = smf_get_state(fmri);
- boolean_t result = state != NULL &&
- strcmp(state, SCF_STATE_STRING_ONLINE) == 0;
+ char *state = smf_get_state(COREADM_INST_FMRI);
- free(state);
- return (result);
+ switch (state == NULL ? -1 : smf_state_from_string(state)) {
+ case SCF_STATE_ONLINE:
+ if (smf_refresh_instance_synchronous(COREADM_INST_FMRI) != 0) {
+ (void) fprintf(stderr,
+ gettext("%s: Unable to refresh %s: %s\n"),
+ command, COREADM_INST_FMRI,
+ scf_strerror(scf_error()));
+ return (-1);
+ }
+ break;
+ case SCF_STATE_DEGRADED:
+ case SCF_STATE_MAINT:
+ if (smf_restore_instance_synchronous(COREADM_INST_FMRI) != 0) {
+ (void) fprintf(stderr,
+ gettext("%s: Unable to clear %s: %s\n"),
+ command, COREADM_INST_FMRI,
+ scf_strerror(scf_error()));
+ return (-1);
+ }
+ break;
+ case SCF_STATE_DISABLED:
+ if (smf_enable_instance_synchronous(COREADM_INST_FMRI,
+ 0) != 0) {
+ (void) fprintf(stderr,
+ gettext("%s: Unable to enable %s: %s\n"),
+ command, COREADM_INST_FMRI,
+ scf_strerror(scf_error()));
+ return (-1);
+ }
+ break;
+ case SCF_STATE_OFFLINE:
+ default:
+ (void) fprintf(stderr,
+ gettext("%s: coreadm service not online\n"), command);
+ return (-1);
+ }
+
+ return (0);
}
/*
* The user has specified the -g, -G, -i, -I, -d, or -e options to
* modify the given configuration parameter. Perform the modification
@@ -399,24 +442,18 @@
* in the smf repository and then perform a smf_refresh_instance which
* will cause a coreadm -u to occur which will transfer ALL coreadm
* configuration information from the repository to the kernel.
*/
static int
-do_modify(boolean_t method)
+do_modify(void)
{
char gcontentstr[PRCONTENTBUFSZ];
char icontentstr[PRCONTENTBUFSZ];
scf_propvec_t *prop;
scf_propvec_t properties[MAX_PROPS + 1];
int count = 0;
- if (!method && !is_online(COREADM_INST_FMRI)) {
- (void) fprintf(stderr,
- gettext("%s: coreadm service not online\n"), command);
- return (E_ERROR);
- }
-
if (glob_pattern != NULL)
addprop(properties, MAX_PROPS, count++, &prop_gpattern,
glob_pattern);
if (glob_content != CC_CONTENT_INVALID) {
@@ -456,15 +493,13 @@
command, scf_strerror(scf_error()));
}
return (E_ERROR);
}
- if (smf_refresh_instance(COREADM_INST_FMRI) != 0) {
- (void) fprintf(stderr,
- gettext("%s: Unable to refresh %s: %s\n"
- "Configuration stored but not made active.\n"),
- command, COREADM_INST_FMRI, scf_strerror(scf_error()));
+ if (make_active() != 0) {
+ (void) fprintf(stderr, gettext(
+ "Configuration stored but not made active.\n"));
return (E_ERROR);
}
return (E_SUCCESS);
}
@@ -620,11 +655,11 @@
if (read_legacy()) {
if ((errstr = write_kernel()) != NULL)
goto error;
- if (do_modify(B_TRUE) != 0 ||
+ if (do_modify() != 0 ||
rename(PATH_CONFIG, PATH_CONFIG_OLD) != 0) {
(void) fprintf(stderr, gettext(
"%s: failed to import legacy configuration.\n"),
command);
return (SMF_EXIT_ERR_FATAL);
@@ -639,11 +674,11 @@
for (prop = prop_option; prop->pv_prop != NULL; prop++)
addprop(properties, MAX_PROPS, count++, prop, &options);
properties[count].pv_prop = NULL;
alloptions = CC_OPTIONS;
- if (scf_read_propvec(COREADM_INST_FMRI, CONFIG_PARAMS, B_TRUE,
+ if (scf_read_propvec(COREADM_INST_FMRI, CONFIG_PARAMS, B_FALSE,
properties, &prop) == SCF_FAILED) {
if (prop != NULL) {
(void) fprintf(stderr, gettext(
"%s: configuration property '%s' not found.\n"),
command, prop->pv_prop);
@@ -667,11 +702,11 @@
if (errno == EPERM) {
(void) perm();
return (SMF_EXIT_ERR_PERM);
}
perror(errstr);
- return (SMF_EXIT_ERR_FATAL);
+ return (errno == EINVAL ? SMF_EXIT_ERR_CONFIG : SMF_EXIT_ERR_FATAL);
}
static int do_legacy()
{
const char *errstr;