コード例 #1
0
ファイル: smbfs_scfutil.c プロジェクト: apprisi/illumos-gate
/*
 * Check if instance with given name exists for a service.
 * Returns 0 is instance exist
 */
int
smb_smf_instance_exists(smb_scfhandle_t *handle, char *inst_name)
{
	int ret = SMBC_SMF_OK;
	if (handle == NULL) {
		return (SMBC_SMF_SYSTEM_ERR);
	}

	handle->scf_instance = scf_instance_create(handle->scf_handle);
	if (scf_service_get_instance(handle->scf_service, inst_name,
	    handle->scf_instance) != SCF_SUCCESS) {
		ret = SMBC_SMF_SYSTEM_ERR;
	}
	scf_instance_destroy(handle->scf_instance);
	handle->scf_instance = NULL;
	return (ret);
}
コード例 #2
0
ファイル: smbfs_scfutil.c プロジェクト: apprisi/illumos-gate
/*
 * Create a service instance. returns 0 if successful.
 * If instance already exists enable it.
 */
int
smb_smf_instance_create(smb_scfhandle_t *handle, char *serv_prefix,
	char *inst_name)
{
	char *instance;
	int ret = SMBC_SMF_OK;
	int sz;

	if (handle == NULL) {
		return (SMBC_SMF_SYSTEM_ERR);
	}

	if (!serv_prefix || !inst_name) {
		return (SMBC_SMF_SYSTEM_ERR);
	}
	sz = strlen(serv_prefix) + strlen(inst_name) + 2;
	instance = malloc(sz);
	if (!instance) {
		return (SMBC_SMF_SYSTEM_ERR);
	}
	(void) snprintf(instance, sz, "%s:%s", serv_prefix, inst_name);
	handle->scf_instance = scf_instance_create(handle->scf_handle);
	if (scf_service_get_instance(handle->scf_service, inst_name,
	    handle->scf_instance) != SCF_SUCCESS) {
		if (scf_service_add_instance(handle->scf_service,
		    inst_name, handle->scf_instance) == SCF_SUCCESS) {
			if (smf_enable_instance(instance, 0))
				ret = SMBC_SMF_SYSTEM_ERR;
		} else {
			ret = SMBC_SMF_SYSTEM_ERR;
		}
	} else {
		if (smf_enable_instance(instance, 0))
			ret = SMBC_SMF_SYSTEM_ERR;
	}
	free(instance);
	return (ret);
}
コード例 #3
0
ファイル: smbfs_scfutil.c プロジェクト: apprisi/illumos-gate
/*
 * Delete a specified instance. Return SMBC_SMF_OK for success.
 */
int
smb_smf_instance_delete(smb_scfhandle_t *handle, char *inst_name)
{
	int ret = SMBC_SMF_OK;

	if (handle == NULL) {
		return (SMBC_SMF_SYSTEM_ERR);
	}

	handle->scf_instance = scf_instance_create(handle->scf_handle);
	if (scf_service_get_instance(handle->scf_service, inst_name,
	    handle->scf_instance) == SCF_SUCCESS) {
		if (scf_instance_delete(handle->scf_instance) == SCF_SUCCESS) {
			return (ret);
		} else {
			ret = SMBC_SMF_SYSTEM_ERR;
		}
	} else {
		smb_smf_scf_log_error(NULL);
		ret = SMBC_SMF_SYSTEM_ERR;
	}
	return (ret);
}
コード例 #4
0
ファイル: ksslcfg_create.c プロジェクト: CoryXie/opensolaris
static int
create_instance(scf_handle_t *handle, scf_service_t *svc,
    const char *instance_name, const char *kssl_entry, const char *command,
    const char *username, char *inaddr_any_name)
{
	int status = FAILURE;
	char *buf;
	boolean_t errflag = B_FALSE;
	ssize_t max_fmri_len;
	scf_instance_t *instance;

	instance = scf_instance_create(handle);
	if (instance == NULL) {
		errflag = B_TRUE;
		KSSL_DEBUG("scf_instance_create failed: %s\n",
		    scf_strerror(scf_error()));
		goto out;
	}
	KSSL_DEBUG("scf_instance_create succeeded\n");

	if (scf_service_get_instance(svc, inaddr_any_name, instance) == 0) {
		/* Let the caller deal with the duplicate instance */
		status = INSTANCE_ANY_EXISTS;
		goto out;
	}

	if (scf_service_add_instance(svc, instance_name, instance) != 0) {
		if (scf_error() == SCF_ERROR_EXISTS) {
			/* Let the caller deal with the duplicate instance */
			status = INSTANCE_OTHER_EXISTS;
			goto out;
		}

		errflag = B_TRUE;
		KSSL_DEBUG("scf_service_add_instance failed: %s\n",
		    scf_strerror(scf_error()));
		goto out;
	}
	KSSL_DEBUG("scf_service_add_instance succeeded\n");

	if ((add_pg_method(handle, instance, kssl_entry, "start",
		command, username) != SUCCESS) ||
	    (add_pg_method(handle, instance, kssl_entry, "refresh",
		command, username) != SUCCESS) ||
	    (add_pg_method(handle, instance, kssl_entry, "stop",
		"", username) != SUCCESS)) {
		scf_instance_destroy(instance);
		return (status);
	}

	/* enabling the instance */
	max_fmri_len = scf_limit(SCF_LIMIT_MAX_FMRI_LENGTH);
	if ((buf = malloc(max_fmri_len + 1)) == NULL)
		goto out;

	if (scf_instance_to_fmri(instance, buf, max_fmri_len + 1) > 0) {
		KSSL_DEBUG("instance_fmri=%s\n", buf);
		if (smf_enable_instance(buf, 0) != 0) {
			errflag = B_TRUE;
			KSSL_DEBUG(
			    "smf_enable_instance failed: %s\n",
			    scf_strerror(scf_error()));
			goto out;
		}
		status = SUCCESS;
	}

out:
	if (instance != NULL)
		scf_instance_destroy(instance);
	if (errflag)
		(void) fprintf(stderr, gettext(
		    "Unexpected fatal libscf error: %s. Exiting.\n"),
		    scf_strerror(scf_error()));
	return (status);
}
コード例 #5
0
ファイル: ksslcfg_delete.c プロジェクト: andreiw/polaris
int
delete_instance(const char *instance_name)
{
	int status = FAILURE;
	char *buf;
	boolean_t errflag = B_FALSE;
	ssize_t max_fmri_len;
	scf_scope_t *scope;
	scf_service_t *svc;
	scf_handle_t *handle;
	scf_instance_t *instance;

	handle = scf_handle_create(SCF_VERSION);
	if (handle == NULL) {
		errflag = B_TRUE;
		KSSL_DEBUG("scf_handle_create failed: %s\n",
		    scf_strerror(scf_error()));
		goto out1;
	}
	KSSL_DEBUG("scf_handle_create succeeded\n");

	if (scf_handle_bind(handle) == -1) {
		errflag = B_TRUE;
		KSSL_DEBUG("scf_handle_bind failed: %s\n",
		    scf_strerror(scf_error()));
		goto out1;
	}
	KSSL_DEBUG("scf_handle_bind succeeded\n");

	if ((scope = scf_scope_create(handle)) == NULL) {
		errflag = B_TRUE;
		KSSL_DEBUG("scf_scope_create failed: %s\n",
		    scf_strerror(scf_error()));
		goto out2;
	}
	KSSL_DEBUG("scf_scope_create succeeded\n");

	if ((svc = scf_service_create(handle)) == NULL) {
		errflag = B_TRUE;
		KSSL_DEBUG("scf_service_create failed: %s\n",
		    scf_strerror(scf_error()));
		goto out3;
	}
	KSSL_DEBUG("scf_service_create succeeded\n");

	if (scf_handle_get_scope(handle, SCF_SCOPE_LOCAL, scope) == -1) {
		errflag = B_TRUE;
		KSSL_DEBUG("scf_handle_get_scope failed: %s\n",
		    scf_strerror(scf_error()));
		goto out4;
	}
	KSSL_DEBUG("scf_handle_get_scope succeeded\n");

	if (scf_scope_get_service(scope, SERVICE_NAME, svc) < 0) {
		scf_error_t scf_errnum = scf_error();

		if (scf_errnum != SCF_ERROR_NOT_FOUND) {
			errflag = B_TRUE;
			KSSL_DEBUG(
			    "ERROR scf_scope_get_service failed: %s\n",
			    scf_strerror(scf_errnum));
		}
		goto out4;
	} else {
		KSSL_DEBUG("scf_scope_get_service succeeded\n");
	}

	instance = scf_instance_create(handle);
	if (instance == NULL) {
		errflag = B_TRUE;
		KSSL_DEBUG("scf_instance_create failed: %s\n",
		    scf_strerror(scf_error()));
		goto out4;
	}

	if (scf_service_get_instance(svc, instance_name, instance) != 0) {
		scf_error_t scf_errnum = scf_error();

		if (scf_errnum == SCF_ERROR_NOT_FOUND) {
			status = SUCCESS;
		} else {
			errflag = B_TRUE;
			KSSL_DEBUG(
			    "ERROR scf_scope_get_service failed: %s\n",
			    scf_strerror(scf_errnum));
		}
		scf_instance_destroy(instance);
		goto out4;
	}

	max_fmri_len = scf_limit(SCF_LIMIT_MAX_FMRI_LENGTH);
	if ((buf = malloc(max_fmri_len + 1)) == NULL)
		goto out4;

	if (scf_instance_to_fmri(instance, buf, max_fmri_len + 1) > 0) {
		char *state;

		KSSL_DEBUG("instance_fmri=%s\n", buf);
		state = smf_get_state(buf);
		if (state)
			KSSL_DEBUG("state=%s\n", state);
		if (state && strcmp(state, "online") == 0) {
			if (smf_disable_instance(buf, 0) != 0) {
				errflag = B_TRUE;
				KSSL_DEBUG(
				    "smf_disable_instance failed: %s\n",
				    scf_strerror(scf_error()));
			} else {
				/*
				 * Wait for some time till timeout to avoid
				 * a race with scf_instance_delete() below.
				 */
				wait_till_to(buf);
			}
		}
	}

	if (scf_instance_delete(instance) != 0) {
		errflag = B_TRUE;
		KSSL_DEBUG(
		    "ERROR scf_instance_delete failed: %s\n",
		    scf_strerror(scf_error()));
		goto out4;
	} else {
		KSSL_DEBUG("deleted %s\n", instance_name);
	}

	status = SUCCESS;

out4:
	scf_service_destroy(svc);
out3:
	scf_scope_destroy(scope);
out2:
	(void) scf_handle_unbind(handle);
out1:
	if (handle != NULL)
		scf_handle_destroy(handle);
	if (errflag)
		(void) fprintf(stderr, gettext(
		    "Unexpected fatal libscf error: %s.  Exiting.\n"),
		    scf_strerror(scf_error()));
	return (status);
}