Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/kern/vfs_lookup.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/kern/vfs_lookup.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.75 retrieving revision 1.76 diff -u -p -r1.75 -r1.76 --- src/sys/kern/vfs_lookup.c 2006/12/13 13:36:19 1.75 +++ src/sys/kern/vfs_lookup.c 2006/12/24 08:54:55 1.76 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_lookup.c,v 1.75 2006/12/13 13:36:19 yamt Exp $ */ +/* $NetBSD: vfs_lookup.c,v 1.76 2006/12/24 08:54:55 elad Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -37,7 +37,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.75 2006/12/13 13:36:19 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.76 2006/12/24 08:54:55 elad Exp $"); #include "opt_ktrace.h" #include "opt_systrace.h" @@ -70,6 +70,11 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c #define MAGICLINKS 0 #endif +struct pathname_internal { + char *pathbuf; + boolean_t needfree; +}; + int vfs_magiclinks = MAGICLINKS; struct pool pnbuf_pool; /* pathname buffer pool */ @@ -191,6 +196,52 @@ symlink_magic(struct proc *p, char *cp, #undef MATCH #undef SUBSTITUTE +int +pathname_get(const char *dirp, enum uio_seg segflg, pathname_t *path) +{ + int error; + + if (dirp == NULL) + return (EFAULT); + + *path = malloc(sizeof(struct pathname_internal), M_TEMP, + M_ZERO|M_WAITOK); + + if (segflg == UIO_USERSPACE) { + (*path)->pathbuf = PNBUF_GET(); + error = copyinstr(dirp, (*path)->pathbuf, MAXPATHLEN, + NULL); + if (error) { + PNBUF_PUT((*path)->pathbuf); + free(path, M_TEMP); + return (error); + } + (*path)->needfree = TRUE; + } else { + (*path)->pathbuf = __UNCONST(dirp); + (*path)->needfree = FALSE; + } + + return (0); +} + +const char * +pathname_path(pathname_t path) +{ + KASSERT(path != NULL); + return (path->pathbuf); +} + +void +pathname_put(pathname_t path) +{ + if (path != NULL) { + if (path->pathbuf != NULL && path->needfree) + PNBUF_PUT(path->pathbuf); + free(path, M_TEMP); + } +} + /* * Convert a pathname into a pointer to a locked vnode. *