From f13d2c5adf133a4963ed38a3dc85aa035cf88bcf Mon Sep 17 00:00:00 2001 From: Doug Ledford Date: Fri, 16 Apr 2010 15:18:44 -0400 Subject: Add new helper function dev_open_check() that does the most common sanity checks for us Signed-off-by: Doug Ledford --- mdadm.h | 1 + util.c | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/mdadm.h b/mdadm.h index aa64a38..7c037ea 100644 --- a/mdadm.h +++ b/mdadm.h @@ -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); diff --git a/util.c b/util.c index 5ae208c..dedb9db 100644 --- a/util.c +++ b/util.c @@ -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]; -- cgit