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