PERFORCE change 120830 for review
Roman Divacky
rdivacky at FreeBSD.org
Sun Jun 3 11:02:00 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=120830
Change 120830 by rdivacky at rdivacky_witten on 2007/06/03 11:01:11
Implement kern_lstatat.
Affected files ...
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#7 edit
Differences ...
==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#7 (text+ko) ====
@@ -93,6 +93,8 @@
struct nameidata *nd);
static int kern_common_stat(struct thread *td, struct stat *sbp,
struct nameidata *nd);
+static int kern_common_lstat(struct thread *td, struct stat *sbp,
+ struct nameidata *nd);
/*
* The module initialization routine for POSIX asynchronous I/O will
@@ -2216,18 +2218,53 @@
int
kern_lstat(struct thread *td, char *path, enum uio_seg pathseg, struct stat *sbp)
{
- struct vnode *vp;
- struct stat sb;
struct nameidata nd;
- int error, vfslocked;
NDINIT(&nd, LOOKUP,
NOFOLLOW | LOCKLEAF | LOCKSHARED | MPSAFE | AUDITVNODE1,
pathseg, path, td);
if ((error = namei(&nd)) != 0)
return (error);
+
+ return kern_common_lstat(td, sbp, &nd)
+}
+
+int
+kern_lstatat(struct thread *td, char *path, enum uio_seg pathseg, struct stat *sbp, int dfd)
+{
+ int error;
+ struct nameidata nd;
+ struct vnode *dir_vn;
+
+ if (dirfd == AT_FDCWD)
+ dir_vn = NULL;
+ else {
+ error = fgetvp(td, dirfd, &dir_vn);
+ if (error)
+ return (error);
+ if (dir_vn->v_type != VDIR) {
+ vrele(dir_vn);
+ return (ENOTDIR);
+ }
+ }
+
+ NDINIT_AT(&nd, LOOKUP, NOFOLLOW | AUDITVNODE1 | MPSAFE, pathseg, path, td, dir_vn);
+
+ error = kern_common_stat(td, sbp, &nd);
+ if (dirfd != AT_FDCWD)
+ vrele(dir_vn);
+ return (error);
+}
+
+static int
+kern_common_lstat(struct thread *td, struct stat *sbp, struct nameidata *nd)
+{
+ struct vnode *vp;
+ struct stat sb;
+ int error, vfslocked;
+
vfslocked = NDHASGIANT(&nd);
- vp = nd.ni_vp;
+ vp = nd->ni_vp;
error = vn_stat(vp, &sb, td->td_ucred, NOCRED, td);
NDFREE(&nd, NDF_ONLY_PNBUF);
vput(vp);
More information about the p4-projects
mailing list