diff options
author | Anand Jain <anand.jain@oracle.com> | 2013-01-28 13:22:30 +0800 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2013-01-30 00:40:35 +0100 |
commit | 46e3b8087b86ef555b13be6807c34c555171fc4a (patch) | |
tree | 0a12035e30f7661f11aee0f96ec61be6319b6e7e /utils.c | |
parent | 4a64455231d41b8c23c980cb20959242d2fbff78 (diff) |
Btrfs-progs: move open_file_or_dir() to utils.c
The definition of the function open_file_or_dir() is moved from common.c
to utils.c in order to be able to share some common code between scrub
and the device stats in the following step. That common code uses
open_file_or_dir(). Since open_file_or_dir() makes use of the function
dirfd(3), the required XOPEN version was raised from 6 to 7.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
Original-Signed-off-by: Stefan Behrens <sbehrens@giantdisaster.de>
Diffstat (limited to 'utils.c')
-rw-r--r-- | utils.c | 30 |
1 files changed, 28 insertions, 2 deletions
@@ -16,8 +16,9 @@ * Boston, MA 021110-1307, USA. */ -#define _XOPEN_SOURCE 600 -#define __USE_XOPEN2K +#define _XOPEN_SOURCE 700 +#define __USE_XOPEN2K8 +#define __XOPEN2K8 /* due to an error in dirent.h, to get dirfd() */ #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -1276,3 +1277,28 @@ u64 parse_size(char *s) return strtoull(s, NULL, 10) * mult; } +int open_file_or_dir(const char *fname) +{ + int ret; + struct stat st; + DIR *dirstream; + int fd; + + ret = stat(fname, &st); + if (ret < 0) { + return -1; + } + if (S_ISDIR(st.st_mode)) { + dirstream = opendir(fname); + if (!dirstream) { + return -2; + } + fd = dirfd(dirstream); + } else { + fd = open(fname, O_RDWR); + } + if (fd < 0) { + return -3; + } + return fd; +} |