#ifndef _COMPAT_SYS_MOUNT_H_
#define _COMPAT_SYS_MOUNT_H_
#ifdef _KERNEL_OPT
#include "opt_compat_43.h"
#endif
#define MFSNAMELEN 16
struct statfs12 {
short f_type;
u_short f_oflags;
long f_bsize;
long f_iosize;
long f_blocks;
long f_bfree;
long f_bavail;
long f_files;
long f_ffree;
fsid_t f_fsid;
uid_t f_owner;
long f_flags;
long f_syncwrites;
long f_asyncwrites;
long f_spare[1];
char f_fstypename[MFSNAMELEN];
char f_mntonname[MNAMELEN];
char f_mntfromname[MNAMELEN];
};
#ifndef _KERNEL
#include <string.h>
#endif
#define MOUNTNO_NONE 0
#define MOUNTNO_UFS 1
#define MOUNTNO_NFS 2
#define MOUNTNO_MFS 3
#define MOUNTNO_MSDOS 4
#define MOUNTNO_CD9660 5
#define MOUNTNO_FDESC 6
#define MOUNTNO_KERNFS 7
#define MOUNTNO_DEVFS 8
#define MOUNTNO_AFS 9
static const struct {
const char *name;
const int value;
} __nv[] = {
{ MOUNT_UFS, MOUNTNO_UFS },
{ MOUNT_NFS, MOUNTNO_NFS },
{ MOUNT_MFS, MOUNTNO_MFS },
{ MOUNT_MSDOS, MOUNTNO_MSDOS },
{ MOUNT_CD9660, MOUNTNO_CD9660 },
{ MOUNT_FDESC, MOUNTNO_FDESC },
{ MOUNT_KERNFS, MOUNTNO_KERNFS },
{ MOUNT_AFS, MOUNTNO_AFS },
};
static __inline void
statvfs_to_statfs12(const struct statvfs *fs, struct statfs12 *s12)
{
size_t i = 0;
memset(s12, 0, sizeof(*s12));
s12->f_type = 0;
s12->f_oflags = (short)fs->f_flag;
for (i = 0; i < sizeof(__nv) / sizeof(__nv[0]); i++) {
if (strcmp(__nv[i].name, fs->f_fstypename) == 0) {
s12->f_type = __nv[i].value;
break;
}
}
#define __STATFSCLAMP(a) (long)(((a) & ~LONG_MAX) ? LONG_MAX : (a))
s12->f_bsize = __STATFSCLAMP(fs->f_frsize);
s12->f_iosize = __STATFSCLAMP(fs->f_iosize);
s12->f_blocks = __STATFSCLAMP(fs->f_blocks);
s12->f_bfree = __STATFSCLAMP(fs->f_bfree);
if (fs->f_bfree > fs->f_bresvd)
s12->f_bavail = __STATFSCLAMP(fs->f_bfree - fs->f_bresvd);
else
s12->f_bavail = -__STATFSCLAMP(fs->f_bresvd - fs->f_bfree);
s12->f_files = __STATFSCLAMP(fs->f_files);
s12->f_ffree = __STATFSCLAMP(fs->f_ffree);
s12->f_fsid = fs->f_fsidx;
s12->f_owner = fs->f_owner;
s12->f_flags = (long)fs->f_flag;
s12->f_syncwrites = __STATFSCLAMP(fs->f_syncwrites);
s12->f_asyncwrites = __STATFSCLAMP(fs->f_asyncwrites);
memcpy(s12->f_fstypename, fs->f_fstypename, sizeof(s12->f_fstypename));
memcpy(s12->f_mntonname, fs->f_mntonname, sizeof(s12->f_mntonname));
memcpy(s12->f_mntfromname, fs->f_mntfromname,
sizeof(s12->f_mntfromname));
}
#ifdef _KERNEL
static __inline int
statvfs_to_statfs12_copy(const void *vs, void *vs12, size_t l)
{
struct statfs12 *s12 = kmem_zalloc(sizeof(*s12), KM_SLEEP);
int error;
statvfs_to_statfs12(vs, s12);
error = copyout(s12, vs12, sizeof(*s12));
kmem_free(s12, sizeof(*s12));
return error;
}
struct vfsconf {
struct vfsops *vfc_vfsops;
char vfc_name[MFSNAMELEN];
int vfc_typenum;
int vfc_refcount;
int vfc_flags;
int (*vfc_mountroot)(void);
struct vfsconf *vfc_next;
};
struct compat_30_fid {
unsigned short fid_len;
unsigned short fid_reserved;
char fid_data[16];
};
struct compat_30_fhandle {
fsid_t fh_fsid;
struct compat_30_fid fh_fid;
};
#else
__BEGIN_DECLS
int __compat_fstatfs(int, struct statfs12 *) __dso_hidden;
int __compat_getfsstat(struct statfs12 *, long, int) __dso_hidden;
int __compat_statfs(const char *, struct statfs12 *) __dso_hidden;
int __compat_getmntinfo(struct statfs12 **, int) __dso_hidden;
#if defined(_NETBSD_SOURCE)
struct compat_30_fhandle;
int __compat_fhstatfs(const struct compat_30_fhandle *, struct statfs12 *)
__dso_hidden;
struct stat13;
int __compat_fhstat(const struct compat_30_fhandle *, struct stat13 *)
__dso_hidden;
struct stat30;
int __compat___fhstat30(const struct compat_30_fhandle *, struct stat30 *)
__dso_hidden;
int __compat___fhstat40(const void *, size_t, struct stat30 *) __dso_hidden;
struct stat;
int __fhstat50(const void *, size_t, struct stat *);
int __fhopen40(const void *, size_t, int);
int fhopen(const struct compat_30_fhandle *, int);
int __getfh30(const char *, void*, size_t *);
int getfh(const char *path, struct compat_30_fhandle *fhp);
int mount(const char *, const char *, int, void *);
int __mount50(const char *, const char *, int, void *, size_t);
#endif
__END_DECLS
#endif
#endif