1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or https://opensource.org/licenses/CDDL-1.0. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ 27 /* All Rights Reserved */ 28 29 /* 30 * University Copyright- Copyright (c) 1982, 1986, 1988 31 * The Regents of the University of California 32 * All Rights Reserved 33 * 34 * University Acknowledgment- Portions of this document are derived from 35 * software developed by the University of California, Berkeley, and its 36 * contributors. 37 */ 38 39 40 #include <sys/types.h> 41 #include <sys/pathname.h> 42 #include <sys/kmem.h> 43 #include <sys/sysmacros.h> 44 45 /* 46 * Pathname utilities. 47 * 48 * In translating file names we copy each argument file 49 * name into a pathname structure where we operate on it. 50 * Each pathname structure can hold "pn_bufsize" characters 51 * including a terminating null, and operations here support 52 * allocating and freeing pathname structures, fetching 53 * strings from user space, getting the next character from 54 * a pathname, combining two pathnames (used in symbolic 55 * link processing), and peeling off the first component 56 * of a pathname. 57 */ 58 59 /* 60 * Allocate contents of pathname structure. Structure is typically 61 * an automatic variable in calling routine for convenience. 62 * 63 * May sleep in the call to kmem_alloc() and so must not be called 64 * from interrupt level. 65 */ 66 void 67 pn_alloc(struct pathname *pnp) 68 { 69 pn_alloc_sz(pnp, MAXPATHLEN); 70 } 71 void 72 pn_alloc_sz(struct pathname *pnp, size_t sz) 73 { 74 pnp->pn_buf = kmem_alloc(sz, KM_SLEEP); 75 pnp->pn_bufsize = sz; 76 } 77 78 /* 79 * Free pathname resources. 80 */ 81 void 82 pn_free(struct pathname *pnp) 83 { 84 /* pn_bufsize is usually MAXPATHLEN, but may not be */ 85 kmem_free(pnp->pn_buf, pnp->pn_bufsize); 86 pnp->pn_buf = NULL; 87 pnp->pn_bufsize = 0; 88 } 89