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