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 *);