if (!buf)
break;
if (geteuid() == 0) {
- if (stat(tgt, &st) || !S_ISDIR(st.st_mode))
+ if (mnt_stat_mountpoint(tgt, &st) || !S_ISDIR(st.st_mode))
snprintf(buf, bufsz, _("mount point is not a directory"));
else
snprintf(buf, bufsz, _("permission denied"));
snprintf(buf, bufsz, _("%s already mounted or mount point busy"), src);
break;
case ENOENT:
- if (tgt && lstat(tgt, &st)) {
+ if (tgt && mnt_lstat_mountpoint(tgt, &st)) {
if (buf)
snprintf(buf, bufsz, _("mount point does not exist"));
- } else if (tgt && stat(tgt, &st)) {
+ } else if (tgt && mnt_stat_mountpoint(tgt, &st)) {
if (buf)
snprintf(buf, bufsz, _("mount point is a symbolic link to nowhere"));
} else if (src && stat(src, &st)) {
break;
case ENOTDIR:
- if (stat(tgt, &st) || ! S_ISDIR(st.st_mode)) {
+ if (mnt_stat_mountpoint(tgt, &st) || ! S_ISDIR(st.st_mode)) {
if (buf)
snprintf(buf, bufsz, _("mount point is not a directory"));
} else if (src && stat(src, &st) && errno == ENOTDIR) {
extern char *mnt_get_kernel_cmdline_option(const char *name);
extern int mnt_stat_mountpoint(const char *target, struct stat *st);
+extern int mnt_lstat_mountpoint(const char *target, struct stat *st);
extern FILE *mnt_get_procfs_memstream(int fd, char **membuf);
/* tab.c */
#endif
}
+int mnt_lstat_mountpoint(const char *target, struct stat *st)
+{
+#ifdef AT_NO_AUTOMOUNT
+ return fstatat(AT_FDCWD, target, st, AT_NO_AUTOMOUNT | AT_SYMLINK_NOFOLLOW);
+#else
+ return lstat(target, st);
+#endif
+}
+
+
/*
* Note that the @target has to be an absolute path (so at least "/"). The
* @filename returns an allocated buffer with the last path component, for example: