summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>2004-04-14 23:17:37 +0000
committerpeter <peter@FreeBSD.org>2004-04-14 23:17:37 +0000
commitba2b6ac30f36733a6e733977444f6212699017ff (patch)
treefb165d2ac8d97c00ef2efbea925f1bc63117b3a9
parent290ea04ebfdbc80f18ec99925f08b0884da605d9 (diff)
downloadFreeBSD-src-ba2b6ac30f36733a6e733977444f6212699017ff.zip
FreeBSD-src-ba2b6ac30f36733a6e733977444f6212699017ff.tar.gz
Catch up to the not-so-recent statfs(2) changes.
-rw-r--r--sys/compat/freebsd32/freebsd32.h7
-rw-r--r--sys/compat/freebsd32/freebsd32_misc.c37
-rw-r--r--sys/compat/freebsd32/syscalls.master23
3 files changed, 49 insertions, 18 deletions
diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h
index 5975144..806b2ff 100644
--- a/sys/compat/freebsd32/freebsd32.h
+++ b/sys/compat/freebsd32/freebsd32.h
@@ -75,8 +75,9 @@ struct rusage32 {
int32_t ru_nivcsw;
};
-#define FREEBSD32_MNAMELEN (88 - 2 * sizeof(int32_t)) /* size of on/from name bufs */
+#define FREEBSD4_MNAMELEN (88 - 2 * sizeof(int32_t)) /* size of on/from name bufs */
+/* 4.x version */
struct statfs32 {
int32_t f_spare2;
int32_t f_bsize;
@@ -93,11 +94,11 @@ struct statfs32 {
int32_t f_syncwrites;
int32_t f_asyncwrites;
char f_fstypename[MFSNAMELEN];
- char f_mntonname[FREEBSD32_MNAMELEN];
+ char f_mntonname[FREEBSD4_MNAMELEN];
int32_t f_syncreads;
int32_t f_asyncreads;
int16_t f_spares1;
- char f_mntfromname[FREEBSD32_MNAMELEN];
+ char f_mntfromname[FREEBSD4_MNAMELEN];
int16_t f_spares2 __packed;
int32_t f_spare[2];
};
diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c
index deccaf8..a103204 100644
--- a/sys/compat/freebsd32/freebsd32_misc.c
+++ b/sys/compat/freebsd32/freebsd32_misc.c
@@ -140,15 +140,15 @@ copy_statfs(struct statfs *in, struct statfs32 *out)
bcopy(in->f_fstypename,
out->f_fstypename, MFSNAMELEN);
bcopy(in->f_mntonname,
- out->f_mntonname, MNAMELEN);
+ out->f_mntonname, min(MNAMELEN, FREEBSD4_MNAMELEN));
CP(*in, *out, f_syncreads);
CP(*in, *out, f_asyncreads);
bcopy(in->f_mntfromname,
- out->f_mntfromname, MNAMELEN);
+ out->f_mntfromname, min(MNAMELEN, FREEBSD4_MNAMELEN));
}
int
-freebsd32_getfsstat(struct thread *td, struct freebsd32_getfsstat_args *uap)
+freebsd4_freebsd32_getfsstat(struct thread *td, struct freebsd4_freebsd32_getfsstat_args *uap)
{
int error;
caddr_t sg;
@@ -870,7 +870,7 @@ freebsd32_adjtime(struct thread *td, struct freebsd32_adjtime_args *uap)
}
int
-freebsd32_statfs(struct thread *td, struct freebsd32_statfs_args *uap)
+freebsd4_freebsd32_statfs(struct thread *td, struct freebsd4_freebsd32_statfs_args *uap)
{
int error;
caddr_t sg;
@@ -897,7 +897,7 @@ freebsd32_statfs(struct thread *td, struct freebsd32_statfs_args *uap)
}
int
-freebsd32_fstatfs(struct thread *td, struct freebsd32_fstatfs_args *uap)
+freebsd4_freebsd32_fstatfs(struct thread *td, struct freebsd4_freebsd32_fstatfs_args *uap)
{
int error;
caddr_t sg;
@@ -924,6 +924,33 @@ freebsd32_fstatfs(struct thread *td, struct freebsd32_fstatfs_args *uap)
}
int
+freebsd4_freebsd32_fhstatfs(struct thread *td, struct freebsd4_freebsd32_fhstatfs_args *uap)
+{
+ int error;
+ caddr_t sg;
+ struct statfs32 *p32, s32;
+ struct statfs *p = NULL, s;
+
+ p32 = uap->buf;
+ if (p32) {
+ sg = stackgap_init();
+ p = stackgap_alloc(&sg, sizeof(struct statfs));
+ uap->buf = (struct statfs32 *)p;
+ }
+ error = fhstatfs(td, (struct fhstatfs_args *) uap);
+ if (error)
+ return (error);
+ if (p32) {
+ error = copyin(p, &s, sizeof(s));
+ if (error)
+ return (error);
+ copy_statfs(&s, &s32);
+ error = copyout(&s32, p32, sizeof(s32));
+ }
+ return (error);
+}
+
+int
freebsd32_semsys(struct thread *td, struct freebsd32_semsys_args *uap)
{
/*
diff --git a/sys/compat/freebsd32/syscalls.master b/sys/compat/freebsd32/syscalls.master
index c6e9550..6f0631f 100644
--- a/sys/compat/freebsd32/syscalls.master
+++ b/sys/compat/freebsd32/syscalls.master
@@ -64,8 +64,8 @@
15 NOPROTO { int chmod(char *path, int mode); }
16 NOPROTO { int chown(char *path, int uid, int gid); }
17 MNOPROTO { int obreak(char *nsize); } break obreak_args int
-18 STD { int freebsd32_getfsstat(struct statfs32 *buf, long bufsize, \
- int flags); }
+18 COMPAT4 { int freebsd32_getfsstat(struct statfs32 *buf, \
+ long bufsize, int flags); }
19 OBSOL olseek
20 MNOPROTO { pid_t getpid(void); }
21 NOPROTO { int mount(char *type, char *path, int flags, \
@@ -232,8 +232,9 @@
; XXX this is a problem!!!
155 UNIMPL nfssvc
156 OBSOL ogetdirentries
-157 STD { int freebsd32_statfs(char *path, struct statfs32 *buf); }
-158 STD { int freebsd32_fstatfs(int fd, struct statfs32 *buf); }
+157 COMPAT4 { int freebsd32_statfs(char *path, \
+ struct statfs32 *buf); }
+158 COMPAT4 { int freebsd32_fstatfs(int fd, struct statfs32 *buf);}
159 UNIMPL nosys
160 UNIMPL nosys
161 NOPROTO { int getfh(char *fname, struct fhandle *fhp); }
@@ -414,8 +415,8 @@
295 UNIMPL nosys
296 UNIMPL nosys
; XXX 297 is 300 in NetBSD
-297 NOPROTO { int fhstatfs(const struct fhandle *u_fhp, \
- struct statfs *buf); }
+297 COMPAT4 { int freebsd32_fhstatfs(const struct fhandle *u_fhp, \
+ struct statfs32 *buf); }
298 NOPROTO { int fhopen(const struct fhandle *u_fhp, int flags); }
299 NOPROTO { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }
; syscall numbers for FreeBSD
@@ -550,10 +551,12 @@
u_int32_t offsethi, size_t nbytes, struct sf_hdtr *hdtr, \
off_t *sbytes, int flags); }
394 UNIMPL mac_syscall
-395 UNIMPL nosys
-396 UNIMPL nosys
-397 UNIMPL nosys
-398 UNIMPL nosys
+395 NOPROTO { int getfsstat(struct statfs *buf, long bufsize, \
+ int flags); }
+396 NOPROTO { int statfs(char *path, struct statfs *buf); }
+397 NOPROTO { int fstatfs(int fd, struct statfs *buf); }
+398 NOPROTO { int fhstatfs(const struct fhandle *u_fhp, \
+ struct statfs *buf); }
399 UNIMPL nosys
; XXX implement these?
400 UNIMPL ksem_close
OpenPOWER on IntegriCloud