summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Ledford <dledford@redhat.com>2010-04-16 15:18:44 -0400
committerDoug Ledford <dledford@redhat.com>2010-04-16 15:18:44 -0400
commitf13d2c5adf133a4963ed38a3dc85aa035cf88bcf (patch)
tree7ac5f62d51cf70e7d3ba8023ff4c576537eef1d2
parent3619d7da2ac629f8b980eb30daa979431ad5eaf9 (diff)
downloadmdadm-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.h1
-rw-r--r--util.c25
2 files changed, 26 insertions, 0 deletions
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];