* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
*
* Author: Alexander Larsson <alexl@redhat.com>
*/
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
-#ifdef HAVE_SYS_POLL_H
-#include <sys/poll.h>
#endif
-#endif
-#ifdef HAVE_POLL_H
+#ifdef HAVE_POLL
#include <poll.h>
#endif
#include <stdio.h>
*
* Routines for managing mounted UNIX mount points and paths.
*
- * Note that <filename><gio/gunixmounts.h></filename> belongs to the
- * UNIX-specific GIO interfaces, thus you have to use the
- * <filename>gio-unix-2.0.pc</filename> pkg-config file when using it.
+ * Note that `<gio/gunixmounts.h>` belongs to the UNIX-specific GIO
+ * interfaces, thus you have to use the `gio-unix-2.0.pc` pkg-config
+ * file when using it.
*/
/*
/**
* g_unix_is_mount_path_system_internal:
- * @mount_path: a mount path, e.g. <filename>/media/disk</filename>
- * or <filename>/usr</filename>
+ * @mount_path: a mount path, e.g. `/media/disk` or `/usr`
*
* Determines if @mount_path is considered an implementation of the
* OS. This is primarily used for hiding mountable and mounted volumes
"/", /* we already have "Filesystem root" in Nautilus */
"/bin",
"/boot",
+ "/compat/linux/proc",
+ "/compat/linux/sys",
"/dev",
"/etc",
"/home",
"/lib",
"/lib64",
+ "/libexec",
"/live/cow",
"/live/image",
"/media",
"/mnt",
"/opt",
+ "/rescue",
"/root",
"/sbin",
"/srv",
"/tmp",
"/usr",
+ "/usr/X11R6",
"/usr/local",
+ "/usr/obj",
+ "/usr/ports",
+ "/usr/src",
+ "/usr/xobj",
"/var",
"/var/crash",
"/var/local",
"devfs",
"devpts",
"ecryptfs",
+ "fdescfs",
"kernfs",
"linprocfs",
+ "mfs",
+ "nullfs",
"proc",
"procfs",
"ptyfs",
mount_entry = g_new0 (GUnixMountEntry, 1);
mount_entry->mount_path = g_strdup (mntent->mnt_dir);
- if (strcmp (mntent->mnt_fsname, "/dev/root") == 0)
+ if (g_strcmp0 (mntent->mnt_fsname, "/dev/root") == 0)
mount_entry->device_path = g_strdup (_resolve_dev_root ());
else
mount_entry->device_path = g_strdup (mntent->mnt_fsname);
(strcmp (mntent->mnt_dir, "none") == 0))
continue;
+#ifdef HAVE_HASMNTOPT
+ /* We ignore bind fstab entries, as we ignore bind mounts anyway */
+ if (hasmntopt (mntent, "bind"))
+ continue;
+#endif
+
mount_entry = g_new0 (GUnixMountPoint, 1);
mount_entry->mount_path = g_strdup (mntent->mnt_dir);
if (strcmp (mntent->mnt_fsname, "/dev/root") == 0)
/**
* g_unix_mount_free:
- * @mount_entry: a #GUnixMount.
+ * @mount_entry: a #GUnixMountEntry.
*
* Frees a unix mount.
*/
}
static const char *
-type_to_icon (GUnixMountType type, gboolean is_mount_point)
+type_to_icon (GUnixMountType type, gboolean is_mount_point, gboolean use_symbolic)
{
const char *icon_name;
{
case G_UNIX_MOUNT_TYPE_HD:
if (is_mount_point)
- icon_name = "drive-removable-media";
+ icon_name = use_symbolic ? "drive-removable-media-symbolic" : "drive-removable-media";
else
- icon_name = "drive-harddisk";
+ icon_name = use_symbolic ? "drive-harddisk-symbolic" : "drive-harddisk";
break;
case G_UNIX_MOUNT_TYPE_FLOPPY:
case G_UNIX_MOUNT_TYPE_ZIP:
case G_UNIX_MOUNT_TYPE_JAZ:
if (is_mount_point)
- icon_name = "drive-removable-media";
+ icon_name = use_symbolic ? "drive-removable-media-symbolic" : "drive-removable-media";
else
- icon_name = "media-floppy";
+ icon_name = use_symbolic ? "media-removable-symbolic" : "media-floppy";
break;
case G_UNIX_MOUNT_TYPE_CDROM:
if (is_mount_point)
- icon_name = "drive-optical";
+ icon_name = use_symbolic ? "drive-optical-symbolic" : "drive-optical";
else
- icon_name = "media-optical";
+ icon_name = use_symbolic ? "media-optical-symbolic" : "media-optical";
break;
case G_UNIX_MOUNT_TYPE_NFS:
- /* TODO: Would like a better icon here... */
- if (is_mount_point)
- icon_name = "drive-removable-media";
- else
- icon_name = "drive-harddisk";
+ icon_name = use_symbolic ? "folder-remote-symbolic" : "folder-remote";
break;
case G_UNIX_MOUNT_TYPE_MEMSTICK:
if (is_mount_point)
- icon_name = "drive-removable-media";
+ icon_name = use_symbolic ? "drive-removable-media-symbolic" : "drive-removable-media";
else
- icon_name = "media-flash";
+ icon_name = use_symbolic ? "media-removable-symbolic" : "media-flash";
break;
case G_UNIX_MOUNT_TYPE_CAMERA:
if (is_mount_point)
- icon_name = "drive-removable-media";
+ icon_name = use_symbolic ? "drive-removable-media-symbolic" : "drive-removable-media";
else
- icon_name = "camera-photo";
+ icon_name = use_symbolic ? "camera-photo-symbolic" : "camera-photo";
break;
case G_UNIX_MOUNT_TYPE_IPOD:
if (is_mount_point)
- icon_name = "drive-removable-media";
+ icon_name = use_symbolic ? "drive-removable-media-symbolic" : "drive-removable-media";
else
- icon_name = "multimedia-player";
+ icon_name = use_symbolic ? "multimedia-player-symbolic" : "multimedia-player";
break;
case G_UNIX_MOUNT_TYPE_UNKNOWN:
default:
if (is_mount_point)
- icon_name = "drive-removable-media";
+ icon_name = use_symbolic ? "drive-removable-media-symbolic" : "drive-removable-media";
else
- icon_name = "drive-harddisk";
+ icon_name = use_symbolic ? "drive-harddisk-symbolic" : "drive-harddisk";
break;
}
GIcon *
g_unix_mount_guess_icon (GUnixMountEntry *mount_entry)
{
- return g_themed_icon_new_with_default_fallbacks (type_to_icon (g_unix_mount_guess_type (mount_entry), FALSE));
+ return g_themed_icon_new_with_default_fallbacks (type_to_icon (g_unix_mount_guess_type (mount_entry), FALSE, FALSE));
+}
+
+/**
+ * g_unix_mount_guess_symbolic_icon:
+ * @mount_entry: a #GUnixMountEntry
+ *
+ * Guesses the symbolic icon of a Unix mount.
+ *
+ * Returns: (transfer full): a #GIcon
+ *
+ * Since: 2.34
+ */
+GIcon *
+g_unix_mount_guess_symbolic_icon (GUnixMountEntry *mount_entry)
+{
+ return g_themed_icon_new_with_default_fallbacks (type_to_icon (g_unix_mount_guess_type (mount_entry), FALSE, TRUE));
}
/**
GIcon *
g_unix_mount_point_guess_icon (GUnixMountPoint *mount_point)
{
- return g_themed_icon_new_with_default_fallbacks (type_to_icon (g_unix_mount_point_guess_type (mount_point), TRUE));
+ return g_themed_icon_new_with_default_fallbacks (type_to_icon (g_unix_mount_point_guess_type (mount_point), TRUE, FALSE));
+}
+
+/**
+ * g_unix_mount_point_guess_symbolic_icon:
+ * @mount_point: a #GUnixMountPoint
+ *
+ * Guesses the symbolic icon of a Unix mount point.
+ *
+ * Returns: (transfer full): a #GIcon
+ *
+ * Since: 2.34
+ */
+GIcon *
+g_unix_mount_point_guess_symbolic_icon (GUnixMountPoint *mount_point)
+{
+ return g_themed_icon_new_with_default_fallbacks (type_to_icon (g_unix_mount_point_guess_type (mount_point), TRUE, TRUE));
}
/**
g_unix_mount_guess_should_display (GUnixMountEntry *mount_entry)
{
const char *mount_path;
+ const gchar *user_name;
+ gsize user_name_len;
/* Never display internal mountpoints */
if (g_unix_mount_is_system_internal (mount_entry))
return FALSE;
/* Only display things in /media (which are generally user mountable)
- and home dir (fuse stuff) and $XDG_RUNTIME_DIR */
+ and home dir (fuse stuff) and /run/media/$USER */
mount_path = mount_entry->mount_path;
if (mount_path != NULL)
{
if (g_strstr_len (mount_path, -1, "/.") != NULL)
return FALSE;
- if (g_getenv ("XDG_RUNTIME_DIR") != NULL && g_str_has_prefix (mount_path, g_get_user_runtime_dir ()))
+ /* Check /run/media/$USER/ */
+ user_name = g_get_user_name ();
+ user_name_len = strlen (user_name);
+ if (strncmp (mount_path, "/run/media/", sizeof ("/run/media/") - 1) == 0 &&
+ strncmp (mount_path + sizeof ("/run/media/") - 1, user_name, user_name_len) == 0 &&
+ mount_path[sizeof ("/run/media/") - 1 + user_name_len] == '/')
is_in_runtime_dir = TRUE;
if (is_in_runtime_dir || g_str_has_prefix (mount_path, "/media/"))
{
dev_t root_dev = statbuf.st_dev;
FILE *f;
- char buf[1024];
/* see if device with similar major:minor as /dev/root is mention
* in /etc/mtab (it usually is)
struct mntent *entp;
#ifdef HAVE_GETMNTENT_R
struct mntent ent;
+ char buf[1024];
while ((entp = getmntent_r (f, &ent, buf, sizeof (buf))) != NULL)
{
#else