chiark / gitweb /
basic/def.h: drop TTY_GID definition
[elogind.git] / src / basic / mount-util.c
index 61190e40ac15f51a70f8d6fa0b45af28f9492052..fef9912072e2961914db699f8057060507bc0eb8 100644 (file)
@@ -29,6 +29,7 @@
 #include "escape.h"
 #include "fd-util.h"
 #include "fileio.h"
+#include "fs-util.h"
 #include "hashmap.h"
 #include "mount-util.h"
 #include "parse-util.h"
@@ -110,9 +111,10 @@ int fd_is_mount_point(int fd, const char *filename, int flags) {
 
         r = name_to_handle_at(fd, filename, &h.handle, &mount_id, flags);
         if (r < 0) {
-                if (errno == ENOSYS)
-                        /* This kernel does not support name_to_handle_at()
-                         * fall back to simpler logic. */
+                if (IN_SET(errno, ENOSYS, EACCES, EPERM))
+                        /* This kernel does not support name_to_handle_at() at all, or the syscall was blocked (maybe
+                         * through seccomp, because we are running inside of a container?): fall back to simpler
+                         * logic. */
                         goto fallback_fdinfo;
                 else if (errno == EOPNOTSUPP)
                         /* This kernel or file system does not support
@@ -161,7 +163,7 @@ int fd_is_mount_point(int fd, const char *filename, int flags) {
 
 fallback_fdinfo:
         r = fd_fdinfo_mnt_id(fd, filename, flags, &mount_id);
-        if (IN_SET(r, -EOPNOTSUPP, -EACCES))
+        if (IN_SET(r, -EOPNOTSUPP, -EACCES, -EPERM))
                 goto fallback_fstat;
         if (r < 0)
                 return r;
@@ -674,6 +676,9 @@ int mount_verbose(
         else if ((flags & MS_BIND) && !type)
                 log_debug("Bind-mounting %s on %s (%s \"%s\")...",
                           what, where, strnull(fl), strempty(options));
+        else if (flags & MS_MOVE)
+                log_debug("Moving mount %s → %s (%s \"%s\")...",
+                          what, where, strnull(fl), strempty(options));
         else
                 log_debug("Mounting %s on %s (%s \"%s\")...",
                           strna(type), where, strnull(fl), strempty(options));
@@ -690,18 +695,16 @@ int umount_verbose(const char *what) {
                 return log_error_errno(errno, "Failed to unmount %s: %m", what);
         return 0;
 }
-#endif // 0
 
 const char *mount_propagation_flags_to_string(unsigned long flags) {
 
         switch (flags & (MS_SHARED|MS_SLAVE|MS_PRIVATE)) {
-
+        case 0:
+                return "";
         case MS_SHARED:
                 return "shared";
-
         case MS_SLAVE:
                 return "slave";
-
         case MS_PRIVATE:
                 return "private";
         }
@@ -709,17 +712,19 @@ const char *mount_propagation_flags_to_string(unsigned long flags) {
         return NULL;
 }
 
-unsigned long mount_propagation_flags_from_string(const char *name) {
 
-        if (isempty(name))
-                return 0;
-
-        if (streq(name, "shared"))
-                return MS_SHARED;
-        if (streq(name, "slave"))
-                return MS_SLAVE;
-        if (streq(name, "private"))
-                return MS_PRIVATE;
+int mount_propagation_flags_from_string(const char *name, unsigned long *ret) {
 
+        if (isempty(name))
+                *ret = 0;
+        else if (streq(name, "shared"))
+                *ret = MS_SHARED;
+        else if (streq(name, "slave"))
+                *ret = MS_SLAVE;
+        else if (streq(name, "private"))
+                *ret = MS_PRIVATE;
+        else
+                return -EINVAL;
         return 0;
 }
+#endif // 0