diff options
author | Doug Ledford <dledford@redhat.com> | 2010-04-16 15:18:44 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2010-04-16 15:18:44 -0400 |
commit | f13d2c5adf133a4963ed38a3dc85aa035cf88bcf (patch) | |
tree | 7ac5f62d51cf70e7d3ba8023ff4c576537eef1d2 | |
parent | 3619d7da2ac629f8b980eb30daa979431ad5eaf9 (diff) | |
download | mdadm-f13d2c5adf133a4963ed38a3dc85aa035cf88bcf.tar.gz mdadm-f13d2c5adf133a4963ed38a3dc85aa035cf88bcf.tar.xz mdadm-f13d2c5adf133a4963ed38a3dc85aa035cf88bcf.zip |
Add new helper function dev_open_check() that does the most common
sanity checks for us
Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r-- | mdadm.h | 1 | ||||
-rw-r--r-- | util.c | 25 |
2 files changed, 26 insertions, 0 deletions
@@ -897,6 +897,7 @@ extern int check_partitions(int fd, char *dname, unsigned long long freesize); extern int get_mdp_major(void); extern int dev_open(char *dev, int flags); +extern int dev_open_check(char *dev, int flags); extern int open_dev(int devnum); extern int open_dev_excl(int devnum); extern int is_standard(char *dev, int *nump); @@ -950,6 +950,31 @@ int dev_open(char *dev, int flags) return fd; } +int dev_open_check(char *devname, int flags) +{ + int dfd; + struct stat stb; + + dfd = dev_open(devname, flags); + if (dfd < 0) { + fprintf(stderr, Name ": cannot open %s: %s.\n", + devname, strerror(errno)); + return -1; + } + if (fstat(dfd, &stb) < 0) { + fprintf(stderr, Name ": fstat failed on %s: %s.\n", + devname, strerror(errno)); + close(dfd); + return -1; + } + if ((stb.st_mode & S_IFMT) != S_IFBLK) { + fprintf(stderr, Name ": %s is not a block device.\n", devname); + close(dfd); + return -1; + } + return dfd; +} + int open_dev(int devnum) { char buf[20]; |