summaryrefslogtreecommitdiffstats
path: root/lib/mountlist.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mountlist.c')
-rw-r--r--lib/mountlist.c114
1 files changed, 49 insertions, 65 deletions
diff --git a/lib/mountlist.c b/lib/mountlist.c
index 631be312..70d4edb2 100644
--- a/lib/mountlist.c
+++ b/lib/mountlist.c
@@ -1,5 +1,7 @@
1/* mountlist.c -- return a list of mounted filesystems 1/* mountlist.c -- return a list of mounted file systems
2 Copyright (C) 1991, 1992, 1997-2004 Free Software Foundation, Inc. 2
3 Copyright (C) 1991, 1992, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4 2004, 2005 Free Software Foundation, Inc.
3 5
4 This program is free software; you can redistribute it and/or modify 6 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by 7 it under the terms of the GNU General Public License as published by
@@ -13,39 +15,29 @@
13 15
14 You should have received a copy of the GNU General Public License 16 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software Foundation, 17 along with this program; if not, write to the Free Software Foundation,
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
17 19
18#if HAVE_CONFIG_H 20#ifdef HAVE_CONFIG_H
19# include <config.h> 21# include <config.h>
20#endif 22#endif
21 23
24#include "mountlist.h"
25
22#include <stdio.h> 26#include <stdio.h>
23#include <sys/types.h>
24#include <stdlib.h> 27#include <stdlib.h>
25#include <string.h> 28#include <string.h>
26 29
27#include "xalloc.h" 30#include "xalloc.h"
28 31
29#ifndef SIZE_MAX
30# define SIZE_MAX ((size_t) -1)
31#endif
32
33#ifndef strstr 32#ifndef strstr
34char *strstr (); 33char *strstr ();
35#endif 34#endif
36 35
37#include <errno.h> 36#include <errno.h>
38#ifndef errno
39extern int errno;
40#endif
41 37
42#ifdef HAVE_FCNTL_H 38#include <fcntl.h>
43# include <fcntl.h>
44#endif
45 39
46#ifdef HAVE_UNISTD_H 40#include <unistd.h>
47# include <unistd.h>
48#endif
49 41
50#if HAVE_SYS_PARAM_H 42#if HAVE_SYS_PARAM_H
51# include <sys/param.h> 43# include <sys/param.h>
@@ -140,42 +132,39 @@ extern int errno;
140# define MNT_IGNORE(M) 0 132# define MNT_IGNORE(M) 0
141#endif 133#endif
142 134
143#include "mountlist.h" 135#if USE_UNLOCKED_IO
144#include "unlocked-io.h" 136# include "unlocked-io.h"
137#endif
145 138
146#ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */ 139#ifndef SIZE_MAX
147/* Return the value of the hexadecimal number represented by CP. 140# define SIZE_MAX ((size_t) -1)
148 No prefix (like '0x') or suffix (like 'h') is expected to be 141#endif
149 part of CP. */
150/* FIXME: this can overflow */
151 142
152static int 143#ifndef ME_DUMMY
153xatoi (char *cp) 144# define ME_DUMMY(Fs_name, Fs_type) \
154{ 145 (strcmp (Fs_type, "autofs") == 0 \
155 int val; 146 || strcmp (Fs_type, "none") == 0 \
147 || strcmp (Fs_type, "proc") == 0 \
148 || strcmp (Fs_type, "subfs") == 0 \
149 /* for Irix 6.5 */ \
150 || strcmp (Fs_type, "ignore") == 0)
151#endif
156 152
157 val = 0; 153#ifndef ME_REMOTE
158 while (*cp) 154/* A file system is `remote' if its Fs_name contains a `:'
159 { 155 or if (it is of type smbfs and its Fs_name starts with `//'). */
160 if (*cp >= 'a' && *cp <= 'f') 156# define ME_REMOTE(Fs_name, Fs_type) \
161 val = val * 16 + *cp - 'a' + 10; 157 (strchr (Fs_name, ':') != 0 \
162 else if (*cp >= 'A' && *cp <= 'F') 158 || ((Fs_name)[0] == '/' \
163 val = val * 16 + *cp - 'A' + 10; 159 && (Fs_name)[1] == '/' \
164 else if (*cp >= '0' && *cp <= '9') 160 && strcmp (Fs_type, "smbfs") == 0))
165 val = val * 16 + *cp - '0'; 161#endif
166 else
167 break;
168 cp++;
169 }
170 return val;
171}
172#endif /* MOUNTED_GETMNTENT1. */
173 162
174#if MOUNTED_GETMNTINFO 163#if MOUNTED_GETMNTINFO
175 164
176# if ! HAVE_F_FSTYPENAME_IN_STATFS 165# if ! HAVE_F_FSTYPENAME_IN_STATFS
177static char * 166static char *
178fstype_to_string (short t) 167fstype_to_string (short int t)
179{ 168{
180 switch (t) 169 switch (t)
181 { 170 {
@@ -296,13 +285,13 @@ fstype_to_string (int t)
296} 285}
297#endif /* MOUNTED_VMOUNT */ 286#endif /* MOUNTED_VMOUNT */
298 287
299/* Return a list of the currently mounted filesystems, or NULL on error. 288/* Return a list of the currently mounted file systems, or NULL on error.
300 Add each entry to the tail of the list so that they stay in order. 289 Add each entry to the tail of the list so that they stay in order.
301 If NEED_FS_TYPE is nonzero, ensure that the filesystem type fields in 290 If NEED_FS_TYPE is true, ensure that the file system type fields in
302 the returned list are valid. Otherwise, they might not be. */ 291 the returned list are valid. Otherwise, they might not be. */
303 292
304struct mount_entry * 293struct mount_entry *
305read_filesystem_list (int need_fs_type) 294read_file_system_list (bool need_fs_type)
306{ 295{
307 struct mount_entry *mount_list; 296 struct mount_entry *mount_list;
308 struct mount_entry *me; 297 struct mount_entry *me;
@@ -360,12 +349,7 @@ read_filesystem_list (int need_fs_type)
360 me->me_remote = ME_REMOTE (me->me_devname, me->me_type); 349 me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
361 devopt = strstr (mnt->mnt_opts, "dev="); 350 devopt = strstr (mnt->mnt_opts, "dev=");
362 if (devopt) 351 if (devopt)
363 { 352 me->me_dev = strtoul (devopt + 4, NULL, 16);
364 if (devopt[4] == '0' && (devopt[5] == 'x' || devopt[5] == 'X'))
365 me->me_dev = xatoi (devopt + 6);
366 else
367 me->me_dev = xatoi (devopt + 4);
368 }
369 else 353 else
370 me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ 354 me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
371 355
@@ -438,14 +422,14 @@ read_filesystem_list (int need_fs_type)
438#if defined MOUNTED_FS_STAT_DEV /* BeOS */ 422#if defined MOUNTED_FS_STAT_DEV /* BeOS */
439 { 423 {
440 /* The next_dev() and fs_stat_dev() system calls give the list of 424 /* The next_dev() and fs_stat_dev() system calls give the list of
441 all filesystems, including the information returned by statvfs() 425 all file systems, including the information returned by statvfs()
442 (fs type, total blocks, free blocks etc.), but without the mount 426 (fs type, total blocks, free blocks etc.), but without the mount
443 point. But on BeOS all filesystems except / are mounted in the 427 point. But on BeOS all file systems except / are mounted in the
444 rootfs, directly under /. 428 rootfs, directly under /.
445 The directory name of the mount point is often, but not always, 429 The directory name of the mount point is often, but not always,
446 identical to the volume name of the device. 430 identical to the volume name of the device.
447 We therefore get the list of subdirectories of /, and the list 431 We therefore get the list of subdirectories of /, and the list
448 of all filesystems, and match the two lists. */ 432 of all file systems, and match the two lists. */
449 433
450 DIR *dirp; 434 DIR *dirp;
451 struct rootdir_entry 435 struct rootdir_entry
@@ -744,12 +728,12 @@ read_filesystem_list (int need_fs_type)
744 int n_entries; 728 int n_entries;
745 int i; 729 int i;
746 730
747 /* Ask how many bytes to allocate for the mounted filesystem info. */ 731 /* Ask how many bytes to allocate for the mounted file system info. */
748 if (mntctl (MCTL_QUERY, sizeof bufsize, (struct vmount *) &bufsize) != 0) 732 if (mntctl (MCTL_QUERY, sizeof bufsize, (struct vmount *) &bufsize) != 0)
749 return NULL; 733 return NULL;
750 entries = xmalloc (bufsize); 734 entries = xmalloc (bufsize);
751 735
752 /* Get the list of mounted filesystems. */ 736 /* Get the list of mounted file systems. */
753 n_entries = mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries); 737 n_entries = mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries);
754 if (n_entries < 0) 738 if (n_entries < 0)
755 { 739 {
@@ -769,16 +753,16 @@ read_filesystem_list (int need_fs_type)
769 me = xmalloc (sizeof *me); 753 me = xmalloc (sizeof *me);
770 if (vmp->vmt_flags & MNT_REMOTE) 754 if (vmp->vmt_flags & MNT_REMOTE)
771 { 755 {
772 char *host, *path; 756 char *host, *dir;
773 757
774 me->me_remote = 1; 758 me->me_remote = 1;
775 /* Prepend the remote pathname. */ 759 /* Prepend the remote dirname. */
776 host = thisent + vmp->vmt_data[VMT_HOSTNAME].vmt_off; 760 host = thisent + vmp->vmt_data[VMT_HOSTNAME].vmt_off;
777 path = thisent + vmp->vmt_data[VMT_OBJECT].vmt_off; 761 dir = thisent + vmp->vmt_data[VMT_OBJECT].vmt_off;
778 me->me_devname = xmalloc (strlen (host) + strlen (path) + 2); 762 me->me_devname = xmalloc (strlen (host) + strlen (dir) + 2);
779 strcpy (me->me_devname, host); 763 strcpy (me->me_devname, host);
780 strcat (me->me_devname, ":"); 764 strcat (me->me_devname, ":");
781 strcat (me->me_devname, path); 765 strcat (me->me_devname, dir);
782 } 766 }
783 else 767 else
784 { 768 {