[PATCH 1/2] libblkid: introduce blkid_safe_open

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Commit 39f5af25982d8b0244000e92a9d0e0e6557d0e17 modified open() calls
used to get fds for probing by adding O_NONBLOCK flag.

We want to modify this logic in the following commit. So, as a first
step create a generic wrapper on open, so blkid-related open logic live
in one place.

Formally blkid_safe_open() becomes recommended method to open device
file for probing, as it workarounds problems of opening CDROM (and in
further patch also of FLOPPY). So, it's good to make a public API
function.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@xxxxxxxxxxxxx>
---
 libblkid/src/blkid.h.in   |  2 ++
 libblkid/src/evaluate.c   |  2 +-
 libblkid/src/libblkid.sym |  4 ++++
 libblkid/src/probe.c      | 19 ++++++++++++++++++-
 libblkid/src/verify.c     |  2 +-
 misc-utils/blkid.c        |  2 +-
 misc-utils/wipefs.c       |  2 +-
 7 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/libblkid/src/blkid.h.in b/libblkid/src/blkid.h.in
index 3cd4116d9..7ecf4f9be 100644
--- a/libblkid/src/blkid.h.in
+++ b/libblkid/src/blkid.h.in
@@ -217,6 +217,8 @@ extern char *blkid_evaluate_spec(const char *spec, blkid_cache *cache)
 			__ul_attribute__((warn_unused_result));
 
 /* probe.c */
+extern int blkid_safe_open(const char *filename, int mode)
+			__ul_attribute__((warn_unused_result));
 extern blkid_probe blkid_new_probe(void)
 			__ul_attribute__((warn_unused_result));
 extern blkid_probe blkid_new_probe_from_filename(const char *filename)
diff --git a/libblkid/src/evaluate.c b/libblkid/src/evaluate.c
index 710eac956..1eefe455c 100644
--- a/libblkid/src/evaluate.c
+++ b/libblkid/src/evaluate.c
@@ -73,7 +73,7 @@ static int verify_tag(const char *devname, const char *name, const char *value)
 	blkid_probe_enable_partitions(pr, TRUE);
 	blkid_probe_set_partitions_flags(pr, BLKID_PARTS_ENTRY_DETAILS);
 
-	fd = open(devname, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
+	fd = blkid_safe_open(devname, O_RDONLY|O_CLOEXEC);
 	if (fd < 0) {
 		errsv = errno;
 		goto done;
diff --git a/libblkid/src/libblkid.sym b/libblkid/src/libblkid.sym
index 366f2c0c0..1549a29f4 100644
--- a/libblkid/src/libblkid.sym
+++ b/libblkid/src/libblkid.sym
@@ -183,3 +183,7 @@ BLKID_2_37 {
 	blkid_probe_set_hint;
 	blkid_probe_reset_hints;
 } BLKID_2_36;
+
+BLKID_2_38 {
+	blkid_safe_open;
+} BLKID_2_37;
diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c
index 3685ea5e1..70e3dc0eb 100644
--- a/libblkid/src/probe.c
+++ b/libblkid/src/probe.c
@@ -189,6 +189,23 @@ blkid_probe blkid_clone_probe(blkid_probe parent)
 }
 
 
+/**
+ * blkid_safe_open
+ * @filename: device or regular file
+ * @mode: open mode
+ *
+ * This wrapper is blkid-specific wrapper on open(). It's "safe" in a meaning
+ * that it doesn't change
+ *
+ * We add O_NONBLOCK flag to the mode, as opening CDROM without this flag may
+ * load to closing the rom (if it's open), which is bad thing in context of
+ * blkid: we don't want to change the actual device state.
+ */
+int blkid_safe_open(const char *filename, int mode)
+{
+	return open(filename, mode | O_NONBLOCK);
+}
+
 
 /**
  * blkid_new_probe_from_filename:
@@ -208,7 +225,7 @@ blkid_probe blkid_new_probe_from_filename(const char *filename)
 	int fd;
 	blkid_probe pr = NULL;
 
-	fd = open(filename, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
+	fd = blkid_safe_open(filename, O_RDONLY|O_CLOEXEC);
 	if (fd < 0)
 		return NULL;
 
diff --git a/libblkid/src/verify.c b/libblkid/src/verify.c
index 3b9754f57..96b43634c 100644
--- a/libblkid/src/verify.c
+++ b/libblkid/src/verify.c
@@ -126,7 +126,7 @@ blkid_dev blkid_verify(blkid_cache cache, blkid_dev dev)
 		}
 	}
 
-	fd = open(dev->bid_name, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
+	fd = blkid_safe_open(dev->bid_name, O_RDONLY|O_CLOEXEC);
 	if (fd < 0) {
 		DBG(PROBE, ul_debug("blkid_verify: error %s (%d) while "
 					"opening %s", strerror(errno), errno,
diff --git a/misc-utils/blkid.c b/misc-utils/blkid.c
index 41826e6dc..1f7be80eb 100644
--- a/misc-utils/blkid.c
+++ b/misc-utils/blkid.c
@@ -516,7 +516,7 @@ static int lowprobe_device(blkid_probe pr, const char *devname,
 	int rc = 0;
 	static int first = 1;
 
-	fd = open(devname, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
+	fd = blkid_safe_open(devname, O_RDONLY|O_CLOEXEC);
 	if (fd < 0) {
 		warn(_("error: %s"), devname);
 		return BLKID_EXIT_NOTFOUND;
diff --git a/misc-utils/wipefs.c b/misc-utils/wipefs.c
index 78dc63ee7..2597135b5 100644
--- a/misc-utils/wipefs.c
+++ b/misc-utils/wipefs.c
@@ -390,7 +390,7 @@ new_probe(const char *devname, int mode)
 		return NULL;
 
 	if (mode) {
-		int fd = open(devname, mode | O_NONBLOCK);
+		int fd = blkid_safe_open(devname, mode);
 		if (fd < 0)
 			goto error;
 
-- 
2.31.1




[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux