da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Research
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * mounted filesystem scan support
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * where are the standards when you really need them
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <mnt.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ls.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_mntopen && _lib_mntread && _lib_mntclose
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinNoN(mnt)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * the original interface just had mode
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FIXARGS(p,m,s) do { \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((p)&&*(p)!='/') { \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mode = p; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin path = 0; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!path) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin path = s; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Mnt_t mnt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char buf[128];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __CYGWIN__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char typ[128];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char opt[128];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Header_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __CYGWIN__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast_windows.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinset(register Header_t* hp, const char* fs, const char* dir, const char* type, const char* options)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char* x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hp->mnt.flags = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (x = (const char*)strchr(fs, ':'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*++x && *x != '\\')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hp->mnt.flags |= MNT_REMOTE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*x == '(')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fs = x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin type = "auto";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (x = (const char*)strchr(fs, '@'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hp->mnt.flags |= MNT_REMOTE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfsprintf(hp->buf, sizeof(hp->buf) - 1, "%s:%*.*s", x + 1, x - fs, x - fs, fs);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fs = (const char*)hp->buf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (strmatch(type, "[aAnN][fF][sS]*"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hp->mnt.flags |= MNT_REMOTE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (streq(fs, "none"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fs = dir;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hp->mnt.fs = (char*)fs;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hp->mnt.dir = (char*)dir;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hp->mnt.type = (char*)type;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hp->mnt.options = (char*)options;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __CYGWIN__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (streq(type, "system") || streq(type, "user"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int mode;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin DWORD vser;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin DWORD flags;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin DWORD len;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char drive[4];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mode = SetErrorMode(SEM_FAILCRITICALERRORS);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin drive[0] = fs[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin drive[1] = ':';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin drive[2] = '\\';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin drive[3] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (GetVolumeInformation(drive, 0, 0, &vser, &len, &flags, hp->typ, sizeof(hp->typ) - 1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hp->mnt.type = hp->typ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SetErrorMode(mode);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = strcopy(hp->mnt.options = hp->opt, type);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = strcopy(s, ",ignorecase");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (options)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = ',';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcpy(s, options);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef MNT_REMOTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_getmntinfo && _sys_mount
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * 4.4 bsd
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * what a crappy interface
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * data returned in static buffer -- ok
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * big chunk of allocated memory that cannot be freed -- come on
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * *and* netbsd changed the interface somewhere along the line
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * private interface? my bad -- public interface? par for the bsd course
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/param.h> /* expect some macro redefinitions here */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/mount.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_getmntinfo_statvfs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define statfs statvfs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define f_flags f_flag
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Header_t hdr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct statfs* next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct statfs* last;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char opt[256];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Handle_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MFSNAMELEN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TYPE(f) ((f)->f_fstypename)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef INITMOUNTNAMES
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TYPE(f) ((char*)type[(f)->f_type])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char* type[] = INITMOUNTNAMES;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _sys_fs_types
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TYPE(f) ((char*)mnt_names[(f)->f_type])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/fs_types.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TYPE(f) (strchr((f)->f_mntfromname,':')?"nfs":"ufs")
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic struct Mnt_options_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned long flag;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char* name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinoptions[] =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_RDONLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_RDONLY, "rdonly",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_SYNCHRONOUS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_SYNCHRONOUS,"synchronous",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_NOEXEC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_NOEXEC, "noexec",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_NOSUID
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_NOSUID, "nosuid",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_NODEV
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_NODEV, "nodev",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_UNION
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_UNION, "union",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_ASYNC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_ASYNC, "async",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_NOCOREDUMP
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_NOCOREDUMP, "nocoredump",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_NOATIME
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_NOATIME, "noatime",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_SYMPERM
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_SYMPERM, "symperm",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_NODEVMTIME
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_NODEVMTIME, "nodevmtime",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_SOFTDEP
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_SOFTDEP, "softdep",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_EXRDONLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_EXRDONLY, "exrdonly",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_EXPORTED
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_EXPORTED, "exported",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_DEFEXPORTED
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_DEFEXPORTED,"defexported",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_EXPORTANON
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_EXPORTANON, "exportanon",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_EXKERB
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_EXKERB, "exkerb",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_EXNORESPORT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_EXNORESPORT,"exnoresport",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_EXPUBLIC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_EXPUBLIC, "expublic",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_LOCAL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_LOCAL, "local",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_QUOTA
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_QUOTA, "quota",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_ROOTFS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MNT_ROOTFS, "rootfs",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 0, "unknown",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmntopen(const char* path, const char* mode)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Handle_t* mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FIXARGS(path, mode, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(mp = newof(0, Handle_t, 1, 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((n = getmntinfo(&mp->next, 0)) <= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(mp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->last = mp->next + n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (void*)mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinMnt_t*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmntread(void* handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Handle_t* mp = (Handle_t*)handle;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register unsigned long flags;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (mp->next < mp->last)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags = mp->next->f_flags;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < elementsof(options); i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & options[i].flag)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n += sfsprintf(mp->opt + n, sizeof(mp->opt) - n - 1, ",%s", options[i].name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, mp->next->f_mntfromname, mp->next->f_mntonname, TYPE(mp->next), n ? (mp->opt + 1) : (char*)0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->next++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return &mp->hdr.mnt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmntclose(void* handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Handle_t* mp = (Handle_t*)handle;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!mp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(mp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_mntctl && _sys_vmount
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * aix
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/vmount.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SIZE (16 * 1024)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char* type[] =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "aix", "aix#1", "nfs", "jfs", "aix#4", "cdrom"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Header_t hdr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin long count;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct vmount* next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char remote[128];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char type[16];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct vmount info[1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Handle_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmntopen(const char* path, const char* mode)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Handle_t* mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FIXARGS(path, mode, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(mp = newof(0, Handle_t, 1, SIZE)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((mp->count = mntctl(MCTL_QUERY, sizeof(Handle_t) + SIZE, &mp->info)) <= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(mp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->next = mp->info;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (void*)mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinMnt_t*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmntread(void* handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Handle_t* mp = (Handle_t*)handle;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* o;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (mp->count > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (vmt2datasize(mp->next, VMT_HOST) && (s = vmt2dataptr(mp->next, VMT_HOST)) && !streq(s, "-"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfsprintf(mp->remote, sizeof(mp->remote) - 1, "%s:%s", s, vmt2dataptr(mp->next, VMT_OBJECT));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = mp->remote;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = vmt2dataptr(mp->next, VMT_OBJECT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (vmt2datasize(mp->next, VMT_ARGS))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin o = vmt2dataptr(mp->next, VMT_ARGS);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin o = NiL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (mp->next->vmt_gfstype)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_AIX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case MNT_AIX:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "aix";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_NFS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case MNT_NFS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "nfs";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_JFS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case MNT_JFS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "jfs";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_CDROM
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case MNT_CDROM:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "cdrom";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_SFS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case MNT_SFS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "sfs";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_CACHEFS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case MNT_CACHEFS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "cachefs";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_NFS3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case MNT_NFS3:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "nfs3";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_AUTOFS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case MNT_AUTOFS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "autofs";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfsprintf(t = mp->type, sizeof(mp->type), "aix%+d", mp->next->vmt_gfstype);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, s, vmt2dataptr(mp->next, VMT_STUB), t, o);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (--mp->count > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->next = (struct vmount*)((char*)mp->next + mp->next->vmt_length);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return &mp->hdr.mnt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmntclose(void* handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Handle_t* mp = (Handle_t*)handle;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!mp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(mp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_lib_setmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_getmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_SCO_COFF && !_SCO_ELF && !_UTS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _hdr_mnttab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_getmntent && ( _hdr_mntent || _sys_mntent && !_sys_mnttab )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(__STDPP__directive) && defined(__STDPP__hide)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__STDPP__directive pragma pp:hide endmntent getmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define endmntent ______endmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define getmntent ______getmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <stdio.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_mntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <mntent.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/mntent.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(__STDPP__directive) && defined(__STDPP__hide)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__STDPP__directive pragma pp:nohide endmntent getmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef endmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef getmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int endmntent(FILE*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern struct mntent* getmntent(FILE*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_getmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_mnttab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <mnttab.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _sys_mnttab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/mnttab.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef MOUNTED
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MNT_MNTTAB
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MOUNTED MNT_MNTTAB
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_mnttab || _sys_mnttab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MOUNTED "/etc/mnttab"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MOUNTED "/etc/mtab"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef __Lynx__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef MOUNTED
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MOUNTED "/etc/fstab"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SEP ':'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_getmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _mem_mnt_opts_mntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OPTIONS(p) ((p)->mnt_opts)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OPTIONS(p) NiL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Header_t hdr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FILE* fp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Handle_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmntopen(const char* path, const char* mode)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Handle_t* mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FIXARGS(path, mode, MOUNTED);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(mp = newof(0, Handle_t, 1, 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(mp->fp = setmntent(path, mode)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(mp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (void*)mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinMnt_t*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmntread(void* handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Handle_t* mp = (Handle_t*)handle;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct mntent* mnt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (mnt = getmntent(mp->fp))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, mnt->mnt_fsname, mnt->mnt_dir, mnt->mnt_type, OPTIONS(mnt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return &mp->hdr.mnt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmntclose(void* handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Handle_t* mp = (Handle_t*)handle;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!mp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin endmntent(mp->fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(mp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _sys_mntent && _lib_w_getmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/mntent.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define mntent w_mntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define mnt_dir mnt_mountpoint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define mnt_type mnt_fstname
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MNTBUFSIZE (sizeof(struct w_mnth)+16*sizeof(struct w_mntent))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _mem_mnt_opts_w_mntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OPTIONS(p) ((p)->mnt_opts)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OPTIONS(p) NiL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_w_getmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MNTBUFSIZE sizeof(struct mntent)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_mem_mt_dev_mnttab || !_mem_mt_filsys_mnttab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _hdr_mnttab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_mnttab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define mntent mnttab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define mnt_fsname mt_dev
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define mnt_dir mt_filsys
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _mem_mt_fstyp_mnttab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define mnt_type mt_fstyp
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _mem_mnt_opts_mnttab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OPTIONS(p) ((p)->mnt_opts)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OPTIONS(p) NiL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct mntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char mnt_fsname[256];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char mnt_dir[256];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char mnt_type[32];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char mnt_opts[64];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OPTIONS(p) ((p)->mnt_opts)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Header_t hdr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfio_t* fp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct mntent* mnt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_w_getmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int count;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char buf[MNTBUFSIZE];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Handle_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmntopen(const char* path, const char* mode)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Handle_t* mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FIXARGS(path, mode, MOUNTED);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(mp = newof(0, Handle_t, 1, 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_w_getmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((mp->count = w_getmntent(mp->buf, sizeof(mp->buf))) > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->mnt = (struct mntent*)(((struct w_mnth*)mp->buf) + 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->mnt = (struct mntent*)mp->buf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(mp->fp = sfopen(NiL, path, mode)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(mp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (void*)mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinMnt_t*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmntread(void* handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Handle_t* mp = (Handle_t*)handle;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_w_getmntent
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (mp->count-- <= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((mp->count = w_getmntent(mp->buf, sizeof(mp->buf))) <= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->count--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->mnt = (struct mntent*)(((struct w_mnth*)mp->buf) + 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, mp->mnt->mnt_fsname, mp->mnt->mnt_dir, mp->mnt->mnt_type, OPTIONS(mp->mnt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->mnt++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return &mp->hdr.mnt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_mnttab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (sfread(mp->fp, &mp->buf, sizeof(mp->buf)) == sizeof(mp->buf))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*mp->mnt->mnt_fsname && *mp->mnt->mnt_dir)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef mnt_type
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct stat st;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static char typ[32];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, mp->mnt->mnt_fsname, mp->mnt->mnt_dir, stat(mp->mnt->mnt_dir, &st) ? FS_default : strncpy(typ, fmtfs(&st), sizeof(typ) - 1), OPTIONS(mp->mnt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, mp->mnt->mnt_fsname, mp->mnt->mnt_dir, mp->mnt->mnt_type, OPTIONS(mp->mnt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return &mp->hdr.mnt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* m;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* b;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int q;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin again:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin q = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b = s = mp->mnt->mnt_fsname;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = s + sizeof(mp->mnt->mnt_fsname) - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;) switch (c = sfgetc(mp->fp))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case EOF:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '"':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\'':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (q == c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin q = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!q)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin q = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef SEP
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case SEP:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ' ':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\t':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s != b && !q) switch (++x)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 1:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b = s = mp->mnt->mnt_dir;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = s + sizeof(mp->mnt->mnt_dir) - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 2:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b = s = mp->mnt->mnt_type;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = s + sizeof(mp->mnt->mnt_type) - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 3:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b = s = mp->mnt->mnt_opts;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = s + sizeof(mp->mnt->mnt_opts) - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 4:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b = s = m = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\n':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (x >= 3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, mp->mnt->mnt_fsname, mp->mnt->mnt_dir, mp->mnt->mnt_type, OPTIONS(mp->mnt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return &mp->hdr.mnt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto again;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s < m)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmntclose(void* handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Handle_t* mp = (Handle_t*)handle;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!mp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfclose(mp->fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(mp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * currently no write
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmntwrite(void* handle, const Mnt_t* mnt)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NoP(handle);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NoP(mnt);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif