PERFORCE change 120832 for review
Roman Divacky
rdivacky at FreeBSD.org
Sun Jun 3 11:10:11 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=120832
Change 120832 by rdivacky at rdivacky_witten on 2007/06/03 11:10:04
Implement linux_fstatat64 using kern_[l]statat.
Suggested by: rwatson
Affected files ...
.. //depot/projects/soc2007/rdivacky/linux_at/sys/compat/linux/linux_stats.c#5 edit
Differences ...
==== //depot/projects/soc2007/rdivacky/linux_at/sys/compat/linux/linux_stats.c#5 (text+ko) ====
@@ -579,35 +579,21 @@
return (error);
}
-/* XXX: racy? */
int
linux_fstatat64(struct thread *td, struct linux_fstatat64_args *args)
{
- int error;
- char *path, *newpath;
- int fd, dfd, flags = O_RDONLY;
+ char *path;
+ int error, dfd;
struct stat buf;
if (args->flag & ~LINUX_AT_SYMLINK_NOFOLLOW)
return (EINVAL);
- if (args->flag & LINUX_AT_SYMLINK_NOFOLLOW)
- flags |= O_NOFOLLOW;
+ LCONVPATHEXIST(td, args->filename, &path);
- /* open the file */
- path = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
- error = copyinstr(args->pathname, path, MAXPATHLEN, NULL);
- if (error) {
- free(path, M_TEMP);
- return (EFAULT);
- }
-
- LCONVPATH_SEG(td, path, &newpath, 0, UIO_SYSSPACE);
- free(path, M_TEMP);
-
#ifdef DEBUG
if (ldebug(fstatat64))
- printf(ARGS(fstatat64, "%i, %s, %i"), args->dfd, newpath, args->flag);
+ printf(ARGS(fstatat64, "%i, %s, %i"), args->dfd, args->path, args->flag);
#endif
if (args->dfd == LINUX_AT_FDCWD)
@@ -615,26 +601,17 @@
else
dfd = args->dfd;
- error = kern_openat(td, newpath, UIO_SYSSPACE, flags, 0, dfd);
- if (error) {
- LFREEPATH(newpath);
- return (error);
- }
- /* file opened */
- fd = td->td_retval[0];
- td->td_retval[0] = 0;
-
- /* do the actual fstat */
-
- error = kern_fstat(td, fd, &buf);
+ if (args->flags & LINUX_AT_SYMLINK_NOFOLLOW)
+ error = kern_statat(td, fd, &buf, dfd);
+ else
+ error = kern_lstatat(td, fd, &buf, dfd);
+
translate_fd_major_minor(td, fd, &buf);
if (!error)
error = stat64_copyout(&buf, args->statbuf);
+ LFREEPATH(path);
- /* close the opened file */
- kern_close(td, fd);
- LFREEPATH(newpath);
- return (0);
+ return (error);
}
#endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */
More information about the p4-projects
mailing list