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><gio/gunixmounts.h></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