13ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
23ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
33781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/* GIO - GLib Input, Output and Streaming Library
43781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
53781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Copyright (C) 2006-2007 Red Hat, Inc.
63781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
73781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * This library is free software; you can redistribute it and/or
83781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * modify it under the terms of the GNU Lesser General Public
93781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * License as published by the Free Software Foundation; either
103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * version 2 of the License, or (at your option) any later version.
113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * This library is distributed in the hope that it will be useful,
133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * but WITHOUT ANY WARRANTY; without even the implied warranty of
143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Lesser General Public License for more details.
163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * You should have received a copy of the GNU Lesser General
183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Public License along with this library; if not, write to the
193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Boston, MA 02111-1307, USA.
213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Author: Alexander Larsson <alexl@redhat.com>
233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson */
243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
25761424465aaad736916b029383483b6ac419d831Johan Dahlin#include "config.h"
263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/types.h>
283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/stat.h>
293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/wait.h>
303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifndef HAVE_SYSCTLBYNAME
313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_SYS_PARAM_H
323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/param.h>
333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_SYS_POLL_H
353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/poll.h>
363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_POLL_H
393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <poll.h>
403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
418c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson#if HAVE_SYS_STATVFS_H
428c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson#include <sys/statvfs.h>
438c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson#endif
443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <stdio.h>
453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <unistd.h>
463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/time.h>
473781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <errno.h>
483781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <string.h>
493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <signal.h>
5027dba4c28b9276a4ce3c67e1777fa259931b1d82David Zeuthen#include <gstdio.h>
518c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson#include <dirent.h>
523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include "gunixmounts.h"
543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include "gfile.h"
553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include "gfilemonitor.h"
563ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen#include "glibintl.h"
573ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen#include "gthemedicon.h"
583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
597f3280230bc9448a5750fc17a6eabef691ba25f4Alexander Larsson#include "gioalias.h"
607f3280230bc9448a5750fc17a6eabef691ba25f4Alexander Larsson
613ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthenstatic const char *_resolve_dev_root (void);
623ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
635247f12f3649726471080440de0d37b78c1cec33Andrew Walton/**
645247f12f3649726471080440de0d37b78c1cec33Andrew Walton * SECTION:gunixmounts
650debd52858ffb4f468e55cd2f3c7e4dec5455b94Matthias Clasen * @include: gio/gunixmounts.h
665247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @short_description: Unix Mounts
675247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
685247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Routines for managing mounted UNIX mount points and paths.
695247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
70782fe440ef9a9c8e7a8379249779b294d9552a23Matthias Clasen * Note that <filename>&lt;gio/gunixmounts.h&gt;</filename> belongs to the
71782fe440ef9a9c8e7a8379249779b294d9552a23Matthias Clasen * UNIX-specific GIO interfaces, thus you have to use the
72782fe440ef9a9c8e7a8379249779b294d9552a23Matthias Clasen * <filename>gio-unix-2.0.pc</filename> pkg-config file when using it.
73782fe440ef9a9c8e7a8379249779b294d9552a23Matthias Clasen */
745247f12f3649726471080440de0d37b78c1cec33Andrew Walton
75f5063650794c987868830241a630993e624eabd9Alexander Larsson/*
763ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * GUnixMountType:
773ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @G_UNIX_MOUNT_TYPE_UNKNOWN: Unknown UNIX mount type.
783ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @G_UNIX_MOUNT_TYPE_FLOPPY: Floppy disk UNIX mount type.
793ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @G_UNIX_MOUNT_TYPE_CDROM: CDROM UNIX mount type.
803ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @G_UNIX_MOUNT_TYPE_NFS: Network File System (NFS) UNIX mount type.
813ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @G_UNIX_MOUNT_TYPE_ZIP: ZIP UNIX mount type.
823ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @G_UNIX_MOUNT_TYPE_JAZ: JAZZ UNIX mount type.
833ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @G_UNIX_MOUNT_TYPE_MEMSTICK: Memory Stick UNIX mount type.
843ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @G_UNIX_MOUNT_TYPE_CF: Compact Flash UNIX mount type.
853ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @G_UNIX_MOUNT_TYPE_SM: Smart Media UNIX mount type.
863ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @G_UNIX_MOUNT_TYPE_SDMMC: SD/MMC UNIX mount type.
873ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @G_UNIX_MOUNT_TYPE_IPOD: iPod UNIX mount type.
883ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @G_UNIX_MOUNT_TYPE_CAMERA: Digital camera UNIX mount type.
893ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @G_UNIX_MOUNT_TYPE_HD: Hard drive UNIX mount type.
903ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen *
913ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * Types of UNIX mounts.
923ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen **/
933ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthentypedef enum {
943ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  G_UNIX_MOUNT_TYPE_UNKNOWN,
953ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  G_UNIX_MOUNT_TYPE_FLOPPY,
963ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  G_UNIX_MOUNT_TYPE_CDROM,
973ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  G_UNIX_MOUNT_TYPE_NFS,
983ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  G_UNIX_MOUNT_TYPE_ZIP,
993ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  G_UNIX_MOUNT_TYPE_JAZ,
1003ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  G_UNIX_MOUNT_TYPE_MEMSTICK,
1013ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  G_UNIX_MOUNT_TYPE_CF,
1023ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  G_UNIX_MOUNT_TYPE_SM,
1033ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  G_UNIX_MOUNT_TYPE_SDMMC,
1043ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  G_UNIX_MOUNT_TYPE_IPOD,
1053ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  G_UNIX_MOUNT_TYPE_CAMERA,
1063ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  G_UNIX_MOUNT_TYPE_HD
1073ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen} GUnixMountType;
1083ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
1093ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthenstruct _GUnixMountEntry {
1103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *mount_path;
1113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *device_path;
1123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *filesystem_type;
1133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  gboolean is_read_only;
1143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  gboolean is_system_internal;
1153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson};
1163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1173781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstruct _GUnixMountPoint {
1183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *mount_path;
1193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *device_path;
1203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *filesystem_type;
1213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  gboolean is_read_only;
1223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  gboolean is_user_mountable;
1233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  gboolean is_loopback;
1243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson};
1253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1263781343738de4abddf56982325a77bd70a98cd26Alexander Larssonenum {
1273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  MOUNTS_CHANGED,
1283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  MOUNTPOINTS_CHANGED,
1293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  LAST_SIGNAL
1303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson};
1313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1323781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic guint signals[LAST_SIGNAL];
1333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1343781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstruct _GUnixMountMonitor {
1353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GObject parent;
1363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GFileMonitor *fstab_monitor;
1383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GFileMonitor *mtab_monitor;
1393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson};
1403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1413781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstruct _GUnixMountMonitorClass {
1423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GObjectClass parent_class;
1433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson};
1443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1453781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GUnixMountMonitor *the_mount_monitor = NULL;
1463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1473781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GList *_g_get_unix_mounts (void);
1483781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GList *_g_get_unix_mount_points (void);
1493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1503781343738de4abddf56982325a77bd70a98cd26Alexander LarssonG_DEFINE_TYPE (GUnixMountMonitor, g_unix_mount_monitor, G_TYPE_OBJECT);
1513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#define MOUNT_POLL_INTERVAL 4000
1533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_SYS_MNTTAB_H
1553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#define MNTOPT_RO	"ro"
1563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
1573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_MNTENT_H
1593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <mntent.h>
1603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#elif defined (HAVE_SYS_MNTTAB_H)
1613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/mnttab.h>
1623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
1633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_SYS_VFSTAB_H
1653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/vfstab.h>
1663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
1673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#if defined(HAVE_SYS_MNTCTL_H) && defined(HAVE_SYS_VMOUNT_H) && defined(HAVE_SYS_VFS_H)
1693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/mntctl.h>
1703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/vfs.h>
1713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/vmount.h>
1723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <fshelp.h>
1733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
1743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#if defined(HAVE_GETMNTINFO) && defined(HAVE_FSTAB_H) && defined(HAVE_SYS_MOUNT_H)
1763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/ucred.h>
1773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/mount.h>
1783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <fstab.h>
1793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_SYS_SYSCTL_H
1803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <sys/sysctl.h>
1813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
1823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
1833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifndef HAVE_SETMNTENT
1853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#define setmntent(f,m) fopen(f,m)
1863781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
1873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifndef HAVE_ENDMNTENT
1883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#define endmntent(f) fclose(f)
1893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
1903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1913781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic gboolean
1923781343738de4abddf56982325a77bd70a98cd26Alexander Larssonis_in (const char *value, const char *set[])
1933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
1943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  int i;
1953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  for (i = 0; set[i] != NULL; i++)
1963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
1973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (strcmp (set[i], value) == 0)
1983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	return TRUE;
1993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
2003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return FALSE;
2013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
2023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2033ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen/**
2043ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * g_unix_is_mount_path_system_internal:
205f5d2feddf6311492ea9f7124d73d2997db0ca123Matthias Clasen * @mount_path: a mount path, e.g. <filename>/media/disk</filename>
206f5d2feddf6311492ea9f7124d73d2997db0ca123Matthias Clasen *    or <filename>/usr</filename>
2073ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen *
2083ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * Determines if @mount_path is considered an implementation of the
2093ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * OS. This is primarily used for hiding mountable and mounted volumes
2103ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * that only are used in the OS and has little to no relevance to the
2113ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * casual user.
2123ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen *
213f5d2feddf6311492ea9f7124d73d2997db0ca123Matthias Clasen * Returns: %TRUE if @mount_path is considered an implementation detail
214f5d2feddf6311492ea9f7124d73d2997db0ca123Matthias Clasen *     of the OS.
2153ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen **/
2163ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthengboolean
2173ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeutheng_unix_is_mount_path_system_internal (const char *mount_path)
2183ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen{
2193ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  const char *ignore_mountpoints[] = {
2203ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    /* Includes all FHS 2.3 toplevel dirs and other specilized
2213ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen     * directories that we want to hide from the user.
2223ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen     */
2233ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/",              /* we already have "Filesystem root" in Nautilus */
2243ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/bin",
2253ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/boot",
2263ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/dev",
2273ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/etc",
2283ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/home",
2293ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/lib",
2303ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/lib64",
2313ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/media",
2323ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/mnt",
2333ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/opt",
2343ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/root",
2353ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/sbin",
2363ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/srv",
2373ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/tmp",
2383ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/usr",
239246e2e71a91f028e0657d8f0dca489928b4f2750Alexander Larsson    "/usr/local",
2403ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/var",
2413ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/var/log/audit", /* https://bugzilla.redhat.com/show_bug.cgi?id=333041 */
2423ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/var/tmp",       /* https://bugzilla.redhat.com/show_bug.cgi?id=335241 */
2433ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/proc",
2443ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/sbin",
2453ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    "/net",
2463ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    NULL
2473ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  };
2483ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
2493ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  if (is_in (mount_path, ignore_mountpoints))
2503ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    return TRUE;
2513ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
2523ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  if (g_str_has_prefix (mount_path, "/dev") ||
2533ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      g_str_has_prefix (mount_path, "/proc") ||
2543ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      g_str_has_prefix (mount_path, "/sys"))
2553ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    return TRUE;
2563ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
2573ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  if (strstr (mount_path, "/.gvfs") != NULL)
2583ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    return TRUE;
2593ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
2603ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  return FALSE;
2613ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen}
2623ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
2633781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic gboolean
2643781343738de4abddf56982325a77bd70a98cd26Alexander Larssonguess_system_internal (const char *mountpoint,
2653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		       const char *fs,
2663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		       const char *device)
2673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
2683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  const char *ignore_fs[] = {
2693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "auto",
2703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "autofs",
2713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "devfs",
2723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "devpts",
273c7d37fca345edb23c3b258041140834d80b534a3Matthias Clasen    "ecryptfs",
2743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "kernfs",
2753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "linprocfs",
2763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "proc",
2773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "procfs",
2783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "ptyfs",
2793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "rootfs",
2803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "selinuxfs",
2813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "sysfs",
2823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "tmpfs",
2833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "usbfs",
2843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "nfsd",
2857fe31089ff6d2885197fa1d0d9e340eabc779be6Frederic Crozat    "rpc_pipefs",
2864cafadc955d1c37118ca269ea22bbd37f8f2a2cePadraig O'Briain    "zfs",
2873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    NULL
2883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  };
2893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  const char *ignore_devices[] = {
2903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "none",
2913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "sunrpc",
2923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "devpts",
2933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "nfsd",
2943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "/dev/loop",
2953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    "/dev/vn",
2963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    NULL
2973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  };
2983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (is_in (fs, ignore_fs))
3003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return TRUE;
3013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (is_in (device, ignore_devices))
3033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return TRUE;
3043781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3053ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  if (g_unix_is_mount_path_system_internal (mountpoint))
3063781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return TRUE;
3073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return FALSE;
3093781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
3103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_MNTENT_H
3123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3133781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic char *
3143781343738de4abddf56982325a77bd70a98cd26Alexander Larssonget_mtab_read_file (void)
3153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
3163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef _PATH_MOUNTED
3173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson# ifdef __linux__
3183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return "/proc/mounts";
3193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson# else
3203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return _PATH_MOUNTED;
3213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson# endif
3223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#else
3233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return "/etc/mtab";
3243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
3253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
3263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3273781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic char *
3283781343738de4abddf56982325a77bd70a98cd26Alexander Larssonget_mtab_monitor_file (void)
3293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
3303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef _PATH_MOUNTED
3313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return _PATH_MOUNTED;
3323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#else
3333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return "/etc/mtab";
3343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
3353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
3363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3370766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#ifndef HAVE_GETMNTENT_R
3383781343738de4abddf56982325a77bd70a98cd26Alexander LarssonG_LOCK_DEFINE_STATIC(getmntent);
3390766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#endif
3403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3413781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GList *
342b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen_g_get_unix_mounts (void)
3433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
3440766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#ifdef HAVE_GETMNTENT_R
3450766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen  struct mntent ent;
3460766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen  char buf[1024];
3470766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#endif
3483781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  struct mntent *mntent;
3493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  FILE *file;
3503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *read_file;
3513ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  GUnixMountEntry *mount_entry;
3523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GHashTable *mounts_hash;
3533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GList *return_list;
3543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  read_file = get_mtab_read_file ();
3563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  file = setmntent (read_file, "r");
3583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (file == NULL)
3593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return NULL;
3603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return_list = NULL;
3623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  mounts_hash = g_hash_table_new (g_str_hash, g_str_equal);
3643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3650766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#ifdef HAVE_GETMNTENT_R
3660766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen  while ((mntent = getmntent_r (file, &ent, buf, sizeof (buf))) != NULL)
3670766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#else
3683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  G_LOCK (getmntent);
3693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  while ((mntent = getmntent (file)) != NULL)
3700766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#endif
3713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
3723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      /* ignore any mnt_fsname that is repeated and begins with a '/'
3733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson       *
3743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson       * We do this to avoid being fooled by --bind mounts, since
3753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson       * these have the same device as the location they bind to.
376f5483302757a9c03c43e25c86cea4a7bd5aaaf3fMatthias Clasen       * It's not an ideal solution to the problem, but it's likely that
3773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson       * the most important mountpoint is first and the --bind ones after
3783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson       * that aren't as important. So it should work.
3793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson       *
3803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson       * The '/' is to handle procfs, tmpfs and other no device mounts.
3813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson       */
3823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (mntent->mnt_fsname != NULL &&
3833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  mntent->mnt_fsname[0] == '/' &&
3843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  g_hash_table_lookup (mounts_hash, mntent->mnt_fsname))
3853ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        continue;
3863781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3873ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      mount_entry = g_new0 (GUnixMountEntry, 1);
3883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->mount_path = g_strdup (mntent->mnt_dir);
3893ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      if (strcmp (mntent->mnt_fsname, "/dev/root") == 0)
3903ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        mount_entry->device_path = g_strdup (_resolve_dev_root ());
3913ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      else
3923ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        mount_entry->device_path = g_strdup (mntent->mnt_fsname);
3933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->filesystem_type = g_strdup (mntent->mnt_type);
3943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
3953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#if defined (HAVE_HASMNTOPT)
3963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (hasmntopt (mntent, MNTOPT_RO) != NULL)
3973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	mount_entry->is_read_only = TRUE;
3983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
3993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->is_system_internal =
4013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	guess_system_internal (mount_entry->mount_path,
4023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			       mount_entry->filesystem_type,
4033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			       mount_entry->device_path);
4043781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4053781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_hash_table_insert (mounts_hash,
4063781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			   mount_entry->device_path,
4073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			   mount_entry->device_path);
4083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4093781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      return_list = g_list_prepend (return_list, mount_entry);
4103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
4113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_hash_table_destroy (mounts_hash);
4123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  endmntent (file);
4143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4150766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#ifndef HAVE_GETMNTENT_R
4163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  G_UNLOCK (getmntent);
4170766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#endif
4183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return g_list_reverse (return_list);
4203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
4213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#elif defined (HAVE_SYS_MNTTAB_H)
4233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4243781343738de4abddf56982325a77bd70a98cd26Alexander LarssonG_LOCK_DEFINE_STATIC(getmntent);
4253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4263781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic char *
4273781343738de4abddf56982325a77bd70a98cd26Alexander Larssonget_mtab_read_file (void)
4283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
4293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef _PATH_MOUNTED
4303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return _PATH_MOUNTED;
4313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#else
4323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return "/etc/mnttab";
4333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
4343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
4353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4363781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic char *
4373781343738de4abddf56982325a77bd70a98cd26Alexander Larssonget_mtab_monitor_file (void)
4383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
4393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return get_mtab_read_file ();
4403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
4413781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4423781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GList *
4433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson_g_get_unix_mounts (void)
4443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
4453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  struct mnttab mntent;
4463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  FILE *file;
4473781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *read_file;
4483ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  GUnixMountEntry *mount_entry;
4493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GList *return_list;
4503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  read_file = get_mtab_read_file ();
4523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  file = setmntent (read_file, "r");
4543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (file == NULL)
4553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return NULL;
4563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return_list = NULL;
4583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  G_LOCK (getmntent);
4603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  while (! getmntent (file, &mntent))
4613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
4623ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      mount_entry = g_new0 (GUnixMountEntry, 1);
4633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->mount_path = g_strdup (mntent.mnt_mountp);
4653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->device_path = g_strdup (mntent.mnt_special);
4663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->filesystem_type = g_strdup (mntent.mnt_fstype);
4673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#if defined (HAVE_HASMNTOPT)
4693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (hasmntopt (&mntent, MNTOPT_RO) != NULL)
4703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	mount_entry->is_read_only = TRUE;
4713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
4723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->is_system_internal =
4743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	guess_system_internal (mount_entry->mount_path,
4753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			       mount_entry->filesystem_type,
4763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			       mount_entry->device_path);
4773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      return_list = g_list_prepend (return_list, mount_entry);
4793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
4803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  endmntent (file);
4823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  G_UNLOCK (getmntent);
4843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return g_list_reverse (return_list);
4863781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
4873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#elif defined(HAVE_SYS_MNTCTL_H) && defined(HAVE_SYS_VMOUNT_H) && defined(HAVE_SYS_VFS_H)
4893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4903781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic char *
4913781343738de4abddf56982325a77bd70a98cd26Alexander Larssonget_mtab_monitor_file (void)
4923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
4933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return NULL;
4943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
4953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
4963781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GList *
4973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson_g_get_unix_mounts (void)
4983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
4993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  struct vfs_ent *fs_info;
5003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  struct vmount *vmount_info;
5013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  int vmount_number;
5023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  unsigned int vmount_size;
5033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  int current;
5043781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GList *return_list;
5053781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5063781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (mntctl (MCTL_QUERY, sizeof (vmount_size), &vmount_size) != 0)
5073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
5083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_warning ("Unable to know the number of mounted volumes\n");
5093781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      return NULL;
5113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
5123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  vmount_info = (struct vmount*)g_malloc (vmount_size);
5143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  vmount_number = mntctl (MCTL_QUERY, vmount_size, vmount_info);
5163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (vmount_info->vmt_revision != VMT_REVISION)
5183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    g_warning ("Bad vmount structure revision number, want %d, got %d\n", VMT_REVISION, vmount_info->vmt_revision);
5193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (vmount_number < 0)
5213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
5223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_warning ("Unable to recover mounted volumes information\n");
5233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_free (vmount_info);
5253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      return NULL;
5263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
5273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return_list = NULL;
5293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  while (vmount_number > 0)
5303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
5313ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      mount_entry = g_new0 (GUnixMountEntry, 1);
5323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->device_path = g_strdup (vmt2dataptr (vmount_info, VMT_OBJECT));
5343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->mount_path = g_strdup (vmt2dataptr (vmount_info, VMT_STUB));
5353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      /* is_removable = (vmount_info->vmt_flags & MNT_REMOVABLE) ? 1 : 0; */
5363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->is_read_only = (vmount_info->vmt_flags & MNT_READONLY) ? 1 : 0;
5373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      fs_info = getvfsbytype (vmount_info->vmt_gfstype);
5393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (fs_info == NULL)
5413781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	mount_entry->filesystem_type = g_strdup ("unknown");
5423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else
5433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	mount_entry->filesystem_type = g_strdup (fs_info->vfsent_name);
5443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->is_system_internal =
5463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	guess_system_internal (mount_entry->mount_path,
5473781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			       mount_entry->filesystem_type,
5483781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			       mount_entry->device_path);
5493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      return_list = g_list_prepend (return_list, mount_entry);
5513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      vmount_info = (struct vmount *)( (char*)vmount_info
5533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson				       + vmount_info->vmt_length);
5543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      vmount_number--;
5553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
5563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_free (vmount_info);
5583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return g_list_reverse (return_list);
5603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
5613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#elif defined(HAVE_GETMNTINFO) && defined(HAVE_FSTAB_H) && defined(HAVE_SYS_MOUNT_H)
5633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5643781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic char *
5653781343738de4abddf56982325a77bd70a98cd26Alexander Larssonget_mtab_monitor_file (void)
5663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
5673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return NULL;
5683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
5693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5703781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GList *
5713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson_g_get_unix_mounts (void)
5723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
5733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  struct statfs *mntent = NULL;
5743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  int num_mounts, i;
5753ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  GUnixMountEntry *mount_entry;
5763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GList *return_list;
5773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  /* Pass MNT_NOWAIT to avoid blocking trying to update NFS mounts. */
5793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if ((num_mounts = getmntinfo (&mntent, MNT_NOWAIT)) == 0)
5803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return NULL;
5813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return_list = NULL;
5833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  for (i = 0; i < num_mounts; i++)
5853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
5863ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      mount_entry = g_new0 (GUnixMountEntry, 1);
5873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->mount_path = g_strdup (mntent[i].f_mntonname);
5893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->device_path = g_strdup (mntent[i].f_mntfromname);
5903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->filesystem_type = g_strdup (mntent[i].f_fstypename);
5913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (mntent[i].f_flags & MNT_RDONLY)
5923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	mount_entry->is_read_only = TRUE;
5933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->is_system_internal =
5953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	guess_system_internal (mount_entry->mount_path,
5963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			       mount_entry->filesystem_type,
5973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			       mount_entry->device_path);
5983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
5993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      return_list = g_list_prepend (return_list, mount_entry);
6003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
6013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
6023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return g_list_reverse (return_list);
6033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
6048c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson#elif defined(__INTERIX)
6058c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson
6068c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larssonstatic char *
6078c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larssonget_mtab_monitor_file (void)
6088c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson{
6098c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson  return NULL;
6108c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson}
6118c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson
6128c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larssonstatic GList *
6138c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson_g_get_unix_mounts (void)
6148c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson{
6158c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson  DIR *dirp;
6168c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson  GList* return_list = NULL;
6178c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson  char filename[9 + NAME_MAX];
6188c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson
6198c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson  dirp = opendir ("/dev/fs");
6208c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson  if (!dirp)
6218c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson    {
6228c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson      g_warning ("unable to read /dev/fs!");
6238c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson      return NULL;
6248c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson    }
6258c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson
6268c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson  while (1)
6278c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson    {
6288c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson      struct statvfs statbuf;
6298c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson      struct dirent entry;
6308c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson      struct dirent* result;
6318c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson
6328c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson      if (readdir_r (dirp, &entry, &result) || result == NULL)
6338c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson        break;
6348c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson
6358c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson      strcpy (filename, "/dev/fs/");
6368c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson      strcat (filename, entry.d_name);
6378c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson
6388c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson      if (statvfs (filename, &statbuf) == 0)
6398c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson        {
6408c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson          GUnixMountEntry* mount_entry = g_new0(GUnixMountEntry, 1);
6418c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson
6428c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson          mount_entry->mount_path = g_strdup (statbuf.f_mntonname);
6438c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson          mount_entry->device_path = g_strdup (statbuf.f_mntfromname);
6448c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson          mount_entry->filesystem_type = g_strdup (statbuf.f_fstypename);
6458c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson
6468c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson          if (statbuf.f_flag & ST_RDONLY)
6478c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson            mount_entry->is_read_only = TRUE;
6488c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson
6498c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson          return_list = g_list_prepend(return_list, mount_entry);
6508c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson        }
6518c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson    }
6528c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson
6538c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson  return_list = g_list_reverse (return_list);
6548c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson
6558c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson  closedir (dirp);
6568c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson
6578c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson  return return_list;
6588c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson}
6593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#else
6603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#error No _g_get_unix_mounts() implementation for system
6613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
6623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
6633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/* _g_get_unix_mount_points():
6643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * read the fstab.
6653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * don't return swap and ignore mounts.
6663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson */
6673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
6683781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic char *
6693781343738de4abddf56982325a77bd70a98cd26Alexander Larssonget_fstab_file (void)
6703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
6713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#if defined(HAVE_SYS_MNTCTL_H) && defined(HAVE_SYS_VMOUNT_H) && defined(HAVE_SYS_VFS_H)
6723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  /* AIX */
6733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return "/etc/filesystems";
6743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#elif defined(_PATH_MNTTAB)
6753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return _PATH_MNTTAB;
6763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#elif defined(VFSTAB)
6773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return VFSTAB;
6783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#else
6793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return "/etc/fstab";
6803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
6813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
6823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
6833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_MNTENT_H
6843781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GList *
6853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson_g_get_unix_mount_points (void)
6863781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
6870766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#ifdef HAVE_GETMNTENT_R
6880766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen  struct mntent ent;
6890766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen  char buf[1024];
6900766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#endif
6913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  struct mntent *mntent;
6923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  FILE *file;
6933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *read_file;
6943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GUnixMountPoint *mount_entry;
6953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GList *return_list;
6963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
6973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  read_file = get_fstab_file ();
6983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
6993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  file = setmntent (read_file, "r");
7003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (file == NULL)
7013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return NULL;
7023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return_list = NULL;
7043781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7050766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#ifdef HAVE_GETMNTENT_R
7060766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen  while ((mntent = getmntent_r (file, &ent, buf, sizeof (buf))) != NULL)
7070766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#else
7083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  G_LOCK (getmntent);
7093781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  while ((mntent = getmntent (file)) != NULL)
7100766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#endif
7113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
7123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if ((strcmp (mntent->mnt_dir, "ignore") == 0) ||
7133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  (strcmp (mntent->mnt_dir, "swap") == 0))
7143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	continue;
7153ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
7163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry = g_new0 (GUnixMountPoint, 1);
7173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->mount_path = g_strdup (mntent->mnt_dir);
7183ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      if (strcmp (mntent->mnt_fsname, "/dev/root") == 0)
7193ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        mount_entry->device_path = g_strdup (_resolve_dev_root ());
7203ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      else
7213ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        mount_entry->device_path = g_strdup (mntent->mnt_fsname);
7223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->filesystem_type = g_strdup (mntent->mnt_type);
7233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_HASMNTOPT
7253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (hasmntopt (mntent, MNTOPT_RO) != NULL)
7263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	mount_entry->is_read_only = TRUE;
7273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (hasmntopt (mntent, "loop") != NULL)
7293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	mount_entry->is_loopback = TRUE;
7303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
7323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if ((mntent->mnt_type != NULL && strcmp ("supermount", mntent->mnt_type) == 0)
7343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_HASMNTOPT
7353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  || (hasmntopt (mntent, "user") != NULL
7363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	      && hasmntopt (mntent, "user") != hasmntopt (mntent, "user_xattr"))
7373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  || hasmntopt (mntent, "pamconsole") != NULL
7383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  || hasmntopt (mntent, "users") != NULL
7393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  || hasmntopt (mntent, "owner") != NULL
7403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
7413781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  )
7423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	mount_entry->is_user_mountable = TRUE;
7433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      return_list = g_list_prepend (return_list, mount_entry);
7453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
7463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7473781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  endmntent (file);
7480766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen
7490766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#ifndef HAVE_GETMNTENT_R
7503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  G_UNLOCK (getmntent);
7510766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#endif
7523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return g_list_reverse (return_list);
7543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
7553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#elif defined (HAVE_SYS_MNTTAB_H)
7573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7583781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GList *
7593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson_g_get_unix_mount_points (void)
7603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
7613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  struct mnttab mntent;
7623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  FILE *file;
7633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *read_file;
7643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GUnixMountPoint *mount_entry;
7653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GList *return_list;
7663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  read_file = get_fstab_file ();
7683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  file = setmntent (read_file, "r");
7703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (file == NULL)
7713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return NULL;
7723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return_list = NULL;
7743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  G_LOCK (getmntent);
7763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  while (! getmntent (file, &mntent))
7773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
7783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if ((strcmp (mntent.mnt_mountp, "ignore") == 0) ||
7793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  (strcmp (mntent.mnt_mountp, "swap") == 0))
7803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	continue;
7813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry = g_new0 (GUnixMountPoint, 1);
7833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->mount_path = g_strdup (mntent.mnt_mountp);
7853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->device_path = g_strdup (mntent.mnt_special);
7863781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->filesystem_type = g_strdup (mntent.mnt_fstype);
7873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_HASMNTOPT
7893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (hasmntopt (&mntent, MNTOPT_RO) != NULL)
7903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	mount_entry->is_read_only = TRUE;
7913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (hasmntopt (&mntent, "lofs") != NULL)
7933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	mount_entry->is_loopback = TRUE;
7943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
7953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
7963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if ((mntent.mnt_fstype != NULL)
7973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_HASMNTOPT
7983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  || (hasmntopt (&mntent, "user") != NULL
7993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	      && hasmntopt (&mntent, "user") != hasmntopt (&mntent, "user_xattr"))
8003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  || hasmntopt (&mntent, "pamconsole") != NULL
8013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  || hasmntopt (&mntent, "users") != NULL
8023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  || hasmntopt (&mntent, "owner") != NULL
8033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
8043781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  )
8053781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	mount_entry->is_user_mountable = TRUE;
8063781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      return_list = g_list_prepend (return_list, mount_entry);
8083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
8093781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  endmntent (file);
8113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  G_UNLOCK (getmntent);
8123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return g_list_reverse (return_list);
8143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
8153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#elif defined(HAVE_SYS_MNTCTL_H) && defined(HAVE_SYS_VMOUNT_H) && defined(HAVE_SYS_VFS_H)
8163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/* functions to parse /etc/filesystems on aix */
8183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/* read character, ignoring comments (begin with '*', end with '\n' */
8203781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic int
8213781343738de4abddf56982325a77bd70a98cd26Alexander Larssonaix_fs_getc (FILE *fd)
8223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
8233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  int c;
8243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  while ((c = getc (fd)) == '*')
8263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
8273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      while (((c = getc (fd)) != '\n') && (c != EOF))
8283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	;
8293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
8303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
8313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/* eat all continuous spaces in a file */
8333781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic int
8343781343738de4abddf56982325a77bd70a98cd26Alexander Larssonaix_fs_ignorespace (FILE *fd)
8353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
8363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  int c;
8373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  while ((c = aix_fs_getc (fd)) != EOF)
8393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
8403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (!g_ascii_isspace (c))
8413781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	{
8423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  ungetc (c,fd);
8433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  return c;
8443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	}
8453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
8463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8473781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return EOF;
8483781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
8493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/* read one word from file */
8513781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic int
852a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasenaix_fs_getword (FILE *fd,
853a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasen                char *word)
8543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
8553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  int c;
8563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  aix_fs_ignorespace (fd);
8583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  while (((c = aix_fs_getc (fd)) != EOF) && !g_ascii_isspace (c))
8603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
8613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (c == '"')
8623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	{
8633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  while (((c = aix_fs_getc (fd)) != EOF) && (c != '"'))
8643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	    *word++ = c;
8653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  else
8663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	    *word++ = c;
8673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	}
8683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
8693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  *word = 0;
8703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return c;
8723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
8733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8743781343738de4abddf56982325a77bd70a98cd26Alexander Larssontypedef struct {
8753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char mnt_mount[PATH_MAX];
8763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char mnt_special[PATH_MAX];
8773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char mnt_fstype[16];
8783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char mnt_options[128];
8793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} AixMountTableEntry;
8803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/* read mount points properties */
8823781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic int
883a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasenaix_fs_get (FILE               *fd,
884a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasen            AixMountTableEntry *prop)
8853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
8863781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  static char word[PATH_MAX] = { 0 };
8873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char value[PATH_MAX];
8883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  /* read stanza */
8903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (word[0] == 0)
8913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
8923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (aix_fs_getword (fd, word) == EOF)
8933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	return EOF;
8943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
8953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  word[strlen(word) - 1] = 0;
8973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  strcpy (prop->mnt_mount, word);
8983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
8993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  /* read attributes and value */
9003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  while (aix_fs_getword (fd, word) != EOF)
9023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
9033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      /* test if is attribute or new stanza */
9043781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (word[strlen(word) - 1] == ':')
9053781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	return 0;
9063781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      /* read "=" */
9083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      aix_fs_getword (fd, value);
9093781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      /* read value */
9113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      aix_fs_getword (fd, value);
9123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (strcmp (word, "dev") == 0)
9143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	strcpy (prop->mnt_special, value);
9153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (strcmp (word, "vfs") == 0)
9163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	strcpy (prop->mnt_fstype, value);
9173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (strcmp (word, "options") == 0)
9183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	strcpy(prop->mnt_options, value);
9193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
9203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return 0;
9223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
9233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9243781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GList *
9253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson_g_get_unix_mount_points (void)
9263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
9273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  struct mntent *mntent;
9283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  FILE *file;
9293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *read_file;
9303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GUnixMountPoint *mount_entry;
9313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  AixMountTableEntry mntent;
9323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GList *return_list;
9333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  read_file = get_fstab_file ();
9353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  file = setmntent (read_file, "r");
9373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (file == NULL)
9383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return NULL;
9393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return_list = NULL;
9413781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  while (!aix_fs_get (file, &mntent))
9433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
9443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (strcmp ("cdrfs", mntent.mnt_fstype) == 0)
9453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	{
9463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  mount_entry = g_new0 (GUnixMountPoint, 1);
9473781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9483781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  mount_entry->mount_path = g_strdup (mntent.mnt_mount);
9493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  mount_entry->device_path = g_strdup (mntent.mnt_special);
9503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  mount_entry->filesystem_type = g_strdup (mntent.mnt_fstype);
9513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  mount_entry->is_read_only = TRUE;
9523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  mount_entry->is_user_mountable = TRUE;
9533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  return_list = g_list_prepend (return_list, mount_entry);
9553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	}
9563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
9573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  endmntent (file);
9593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return g_list_reverse (return_list);
9613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
9623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#elif defined(HAVE_GETMNTINFO) && defined(HAVE_FSTAB_H) && defined(HAVE_SYS_MOUNT_H)
9643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9653781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GList *
9663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson_g_get_unix_mount_points (void)
9673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
9683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  struct fstab *fstab = NULL;
9693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GUnixMountPoint *mount_entry;
9703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GList *return_list;
9713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_SYS_SYSCTL_H
9723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  int usermnt = 0;
9733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  size_t len = sizeof(usermnt);
9743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  struct stat sb;
9753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
9763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (!setfsent ())
9783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return NULL;
9793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return_list = NULL;
9813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_SYS_SYSCTL_H
9833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#if defined(HAVE_SYSCTLBYNAME)
9843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  sysctlbyname ("vfs.usermount", &usermnt, &len, NULL, 0);
9853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#elif defined(CTL_VFS) && defined(VFS_USERMOUNT)
9863781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  {
9873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    int mib[2];
9883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    mib[0] = CTL_VFS;
9903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    mib[1] = VFS_USERMOUNT;
9913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    sysctl (mib, 2, &usermnt, &len, NULL, 0);
9923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  }
9933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#elif defined(CTL_KERN) && defined(KERN_USERMOUNT)
9943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  {
9953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    int mib[2];
9963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
9973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    mib[0] = CTL_KERN;
9983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    mib[1] = KERN_USERMOUNT;
9993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    sysctl (mib, 2, &usermnt, &len, NULL, 0);
10003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  }
10013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
10023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
10033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10043781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  while ((fstab = getfsent ()) != NULL)
10053781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
10063781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (strcmp (fstab->fs_vfstype, "swap") == 0)
10073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	continue;
10083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10093781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry = g_new0 (GUnixMountPoint, 1);
10103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->mount_path = g_strdup (fstab->fs_file);
10123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->device_path = g_strdup (fstab->fs_spec);
10133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry->filesystem_type = g_strdup (fstab->fs_vfstype);
10143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (strcmp (fstab->fs_type, "ro") == 0)
10163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	mount_entry->is_read_only = TRUE;
10173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_SYS_SYSCTL_H
10193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (usermnt != 0)
10203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	{
10213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  uid_t uid = getuid ();
10223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  if (stat (fstab->fs_file, &sb) == 0)
10233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	    {
10243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	      if (uid == 0 || sb.st_uid == uid)
10253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		mount_entry->is_user_mountable = TRUE;
10263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	    }
10273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	}
10283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
10293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      return_list = g_list_prepend (return_list, mount_entry);
10313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
10323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  endfsent ();
10343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return g_list_reverse (return_list);
10363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
10378c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson#elif defined(__INTERIX)
10388c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larssonstatic GList *
10398c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson_g_get_unix_mount_points (void)
10408c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson{
10418c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson  return _g_get_unix_mounts ();
10428c6e7c103fc2ec1c80149b0d391b7c89e13d11cfAlexander Larsson}
10433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#else
10443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#error No g_get_mount_table() implementation for system
10453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif
10463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10473781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic guint64
10483781343738de4abddf56982325a77bd70a98cd26Alexander Larssonget_mounts_timestamp (void)
10493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
10503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  const char *monitor_file;
10513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  struct stat buf;
10523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  monitor_file = get_mtab_monitor_file ();
10543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (monitor_file)
10553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
10563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (stat (monitor_file, &buf) == 0)
10573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	return (guint64)buf.st_mtime;
10583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
10593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return 0;
10603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
10613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10623781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic guint64
10633781343738de4abddf56982325a77bd70a98cd26Alexander Larssonget_mount_points_timestamp (void)
10643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
10653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  const char *monitor_file;
10663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  struct stat buf;
10673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  monitor_file = get_fstab_file ();
10693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (monitor_file)
10703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
10713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (stat (monitor_file, &buf) == 0)
10723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	return (guint64)buf.st_mtime;
10733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
10743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return 0;
10753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
10763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
1078feb5258cf9ca9c3b3d9a58a98b1c6c75c822855aMatthias Clasen * g_unix_mounts_get:
10793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @time_read: guint64 to contain a timestamp.
10803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
1081442e8df1b833e3311a214ae1bf02337b0c831544Matthias Clasen * Gets a #GList of strings containing the unix mounts.
1082442e8df1b833e3311a214ae1bf02337b0c831544Matthias Clasen * If @time_read is set, it will be filled with the mount
1083442e8df1b833e3311a214ae1bf02337b0c831544Matthias Clasen * timestamp, allowing for checking if the mounts have changed
1084442e8df1b833e3311a214ae1bf02337b0c831544Matthias Clasen * with g_unix_mounts_changed_since().
10855247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
10865247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: a #GList of the UNIX mounts.
10873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson **/
10883781343738de4abddf56982325a77bd70a98cd26Alexander LarssonGList *
1089feb5258cf9ca9c3b3d9a58a98b1c6c75c822855aMatthias Claseng_unix_mounts_get (guint64 *time_read)
10903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
10913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (time_read)
10923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    *time_read = get_mounts_timestamp ();
10933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return _g_get_unix_mounts ();
10953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
10963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
10973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
1098feb5258cf9ca9c3b3d9a58a98b1c6c75c822855aMatthias Clasen * g_unix_mount_at:
10995247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @mount_path: path for a possible unix mount.
11003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @time_read: guint64 to contain a timestamp.
11013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
11023ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * Gets a #GUnixMountEntry for a given mount path. If @time_read
11035247f12f3649726471080440de0d37b78c1cec33Andrew Walton * is set, it will be filled with a unix timestamp for checking
11045247f12f3649726471080440de0d37b78c1cec33Andrew Walton * if the mounts have changed since with g_unix_mounts_changed_since().
11055247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
11065247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: a #GUnixMount.
11073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson **/
11083ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid ZeuthenGUnixMountEntry *
1109feb5258cf9ca9c3b3d9a58a98b1c6c75c822855aMatthias Claseng_unix_mount_at (const char *mount_path,
1110feb5258cf9ca9c3b3d9a58a98b1c6c75c822855aMatthias Clasen		 guint64    *time_read)
11113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
11123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GList *mounts, *l;
11133ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  GUnixMountEntry *mount_entry, *found;
11143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1115feb5258cf9ca9c3b3d9a58a98b1c6c75c822855aMatthias Clasen  mounts = g_unix_mounts_get (time_read);
11163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
11173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  found = NULL;
11183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  for (l = mounts; l != NULL; l = l->next)
11193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
11203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      mount_entry = l->data;
11213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1122a28d87bfc987d8b0aa27c6f9d996a31894fedf4aRyan Lortie      if (!found && strcmp (mount_path, mount_entry->mount_path) == 0)
11233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	found = mount_entry;
11243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else
11253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	g_unix_mount_free (mount_entry);
11263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
11273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_list_free (mounts);
11283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
11293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return found;
11303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
11313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
11323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
1133feb5258cf9ca9c3b3d9a58a98b1c6c75c822855aMatthias Clasen * g_unix_mount_points_get:
11343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @time_read: guint64 to contain a timestamp.
11353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
11365247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Gets a #GList of strings containing the unix mount points.
11375247f12f3649726471080440de0d37b78c1cec33Andrew Walton * If @time_read is set, it will be filled with the mount timestamp,
11385247f12f3649726471080440de0d37b78c1cec33Andrew Walton * allowing for checking if the mounts have changed with
11395247f12f3649726471080440de0d37b78c1cec33Andrew Walton * g_unix_mounts_points_changed_since().
11405247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
1141442e8df1b833e3311a214ae1bf02337b0c831544Matthias Clasen * Returns: a #GList of the UNIX mountpoints.
11423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson **/
11433781343738de4abddf56982325a77bd70a98cd26Alexander LarssonGList *
1144feb5258cf9ca9c3b3d9a58a98b1c6c75c822855aMatthias Claseng_unix_mount_points_get (guint64 *time_read)
11453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
11463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (time_read)
11473781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    *time_read = get_mount_points_timestamp ();
11483781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
11493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return _g_get_unix_mount_points ();
11503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
11513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
11523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
11535247f12f3649726471080440de0d37b78c1cec33Andrew Walton * g_unix_mounts_changed_since:
11543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @time: guint64 to contain a timestamp.
11553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
11565247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Checks if the unix mounts have changed since a given unix time.
11575247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
1158442e8df1b833e3311a214ae1bf02337b0c831544Matthias Clasen * Returns: %TRUE if the mounts have changed since @time.
11593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson **/
11603781343738de4abddf56982325a77bd70a98cd26Alexander Larssongboolean
11613781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mounts_changed_since (guint64 time)
11623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
11633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return get_mounts_timestamp () != time;
11643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
11653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
11663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
11675247f12f3649726471080440de0d37b78c1cec33Andrew Walton * g_unix_mount_points_changed_since:
11683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @time: guint64 to contain a timestamp.
11693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
11705247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Checks if the unix mount points have changed since a given unix time.
11715247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
1172442e8df1b833e3311a214ae1bf02337b0c831544Matthias Clasen * Returns: %TRUE if the mount points have changed since @time.
11733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson **/
11743781343738de4abddf56982325a77bd70a98cd26Alexander Larssongboolean
11753781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_points_changed_since (guint64 time)
11763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
11773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return get_mount_points_timestamp () != time;
11783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
11793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
11803781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void
11813781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_monitor_finalize (GObject *object)
11823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
11833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GUnixMountMonitor *monitor;
11843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
11853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  monitor = G_UNIX_MOUNT_MONITOR (object);
11863781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
11873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (monitor->fstab_monitor)
11883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
11893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_file_monitor_cancel (monitor->fstab_monitor);
11903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_object_unref (monitor->fstab_monitor);
11913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
11923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
11933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (monitor->mtab_monitor)
11943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
11953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_file_monitor_cancel (monitor->mtab_monitor);
11963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_object_unref (monitor->mtab_monitor);
11973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
11983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
11993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  the_mount_monitor = NULL;
1200a4427bfff5d31499dc0b46fa3f734bc92f7d0dd5Michael Natterer
1201a4427bfff5d31499dc0b46fa3f734bc92f7d0dd5Michael Natterer  G_OBJECT_CLASS (g_unix_mount_monitor_parent_class)->finalize (object);
12023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
12033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12043781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12053781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void
12063781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_monitor_class_init (GUnixMountMonitorClass *klass)
12073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
12083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
12093781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  gobject_class->finalize = g_unix_mount_monitor_finalize;
1211b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen
12125247f12f3649726471080440de0d37b78c1cec33Andrew Walton  /**
12135247f12f3649726471080440de0d37b78c1cec33Andrew Walton   * GUnixMountMonitor::mounts-changed:
1214c723669198d1848f553a8e7fdb130ba8cf0e0253Matthias Clasen   * @monitor: the object on which the signal is emitted
12155247f12f3649726471080440de0d37b78c1cec33Andrew Walton   *
12165247f12f3649726471080440de0d37b78c1cec33Andrew Walton   * Emitted when the unix mounts have changed.
1217b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen   */
12183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  signals[MOUNTS_CHANGED] =
12198d37a7964d3b41de330aa581b61eda374b093e71Sven Neumann    g_signal_new ("mounts-changed",
12203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  G_TYPE_FROM_CLASS (klass),
12213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  G_SIGNAL_RUN_LAST,
12223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  0,
12233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  NULL, NULL,
12243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  g_cclosure_marshal_VOID__VOID,
12253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  G_TYPE_NONE, 0);
1226b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen
12275247f12f3649726471080440de0d37b78c1cec33Andrew Walton  /**
12285247f12f3649726471080440de0d37b78c1cec33Andrew Walton   * GUnixMountMonitor::mountpoints-changed:
1229c723669198d1848f553a8e7fdb130ba8cf0e0253Matthias Clasen   * @monitor: the object on which the signal is emitted
12305247f12f3649726471080440de0d37b78c1cec33Andrew Walton   *
12315247f12f3649726471080440de0d37b78c1cec33Andrew Walton   * Emitted when the unix mount points have changed.
1232b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen   */
12333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  signals[MOUNTPOINTS_CHANGED] =
12348d37a7964d3b41de330aa581b61eda374b093e71Sven Neumann    g_signal_new ("mountpoints-changed",
12353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  G_TYPE_FROM_CLASS (klass),
12363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  G_SIGNAL_RUN_LAST,
12373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  0,
12383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  NULL, NULL,
12393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  g_cclosure_marshal_VOID__VOID,
12403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  G_TYPE_NONE, 0);
12413781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
12423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12433781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void
1244a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasenfstab_file_changed (GFileMonitor      *monitor,
1245a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasen		    GFile             *file,
1246a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasen		    GFile             *other_file,
1247a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasen		    GFileMonitorEvent  event_type,
1248a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasen		    gpointer           user_data)
12493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
12503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GUnixMountMonitor *mount_monitor;
12513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (event_type != G_FILE_MONITOR_EVENT_CHANGED &&
12533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      event_type != G_FILE_MONITOR_EVENT_CREATED &&
12543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      event_type != G_FILE_MONITOR_EVENT_DELETED)
12553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return;
12563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  mount_monitor = user_data;
12583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_signal_emit (mount_monitor, signals[MOUNTPOINTS_CHANGED], 0);
12593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
12603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12613781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void
1262a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasenmtab_file_changed (GFileMonitor      *monitor,
1263a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasen		   GFile             *file,
1264a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasen		   GFile             *other_file,
1265a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasen		   GFileMonitorEvent  event_type,
1266a2ca589703273fca80cb126430a8b058aba3eb52Matthias Clasen		   gpointer           user_data)
12673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
12683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GUnixMountMonitor *mount_monitor;
12693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (event_type != G_FILE_MONITOR_EVENT_CHANGED &&
12713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      event_type != G_FILE_MONITOR_EVENT_CREATED &&
12723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      event_type != G_FILE_MONITOR_EVENT_DELETED)
12733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return;
12743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  mount_monitor = user_data;
12763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_signal_emit (mount_monitor, signals[MOUNTS_CHANGED], 0);
12773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
12783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12793781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void
12803781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_monitor_init (GUnixMountMonitor *monitor)
12813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
12823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GFile *file;
12833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (get_fstab_file () != NULL)
12853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
12863781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      file = g_file_new_for_path (get_fstab_file ());
12873690cb75a67377a169264e226655d8fa3a5d003aAlexander Larsson      monitor->fstab_monitor = g_file_monitor_file (file, 0, NULL, NULL);
12883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_object_unref (file);
12893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_signal_connect (monitor->fstab_monitor, "changed", (GCallback)fstab_file_changed, monitor);
12913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
12923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (get_mtab_monitor_file () != NULL)
12943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
12953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      file = g_file_new_for_path (get_mtab_monitor_file ());
12963690cb75a67377a169264e226655d8fa3a5d003aAlexander Larsson      monitor->mtab_monitor = g_file_monitor_file (file, 0, NULL, NULL);
12973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_object_unref (file);
12983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
12993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_signal_connect (monitor->mtab_monitor, "changed", (GCallback)mtab_file_changed, monitor);
13003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
13013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
13023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
13033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
130451d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen * g_unix_mount_monitor_set_rate_limit:
1305ee96535cec0c02bbe15688489654e816dd5c1e7aMatthias Clasen * @mount_monitor: a #GUnixMountMonitor
1306ee96535cec0c02bbe15688489654e816dd5c1e7aMatthias Clasen * @limit_msec: a integer with the limit in milliseconds to
1307ee96535cec0c02bbe15688489654e816dd5c1e7aMatthias Clasen *     poll for changes.
130851d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen *
130951d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen * Sets the rate limit to which the @mount_monitor will report
131051d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen * consecutive change events to the mount and mount point entry files.
131151d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen *
131251d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen * Since: 2.18
1313b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
131451d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthenvoid
131551d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeutheng_unix_mount_monitor_set_rate_limit (GUnixMountMonitor *mount_monitor,
1316b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                                     gint               limit_msec)
131751d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen{
131851d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen  g_return_if_fail (G_IS_UNIX_MOUNT_MONITOR (mount_monitor));
131951d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen
132051d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen  if (mount_monitor->fstab_monitor != NULL)
132151d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen    g_file_monitor_set_rate_limit (mount_monitor->fstab_monitor, limit_msec);
132251d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen
132351d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen  if (mount_monitor->mtab_monitor != NULL)
132451d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen    g_file_monitor_set_rate_limit (mount_monitor->mtab_monitor, limit_msec);
132551d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen}
132651d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen
132751d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen/**
13283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_monitor_new:
13293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
133051d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen * Gets a new #GUnixMountMonitor. The default rate limit for which the
133151d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen * monitor will report consecutive changes for the mount and mount
133251d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen * point entry files is the default for a #GFileMonitor. Use
133351d7fc9e965c64da40597d007756d330b5e3cc5fDavid Zeuthen * g_unix_mount_monitor_set_rate_limit() to change this.
13345247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
13355247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: a #GUnixMountMonitor.
1336b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
13373781343738de4abddf56982325a77bd70a98cd26Alexander LarssonGUnixMountMonitor *
13383781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_monitor_new (void)
13393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
13403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (the_mount_monitor == NULL)
13413781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
13423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      the_mount_monitor = g_object_new (G_TYPE_UNIX_MOUNT_MONITOR, NULL);
13433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      return the_mount_monitor;
13443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
13453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
13463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return g_object_ref (the_mount_monitor);
13473781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
13483781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
13493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
13503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_free:
13513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @mount_entry: a #GUnixMount.
13523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
13535247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Frees a unix mount.
1354b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
13553781343738de4abddf56982325a77bd70a98cd26Alexander Larssonvoid
13563ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeutheng_unix_mount_free (GUnixMountEntry *mount_entry)
13573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
13583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_if_fail (mount_entry != NULL);
13593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
13603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_free (mount_entry->mount_path);
13613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_free (mount_entry->device_path);
13623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_free (mount_entry->filesystem_type);
13633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_free (mount_entry);
13643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
13653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
13663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
13673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_point_free:
13685247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @mount_point: unix mount point to free.
13693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
13705247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Frees a unix mount point.
1371b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
13723781343738de4abddf56982325a77bd70a98cd26Alexander Larssonvoid
13733781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_point_free (GUnixMountPoint *mount_point)
13743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
13753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_if_fail (mount_point != NULL);
13763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
13773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_free (mount_point->mount_path);
13783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_free (mount_point->device_path);
13793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_free (mount_point->filesystem_type);
13803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_free (mount_point);
13813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
13823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
13833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
13843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_compare:
13853ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @mount1: first #GUnixMountEntry to compare.
13863ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @mount2: second #GUnixMountEntry to compare.
13873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
13885247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Compares two unix mounts.
13895247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
1390442e8df1b833e3311a214ae1bf02337b0c831544Matthias Clasen * Returns: 1, 0 or -1 if @mount1 is greater than, equal to,
13913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * or less than @mount2, respectively.
1392b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
13933781343738de4abddf56982325a77bd70a98cd26Alexander Larssongint
13943ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeutheng_unix_mount_compare (GUnixMountEntry *mount1,
13953ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen		      GUnixMountEntry *mount2)
13963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
13973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  int res;
13983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
13993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount1 != NULL && mount2 != NULL, 0);
14003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
140120174898b5b1014f5f125811d1d92f1b017bdbbcMatthias Clasen  res = g_strcmp0 (mount1->mount_path, mount2->mount_path);
14023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (res != 0)
14033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return res;
14043781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
140520174898b5b1014f5f125811d1d92f1b017bdbbcMatthias Clasen  res = g_strcmp0 (mount1->device_path, mount2->device_path);
14063781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (res != 0)
14073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return res;
14083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
140920174898b5b1014f5f125811d1d92f1b017bdbbcMatthias Clasen  res = g_strcmp0 (mount1->filesystem_type, mount2->filesystem_type);
14103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (res != 0)
14113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return res;
14123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
14133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  res =  mount1->is_read_only - mount2->is_read_only;
14143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (res != 0)
14153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return res;
14163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
14173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return 0;
14183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
14193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
14203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
14213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_get_mount_path:
14223ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen * @mount_entry: input #GUnixMountEntry to get the mount path for.
14233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
14245247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Gets the mount path for a unix mount.
14253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
14265247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: the mount path for @mount_entry.
1427b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
1428b77a6eeac9406e9a2290256494240383190a8610Matthias Clasenconst gchar *
14293ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeutheng_unix_mount_get_mount_path (GUnixMountEntry *mount_entry)
14303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
14313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_entry != NULL, NULL);
14323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
14333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return mount_entry->mount_path;
14343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
14353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
14363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
14373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_get_device_path:
14383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @mount_entry: a #GUnixMount.
14393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
14405247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Gets the device path for a unix mount.
14415247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
14425247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: a string containing the device path.
1443b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
1444b77a6eeac9406e9a2290256494240383190a8610Matthias Clasenconst gchar *
14453ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeutheng_unix_mount_get_device_path (GUnixMountEntry *mount_entry)
14463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
14473781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_entry != NULL, NULL);
14483781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
14493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return mount_entry->device_path;
14503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
14513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
14523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
14533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_get_fs_type:
14543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @mount_entry: a #GUnixMount.
14553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
14565247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Gets the filesystem type for the unix mount.
14575247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
14585247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: a string containing the file system type.
1459b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
1460b77a6eeac9406e9a2290256494240383190a8610Matthias Clasenconst gchar *
14613ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeutheng_unix_mount_get_fs_type (GUnixMountEntry *mount_entry)
14623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
14633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_entry != NULL, NULL);
14643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
14653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return mount_entry->filesystem_type;
14663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
14673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
14683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
14693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_is_readonly:
14703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @mount_entry: a #GUnixMount.
14713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
14725247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Checks if a unix mount is mounted read only.
14733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
14745247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: %TRUE if @mount_entry is read only.
1475b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
14763781343738de4abddf56982325a77bd70a98cd26Alexander Larssongboolean
14773ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeutheng_unix_mount_is_readonly (GUnixMountEntry *mount_entry)
14783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
14793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_entry != NULL, FALSE);
14803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
14813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return mount_entry->is_read_only;
14823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
14833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
14843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
14853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_is_system_internal:
14863781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @mount_entry: a #GUnixMount.
14873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
14885247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Checks if a unix mount is a system path.
14895247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
14905247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: %TRUE if the unix mount is for a system path.
1491b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
14923781343738de4abddf56982325a77bd70a98cd26Alexander Larssongboolean
14933ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeutheng_unix_mount_is_system_internal (GUnixMountEntry *mount_entry)
14943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
14953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_entry != NULL, FALSE);
14963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
14973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return mount_entry->is_system_internal;
14983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
14993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
15003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
15013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_point_compare:
15023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @mount1: a #GUnixMount.
15033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @mount2: a #GUnixMount.
15043781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
15055247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Compares two unix mount points.
15065247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
1507442e8df1b833e3311a214ae1bf02337b0c831544Matthias Clasen * Returns: 1, 0 or -1 if @mount1 is greater than, equal to,
15083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * or less than @mount2, respectively.
1509b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
15103781343738de4abddf56982325a77bd70a98cd26Alexander Larssongint
15113781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_point_compare (GUnixMountPoint *mount1,
15123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			    GUnixMountPoint *mount2)
15133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
15143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  int res;
15153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
15163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount1 != NULL && mount2 != NULL, 0);
15173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
151820174898b5b1014f5f125811d1d92f1b017bdbbcMatthias Clasen  res = g_strcmp0 (mount1->mount_path, mount2->mount_path);
15193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (res != 0)
15203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return res;
15213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
152220174898b5b1014f5f125811d1d92f1b017bdbbcMatthias Clasen  res = g_strcmp0 (mount1->device_path, mount2->device_path);
15233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (res != 0)
15243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return res;
15253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
152620174898b5b1014f5f125811d1d92f1b017bdbbcMatthias Clasen  res = g_strcmp0 (mount1->filesystem_type, mount2->filesystem_type);
15273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (res != 0)
15283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return res;
15293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
15303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  res =  mount1->is_read_only - mount2->is_read_only;
15313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (res != 0)
15323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return res;
15333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
15343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  res = mount1->is_user_mountable - mount2->is_user_mountable;
15353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (res != 0)
15363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return res;
15373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
15383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  res = mount1->is_loopback - mount2->is_loopback;
15393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (res != 0)
15403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    return res;
15413781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
15423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return 0;
15433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
15443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
15453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
15463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_point_get_mount_path:
15475247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @mount_point: a #GUnixMountPoint.
15485247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
15495247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Gets the mount path for a unix mount point.
15503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
15515247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: a string containing the mount path.
1552b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
1553b77a6eeac9406e9a2290256494240383190a8610Matthias Clasenconst gchar *
15543781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_point_get_mount_path (GUnixMountPoint *mount_point)
15553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
15563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_point != NULL, NULL);
15573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
15583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return mount_point->mount_path;
15593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
15603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
15613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
15623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_point_get_device_path:
15635247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @mount_point: a #GUnixMountPoint.
15645247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
15655247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Gets the device path for a unix mount point.
15663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
15675247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: a string containing the device path.
1568b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
1569b77a6eeac9406e9a2290256494240383190a8610Matthias Clasenconst gchar *
15703781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_point_get_device_path (GUnixMountPoint *mount_point)
15713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
15723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_point != NULL, NULL);
15733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
15743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return mount_point->device_path;
15753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
15763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
15773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
15783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_point_get_fs_type:
15795247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @mount_point: a #GUnixMountPoint.
15803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
15815247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Gets the file system type for the mount point.
15825247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
15835247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: a string containing the file system type.
1584b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
1585b77a6eeac9406e9a2290256494240383190a8610Matthias Clasenconst gchar *
15863781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_point_get_fs_type (GUnixMountPoint *mount_point)
15873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
15883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_point != NULL, NULL);
15893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
15903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return mount_point->filesystem_type;
15913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
15923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
15933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
15943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_point_is_readonly:
15955247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @mount_point: a #GUnixMountPoint.
15965247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
15975247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Checks if a unix mount point is read only.
15983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
15995247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: %TRUE if a mount point is read only.
1600b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
16013781343738de4abddf56982325a77bd70a98cd26Alexander Larssongboolean
16023781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_point_is_readonly (GUnixMountPoint *mount_point)
16033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
16043781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_point != NULL, FALSE);
16053781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
16063781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return mount_point->is_read_only;
16073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
16083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
16093781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
16103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_point_is_user_mountable:
16115247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @mount_point: a #GUnixMountPoint.
16125247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
16135247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Checks if a unix mount point is mountable by the user.
16143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
16155247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: %TRUE if the mount point is user mountable.
1616b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
16173781343738de4abddf56982325a77bd70a98cd26Alexander Larssongboolean
16183781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_point_is_user_mountable (GUnixMountPoint *mount_point)
16193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
16203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_point != NULL, FALSE);
16213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
16223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return mount_point->is_user_mountable;
16233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
16243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
16253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
16263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_point_is_loopback:
16275247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @mount_point: a #GUnixMountPoint.
16283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
16295247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Checks if a unix mount point is a loopback device.
16305247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
16315247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: %TRUE if the mount point is a loopback. %FALSE otherwise.
1632b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
16333781343738de4abddf56982325a77bd70a98cd26Alexander Larssongboolean
16343781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_point_is_loopback (GUnixMountPoint *mount_point)
16353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
16363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_point != NULL, FALSE);
16373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
16383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return mount_point->is_loopback;
16393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
16403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
16413781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GUnixMountType
16423781343738de4abddf56982325a77bd70a98cd26Alexander Larssonguess_mount_type (const char *mount_path,
16433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  const char *device_path,
16443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson		  const char *filesystem_type)
16453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
16463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GUnixMountType type;
16473781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *basename;
16483781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
16493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  type = G_UNIX_MOUNT_TYPE_UNKNOWN;
16503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
16513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if ((strcmp (filesystem_type, "udf") == 0) ||
16523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      (strcmp (filesystem_type, "iso9660") == 0) ||
16533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      (strcmp (filesystem_type, "cd9660") == 0))
16543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    type = G_UNIX_MOUNT_TYPE_CDROM;
1655864b0d690edd5ba945571bb3715e71b5e5b1f65bSebastien Bacher  else if ((strcmp (filesystem_type, "nfs") == 0) ||
1656864b0d690edd5ba945571bb3715e71b5e5b1f65bSebastien Bacher           (strcmp (filesystem_type, "nfs4") == 0))
16573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    type = G_UNIX_MOUNT_TYPE_NFS;
16583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  else if (g_str_has_prefix (device_path, "/vol/dev/diskette/") ||
16593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	   g_str_has_prefix (device_path, "/dev/fd") ||
16603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	   g_str_has_prefix (device_path, "/dev/floppy"))
16613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    type = G_UNIX_MOUNT_TYPE_FLOPPY;
16623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  else if (g_str_has_prefix (device_path, "/dev/cdrom") ||
16633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	   g_str_has_prefix (device_path, "/dev/acd") ||
16643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	   g_str_has_prefix (device_path, "/dev/cd"))
16653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    type = G_UNIX_MOUNT_TYPE_CDROM;
16663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  else if (g_str_has_prefix (device_path, "/vol/"))
16673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
16683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      const char *name = mount_path + strlen ("/");
16693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
16703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (g_str_has_prefix (name, "cdrom"))
16713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_CDROM;
16723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (g_str_has_prefix (name, "floppy") ||
16733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	       g_str_has_prefix (device_path, "/vol/dev/diskette/"))
16743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_FLOPPY;
16753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (g_str_has_prefix (name, "rmdisk"))
16763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_ZIP;
16773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (g_str_has_prefix (name, "jaz"))
16783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_JAZ;
16793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (g_str_has_prefix (name, "memstick"))
16803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_MEMSTICK;
16813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
16823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  else
16833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
16843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      basename = g_path_get_basename (mount_path);
16853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1686240ba02786e2ce0fe17327e1901d8e6fe06e812eAlexander Larsson      if (g_str_has_prefix (basename, "cdr") ||
16873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  g_str_has_prefix (basename, "cdwriter") ||
16883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	  g_str_has_prefix (basename, "burn") ||
1689240ba02786e2ce0fe17327e1901d8e6fe06e812eAlexander Larsson	  g_str_has_prefix (basename, "dvdr"))
16903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_CDROM;
16913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (g_str_has_prefix (basename, "floppy"))
16923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_FLOPPY;
16933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (g_str_has_prefix (basename, "zip"))
16943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_ZIP;
16953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (g_str_has_prefix (basename, "jaz"))
16963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_JAZ;
16973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (g_str_has_prefix (basename, "camera"))
16983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_CAMERA;
16993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (g_str_has_prefix (basename, "memstick") ||
17003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	       g_str_has_prefix (basename, "memory_stick") ||
17013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	       g_str_has_prefix (basename, "ram"))
17023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_MEMSTICK;
17033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (g_str_has_prefix (basename, "compact_flash"))
17043781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_CF;
17053781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (g_str_has_prefix (basename, "smart_media"))
17063781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_SM;
17073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (g_str_has_prefix (basename, "sd_mmc"))
17083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_SDMMC;
17093781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      else if (g_str_has_prefix (basename, "ipod"))
17103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	type = G_UNIX_MOUNT_TYPE_IPOD;
17113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
17123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_free (basename);
17133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
17143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
17153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (type == G_UNIX_MOUNT_TYPE_UNKNOWN)
17163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    type = G_UNIX_MOUNT_TYPE_HD;
17173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
17183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return type;
17193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
17203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1721f5063650794c987868830241a630993e624eabd9Alexander Larsson/*
17223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_guess_type:
17233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @mount_entry: a #GUnixMount.
17243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
17255247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Guesses the type of a unix mount. If the mount type cannot be
17265247f12f3649726471080440de0d37b78c1cec33Andrew Walton * determined, returns %G_UNIX_MOUNT_TYPE_UNKNOWN.
17275247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
17285247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: a #GUnixMountType.
1729b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
1730f5063650794c987868830241a630993e624eabd9Alexander Larssonstatic GUnixMountType
17313ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeutheng_unix_mount_guess_type (GUnixMountEntry *mount_entry)
17323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
17333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_entry != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN);
17343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_entry->mount_path != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN);
17353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_entry->device_path != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN);
17363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_entry->filesystem_type != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN);
17373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
17383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return guess_mount_type (mount_entry->mount_path,
17393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			   mount_entry->device_path,
17403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			   mount_entry->filesystem_type);
17413781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
17423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1743f5063650794c987868830241a630993e624eabd9Alexander Larsson/*
17443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_unix_mount_point_guess_type:
17455247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @mount_point: a #GUnixMountPoint.
17465247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
17472e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * Guesses the type of a unix mount point.
17482e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * If the mount type cannot be determined,
17492e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * returns %G_UNIX_MOUNT_TYPE_UNKNOWN.
17503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
17515247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: a #GUnixMountType.
1752b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen */
1753f5063650794c987868830241a630993e624eabd9Alexander Larssonstatic GUnixMountType
17543781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_unix_mount_point_guess_type (GUnixMountPoint *mount_point)
17553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
17563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_point != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN);
17573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_point->mount_path != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN);
17583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_point->device_path != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN);
17593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (mount_point->filesystem_type != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN);
17603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
17613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return guess_mount_type (mount_point->mount_path,
17623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			   mount_point->device_path,
17633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			   mount_point->filesystem_type);
17643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
17657f3280230bc9448a5750fc17a6eabef691ba25f4Alexander Larsson
17663ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthenstatic const char *
17673ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthentype_to_icon (GUnixMountType type, gboolean is_mount_point)
17683ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen{
17693ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  const char *icon_name;
17703ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
17713ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  switch (type)
17723ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    {
17733ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    case G_UNIX_MOUNT_TYPE_HD:
17743ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      if (is_mount_point)
17753ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "drive-removable-media";
17763ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      else
17773ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "drive-harddisk";
17783ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      break;
17793ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    case G_UNIX_MOUNT_TYPE_FLOPPY:
17803ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    case G_UNIX_MOUNT_TYPE_ZIP:
17813ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    case G_UNIX_MOUNT_TYPE_JAZ:
17823ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      if (is_mount_point)
17833ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "drive-removable-media";
17843ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      else
17853ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "media-floppy";
17863ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      break;
17873ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    case G_UNIX_MOUNT_TYPE_CDROM:
17883ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      if (is_mount_point)
17893ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "drive-optical";
17903ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      else
17913ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "media-optical";
17923ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      break;
17933ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    case G_UNIX_MOUNT_TYPE_NFS:
17943ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      /* TODO: Would like a better icon here... */
17953ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      if (is_mount_point)
17963ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "drive-removable-media";
17973ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      else
17983ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "drive-harddisk";
17993ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      break;
18003ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    case G_UNIX_MOUNT_TYPE_MEMSTICK:
18013ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      if (is_mount_point)
18023ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "drive-removable-media";
18033ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      else
18043ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "media-flash";
18053ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      break;
18063ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    case G_UNIX_MOUNT_TYPE_CAMERA:
18073ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      if (is_mount_point)
18083ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "drive-removable-media";
18093ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      else
18103ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "camera-photo";
18113ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      break;
18123ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    case G_UNIX_MOUNT_TYPE_IPOD:
18133ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      if (is_mount_point)
18143ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "drive-removable-media";
18153ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      else
18163ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "multimedia-player";
18173ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      break;
18183ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    case G_UNIX_MOUNT_TYPE_UNKNOWN:
18193ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    default:
18203ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      if (is_mount_point)
18213ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "drive-removable-media";
18223ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      else
18233ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        icon_name = "drive-harddisk";
18243ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      break;
18253ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    }
18263ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
18273ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  return icon_name;
18283ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen}
18293ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
18302e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen/**
18312e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * g_unix_mount_guess_name:
18322e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * @mount_entry: a #GUnixMountEntry
18332e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen *
18342e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * Guesses the name of a Unix mount.
18352e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * The result is a translated string.
18362e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen *
18372e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * Returns: A newly allocated string that must
18382e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen *     be freed with g_free()
18392e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen */
1840b77a6eeac9406e9a2290256494240383190a8610Matthias Clasengchar *
18413ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeutheng_unix_mount_guess_name (GUnixMountEntry *mount_entry)
18423ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen{
18433ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  char *name;
18443ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
18453ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  if (strcmp (mount_entry->mount_path, "/") == 0)
18463ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    name = g_strdup (_("Filesystem root"));
18473ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  else
18483ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    name = g_filename_display_basename (mount_entry->mount_path);
18493ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
18503ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  return name;
18513ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen}
18523ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
18532e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen/**
18542e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * g_unix_mount_guess_icon:
18552e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * @mount_entry: a #GUnixMountEntry
18562e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen *
18572e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * Guesses the icon of a Unix mount.
18582e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen *
18592e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * Returns: a #GIcon
18602e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen */
18613ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid ZeuthenGIcon *
18623ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeutheng_unix_mount_guess_icon (GUnixMountEntry *mount_entry)
18633ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen{
186447b8809e176f4bc7f22768cb45fec47280c4242fAlexander Larsson  return g_themed_icon_new_with_default_fallbacks (type_to_icon (g_unix_mount_guess_type (mount_entry), FALSE));
18653ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen}
18663ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
18672e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen/**
18682e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * g_unix_mount_point_guess_name:
18692e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * @mount_point: a #GUnixMountPoint
18702e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen *
18712e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * Guesses the name of a Unix mount point.
18722e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * The result is a translated string.
18732e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen *
18742e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * Returns: A newly allocated string that must
18752e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen *     be freed with g_free()
18762e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen */
1877b77a6eeac9406e9a2290256494240383190a8610Matthias Clasengchar *
18783ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeutheng_unix_mount_point_guess_name (GUnixMountPoint *mount_point)
18793ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen{
18803ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  char *name;
18813ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
18823ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  if (strcmp (mount_point->mount_path, "/") == 0)
18833ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    name = g_strdup (_("Filesystem root"));
18843ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  else
18853ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    name = g_filename_display_basename (mount_point->mount_path);
18863ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
18873ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  return name;
18883ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen}
18893ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
18902e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen/**
18912e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * g_unix_mount_point_guess_icon:
18922e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * @mount_point: a #GUnixMountPoint
18932e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen *
18942e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * Guesses the icon of a Unix mount point.
18952e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen *
18962e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen * Returns: a #GIcon
18972e3f48993ddf2a18eff36f3e4eae10da0207e510Matthias Clasen */
18983ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid ZeuthenGIcon *
18993ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeutheng_unix_mount_point_guess_icon (GUnixMountPoint *mount_point)
19003ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen{
190147b8809e176f4bc7f22768cb45fec47280c4242fAlexander Larsson  return g_themed_icon_new_with_default_fallbacks (type_to_icon (g_unix_mount_point_guess_type (mount_point), TRUE));
19023ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen}
19033ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
1904c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen/**
1905c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen * g_unix_mount_guess_can_eject:
1906c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen * @mount_entry: a #GUnixMountEntry
1907c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen *
1908c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen * Guesses whether a Unix mount can be ejected.
1909c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen *
1910c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen * Returns: %TRUE if @mount_entry is deemed to be ejectable.
1911c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen */
1912f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthengboolean
1913f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeutheng_unix_mount_guess_can_eject (GUnixMountEntry *mount_entry)
1914f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen{
1915f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen  GUnixMountType guessed_type;
1916f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen
1917f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen  guessed_type = g_unix_mount_guess_type (mount_entry);
1918f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen  if (guessed_type == G_UNIX_MOUNT_TYPE_IPOD ||
1919f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen      guessed_type == G_UNIX_MOUNT_TYPE_CDROM)
1920f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen    return TRUE;
1921f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen
1922f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen  return FALSE;
1923f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen}
1924f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen
1925c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen/**
1926896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson * g_unix_mount_guess_should_display:
1927896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson * @mount_entry: a #GUnixMountEntry
1928896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson *
1929896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson * Guesses whether a Unix mount should be displayed in the UI.
1930896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson *
1931896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson * Returns: %TRUE if @mount_entry is deemed to be displayable.
1932896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson */
1933896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larssongboolean
1934896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larssong_unix_mount_guess_should_display (GUnixMountEntry *mount_entry)
1935896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson{
19364a1cf45793e3e7ef5d94c10cd2331c6085423058Alexander Larsson  const char *mount_path;
1937896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson
1938896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson  /* Never display internal mountpoints */
1939896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson  if (g_unix_mount_is_system_internal (mount_entry))
1940896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson    return FALSE;
19414a1cf45793e3e7ef5d94c10cd2331c6085423058Alexander Larsson
19424a1cf45793e3e7ef5d94c10cd2331c6085423058Alexander Larsson  /* Only display things in /media (which are generally user mountable)
19434a1cf45793e3e7ef5d94c10cd2331c6085423058Alexander Larsson     and home dir (fuse stuff) */
19444a1cf45793e3e7ef5d94c10cd2331c6085423058Alexander Larsson  mount_path = mount_entry->mount_path;
19454a1cf45793e3e7ef5d94c10cd2331c6085423058Alexander Larsson  if (mount_path != NULL)
19464a1cf45793e3e7ef5d94c10cd2331c6085423058Alexander Larsson    {
1947b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen      if (g_str_has_prefix (mount_path, "/media/"))
1948b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen        {
1949b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          char *path;
1950b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          /* Avoid displaying mounts that are not accessible to the user.
1951b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen           *
1952b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen           * See http://bugzilla.gnome.org/show_bug.cgi?id=526320 for why we
1953b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen           * want to avoid g_access() for mount points which can potentially
1954b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen           * block or fail stat()'ing, such as network mounts.
1955b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen           */
1956b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          path = g_path_get_dirname (mount_path);
1957b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          if (g_str_has_prefix (path, "/media/"))
1958b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen            {
1959b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen              if (g_access (path, R_OK|X_OK) != 0)
1960b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                {
1961b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                  g_free (path);
1962b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                  return FALSE;
1963b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                }
196427dba4c28b9276a4ce3c67e1777fa259931b1d82David Zeuthen            }
1965b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          g_free (path);
196608b1ec389b00d8d60b22ad5b25256831f9fc295cMatthias Clasen
1967b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          if (mount_entry->device_path && mount_entry->device_path[0] == '/')
196808b1ec389b00d8d60b22ad5b25256831f9fc295cMatthias Clasen           {
196908b1ec389b00d8d60b22ad5b25256831f9fc295cMatthias Clasen             struct stat st;
197008b1ec389b00d8d60b22ad5b25256831f9fc295cMatthias Clasen             if (g_stat (mount_entry->device_path, &st) == 0 &&
197108b1ec389b00d8d60b22ad5b25256831f9fc295cMatthias Clasen                 S_ISBLK(st.st_mode) &&
197208b1ec389b00d8d60b22ad5b25256831f9fc295cMatthias Clasen                 g_access (mount_path, R_OK|X_OK) != 0)
197308b1ec389b00d8d60b22ad5b25256831f9fc295cMatthias Clasen               return FALSE;
197408b1ec389b00d8d60b22ad5b25256831f9fc295cMatthias Clasen           }
1975b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          return TRUE;
1976b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen        }
19774a1cf45793e3e7ef5d94c10cd2331c6085423058Alexander Larsson
1978b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen      if (g_str_has_prefix (mount_path, g_get_home_dir ()) &&
1979b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          mount_path[strlen (g_get_home_dir())] == G_DIR_SEPARATOR)
19804a1cf45793e3e7ef5d94c10cd2331c6085423058Alexander Larsson        return TRUE;
19814a1cf45793e3e7ef5d94c10cd2331c6085423058Alexander Larsson    }
19824a1cf45793e3e7ef5d94c10cd2331c6085423058Alexander Larsson
1983896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson  return FALSE;
1984896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson}
1985896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson
1986896ebed1a57623ec5e0b08ba2bec3e37c1c88d41Alexander Larsson/**
1987c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen * g_unix_mount_point_guess_can_eject:
1988c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen * @mount_point: a #GUnixMountPoint
1989c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen *
1990c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen * Guesses whether a Unix mount point can be ejected.
1991c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen *
1992c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen * Returns: %TRUE if @mount_point is deemed to be ejectable.
1993c014e5f8deecbb85966d99fb3aa46d10c674c322Matthias Clasen */
1994f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthengboolean
1995f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeutheng_unix_mount_point_guess_can_eject (GUnixMountPoint *mount_point)
1996f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen{
1997f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen  GUnixMountType guessed_type;
1998f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen
1999f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen  guessed_type = g_unix_mount_point_guess_type (mount_point);
2000f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen  if (guessed_type == G_UNIX_MOUNT_TYPE_IPOD ||
2001f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen      guessed_type == G_UNIX_MOUNT_TYPE_CDROM)
2002f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen    return TRUE;
2003f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen
2004f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen  return FALSE;
2005f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen}
2006f4add8f0faf4a8c2ca1cdb4f99f5f3d0d66aaff8David Zeuthen
20073ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
20083ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen/* borrowed from gtk/gtkfilesystemunix.c in GTK+ on 02/23/2006 */
20093ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthenstatic void
20103ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen_canonicalize_filename (gchar *filename)
20113ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen{
20123ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  gchar *p, *q;
20133ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  gboolean last_was_slash = FALSE;
20143ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
20153ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  p = filename;
20163ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  q = filename;
20173ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
20183ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  while (*p)
20193ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    {
20203ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      if (*p == G_DIR_SEPARATOR)
20213ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        {
20223ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen          if (!last_was_slash)
20233ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen            *q++ = G_DIR_SEPARATOR;
20243ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
20253ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen          last_was_slash = TRUE;
20263ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        }
20273ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      else
20283ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        {
20293ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen          if (last_was_slash && *p == '.')
20303ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen            {
20313ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen              if (*(p + 1) == G_DIR_SEPARATOR ||
20323ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                  *(p + 1) == '\0')
20333ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                {
20343ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                  if (*(p + 1) == '\0')
20353ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                    break;
20363ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
20373ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                  p += 1;
20383ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                }
20393ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen              else if (*(p + 1) == '.' &&
20403ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                       (*(p + 2) == G_DIR_SEPARATOR ||
20413ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                        *(p + 2) == '\0'))
20423ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                {
20433ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                  if (q > filename + 1)
20443ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                    {
20453ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                      q--;
20463ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                      while (q > filename + 1 &&
20473ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                             *(q - 1) != G_DIR_SEPARATOR)
20483ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                        q--;
20493ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                    }
20503ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
20513ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                  if (*(p + 2) == '\0')
20523ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                    break;
20533ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
20543ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                  p += 2;
20553ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                }
20563ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen              else
20573ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                {
20583ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                  *q++ = *p;
20593ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                  last_was_slash = FALSE;
20603ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen                }
20613ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen            }
20623ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen          else
20633ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen            {
20643ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen              *q++ = *p;
20653ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen              last_was_slash = FALSE;
20663ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen            }
20673ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen        }
20683ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
20693ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      p++;
20703ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    }
20713ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
20723ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  if (q > filename + 1 && *(q - 1) == G_DIR_SEPARATOR)
20733ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    q--;
20743ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
20753ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  *q = '\0';
20763ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen}
20773ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
20783ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthenstatic char *
20793ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen_resolve_symlink (const char *file)
20803ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen{
20813ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  GError *error;
20823ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  char *dir;
20833ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  char *link;
20843ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  char *f;
20853ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  char *f1;
20863ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
20873ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  f = g_strdup (file);
20883ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
2089b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen  while (g_file_test (f, G_FILE_TEST_IS_SYMLINK))
2090b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen    {
2091b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen      link = g_file_read_link (f, &error);
2092b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen      if (link == NULL)
2093b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen        {
2094b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          g_error_free (error);
2095b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          g_free (f);
2096b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          f = NULL;
2097b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          goto out;
2098b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen        }
2099b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen
2100b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen      dir = g_path_get_dirname (f);
2101b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen      f1 = g_strdup_printf ("%s/%s", dir, link);
2102b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen      g_free (dir);
2103b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen      g_free (link);
21043ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen      g_free (f);
2105b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen      f = f1;
21063ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    }
21073ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
21083ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen out:
21093ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  if (f != NULL)
21103ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    _canonicalize_filename (f);
21113ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  return f;
21123ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen}
21133ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
21146ad96b367793557d0a02c1bff75cc60befcd59a6Alexander Larsson#ifdef HAVE_MNTENT_H
21153ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthenstatic const char *
21163ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen_resolve_dev_root (void)
21173ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen{
21183ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  static gboolean have_real_dev_root = FALSE;
21193ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  static char real_dev_root[256];
21203ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  struct stat statbuf;
21213ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
21223ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  /* see if it's cached already */
21233ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  if (have_real_dev_root)
21243ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    goto found;
21253ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
21263ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  /* otherwise we're going to find it right away.. */
21273ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  have_real_dev_root = TRUE;
21283ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
2129b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen  if (stat ("/dev/root", &statbuf) == 0)
2130b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen    {
2131b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen      if (! S_ISLNK (statbuf.st_mode))
2132b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen        {
2133b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          dev_t root_dev = statbuf.st_dev;
2134b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          FILE *f;
2135b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          char buf[1024];
21363ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
2137b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          /* see if device with similar major:minor as /dev/root is mention
2138b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen           * in /etc/mtab (it usually is)
2139b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen           */
2140b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          f = fopen ("/etc/mtab", "r");
2141b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          if (f != NULL)
2142b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen            {
2143b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen	      struct mntent *entp;
21440766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#ifdef HAVE_GETMNTENT_R
2145b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen              struct mntent ent;
2146b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen              while ((entp = getmntent_r (f, &ent, buf, sizeof (buf))) != NULL)
2147b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                {
21480766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#else
2149b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen	      G_LOCK (getmntent);
2150b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen	      while ((entp = getmntent (f)) != NULL)
2151b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                {
21520766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#endif
2153b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                  if (stat (entp->mnt_fsname, &statbuf) == 0 &&
2154b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                      statbuf.st_dev == root_dev)
2155b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                    {
2156b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                      strncpy (real_dev_root, entp->mnt_fsname, sizeof (real_dev_root) - 1);
2157b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                      real_dev_root[sizeof (real_dev_root) - 1] = '\0';
2158b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                      fclose (f);
2159b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                      goto found;
2160b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                    }
2161b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen                }
21620766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen
2163b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen              endmntent (f);
21640766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen
21650766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#ifndef HAVE_GETMNTENT_R
2166b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen	      G_UNLOCK (getmntent);
21670766a1ec399f2dcd707249ed45b13dfbd239f382Matthias Clasen#endif
2168b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen            }
21693ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
2170b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          /* no, that didn't work.. next we could scan /dev ... but I digress.. */
21713ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
2172b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen        }
2173b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen       else
2174b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen        {
2175b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          char *resolved;
2176b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          resolved = _resolve_symlink ("/dev/root");
2177b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen          if (resolved != NULL)
2178b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen            {
2179b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen              strncpy (real_dev_root, resolved, sizeof (real_dev_root) - 1);
2180b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen              real_dev_root[sizeof (real_dev_root) - 1] = '\0';
2181b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen              g_free (resolved);
2182b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen              goto found;
2183b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen            }
2184b77a6eeac9406e9a2290256494240383190a8610Matthias Clasen        }
21853ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen    }
21863ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
21873ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  /* bah sucks.. */
21883ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  strcpy (real_dev_root, "/dev/root");
21893ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
2190b77a6eeac9406e9a2290256494240383190a8610Matthias Clasenfound:
21913ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen  return real_dev_root;
21923ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen}
21936ad96b367793557d0a02c1bff75cc60befcd59a6Alexander Larsson#endif
21943ca9fd4dbb134088bf70f2f6584f14a559e6820aDavid Zeuthen
21957f3280230bc9448a5750fc17a6eabef691ba25f4Alexander Larsson#define __G_UNIX_MOUNTS_C__
21967f3280230bc9448a5750fc17a6eabef691ba25f4Alexander Larsson#include "gioaliasdef.c"
2197