On 2018/02/16 4:04, Omar Sandoval wrote:
> From: Omar Sandoval <osandov@xxxxxx>
> +static enum btrfs_util_error openat_parent_and_name(int dirfd, const char *path,
> + char *name, size_t name_len,
> + int *fd)
> +{
> + char *tmp_path, *slash, *dirname, *basename;
> + size_t len;
> +
> + /* Ignore trailing slashes. */
> + len = strlen(path);
> + while (len > 1 && path[len - 1] == '/')
> + len--;
> +
> + tmp_path = malloc(len + 1);
> + if (!tmp_path)
> + return BTRFS_UTIL_ERROR_NO_MEMORY;
> + memcpy(tmp_path, path, len);
> + tmp_path[len] = '\0';
> +
> + slash = memrchr(tmp_path, '/', len);
> + if (slash == tmp_path) {
> + dirname = "/";
> + basename = tmp_path + 1;
> + } else if (slash) {
> + *slash = '\0';
> + dirname = tmp_path;
> + basename = slash + 1;
> + } else {
> + dirname = ".";
> + basename = tmp_path;
> + }
> +
> + len = strlen(basename);
> + if (len >= name_len) {
> + errno = ENAMETOOLONG;
tmp_path should be also freed here.
> + return BTRFS_UTIL_ERROR_INVALID_ARGUMENT;
> + }
> + memcpy(name, basename, len);
> + name[len] = '\0';
> +
> + *fd = openat(dirfd, dirname, O_RDONLY | O_DIRECTORY);
> + if (*fd == -1) {
> + free(tmp_path);
> + return BTRFS_UTIL_ERROR_OPEN_FAILED;
> + }
> +
> + free(tmp_path);
> + return BTRFS_UTIL_OK;
> +}
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html