]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - tools-util.c
check if fs is mounted before running fsck
[bcachefs-tools-debian] / tools-util.c
index b107cc43e17dfcbee2877a37c555a0c32cb9154a..e4d2beae232f53d5418b146521f54275b0a45d15 100644 (file)
@@ -386,7 +386,7 @@ struct fiemap_extent fiemap_iter_next(struct fiemap_iter *iter)
        return e;
 }
 
-const char *strcmp_prefix(const char *a, const char *a_prefix)
+char *strcmp_prefix(char *a, const char *a_prefix)
 {
        while (*a_prefix && *a == *a_prefix) {
                a++;
@@ -610,26 +610,18 @@ char *dev_to_path(dev_t dev)
        return path;
 }
 
-char *dev_to_mount(char *dev)
+struct mntent *dev_to_mount(char *dev)
 {
-       char *line = NULL, *ret = NULL;
-       size_t n = 0;
-
-       FILE *f = fopen("/proc/mounts", "r");
+       struct mntent *mnt, *ret = NULL;
+       FILE *f = setmntent("/proc/mounts", "r");
        if (!f)
                die("error opening /proc/mounts: %m");
 
        struct stat d1 = xstat(dev);
 
-       while (getline(&line, &n, f) != -1) {
-               char *d, *p = line;
-               char *devs = strsep(&p, " ");
-               char *mount = strsep(&p, " ");
+       while ((mnt = getmntent(f))) {
+               char *d, *p = mnt->mnt_fsname;
 
-               if (!devs || !mount)
-                       continue;
-
-               p = devs;
                while ((d = strsep(&p, ":"))) {
                        struct stat d2;
 
@@ -648,12 +640,18 @@ char *dev_to_mount(char *dev)
                                        continue;
                        }
 
-                       ret = strdup(mount);
+                       ret = mnt;
                        goto found;
                }
        }
 found:
        fclose(f);
-       free(line);
        return ret;
 }
+
+bool dev_mounted_rw(char *dev)
+{
+       struct mntent *mnt = dev_to_mount(dev);
+
+       return mnt && !hasmntopt(mnt, "ro");
+}