diff options
Diffstat (limited to 'lib/fstree')
| -rw-r--r-- | lib/fstree/fstree_from_dir.c | 48 | 
1 files changed, 39 insertions, 9 deletions
| diff --git a/lib/fstree/fstree_from_dir.c b/lib/fstree/fstree_from_dir.c index fe12b24..d3e188d 100644 --- a/lib/fstree/fstree_from_dir.c +++ b/lib/fstree/fstree_from_dir.c @@ -13,13 +13,20 @@  #include <errno.h>  #ifdef _WIN32 -int fstree_from_dir(fstree_t *fs, tree_node_t *root, -		    const char *path, unsigned int flags) +int fstree_from_subdir(fstree_t *fs, tree_node_t *root, +		       const char *path, const char *subdir, +		       unsigned int flags)  { -	(void)fs; (void)root; (void)path; (void)flags; +	(void)fs; (void)root; (void)path; (void)subdir; (void)flags;  	fputs("Packing a directory is not supported on Windows.\n", stderr);  	return -1;  } + +int fstree_from_dir(fstree_t *fs, tree_node_t *root, +		    const char *path, unsigned int flags) +{ +	return fstree_from_subdir(fs, root, path, NULL, flags); +}  #else  static int populate_dir(int dir_fd, fstree_t *fs, tree_node_t *root,  			dev_t devstart, unsigned int flags) @@ -150,16 +157,17 @@ fail:  	return -1;  } -int fstree_from_dir(fstree_t *fs, tree_node_t *root, -		    const char *path, unsigned int flags) +int fstree_from_subdir(fstree_t *fs, tree_node_t *root, +		       const char *path, const char *subdir, +		       unsigned int flags)  {  	struct stat sb; -	int fd; +	int fd, subfd;  	if (!S_ISDIR(root->mode)) {  		fprintf(stderr, -			"scanning %s into %s: target is not a directory\n", -			path, root->name); +			"scanning %s/%s into %s: target is not a directory\n", +			path, subdir == NULL ? "" : subdir, root->name);  		return -1;  	} @@ -169,12 +177,34 @@ int fstree_from_dir(fstree_t *fs, tree_node_t *root,  		return -1;  	} +	if (subdir != NULL) { +		subfd = openat(fd, subdir, O_DIRECTORY | O_RDONLY | O_CLOEXEC); + +		if (subfd < 0) { +			fprintf(stderr, "%s/%s: %s\n", path, subdir, +				strerror(errno)); +			close(fd); +			return -1; +		} + +		close(fd); +		fd = subfd; +	} +  	if (fstat(fd, &sb)) { -		perror(path); +		fprintf(stderr, "%s/%s: %s\n", path, +			subdir == NULL ? "" : subdir, +			strerror(errno));  		close(fd);  		return -1;  	}  	return populate_dir(fd, fs, root, sb.st_dev, flags);  } + +int fstree_from_dir(fstree_t *fs, tree_node_t *root, +		    const char *path, unsigned int flags) +{ +	return fstree_from_subdir(fs, root, path, NULL, flags); +}  #endif | 
