static int user_extra_parse(
	semanage_handle_t* handle,
	parse_info_t* info, 
	semanage_user_extra_t* user_extra) {

	char* str = NULL;

	if (parse_skip_space(handle, info) < 0)
		goto err;
	if (!info->ptr)
		goto last;

	/* User string */
	if (parse_assert_str(handle, info, "user") < 0)
		goto err;
	if (parse_assert_space(handle, info) < 0)
		goto err;
	
	/* Extract name */
	if (parse_fetch_string(handle, info, &str, ' ') < 0)
		goto err;
	if (semanage_user_extra_set_name(handle, user_extra, str) < 0)
		goto err;
	free(str);
	str = NULL;

	/* Prefix string */
	if (parse_assert_space(handle, info) < 0)
		goto err;
	if (parse_assert_str(handle, info, "prefix") < 0)
		goto err;
	if (parse_assert_space(handle, info) < 0)
		goto err;

	/* Extract prefix */
	if (parse_fetch_string(handle, info, &str, ';') < 0)
		goto err;
	if (semanage_user_extra_set_prefix(handle, user_extra, str) < 0)
		goto err;
	free(str);
	str = NULL;

	/* Semicolon */
	if (parse_skip_space(handle, info) < 0)
		goto err;
	if (parse_assert_ch(handle, info, ';') < 0)
		goto err;

	return STATUS_SUCCESS;

	last:
	parse_dispose_line(info);
	return STATUS_NODATA;

	err:
	ERR(handle, "could not parse user extra data");
	free(str);
	parse_dispose_line(info);
	return STATUS_ERR;
}
Example #2
0
int semanage_user_set_name(semanage_handle_t * handle,
			   semanage_user_t * user, const char *name)
{

	char *tmp_name = strdup(name);
	if (!tmp_name)
		goto omem;

	if (semanage_user_base_set_name(handle, user->base, name) < 0)
		goto err;

	if (semanage_user_extra_set_name(handle, user->extra, name) < 0)
		goto err;

	free(user->name);
	user->name = tmp_name;
	return STATUS_SUCCESS;

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

      err:
	ERR(handle, "could not set user name to %s", name);
	free(tmp_name);
	return STATUS_ERR;
}
Example #3
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;
}