Module Name:    src
Committed By:   pooka
Date:           Wed Jun 30 15:44:55 UTC 2010

Modified Files:
        src/sys/kern: vfs_syscalls.c
        src/sys/sys: vfs_syscalls.h

Log Message:
Enable kernel-internal symlink creation with do_sys_symlink().
I did this a while ago already, but can't remember why i didn't
commit it then.


To generate a diff of this commit:
cvs rdiff -u -r1.406 -r1.407 src/sys/kern/vfs_syscalls.c
cvs rdiff -u -r1.13 -r1.14 src/sys/sys/vfs_syscalls.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/vfs_syscalls.c
diff -u src/sys/kern/vfs_syscalls.c:1.406 src/sys/kern/vfs_syscalls.c:1.407
--- src/sys/kern/vfs_syscalls.c:1.406	Thu Jun 24 13:03:12 2010
+++ src/sys/kern/vfs_syscalls.c	Wed Jun 30 15:44:54 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_syscalls.c,v 1.406 2010/06/24 13:03:12 hannken Exp $	*/
+/*	$NetBSD: vfs_syscalls.c,v 1.407 2010/06/30 15:44:54 pooka Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.406 2010/06/24 13:03:12 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.407 2010/06/30 15:44:54 pooka Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_fileassoc.h"
@@ -2024,29 +2024,24 @@
 	return (error);
 }
 
-/*
- * Make a symbolic link.
- */
-/* ARGSUSED */
 int
-sys_symlink(struct lwp *l, const struct sys_symlink_args *uap, register_t *retval)
+do_sys_symlink(const char *patharg, const char *link, enum uio_seg seg)
 {
-	/* {
-		syscallarg(const char *) path;
-		syscallarg(const char *) link;
-	} */
-	struct proc *p = l->l_proc;
+	struct proc *p = curproc;
 	struct vattr vattr;
 	char *path;
 	int error;
 	struct nameidata nd;
 
 	path = PNBUF_GET();
-	error = copyinstr(SCARG(uap, path), path, MAXPATHLEN, NULL);
-	if (error)
-		goto out;
-	NDINIT(&nd, CREATE, LOCKPARENT | TRYEMULROOT, UIO_USERSPACE,
-	    SCARG(uap, link));
+	if (seg == UIO_USERSPACE) {
+		if ((error = copyinstr(patharg, path, MAXPATHLEN, NULL)) != 0)
+			goto out;
+	} else {
+		KASSERT(strlen(patharg) < MAXPATHLEN);
+		strcpy(path, patharg);
+	}
+	NDINIT(&nd, CREATE, LOCKPARENT | TRYEMULROOT, seg, link);
 	if ((error = namei(&nd)) != 0)
 		goto out;
 	if (nd.ni_vp) {
@@ -2072,6 +2067,22 @@
 }
 
 /*
+ * Make a symbolic link.
+ */
+/* ARGSUSED */
+int
+sys_symlink(struct lwp *l, const struct sys_symlink_args *uap, register_t *retval)
+{
+	/* {
+		syscallarg(const char *) path;
+		syscallarg(const char *) link;
+	} */
+
+	return do_sys_symlink(SCARG(uap, path), SCARG(uap, link),
+	    UIO_USERSPACE);
+}
+
+/*
  * Delete a whiteout from the filesystem.
  */
 /* ARGSUSED */

Index: src/sys/sys/vfs_syscalls.h
diff -u src/sys/sys/vfs_syscalls.h:1.13 src/sys/sys/vfs_syscalls.h:1.14
--- src/sys/sys/vfs_syscalls.h:1.13	Sun Aug  9 22:49:00 2009
+++ src/sys/sys/vfs_syscalls.h	Wed Jun 30 15:44:55 2010
@@ -1,4 +1,4 @@
-/*     $NetBSD: vfs_syscalls.h,v 1.13 2009/08/09 22:49:00 haad Exp $        */
+/*     $NetBSD: vfs_syscalls.h,v 1.14 2010/06/30 15:44:55 pooka Exp $        */
 
 /*
  * Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -65,6 +65,7 @@
 int	do_sys_mknod(struct lwp *, const char *, mode_t, dev_t, register_t *,
     enum uio_seg);
 int	do_sys_mkdir(const char *, mode_t, enum uio_seg);
+int	do_sys_symlink(const char *, const char *, enum uio_seg);
 
 int	chdir_lookup(const char *, int, struct vnode **, struct lwp *);
 void	change_root(struct cwdinfo *, struct vnode *, struct lwp *);

Reply via email to