#ifndef ADD_SYS_MOUNT_H
#define ADD_SYS_MOUNT_H

#include <sys/attr.h>
#include <sys/kernel_types.h>
#include <stdint.h>

#include <APPLE/sys/mount.h>

/*MOUNT(2)                    BSD System Calls Manual                   MOUNT(2)

NAME
     mount, unmount -- mount or dismount a filesystem

SYNOPSIS
     #include <sys/param.h>
     #include <sys/mount.h>

     int
     mount(const char *type, const char *dir, int flags, void *data);

     int
     unmount(const char *dir, int flags);

DESCRIPTION
     The mount() function grafts a filesystem object onto the system file tree
     at the point dir.  The argument data describes the filesystem object to
     be mounted.  The argument type tells the kernel how to interpret data
     (See type below).  The contents of the filesystem become available
     through the new mount point dir.  Any files in dir at the time of a suc-cessful successful
     cessful mount are swept under the carpet so to speak, and are unavailable
     until the filesystem is unmounted.

     The following flags may be specified to suppress default semantics which
     affect filesystem access.

     MNT_RDONLY       The filesystem should be treated as read-only; Even the
                      super-user may not write on it.

     MNT_NOEXEC       Do not allow files to be executed from the filesystem.

     MNT_NOSUID       Do not honor setuid or setgid bits on files when execut-ing executing
                      ing them.

     MNT_NODEV        Do not interpret special files on the filesystem.

     MNT_UNION        Union with underlying filesystem instead of obscuring
                      it.

     MNT_SYNCHRONOUS  All I/O to the filesystem should be done synchronously.

     The flag MNT_UPDATE indicates that the mount command is being applied to
     an already mounted filesystem.  This allows the mount flags to be changed
     without requiring that the filesystem be unmounted and remounted.  Some
     filesystems may not allow all flags to be changed.  For example, most
     filesystems will not allow a change from read-write to read-only.

     The flag MNT_RELOAD causes the vfs subsystem to update its data struc-tures structures
     tures pertaining to the specified already mounted filesystem.

     The type argument defines the type of the filesystem.

     Data is a pointer to a structure that contains the type specific argu-ments arguments
     ments to mount.  The format for these argument structures is described in
     the manual page for each filesystem.

     The umount() function call disassociates the filesystem from the speci-fied specified
     fied mount point dir.

     The flags argument may specify MNT_FORCE to specify that the filesystem
     should be forcibly unmounted even if files are still active.  Active spe-cial special
     cial devices continue to work, but any further accesses to any other
     active files result in errors even if the filesystem is later remounted.

RETURN VALUES
     The mount() returns the value 0 if the mount was successful, otherwise -1
     is returned and the variable errno is set to indicate the error.

     Umount returns the value 0 if the umount succeeded; otherwise -1 is
     returned and the variable errno is set to indicate the error.

ERRORS
     Mount() will fail when one of the following occurs:

     [EPERM]         The caller is not the super-user, and the device-node and
                     the mountpoint do not have adequate ownership and permis-sions. permissions.
                     sions.

     [ENAMETOOLONG]  A component of a pathname exceeded {NAME_MAX} characters,
                     or an entire path name exceeded {PATH_MAX} characters.

     [ELOOP]         Too many symbolic links were encountered in translating a
                     pathname.

     [ENOENT]        A component of dir does not exist.

     [ENOTDIR]       A component of name is not a directory, or a path prefix
                     of special is not a directory.

     [EINVAL]        A pathname contains a character with the high-order bit
                     set.

     [EBUSY]         Another process currently holds a reference to dir.

     [EFAULT]        Dir points outside the process's allocated address space.

     Umount may fail with one of the following errors:

     [EPERM]         The caller is not the super-user, and the mount() was not
                     done by the user.

     [ENOTDIR]       A component of the path is not a directory.

     [EINVAL]        The pathname contains a character with the high-order bit
                     set.

     [ENAMETOOLONG]  A component of a pathname exceeded {NAME_MAX} characters,
                     or an entire path name exceeded {PATH_MAX} characters.

     [ELOOP]         Too many symbolic links were encountered in translating
                     the pathname.

     [EINVAL]        The requested directory is not in the mount table.

     [EBUSY]         A process is holding a reference to a file located on the
                     filesystem.

     [EIO]           An I/O error occurred while writing cached filesystem
                     information.

     [EFAULT]        Dir points outside the process's allocated address space.

SEE ALSO
     mount(8), umount(8),

BUGS
     Some of the error codes need translation to more obvious messages.

HISTORY
     Mount() and umount() function calls appeared in Version 6 AT&T UNIX.

4th Berkeley Distribution      December 11, 1993     4th Berkeley Distribution*/
     //int
     //mount(const char *type, const char *dir, int flags, void *data);
#define oc_mount(type,dir,flags,data) mount ("File", dir,  type, flags, data)


//extern int mount (__const char *__special_file, __const char *__dir,
//		  __const char *__fstype, unsigned long int __rwflag,
//		  __const void *__data) __THROW;


/*MNT_IGNORE_OWNERSHIP

See Also:
User-specifiable Mount Flags
#define MNT_IGNORE_OWNERSHIP 0x00200000 // VFS will ignore ownership information on filesystem objects /
Discussion 
#define MNT_IGNORE_OWNERSHIP 0x00200000 
User specifiable flags. 

Unmount uses MNT_FORCE flag.*/
#define MNT_IGNORE_OWNERSHIP 0x00200000 

/*MNAMELEN

See Also:
FS stats
#define MNAMELEN 90 /* length of buffer for returned name *
Discussion 

file system statistics*/
#define MNAMELEN 90 /* length of buffer for returned name */


/*MNT_EXPORTED

#define MNT_EXPORTED 0x00000100 / file system is exported *
Discussion 

NFS export related mount flags.*/
#define MNT_EXPORTED 0x00000100 /* file system is exported */

/*MNT_UNKNOWNPERMISSIONS

#define MNT_UNKNOWNPERMISSIONS 0x00200000 / VFS will ignore ownership information on filesystem objects *
Discussion 

backwards compatibility only*/
#define MNT_UNKNOWNPERMISSIONS 0x00200000 /* VFS will ignore ownership information on filesystem objects */

/*MNT_DONTBROWSE

See Also:
User-specifiable Mount Flags
#define MNT_DONTBROWSE 0x00100000 / file system is not appropriate path to user data *
Discussion 

User specifiable flags. 

Unmount uses MNT_FORCE flag.*/
#define MNT_DONTBROWSE 0x00100000 /* file system is not appropriate path to user data */

/*MNT_ASYNC

See Also:
User-specifiable Mount Flags
#define MNT_ASYNC 0x00000040 / file system written asynchronously *
Discussion 

User specifiable flags. 

Unmount uses MNT_FORCE flag.*/
#define MNT_ASYNC 0x00000040 /* file system written asynchronously */

/*MNT_JOURNALED

See Also:
User-specifiable Mount Flags
#define MNT_JOURNALED 0x00800000 / filesystem is journaled *
Discussion 

User specifiable flags. 

Unmount uses MNT_FORCE flag.*/
#define MNT_JOURNALED 0x00800000 /* filesystem is journaled */

/*MNT_UNION

See Also:
User-specifiable Mount Flags
#define MNT_UNION 0x00000020 / union with underlying filesystem *
Discussion 

User specifiable flags. 

Unmount uses MNT_FORCE flag.*/
#define MNT_UNION 0x00000020 /* union with underlying filesystem */

/*MNT_NODEV

See Also:
User-specifiable Mount Flags
#define MNT_NODEV 0x00000010 / don't interpret special files *
Discussion 

User specifiable flags. 

Unmount uses MNT_FORCE flag.*/
#define MNT_NODEV 0x00000010 /* don't interpret special files */

/*MNT_AUTOMOUNTED

See Also:
User-specifiable Mount Flags
#define MNT_AUTOMOUNTED 0x00400000 /filesystem was mounted by automounter *
Discussion 

User specifiable flags. 

Unmount uses MNT_FORCE flag.*/
#define MNT_AUTOMOUNTED 0x00400000 /* filesystem was mounted by automounter */

/*MNT_NOSUID

See Also:
User-specifiable Mount Flags
#define MNT_NOSUID 0x00000008 / don't honor setuid bits on fs *
Discussion 

User specifiable flags. 

Unmount uses MNT_FORCE flag.*/
#define MNT_NOSUID 0x00000008 /* don't honor setuid bits on fs */

/*MNT_NOEXEC

See Also:
User-specifiable Mount Flags
#define MNT_NOEXEC 0x00000004 / can't exec from filesystem *
Discussion 

User specifiable flags. 

Unmount uses MNT_FORCE flag.*/
#define MNT_NOEXEC 0x00000004 /* can't exec from filesystem */

/*MNT_SYNCHRONOUS

See Also:
User-specifiable Mount Flags
#define MNT_SYNCHRONOUS 0x00000002 /file system written synchronously *
Discussion 

User specifiable flags. 

Unmount uses MNT_FORCE flag.*/
#define MNT_SYNCHRONOUS 0x00000002 /* file system written synchronously */

/*Internal Mount Flags

See Also:
MNT_LOCAL
MNT_QUOTA
MNT_ROOTFS
MNT_DOVOLFS
#define MNT_LOCAL 0x00001000 / filesystem is stored locally
    *
#define MNT_QUOTA 0x00002000 / quotas are enabled on 
    filesystem *
#define MNT_ROOTFS 0x00004000 /identifies the root 
    filesystem 
#define MNT_DOVOLFS 0x00008000 / FS supports volfs 
Discussion 

Flags set by internal operations.*/

#define MNT_LOCAL 0x00001000 /* filesystem is stored locally
    */
#define MNT_QUOTA 0x00002000 /* quotas are enabled on 
    filesystem */
#define MNT_ROOTFS 0x00004000 /* identifies the root 
    filesystem */
#define MNT_DOVOLFS 0x00008000

/*MNT_RDONLY

See Also:
User-specifiable Mount Flags
#define MNT_RDONLY 0x00000001 / read only filesystem 
Discussion 

User specifiable flags. 

Unmount uses MNT_FORCE flag.*/
#define MNT_RDONLY 0x00000001 /* read only filesystem */

/*vfs_attr

struct vfs_attr { 
    uint64_t f_supported; 
    uint64_t f_active;  
    uint64_t f_minsize; / XXX must be removed /
    uint64_t f_objcount; / number of filesystem objects in volume /
    uint64_t f_filecount; / ... files /
    uint64_t f_dircount; / ... directories /
    uint64_t f_maxobjcount; / maximum number of filesystem objects /
    size_t f_iosize; / optimal transfer block size /
    uint64_t f_blocks; / total data blocks in file system /
    uint64_t f_bfree; / free blocks in fs /
    uint64_t f_bavail; / free blocks avail to non-superuser /
    uint64_t f_bused; / blocks in use /
    uint64_t f_files; / total file nodes in file system /
    uint64_t f_ffree; / free file nodes in fs /
    fsid_t f_fsid; / file system id /
    uid_t f_owner; / user that mounted the filesystem /
    uint64_t f_uuid; / volume UUID /
    vol_capabilities_attr_t f_capabilities; 
    vol_attributes_attr_t f_attributes;  
    struct timespec f_create_time; / creation time /
    struct timespec f_modify_time; / last modification time /
    struct timespec f_access_time; / time of last access /
    struct timespec f_backup_time; / last backup time /
    / XXX must go away /
    char f_fstypename[MFSTYPENAMELEN];/ fs type name inclus /
    char f_mntonname[MAXPATHLEN];/ directory on which mounted /
    char f_mntfromname[MAXPATHLEN];/ mounted filesystem /
    uint32_t f_fssubtype; / filesystem subtype /
    uint32_t f_bsize; / block size for the above size values /
    char f_volname[90 / length of buffer for returned name /
        ]; / volume name /
};  
Discussion 

New VFS_STAT argument structure.*/


struct vfs_attr { 
    uint64_t f_supported; 
    uint64_t f_active;
    uint64_t f_minsize; /* XXX must be removed */
    uint64_t f_objcount; /* number of filesystem objects in volume */
    uint64_t f_filecount; /* ... files */
    uint64_t f_dircount; /* ... directories */
    uint64_t f_maxobjcount; /* maximum number of filesystem objects */
    size_t f_iosize; /* optimal transfer block size */
    uint64_t f_blocks; /* total data blocks in file system */
    uint64_t f_bfree; /* free blocks in fs */
    uint64_t f_bavail; /* free blocks avail to non-superuser */
    uint64_t f_bused; /* blocks in use */
    uint64_t f_files; /* total file nodes in file system */
    uint64_t f_ffree; /* free file nodes in fs */
    fsid_t f_fsid; /* file system id */
    uid_t f_owner; /* user that mounted the filesystem */
    uint64_t f_uuid; /* volume UUID */
    vol_capabilities_attr_t f_capabilities;
    vol_attributes_attr_t f_attributes;
    struct timespec f_create_time; /* creation time */
    struct timespec f_modify_time; /* last modification time */
    struct timespec f_access_time; /* time of last access */
    struct timespec f_backup_time; /* last backup time */
    /* XXX must go away */
    char f_fstypename[MFSTYPENAMELEN];/* fs type name inclus */
    char f_mntonname[MAXPATHLEN];/* directory on which mounted */
    char f_mntfromname[MAXPATHLEN];/* mounted filesystem */
    uint32_t f_fssubtype; /* filesystem subtype */
    uint32_t f_bsize; /* block size for the above size values */
    char f_volname[90 /* length of buffer for returned name */]; /* volume name */
    char		*f_vol_name;
     uint16_t	f_signature;
     uint16_t	f_carbon_fsid;
};  
typedef struct vfs_attr vfs_attr;


/*vfs_fsprivate

void * vfs_fsprivate(
    mount_t);  
Discussion 

Description forthcoming*/
void * vfs_fsprivate(
    mount_t);  

/*vfs_typenum

int vfs_typenum(
    mount_t);  
Discussion 

Description forthcoming*/

int vfs_typenum(
    mount_t);  


/*vfs_fsremove

int vfs_fsremove(
    vfstable_t);  
Discussion 

Description forthcoming*/
int vfs_fsremove(
    vfstable_t);  


/*vfs_statfs

struct vfsstatfs * vfs_statfs(
    mount_t);  
Discussion 

Description forthcoming*/

struct vfsstatfs * vfs_statfs(
    mount_t);  


/*STATFS(2)                   BSD System Calls Manual                  STATFS(2)

NAME
     statfs -- get file system statistics

SYNOPSIS
     #include <sys/param.h>
     #include <sys/mount.h>

     int
     statfs(const char path, struct statfs buf);

     int
     fstatfs(int fd, struct statfs buf);

DESCRIPTION
     Statfs() returns information about a mounted file system.  Path is the
     path name of any file within the mounted file system.  Buf is a pointer
     to a statfs structure defined as follows:

     typedef struct { int32_t val[2]; } fsid_t;

     #define MFSNAMELEN   15 / length of fs type name, not inc. nul /
     #define MNAMELEN     90 / length of buffer for returned name /

     struct statfs {
         short   f_otype;    / type of file system (reserved: zero) /
         short   f_oflags;   / copy of mount flags (reserved: zero) /
         long    f_bsize;    / fundamental file system block size /
         long    f_iosize;   / optimal transfer block size /
         long    f_blocks;   / total data blocks in file system /
         long    f_bfree;    / free blocks in fs /
         long    f_bavail;   / free blocks avail to non-superuser /
         long    f_files;    / total file nodes in file system /
         long    f_ffree;    / free file nodes in fs /
         fsid_t  f_fsid;     / file system id (super-user only) /
         uid_t   f_owner;    / user that mounted the file system /
         short   f_reserved1;        / reserved for future use /
         short   f_type;     / type of file system (reserved) /
         long    f_flags;    / copy of mount flags (reserved) /
         long    f_reserved2[2];     / reserved for future use /
         char    f_fstypename[MFSNAMELEN]; / fs type name /
         char    f_mntonname[MNAMELEN];    / directory on which mounted /
         char    f_mntfromname[MNAMELEN];  / mounted file system /
         char    f_reserved3;        / reserved for future use /
         long    f_reserved4[4];     / reserved for future use /
     };

     Fields that are undefined for a particular file system are set to -1.
     Fstatfs() returns the same information about an open file referenced by
     descriptor fd.

RETURN VALUES
     Upon successful completion, a value of 0 is returned.  Otherwise, -1 is
     returned and the global variable errno is set to indicate the error.

ERRORS
     Statfs() fails if one or more of the following are true:

     [ENOTDIR]          A component of the path prefix of Path is not a direc-directory.
                        tory.

     [ENAMETOOLONG]     The length of a component of path exceeds {NAME_MAX}
                        characters, or the length of path exceeds {PATH_MAX}
                        characters.

     [ENOENT]           The file referred to by path does not exist.

     [EACCES]           Search permission is denied for a component of the
                        path prefix of path.

     [ELOOP]            Too many symbolic links were encountered in translat-translating
                        ing path.

     [EFAULT]           Buf or path points to an invalid address.

     [EIO]              An I/O error occurred while reading from or writing to
                        the file system.

     Fstatfs() fails if one or more of the following are true:

     [EBADF]            fd is not a valid open file descriptor.

     [EFAULT]           Buf points to an invalid address.

     [EIO]              An I/O error occurred while reading from or writing to
                        the file system.

HISTORY
     The statfs() function first appeared in 4.4BSD.

BSD                            February 11, 1994                           BSD*/
//   typedef struct { int32_t val[2]; } fsid_t;

     #define MFSNAMELEN   15 /* length of fs type name, not inc. nul */
     #define MNAMELEN     90 /* length of buffer for returned name */

     struct statfs {
         short   f_otype;    /* type of file system (reserved: zero) */
         short   f_oflags;   /* copy of mount flags (reserved: zero) */
         long    f_bsize;    /* fundamental file system block size */
         long    f_iosize;   /* optimal transfer block size */
         long    f_blocks;   /* total data blocks in file system */
         long    f_bfree;    /* free blocks in fs */
         long    f_bavail;   /* free blocks avail to non-superuser */
         long    f_files;    /* total file nodes in file system */
         long    f_ffree;    /* free file nodes in fs */
         fsid_t  f_fsid;     /* file system id (super-user only) */
         uid_t   f_owner;    /* user that mounted the file system */
         short   f_reserved1;        /* reserved for future use */
         short   f_type;     /* type of file system (reserved) */
         long    f_flags;    /* copy of mount flags (reserved) */
         long    f_reserved2[2];     /* reserved for future use */
         char    f_fstypename[MFSNAMELEN]; /* fs type name */
         char    f_mntonname[MNAMELEN];    /* directory on which mounted */
         char    f_mntfromname[MNAMELEN];  /* mounted file system */
         char    f_reserved3;        /* reserved for future use */
         long    f_reserved4[4];     /* reserved for future use */
     };

 int
     statfs(const char *path, struct statfs *buf);

     int
     fstatfs(int fd, struct statfs *buf);


/*vfs_fsadd

int vfs_fsadd(
    struct vfs_fsentry *,
    vfstable_t *);  
Discussion 

Description forthcoming*/
int vfs_fsadd(
    struct vfs_fsentry *,
    vfstable_t *);  

/*vfs_isupdate

int vfs_isupdate(
    mount_t);  
Discussion 

Description forthcoming*/
int vfs_isupdate(
    mount_t);  

/*vfs_setfsprivate

void vfs_setfsprivate(
    mount_t,
    void *mntdata);  
Discussion 

Description forthcoming*/
void vfs_setfsprivate(
    mount_t,
    void *mntdata);  

/*vfs_setflags

void vfs_setflags(
    mount_t,
    uint64_t);  
Discussion 

Description forthcoming*/

void vfs_setflags(
    mount_t,
    uint64_t);  



/*vfs_statfs

struct vfsstatfs * vfs_statfs(
    mount_t);  
Discussion 

Description forthcoming*/
struct vfsstatfs * vfs_statfs(
    mount_t);  


#endif
