static int user_extra_print(
	semanage_handle_t* handle,
	semanage_user_extra_t* user_extra, 
	FILE* str) {

	const char* name = semanage_user_extra_get_name(user_extra);
	const char* prefix = semanage_user_extra_get_prefix(user_extra);

	if (fprintf(str, "user %s prefix %s;\n", name, prefix) < 0) 
		goto err;
	
	return STATUS_SUCCESS;

	err:
	ERR(handle, "could not print user extra data "
		"for %s to stream", name);
	return STATUS_ERR;
}
示例#2
0
/* Join properties */
hidden int semanage_user_join(semanage_handle_t * handle,
			      const semanage_user_base_t * record1,
			      const semanage_user_extra_t * record2,
			      semanage_user_t ** result)
{

	const char *name;
	semanage_user_t *tmp_user = calloc(1, sizeof(semanage_user_t));
	if (!tmp_user)
		goto omem;

	/* Set the shared name from one of the records 
	 * (at least one is available) */
	if (record1 == NULL)
		name = semanage_user_extra_get_name(record2);
	else
		name = semanage_user_base_get_name(record1);

	/* Join base record if it exists, create a blank one otherwise */
	if (record1) {
		if (semanage_user_base_clone(handle, record1, &tmp_user->base) <
		    0)
			goto err;
	} else {
		if (semanage_user_base_create(handle, &tmp_user->base) < 0)
			goto err;
		if (semanage_user_base_set_name(handle, tmp_user->base, name) <
		    0)
			goto err;
	}

	/* Join extra record if it exists, create a blank one otherwise */
	if (record2) {
		if (semanage_user_extra_clone(handle, record2, &tmp_user->extra)
		    < 0)
			goto err;
	} else {
		if (semanage_user_extra_create(handle, &tmp_user->extra) < 0)
			goto err;
		if (semanage_user_extra_set_name(handle, tmp_user->extra, name)
		    < 0)
			goto err;
		if (semanage_user_extra_set_prefix
		    (handle, tmp_user->extra, "user") < 0)
			goto err;
	}

	if (semanage_user_set_name(handle, tmp_user, name) < 0)
		goto err;

	*result = tmp_user;
	return STATUS_SUCCESS;

      omem:
	ERR(handle, "out of memory");

      err:
	ERR(handle, "could not join data records for user %s",
	    semanage_user_base_get_name(record1));
	semanage_user_free(tmp_user);
	return STATUS_ERR;
}