PERFORCE change 117977 for review
Peter Wemm
peter at FreeBSD.org
Thu Apr 12 20:40:37 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=117977
Change 117977 by peter at peter_overcee on 2007/04/12 20:39:33
Add working forward compatability stubs for __xstat family.
Affected files ...
.. //depot/projects/hammer/sys/kern/init_sysent.c#59 edit
.. //depot/projects/hammer/sys/kern/kern_descrip.c#65 edit
.. //depot/projects/hammer/sys/kern/syscalls.c#57 edit
.. //depot/projects/hammer/sys/kern/syscalls.master#58 edit
.. //depot/projects/hammer/sys/kern/systrace_args.c#3 edit
.. //depot/projects/hammer/sys/kern/vfs_syscalls.c#66 edit
.. //depot/projects/hammer/sys/sys/_types.h#16 edit
.. //depot/projects/hammer/sys/sys/stat.h#12 edit
.. //depot/projects/hammer/sys/sys/syscall.h#56 edit
.. //depot/projects/hammer/sys/sys/syscall.mk#56 edit
.. //depot/projects/hammer/sys/sys/sysproto.h#57 edit
.. //depot/projects/hammer/sys/sys/vnode.h#70 edit
Differences ...
==== //depot/projects/hammer/sys/kern/init_sysent.c#59 (text+ko) ====
@@ -447,9 +447,9 @@
{ AS(__mac_execve_args), (sy_call_t *)__mac_execve, AUE_NULL, NULL, 0, 0 }, /* 415 = __mac_execve */
{ AS(sigaction_args), (sy_call_t *)sigaction, AUE_SIGACTION, NULL, 0, 0 }, /* 416 = sigaction */
{ AS(sigreturn_args), (sy_call_t *)sigreturn, AUE_SIGRETURN, NULL, 0, 0 }, /* 417 = sigreturn */
- { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 }, /* 418 = __xstat */
- { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 }, /* 419 = __xfstat */
- { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 }, /* 420 = __xlstat */
+ { AS(__xstat_args), (sy_call_t *)__xstat, AUE_STAT, NULL, 0, 0 }, /* 418 = __xstat */
+ { AS(__xfstat_args), (sy_call_t *)__xfstat, AUE_FSTAT, NULL, 0, 0 }, /* 419 = __xfstat */
+ { AS(__xlstat_args), (sy_call_t *)__xlstat, AUE_LSTAT, NULL, 0, 0 }, /* 420 = __xlstat */
{ AS(getcontext_args), (sy_call_t *)getcontext, AUE_NULL, NULL, 0, 0 }, /* 421 = getcontext */
{ AS(setcontext_args), (sy_call_t *)setcontext, AUE_NULL, NULL, 0, 0 }, /* 422 = setcontext */
{ AS(swapcontext_args), (sy_call_t *)swapcontext, AUE_NULL, NULL, 0, 0 }, /* 423 = swapcontext */
==== //depot/projects/hammer/sys/kern/kern_descrip.c#65 (text+ko) ====
@@ -1080,6 +1080,31 @@
return (error);
}
+#ifndef _SYS_SYSPROTO_H_
+struct __xfstat_args {
+ int ver;
+ int fd;
+ struct _new_stat *sb;
+};
+#endif
+/* ARGSUSED */
+int
+__xfstat(struct thread *td, struct __xfstat_args *uap)
+{
+ struct stat ub;
+ struct _new_stat nub;
+ int error;
+
+ if (uap->ver != __STATVER)
+ return (EOPNOTSUPP);
+ error = kern_fstat(td, uap->fd, &ub);
+ if (error == 0) {
+ cvtnewstat(&ub, &nub);
+ error = copyout(&nub, uap->sb, sizeof(nub));
+ }
+ return (error);
+}
+
int
kern_fstat(struct thread *td, int fd, struct stat *sbp)
{
==== //depot/projects/hammer/sys/kern/syscalls.c#57 (text+ko) ====
@@ -425,9 +425,9 @@
"__mac_execve", /* 415 = __mac_execve */
"sigaction", /* 416 = sigaction */
"sigreturn", /* 417 = sigreturn */
- "#418", /* 418 = __xstat */
- "#419", /* 419 = __xfstat */
- "#420", /* 420 = __xlstat */
+ "__xstat", /* 418 = __xstat */
+ "__xfstat", /* 419 = __xfstat */
+ "__xlstat", /* 420 = __xlstat */
"getcontext", /* 421 = getcontext */
"setcontext", /* 422 = setcontext */
"swapcontext", /* 423 = swapcontext */
==== //depot/projects/hammer/sys/kern/syscalls.master#58 (text+ko) ====
@@ -735,9 +735,12 @@
struct sigaction *oact); }
417 AUE_SIGRETURN STD { int sigreturn( \
const struct __ucontext *sigcntxp); }
-418 AUE_NULL UNIMPL __xstat
-419 AUE_NULL UNIMPL __xfstat
-420 AUE_NULL UNIMPL __xlstat
+418 AUE_STAT STD { int __xstat(int ver, char *path, \
+ struct _new_stat *ub); }
+419 AUE_FSTAT STD { int __xfstat(int ver, int fd, \
+ struct _new_stat *sb); }
+420 AUE_LSTAT STD { int __xlstat(int ver, char *path, \
+ struct _new_stat *ub); }
421 AUE_NULL STD { int getcontext(struct __ucontext *ucp); }
422 AUE_NULL STD { int setcontext( \
const struct __ucontext *ucp); }
==== //depot/projects/hammer/sys/kern/systrace_args.c#3 (text+ko) ====
@@ -2380,6 +2380,33 @@
*n_args = 1;
break;
}
+ /* __xstat */
+ case 418: {
+ struct __xstat_args *p = params;
+ iarg[0] = p->ver; /* int */
+ uarg[1] = (intptr_t) p->path; /* char * */
+ uarg[2] = (intptr_t) p->ub; /* struct _new_stat * */
+ *n_args = 3;
+ break;
+ }
+ /* __xfstat */
+ case 419: {
+ struct __xfstat_args *p = params;
+ iarg[0] = p->ver; /* int */
+ iarg[1] = p->fd; /* int */
+ uarg[2] = (intptr_t) p->sb; /* struct _new_stat * */
+ *n_args = 3;
+ break;
+ }
+ /* __xlstat */
+ case 420: {
+ struct __xlstat_args *p = params;
+ iarg[0] = p->ver; /* int */
+ uarg[1] = (intptr_t) p->path; /* char * */
+ uarg[2] = (intptr_t) p->ub; /* struct _new_stat * */
+ *n_args = 3;
+ break;
+ }
/* getcontext */
case 421: {
struct getcontext_args *p = params;
==== //depot/projects/hammer/sys/kern/vfs_syscalls.c#66 (text+ko) ====
@@ -2033,6 +2033,33 @@
#endif /* COMPAT_43 */
/*
+ * Convert from a current to new stat structure.
+ */
+void
+cvtnewstat(st, nst)
+ struct stat *st;
+ struct _new_stat *nst;
+{
+ bzero(nst, sizeof *nst);
+ nst->st_dev = st->st_dev;
+ nst->st_ino = st->st_ino;
+ nst->st_mode = st->st_mode;
+ nst->st_nlink = st->st_nlink;
+ nst->st_uid = st->st_uid;
+ nst->st_gid = st->st_gid;
+ nst->st_rdev = st->st_rdev;
+ nst->st_atimespec = st->st_atimespec;
+ nst->st_mtimespec = st->st_mtimespec;
+ nst->st_ctimespec = st->st_ctimespec;
+ nst->st_size = st->st_size;
+ nst->st_blocks = st->st_blocks;
+ nst->st_blksize = st->st_blksize;
+ nst->st_flags = st->st_flags;
+ nst->st_gen = st->st_gen;
+ nst->st_birthtimespec = st->st_birthtimespec;
+}
+
+/*
* Get file status; this version follows links.
*/
#ifndef _SYS_SYSPROTO_H_
@@ -2058,7 +2085,31 @@
return (error);
}
+#ifndef _SYS_SYSPROTO_H_
+struct __xstat_args {
+ int ver;
+ char *path;
+ struct _new_stat *ub;
+};
+#endif
int
+__xstat(struct thread *td, struct __xstat_args *uap)
+{
+ struct stat sb;
+ struct _new_stat nsb;
+ int error;
+
+ if (uap->ver != __STATVER)
+ return (EOPNOTSUPP);
+ error = kern_stat(td, uap->path, UIO_USERSPACE, &sb);
+ if (error == 0) {
+ cvtnewstat(&sb, &nsb);
+ error = copyout(&nsb, uap->ub, sizeof (nsb));
+ }
+ return (error);
+}
+
+int
kern_stat(struct thread *td, char *path, enum uio_seg pathseg, struct stat *sbp)
{
struct nameidata nd;
@@ -2109,6 +2160,30 @@
return (error);
}
+#ifndef _SYS_SYSPROTO_H_
+struct __xlstat_args {
+ int ver;
+ char *path;
+ struct _new_stat *ub;
+};
+#endif
+int
+__xlstat(struct thread *td, struct __xlstat_args *uap)
+{
+ struct stat sb;
+ struct _new_stat nsb;
+ int error;
+
+ if (uap->ver != __STATVER)
+ return (EOPNOTSUPP);
+ error = kern_lstat(td, uap->path, UIO_USERSPACE, &sb);
+ if (error == 0) {
+ cvtnewstat(&sb, &nsb);
+ error = copyout(&nsb, uap->ub, sizeof (nsb));
+ }
+ return (error);
+}
+
int
kern_lstat(struct thread *td, char *path, enum uio_seg pathseg, struct stat *sbp)
{
==== //depot/projects/hammer/sys/sys/_types.h#16 (text+ko) ====
@@ -62,6 +62,11 @@
typedef __uint32_t __uid_t;
typedef unsigned int __useconds_t; /* microseconds (unsigned) */
+/* New types for 64 bit inode number support (forward compat only) */
+typedef __uint64_t __new_ino_t; /* inode number */
+typedef __uint32_t __new_mode_t; /* permissions */
+typedef __uint32_t __new_nlink_t; /* link count */
+
/*
* Unusual type definitions.
*/
==== //depot/projects/hammer/sys/sys/stat.h#12 (text+ko) ====
@@ -174,6 +174,40 @@
#endif
};
+/* New 64 bit inode number support forward compatability */
+struct _new_stat {
+ __dev_t st_dev; /* inode's device */
+ __dev_t st_rdev; /* device type */
+ __new_mode_t st_mode; /* inode protection mode */
+ __new_nlink_t st_nlink; /* number of hard links */
+ uid_t st_uid; /* user ID of the file's owner */
+ gid_t st_gid; /* group ID of the file's group */
+ __new_ino_t st_ino; /* inode's number */
+#if __BSD_VISIBLE
+ struct timespec st_atimespec; /* time of last access */
+ struct timespec st_mtimespec; /* time of last data modification */
+ struct timespec st_ctimespec; /* time of last file status change */
+ struct timespec st_birthtimespec; /* time of file creation */
+#else
+ time_t st_atime; /* time of last access */
+ long st_atimensec; /* nsec of last access */
+ time_t st_mtime; /* time of last data modification */
+ long st_mtimensec; /* nsec of last data modification */
+ time_t st_ctime; /* time of last file status change */
+ long st_ctimensec; /* nsec of last file status change */
+ time_t st_birthtime; /* time of file creation */
+ long st_birthtimensec; /* nsec of file creation */
+#endif
+ off_t st_size; /* file size, in bytes */
+ __int64_t st_blocks; /* blocks allocated for file */
+ __uint32_t st_blksize; /* optimal blocksize for I/O */
+ fflags_t st_flags; /* user defined flags for file */
+ __uint32_t st_gen; /* file generation number */
+ __int32_t __pad2; /* pad to 64 bit alignment */
+ __int64_t __pad3[4]; /* spare */
+};
+#define __STATVER 700 /* FreeBSD 7.0 */
+
#if __BSD_VISIBLE
struct nstat {
__dev_t st_dev; /* inode's device */
==== //depot/projects/hammer/sys/sys/syscall.h#56 (text+ko) ====
@@ -344,6 +344,9 @@
#define SYS___mac_execve 415
#define SYS_sigaction 416
#define SYS_sigreturn 417
+#define SYS___xstat 418
+#define SYS___xfstat 419
+#define SYS___xlstat 420
#define SYS_getcontext 421
#define SYS_setcontext 422
#define SYS_swapcontext 423
==== //depot/projects/hammer/sys/sys/syscall.mk#56 (text+ko) ====
@@ -286,6 +286,9 @@
__mac_execve.o \
sigaction.o \
sigreturn.o \
+ __xstat.o \
+ __xfstat.o \
+ __xlstat.o \
getcontext.o \
setcontext.o \
swapcontext.o \
==== //depot/projects/hammer/sys/sys/sysproto.h#57 (text+ko) ====
@@ -1257,6 +1257,21 @@
struct sigreturn_args {
char sigcntxp_l_[PADL_(const struct __ucontext *)]; const struct __ucontext * sigcntxp; char sigcntxp_r_[PADR_(const struct __ucontext *)];
};
+struct __xstat_args {
+ char ver_l_[PADL_(int)]; int ver; char ver_r_[PADR_(int)];
+ char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+ char ub_l_[PADL_(struct _new_stat *)]; struct _new_stat * ub; char ub_r_[PADR_(struct _new_stat *)];
+};
+struct __xfstat_args {
+ char ver_l_[PADL_(int)]; int ver; char ver_r_[PADR_(int)];
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+ char sb_l_[PADL_(struct _new_stat *)]; struct _new_stat * sb; char sb_r_[PADR_(struct _new_stat *)];
+};
+struct __xlstat_args {
+ char ver_l_[PADL_(int)]; int ver; char ver_r_[PADR_(int)];
+ char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+ char ub_l_[PADL_(struct _new_stat *)]; struct _new_stat * ub; char ub_r_[PADR_(struct _new_stat *)];
+};
struct getcontext_args {
char ucp_l_[PADL_(struct __ucontext *)]; struct __ucontext * ucp; char ucp_r_[PADR_(struct __ucontext *)];
};
@@ -1797,6 +1812,9 @@
int __mac_execve(struct thread *, struct __mac_execve_args *);
int sigaction(struct thread *, struct sigaction_args *);
int sigreturn(struct thread *, struct sigreturn_args *);
+int __xstat(struct thread *, struct __xstat_args *);
+int __xfstat(struct thread *, struct __xfstat_args *);
+int __xlstat(struct thread *, struct __xlstat_args *);
int getcontext(struct thread *, struct getcontext_args *);
int setcontext(struct thread *, struct setcontext_args *);
int swapcontext(struct thread *, struct swapcontext_args *);
@@ -2354,6 +2372,9 @@
#define SYS_AUE___mac_execve AUE_NULL
#define SYS_AUE_sigaction AUE_SIGACTION
#define SYS_AUE_sigreturn AUE_SIGRETURN
+#define SYS_AUE___xstat AUE_STAT
+#define SYS_AUE___xfstat AUE_FSTAT
+#define SYS_AUE___xlstat AUE_LSTAT
#define SYS_AUE_getcontext AUE_NULL
#define SYS_AUE_setcontext AUE_NULL
#define SYS_AUE_swapcontext AUE_NULL
==== //depot/projects/hammer/sys/sys/vnode.h#70 (text+ko) ====
@@ -550,6 +550,7 @@
struct thread;
struct proc;
struct stat;
+struct _new_stat;
struct nstat;
struct ucred;
struct uio;
@@ -569,6 +570,7 @@
int change_dir(struct vnode *vp, struct thread *td);
int change_root(struct vnode *vp, struct thread *td);
void cvtstat(struct stat *st, struct ostat *ost);
+void cvtnewstat(struct stat *st, struct _new_stat *ost);
void cvtnstat(struct stat *sb, struct nstat *nsb);
int getnewvnode(const char *tag, struct mount *mp, struct vop_vector *vops,
struct vnode **vpp);
More information about the p4-projects
mailing list