PERFORCE change 117109 for review
Roman Divacky
rdivacky at FreeBSD.org
Sun Apr 1 17:36:14 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=117109
Change 117109 by rdivacky at rdivacky_witten on 2007/04/01 17:35:45
Semi-implement fstatat64() - only compile tested.
Check for fp being a vnode before referencing fp->f_vnode [1]
Pointed out by: rwatson
I commit this because my harddisk is likely to die in a few hours.
Affected files ...
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_file.c#20 edit
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_stats.c#8 edit
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_util.h#5 edit
Differences ...
==== //depot/projects/linuxolator/src/sys/compat/linux/linux_file.c#20 (text+ko) ====
@@ -105,6 +105,10 @@
error = fget(td, dirfd, &fp);
if (error)
return (error);
+ if (fp->f_type != DTYPE_VNODE) {
+ fdrop(fp, td);
+ return (EBADF);
+ }
dvp = fp->f_vnode;
/* only a dir can be dfd */
if (dvp->v_type != VDIR) {
@@ -144,7 +148,7 @@
}
-static int
+int
linux_common_open(struct thread *td, char *path, int l_flags, int mode, int openat)
{
struct proc *p = td->td_proc;
@@ -1387,12 +1391,6 @@
}
int
-linux_fstatat64(struct thread *td, struct linux_fstatat64_args *args)
-{
- return (ENOSYS);
-}
-
-int
linux_fchownat(struct thread *td, struct linux_fchownat_args *args)
{
return (ENOSYS);
==== //depot/projects/linuxolator/src/sys/compat/linux/linux_stats.c#8 (text+ko) ====
@@ -43,6 +43,7 @@
#include <sys/namei.h>
#include <sys/stat.h>
#include <sys/syscallsubr.h>
+#include <sys/sysproto.h>
#include <sys/systm.h>
#include <sys/vnode.h>
#include <sys/conf.h>
@@ -593,4 +594,52 @@
return (error);
}
+/* XXX: racy? */
+int
+linux_fstatat64(struct thread *td, struct linux_fstatat64_args *args)
+{
+ int error;
+ char *newpath, *oldpath, *freebuf = NULL, *path;
+ int fd;
+ struct close_args cargs;
+ struct stat buf;
+
+ /* open the file */
+ oldpath = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
+ error = copyinstr(args->pathname, oldpath, MAXPATHLEN, NULL);
+#ifdef DEBUG
+ if (ldebug(fstatat64))
+ printf(ARGS(fstatat64, "%i, %s, %i"), args->dfd, args->pathname, args->flag);
+#endif
+
+ error = linux_at(td, args->dfd, oldpath, &newpath, &freebuf);
+ if (error)
+ return (error);
+ LCONVPATH_SEG(td, newpath, &path, 0, UIO_SYSSPACE);
+ if (freebuf)
+ free(freebuf, M_TEMP);
+ if (*oldpath != '/')
+ free(newpath, M_TEMP);
+
+ error = linux_common_open(td, path, O_RDONLY, 0, 1);
+ free(oldpath, M_TEMP);
+ if (error)
+ return (error);
+ /* file opened */
+ fd = td->td_retval[0];
+ td->td_retval[0] = 0;
+
+ /* do the actual fstat */
+
+ error = kern_fstat(td, fd, &buf);
+ translate_fd_major_minor(td, fd, &buf);
+ if (!error)
+ error = stat64_copyout(&buf, args->statbuf);
+
+ /* close the opened file */
+ cargs.fd = fd;
+ close(td, &cargs);
+ return (0);
+}
+
#endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */
==== //depot/projects/linuxolator/src/sys/compat/linux/linux_util.h#5 (text+ko) ====
@@ -106,5 +106,6 @@
/* XXX: doesnt belong here */
int linux_at(struct thread *td, int dirfd, char *filename, char **newpath, char **freebuf);
+int linux_common_open(struct thread *td, char *path, int l_flags, int mode, int openat);
#endif /* !_LINUX_UTIL_H_ */
More information about the p4-projects
mailing list