Reverted to an older gpl2 version of mountlist.c, needed for integration in debian and ubuntu.

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@681 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Adrien Destugues 2009-03-17 12:40:25 +00:00
parent c6f4130efd
commit f009016624

View File

@ -3,10 +3,10 @@
Copyright (C) 1991, 1992, 1997, 1998, 1999, 2000, 2001, 2002, 2003, Copyright (C) 1991, 1992, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
2004, 2005, 2006, 2007 Free Software Foundation, Inc. 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or the Free Software Foundation; either version 2, or (at your option)
(at your option) any later version. any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -14,7 +14,8 @@
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */ along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#if(!defined(__WIN32__))&&(!defined(__amigaos4__))&&(!defined(__AROS__))&&(!defined(__MORPHOS__)) #if(!defined(__WIN32__))&&(!defined(__amigaos4__))&&(!defined(__AROS__))&&(!defined(__MORPHOS__))
@ -47,10 +48,10 @@
# include <sys/param.h> # include <sys/param.h>
#endif #endif
#if defined MOUNTED_GETFSSTAT /* OSF_1 and Darwin1.3.x */ #if defined MOUNTED_GETFSSTAT /* OSF_1 and Darwin1.3.x */
# if HAVE_SYS_UCRED_H # if HAVE_SYS_UCRED_H
# include <grp.h> /* needed on OSF V4.0 for definition of NGROUPS, # include <grp.h> /* needed on OSF V4.0 for definition of NGROUPS,
NGROUPS is used as an array dimension in ucred.h */ NGROUPS is used as an array dimension in ucred.h */
# include <sys/ucred.h> /* needed by powerpc-apple-darwin1.3.7 */ # include <sys/ucred.h> /* needed by powerpc-apple-darwin1.3.7 */
# endif # endif
# if HAVE_SYS_MOUNT_H # if HAVE_SYS_MOUNT_H
@ -66,44 +67,44 @@
# endif # endif
#endif /* MOUNTED_GETFSSTAT */ #endif /* MOUNTED_GETFSSTAT */
#ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */ #ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
# include <mntent.h> # include <mntent.h>
# if !defined MOUNTED # if !defined MOUNTED
# if defined _PATH_MOUNTED /* GNU libc */ # if defined _PATH_MOUNTED /* GNU libc */
# define MOUNTED _PATH_MOUNTED # define MOUNTED _PATH_MOUNTED
# endif # endif
# if defined MNT_MNTTAB /* HP-UX. */ # if defined MNT_MNTTAB /* HP-UX. */
# define MOUNTED MNT_MNTTAB # define MOUNTED MNT_MNTTAB
# endif # endif
# if defined MNTTABNAME /* Dynix. */ # if defined MNTTABNAME /* Dynix. */
# define MOUNTED MNTTABNAME # define MOUNTED MNTTABNAME
# endif # endif
# endif # endif
#endif #endif
#ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */ #ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */
# include <sys/mount.h> # include <sys/mount.h>
#endif #endif
#ifdef MOUNTED_GETMNTINFO2 /* NetBSD 3.0. */ #ifdef MOUNTED_GETMNTINFO2 /* NetBSD 3.0. */
# include <sys/statvfs.h> # include <sys/statvfs.h>
#endif #endif
#ifdef MOUNTED_GETMNT /* Ultrix. */ #ifdef MOUNTED_GETMNT /* Ultrix. */
# include <sys/mount.h> # include <sys/mount.h>
# include <sys/fs_types.h> # include <sys/fs_types.h>
#endif #endif
#ifdef MOUNTED_FS_STAT_DEV /* BeOS. */ #ifdef MOUNTED_FS_STAT_DEV /* BeOS. */
# include <fs_info.h> # include <fs_info.h>
# include <dirent.h> # include <dirent.h>
#endif #endif
#ifdef MOUNTED_FREAD /* SVR2. */ #ifdef MOUNTED_FREAD /* SVR2. */
# include <mnttab.h> # include <mnttab.h>
#endif #endif
#ifdef MOUNTED_FREAD_FSTYP /* SVR3. */ #ifdef MOUNTED_FREAD_FSTYP /* SVR3. */
# include <mnttab.h> # include <mnttab.h>
# include <sys/fstyp.h> # include <sys/fstyp.h>
# include <sys/statfs.h> # include <sys/statfs.h>
@ -113,11 +114,11 @@
# include <mntent.h> # include <mntent.h>
#endif #endif
#ifdef MOUNTED_GETMNTENT2 /* SVR4. */ #ifdef MOUNTED_GETMNTENT2 /* SVR4. */
# include <sys/mnttab.h> # include <sys/mnttab.h>
#endif #endif
#ifdef MOUNTED_VMOUNT /* AIX. */ #ifdef MOUNTED_VMOUNT /* AIX. */
# include <fshelp.h> # include <fshelp.h>
# include <sys/vfs.h> # include <sys/vfs.h>
#endif #endif
@ -159,8 +160,7 @@
#undef closedir #undef closedir
#ifndef ME_DUMMY #ifndef ME_DUMMY
#ifdef __macosx__ # define ME_DUMMY(Fs_name, Fs_type) \
# define ME_DUMMY(Fs_name, Fs_type) \
(strcmp (Fs_type, "autofs") == 0 \ (strcmp (Fs_type, "autofs") == 0 \
|| strcmp (Fs_type, "none") == 0 \ || strcmp (Fs_type, "none") == 0 \
|| strcmp (Fs_type, "proc") == 0 \ || strcmp (Fs_type, "proc") == 0 \
@ -178,35 +178,20 @@
|| strcmp (Fs_type, "fdesc") == 0 \ || strcmp (Fs_type, "fdesc") == 0 \
|| strcmp (Fs_type, "nfs") == 0 \ || strcmp (Fs_type, "nfs") == 0 \
|| strcmp (Fs_type, "volfs") == 0) || strcmp (Fs_type, "volfs") == 0)
#else
# define ME_DUMMY(Fs_name, Fs_type) \
(strcmp (Fs_type, "autofs") == 0 \
|| strcmp (Fs_type, "none") == 0 \
|| strcmp (Fs_type, "proc") == 0 \
|| strcmp (Fs_type, "subfs") == 0 \
|| strcmp (Fs_type, "sysfs") == 0 \
|| strcmp (Fs_type, "usbfs") == 0 \
|| strcmp (Fs_type, "devpts") == 0 \
|| strcmp (Fs_type, "tmpfs") == 0 \
/* for NetBSD 3.0 */ \
|| strcmp (Fs_type, "kernfs") == 0 \
/* for Irix 6.5 */ \
|| strcmp (Fs_type, "ignore") == 0)
#endif #endif
#endif // ME_DUMMY
#ifndef ME_REMOTE #ifndef ME_REMOTE
/* A file system is `remote' if its Fs_name contains a `:' /* A file system is `remote' if its Fs_name contains a `:'
or if (it is of type (smbfs or cifs) and its Fs_name starts with `//'). */ or if (it is of type (smbfs or cifs) and its Fs_name starts with `//'). */
# define ME_REMOTE(Fs_name, Fs_type) \ # define ME_REMOTE(Fs_name, Fs_type) \
(strchr (Fs_name, ':') != NULL \ (strchr (Fs_name, ':') != NULL \
|| ((Fs_name)[0] == '/' \ || ((Fs_name)[0] == '/' \
&& (Fs_name)[1] == '/' \ && (Fs_name)[1] == '/' \
&& (strcmp (Fs_type, "smbfs") == 0 \ && (strcmp (Fs_type, "smbfs") == 0 \
|| strcmp (Fs_type, "cifs") == 0))) || strcmp (Fs_type, "cifs") == 0)))
#endif #endif
#ifdef MOUNTED_GETMNTINFO #if MOUNTED_GETMNTINFO
# if ! HAVE_STRUCT_STATFS_F_FSTYPENAME # if ! HAVE_STRUCT_STATFS_F_FSTYPENAME
static char * static char *
@ -316,7 +301,7 @@ fsp_to_string (const struct statfs *fsp)
#endif /* MOUNTED_GETMNTINFO */ #endif /* MOUNTED_GETMNTINFO */
#ifdef MOUNTED_VMOUNT /* AIX. */ #ifdef MOUNTED_VMOUNT /* AIX. */
static char * static char *
fstype_to_string (int t) fstype_to_string (int t)
{ {
@ -355,10 +340,10 @@ dev_from_mount_options (char const *mount_options)
errno = 0; errno = 0;
dev = strtoul (optval, &optvalend, 16); dev = strtoul (optval, &optvalend, 16);
if (optval != optvalend if (optval != optvalend
&& (*optvalend == '\0' || *optvalend == ',') && (*optvalend == '\0' || *optvalend == ',')
&& ! (dev == ULONG_MAX && errno == ERANGE) && ! (dev == ULONG_MAX && errno == ERANGE)
&& dev == (dev_t) dev) && dev == (dev_t) dev)
return dev; return dev;
} }
# endif # endif
@ -410,7 +395,6 @@ read_file_system_list (bool need_fs_type)
} }
#endif #endif
#ifdef MOUNTED_GETMNTENT1 /* GNU/Linux, 4.3BSD, SunOS, HP-UX, Dynix, Irix. */ #ifdef MOUNTED_GETMNTENT1 /* GNU/Linux, 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
{ {
struct mntent *mnt; struct mntent *mnt;
@ -423,18 +407,18 @@ read_file_system_list (bool need_fs_type)
while ((mnt = getmntent (fp))) while ((mnt = getmntent (fp)))
{ {
me = malloc (sizeof *me); me = malloc (sizeof *me);
me->me_devname = strdup (mnt->mnt_fsname); me->me_devname = strdup (mnt->mnt_fsname);
me->me_mountdir = strdup (mnt->mnt_dir); me->me_mountdir = strdup (mnt->mnt_dir);
me->me_type = strdup (mnt->mnt_type); me->me_type = strdup (mnt->mnt_type);
me->me_type_malloced = 1; me->me_type_malloced = 1;
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
me->me_dev = dev_from_mount_options (mnt->mnt_opts); me->me_dev = dev_from_mount_options (mnt->mnt_opts);
/* Add to the linked list. */ /* Add to the linked list. */
*mtail = me; *mtail = me;
mtail = &me->me_next; mtail = &me->me_next;
} }
if (endmntent (fp) == 0) if (endmntent (fp) == 0)
@ -442,35 +426,7 @@ read_file_system_list (bool need_fs_type)
} }
#endif /* MOUNTED_GETMNTENT1. */ #endif /* MOUNTED_GETMNTENT1. */
#ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */ #ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */
#if defined(__macosx__) || defined(__FreeBSD__)
{
struct statfs *fsp;
int entries;
int i;
entries = getmntinfo (&fsp, MNT_NOWAIT);
if (entries < 0)
return NULL;
for (i = 0; i < entries; i++)
{
me = malloc (sizeof *me);
me->me_devname = strdup (fsp->f_mntfromname);
me->me_mountdir = strdup (fsp->f_mntonname);
me->me_type = fsp->f_fstypename;
me->me_type_malloced = 0;
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
/* Add to the linked list. */
*mtail = me;
mtail = &me->me_next;
fsp++;
}
}
#else
{ {
struct statfs *fsp; struct statfs *fsp;
int entries; int entries;
@ -480,12 +436,10 @@ read_file_system_list (bool need_fs_type)
return NULL; return NULL;
for (; entries-- > 0; fsp++) for (; entries-- > 0; fsp++)
{ {
char *fs_type = fsp_to_string (fsp); me = malloc (sizeof *me);
me->me_devname = strdup (fsp->f_mntfromname);
me = xmalloc (sizeof *me); me->me_mountdir = strdup (fsp->f_mntonname);
me->me_devname = xstrdup (fsp->f_mntfromname); me->me_type = fsp->fs_typename;
me->me_mountdir = xstrdup (fsp->f_mntonname);
me->me_type = fs_type;
me->me_type_malloced = 0; me->me_type_malloced = 0;
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
@ -496,11 +450,9 @@ read_file_system_list (bool need_fs_type)
mtail = &me->me_next; mtail = &me->me_next;
} }
} }
#endif
#endif /* MOUNTED_GETMNTINFO */ #endif /* MOUNTED_GETMNTINFO */
#ifdef MOUNTED_GETMNTINFO2 /* NetBSD 3.0. */
#ifdef MOUNTED_GETMNTINFO2 /* NetBSD 3.0. */
{ {
struct statvfs *fsp; struct statvfs *fsp;
int entries; int entries;
@ -510,45 +462,44 @@ read_file_system_list (bool need_fs_type)
return NULL; return NULL;
for (; entries-- > 0; fsp++) for (; entries-- > 0; fsp++)
{ {
me = xmalloc (sizeof *me); me = xmalloc (sizeof *me);
me->me_devname = xstrdup (fsp->f_mntfromname); me->me_devname = xstrdup (fsp->f_mntfromname);
me->me_mountdir = xstrdup (fsp->f_mntonname); me->me_mountdir = xstrdup (fsp->f_mntonname);
me->me_type = xstrdup (fsp->f_fstypename); me->me_type = xstrdup (fsp->f_fstypename);
me->me_type_malloced = 1; me->me_type_malloced = 1;
prtinf("device: %s\n", me->me_devname); me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
/* Add to the linked list. */ /* Add to the linked list. */
*mtail = me; *mtail = me;
mtail = &me->me_next; mtail = &me->me_next;
} }
} }
#endif /* MOUNTED_GETMNTINFO2 */ #endif /* MOUNTED_GETMNTINFO2 */
#ifdef MOUNTED_GETMNT /* Ultrix. */ #ifdef MOUNTED_GETMNT /* Ultrix. */
{ {
int offset = 0; int offset = 0;
int val; int val;
struct fs_data fsd; struct fs_data fsd;
while (errno = 0, while (errno = 0,
0 < (val = getmnt (&offset, &fsd, sizeof (fsd), NOSTAT_MANY, 0 < (val = getmnt (&offset, &fsd, sizeof (fsd), NOSTAT_MANY,
(char *) 0))) (char *) 0)))
{ {
me = xmalloc (sizeof *me); me = xmalloc (sizeof *me);
me->me_devname = xstrdup (fsd.fd_req.devname); me->me_devname = xstrdup (fsd.fd_req.devname);
me->me_mountdir = xstrdup (fsd.fd_req.path); me->me_mountdir = xstrdup (fsd.fd_req.path);
me->me_type = gt_names[fsd.fd_req.fstype]; me->me_type = gt_names[fsd.fd_req.fstype];
me->me_type_malloced = 0; me->me_type_malloced = 0;
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
me->me_dev = fsd.fd_req.dev; me->me_dev = fsd.fd_req.dev;
/* Add to the linked list. */ /* Add to the linked list. */
*mtail = me; *mtail = me;
mtail = &me->me_next; mtail = &me->me_next;
} }
if (val < 0) if (val < 0)
goto free_then_fail; goto free_then_fail;
@ -608,7 +559,7 @@ read_file_system_list (bool need_fs_type)
if (lstat (name, &statbuf) >= 0 && S_ISDIR (statbuf.st_mode)) if (lstat (name, &statbuf) >= 0 && S_ISDIR (statbuf.st_mode))
{ {
struct rootdir_entry *re = malloc (sizeof *re); struct rootdir_entry *re = malloc (sizeof *re);
re->name = name; re->name = name;
re->dev = statbuf.st_dev; re->dev = statbuf.st_dev;
re->ino = statbuf.st_ino; re->ino = statbuf.st_ino;
@ -634,11 +585,11 @@ read_file_system_list (bool need_fs_type)
if (re->dev == fi.dev && re->ino == fi.root) if (re->dev == fi.dev && re->ino == fi.root)
break; break;
me = malloc (sizeof *me); me = malloc (sizeof *me);
me->me_devname = strdup (fi.device_name[0] != '\0' ? fi.device_name : fi.fsh_name); me->me_devname = strdup (fi.device_name[0] != '\0' ? fi.device_name : fi.fsh_name);
me->me_mountdir = strdup (re != NULL ? re->name : fi.fsh_name); me->me_mountdir = strdup (re != NULL ? re->name : fi.fsh_name);
me->me_type = strdup (fi.fsh_name); me->me_type = strdup (fi.fsh_name);
me->me_type_malloced = 1; me->me_type_malloced = 1;
me->me_dev = fi.dev; me->me_dev = fi.dev;
me->me_dummy = 0; me->me_dummy = 0;
me->me_remote = (fi.flags & B_FS_IS_SHARED) != 0; me->me_remote = (fi.flags & B_FS_IS_SHARED) != 0;
@ -659,7 +610,7 @@ read_file_system_list (bool need_fs_type)
} }
#endif /* MOUNTED_FS_STAT_DEV */ #endif /* MOUNTED_FS_STAT_DEV */
#if defined MOUNTED_GETFSSTAT /* __alpha running OSF_1 */ #if defined MOUNTED_GETFSSTAT /* __alpha running OSF_1 */
{ {
int numsys, counter; int numsys, counter;
size_t bufsize; size_t bufsize;
@ -677,24 +628,24 @@ read_file_system_list (bool need_fs_type)
if (numsys < 0) if (numsys < 0)
{ {
free (stats); free (stats);
return (NULL); return (NULL);
} }
for (counter = 0; counter < numsys; counter++) for (counter = 0; counter < numsys; counter++)
{ {
me = xmalloc (sizeof *me); me = xmalloc (sizeof *me);
me->me_devname = xstrdup (stats[counter].f_mntfromname); me->me_devname = xstrdup (stats[counter].f_mntfromname);
me->me_mountdir = xstrdup (stats[counter].f_mntonname); me->me_mountdir = xstrdup (stats[counter].f_mntonname);
me->me_type = xstrdup (FS_TYPE (stats[counter])); me->me_type = xstrdup (FS_TYPE (stats[counter]));
me->me_type_malloced = 1; me->me_type_malloced = 1;
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
/* Add to the linked list. */ /* Add to the linked list. */
*mtail = me; *mtail = me;
mtail = &me->me_next; mtail = &me->me_next;
} }
free (stats); free (stats);
@ -713,47 +664,47 @@ read_file_system_list (bool need_fs_type)
while (fread (&mnt, sizeof mnt, 1, fp) > 0) while (fread (&mnt, sizeof mnt, 1, fp) > 0)
{ {
me = xmalloc (sizeof *me); me = xmalloc (sizeof *me);
# ifdef GETFSTYP /* SVR3. */ # ifdef GETFSTYP /* SVR3. */
me->me_devname = xstrdup (mnt.mt_dev); me->me_devname = xstrdup (mnt.mt_dev);
# else # else
me->me_devname = xmalloc (strlen (mnt.mt_dev) + 6); me->me_devname = xmalloc (strlen (mnt.mt_dev) + 6);
strcpy (me->me_devname, "/dev/"); strcpy (me->me_devname, "/dev/");
strcpy (me->me_devname + 5, mnt.mt_dev); strcpy (me->me_devname + 5, mnt.mt_dev);
# endif # endif
me->me_mountdir = xstrdup (mnt.mt_filsys); me->me_mountdir = xstrdup (mnt.mt_filsys);
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
me->me_type = ""; me->me_type = "";
me->me_type_malloced = 0; me->me_type_malloced = 0;
# ifdef GETFSTYP /* SVR3. */ # ifdef GETFSTYP /* SVR3. */
if (need_fs_type) if (need_fs_type)
{ {
struct statfs fsd; struct statfs fsd;
char typebuf[FSTYPSZ]; char typebuf[FSTYPSZ];
if (statfs (me->me_mountdir, &fsd, sizeof fsd, 0) != -1 if (statfs (me->me_mountdir, &fsd, sizeof fsd, 0) != -1
&& sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1) && sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1)
{ {
me->me_type = xstrdup (typebuf); me->me_type = xstrdup (typebuf);
me->me_type_malloced = 1; me->me_type_malloced = 1;
} }
} }
# endif # endif
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
/* Add to the linked list. */ /* Add to the linked list. */
*mtail = me; *mtail = me;
mtail = &me->me_next; mtail = &me->me_next;
} }
if (ferror (fp)) if (ferror (fp))
{ {
/* The last fread() call must have failed. */ /* The last fread() call must have failed. */
int saved_errno = errno; int saved_errno = errno;
fclose (fp); fclose (fp);
errno = saved_errno; errno = saved_errno;
goto free_then_fail; goto free_then_fail;
} }
if (fclose (fp) == EOF) if (fclose (fp) == EOF)
@ -761,29 +712,29 @@ read_file_system_list (bool need_fs_type)
} }
#endif /* MOUNTED_FREAD || MOUNTED_FREAD_FSTYP. */ #endif /* MOUNTED_FREAD || MOUNTED_FREAD_FSTYP. */
#ifdef MOUNTED_GETMNTTBL /* DolphinOS goes its own way. */ #ifdef MOUNTED_GETMNTTBL /* DolphinOS goes its own way. */
{ {
struct mntent **mnttbl = getmnttbl (), **ent; struct mntent **mnttbl = getmnttbl (), **ent;
for (ent=mnttbl;*ent;ent++) for (ent=mnttbl;*ent;ent++)
{ {
me = xmalloc (sizeof *me); me = xmalloc (sizeof *me);
me->me_devname = xstrdup ( (*ent)->mt_resource); me->me_devname = xstrdup ( (*ent)->mt_resource);
me->me_mountdir = xstrdup ( (*ent)->mt_directory); me->me_mountdir = xstrdup ( (*ent)->mt_directory);
me->me_type = xstrdup ((*ent)->mt_fstype); me->me_type = xstrdup ((*ent)->mt_fstype);
me->me_type_malloced = 1; me->me_type_malloced = 1;
me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
/* Add to the linked list. */ /* Add to the linked list. */
*mtail = me; *mtail = me;
mtail = &me->me_next; mtail = &me->me_next;
} }
endmnttbl (); endmnttbl ();
} }
#endif #endif
#ifdef MOUNTED_GETMNTENT2 /* SVR4. */ #ifdef MOUNTED_GETMNTENT2 /* SVR4. */
{ {
struct mnttab mnt; struct mnttab mnt;
char *table = MNTTAB; char *table = MNTTAB;
@ -802,19 +753,19 @@ read_file_system_list (bool need_fs_type)
lockfd = open (MNTTAB_LOCK, O_RDONLY); lockfd = open (MNTTAB_LOCK, O_RDONLY);
if (0 <= lockfd) if (0 <= lockfd)
{ {
struct flock flock; struct flock flock;
flock.l_type = F_RDLCK; flock.l_type = F_RDLCK;
flock.l_whence = SEEK_SET; flock.l_whence = SEEK_SET;
flock.l_start = 0; flock.l_start = 0;
flock.l_len = 0; flock.l_len = 0;
while (fcntl (lockfd, F_SETLKW, &flock) == -1) while (fcntl (lockfd, F_SETLKW, &flock) == -1)
if (errno != EINTR) if (errno != EINTR)
{ {
int saved_errno = errno; int saved_errno = errno;
close (lockfd); close (lockfd);
errno = saved_errno; errno = saved_errno;
return NULL; return NULL;
} }
} }
else if (errno != ENOENT) else if (errno != ENOENT)
return NULL; return NULL;
@ -826,23 +777,23 @@ read_file_system_list (bool need_fs_type)
ret = errno; ret = errno;
else else
{ {
while ((ret = getmntent (fp, &mnt)) == 0) while ((ret = getmntent (fp, &mnt)) == 0)
{ {
me = xmalloc (sizeof *me); me = xmalloc (sizeof *me);
me->me_devname = xstrdup (mnt.mnt_special); me->me_devname = xstrdup (mnt.mnt_special);
me->me_mountdir = xstrdup (mnt.mnt_mountp); me->me_mountdir = xstrdup (mnt.mnt_mountp);
me->me_type = xstrdup (mnt.mnt_fstype); me->me_type = xstrdup (mnt.mnt_fstype);
me->me_type_malloced = 1; me->me_type_malloced = 1;
me->me_dummy = MNT_IGNORE (&mnt) != 0; me->me_dummy = MNT_IGNORE (&mnt) != 0;
me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
me->me_dev = dev_from_mount_options (mnt.mnt_mntopts); me->me_dev = dev_from_mount_options (mnt.mnt_mntopts);
/* Add to the linked list. */ /* Add to the linked list. */
*mtail = me; *mtail = me;
mtail = &me->me_next; mtail = &me->me_next;
} }
ret = fclose (fp) == EOF ? errno : 0 < ret ? 0 : -1; ret = fclose (fp) == EOF ? errno : 0 < ret ? 0 : -1;
} }
if (0 <= lockfd && close (lockfd) != 0) if (0 <= lockfd && close (lockfd) != 0)
@ -850,13 +801,13 @@ read_file_system_list (bool need_fs_type)
if (0 <= ret) if (0 <= ret)
{ {
errno = ret; errno = ret;
goto free_then_fail; goto free_then_fail;
} }
} }
#endif /* MOUNTED_GETMNTENT2. */ #endif /* MOUNTED_GETMNTENT2. */
#ifdef MOUNTED_VMOUNT /* AIX. */ #ifdef MOUNTED_VMOUNT /* AIX. */
{ {
int bufsize; int bufsize;
char *entries, *thisent; char *entries, *thisent;
@ -873,53 +824,53 @@ read_file_system_list (bool need_fs_type)
n_entries = mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries); n_entries = mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries);
if (n_entries < 0) if (n_entries < 0)
{ {
int saved_errno = errno; int saved_errno = errno;
free (entries); free (entries);
errno = saved_errno; errno = saved_errno;
return NULL; return NULL;
} }
for (i = 0, thisent = entries; for (i = 0, thisent = entries;
i < n_entries; i < n_entries;
i++, thisent += vmp->vmt_length) i++, thisent += vmp->vmt_length)
{ {
char *options, *ignore; char *options, *ignore;
vmp = (struct vmount *) thisent; vmp = (struct vmount *) thisent;
me = xmalloc (sizeof *me); me = xmalloc (sizeof *me);
if (vmp->vmt_flags & MNT_REMOTE) if (vmp->vmt_flags & MNT_REMOTE)
{ {
char *host, *dir; char *host, *dir;
me->me_remote = 1; me->me_remote = 1;
/* Prepend the remote dirname. */ /* Prepend the remote dirname. */
host = thisent + vmp->vmt_data[VMT_HOSTNAME].vmt_off; host = thisent + vmp->vmt_data[VMT_HOSTNAME].vmt_off;
dir = thisent + vmp->vmt_data[VMT_OBJECT].vmt_off; dir = thisent + vmp->vmt_data[VMT_OBJECT].vmt_off;
me->me_devname = xmalloc (strlen (host) + strlen (dir) + 2); me->me_devname = xmalloc (strlen (host) + strlen (dir) + 2);
strcpy (me->me_devname, host); strcpy (me->me_devname, host);
strcat (me->me_devname, ":"); strcat (me->me_devname, ":");
strcat (me->me_devname, dir); strcat (me->me_devname, dir);
} }
else else
{ {
me->me_remote = 0; me->me_remote = 0;
me->me_devname = xstrdup (thisent + me->me_devname = xstrdup (thisent +
vmp->vmt_data[VMT_OBJECT].vmt_off); vmp->vmt_data[VMT_OBJECT].vmt_off);
} }
me->me_mountdir = xstrdup (thisent + vmp->vmt_data[VMT_STUB].vmt_off); me->me_mountdir = xstrdup (thisent + vmp->vmt_data[VMT_STUB].vmt_off);
me->me_type = xstrdup (fstype_to_string (vmp->vmt_gfstype)); me->me_type = xstrdup (fstype_to_string (vmp->vmt_gfstype));
me->me_type_malloced = 1; me->me_type_malloced = 1;
options = thisent + vmp->vmt_data[VMT_ARGS].vmt_off; options = thisent + vmp->vmt_data[VMT_ARGS].vmt_off;
ignore = strstr (options, "ignore"); ignore = strstr (options, "ignore");
me->me_dummy = (ignore me->me_dummy = (ignore
&& (ignore == options || ignore[-1] == ',') && (ignore == options || ignore[-1] == ',')
&& (ignore[sizeof "ignore" - 1] == ',' && (ignore[sizeof "ignore" - 1] == ','
|| ignore[sizeof "ignore" - 1] == '\0')); || ignore[sizeof "ignore" - 1] == '\0'));
me->me_dev = (dev_t) -1; /* vmt_fsid might be the info we want. */ me->me_dev = (dev_t) -1; /* vmt_fsid might be the info we want. */
/* Add to the linked list. */ /* Add to the linked list. */
*mtail = me; *mtail = me;
mtail = &me->me_next; mtail = &me->me_next;
} }
free (entries); free (entries);
} }
@ -936,18 +887,16 @@ read_file_system_list (bool need_fs_type)
while (mount_list) while (mount_list)
{ {
me = mount_list->me_next; me = mount_list->me_next;
free (mount_list->me_devname); free (mount_list->me_devname);
free (mount_list->me_mountdir); free (mount_list->me_mountdir);
if (mount_list->me_type_malloced) if (mount_list->me_type_malloced)
free (mount_list->me_type); free (mount_list->me_type);
free (mount_list); free (mount_list);
mount_list = me; mount_list = me;
} }
errno = saved_errno; errno = saved_errno;
return NULL; return NULL;
} }
} }
#endif