⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vfs_pathname.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lintstatic        char sccsid[] = "@(#)vfs_pathname.c 1.1 92/07/30 Copyr 1986 Sun Micro";#endif/* * Copyright (c) 1986 by Sun Microsystems, Inc. */#include <sys/param.h>#include "boot/systm.h"#include <sys/dir.h>#include <sys/uio.h>#include <sys/errno.h>#include <sys/pathname.h>/* * Pathname utilities. * * In translating file names we copy each argument file * name into a pathname structure where we operate on it. * Each pathname structure can hold MAXPATHLEN characters * including a terminating null, and operations here support * allocating and freeing pathname structures, fetching * strings from user space, getting the next character from * a pathname, combining two pathnames (used in symbolic * link processing), and peeling off the first component * of a pathname. */static char *pn_freelist;/* * Allocate contents of pathname structure. * Structure itself is typically automatic * variable in calling routine for convenience. */pn_alloc(pnp)	register struct pathname *pnp;{	if (pn_freelist) {		pnp->pn_buf = pn_freelist;		pn_freelist = *(char **) pnp->pn_buf;	} else {		pnp->pn_buf = (char *)kmem_alloc((u_int)MAXPATHLEN);	}	pnp->pn_path = (char *)pnp->pn_buf;	pnp->pn_pathlen = 0;}/* * Pull a pathname from user user or kernel space */intpn_get(str, seg, pnp)	register char *str;	int seg;	register struct pathname *pnp;{	register int error;	pn_alloc(pnp);	if (seg == UIOSEG_USER) {#ifdef	NEVER		error =		    copyinstr(str, pnp->pn_path, MAXPATHLEN, &pnp->pn_pathlen);#endif	/* NEVER */	} else {		error =		    copystr(str, pnp->pn_path, MAXPATHLEN, &pnp->pn_pathlen);	}	pnp->pn_pathlen--;		/* don't count null byte */	if (error)		pn_free(pnp);	return (error);}#ifdef notneeded/* * Get next character from a path. * Return null at end forever. */pn_getchar(pnp)	register struct pathname *pnp;{	if (pnp->pn_pathlen == 0)		return (0);	pnp->pn_pathlen--;	return (*pnp->pn_path++);}#endif notneeded/* * Set pathname to argument string. */pn_set(pnp, path)	register struct pathname *pnp;	register char *path;{	register int error;	pnp->pn_path = pnp->pn_buf;	error = copystr(path, pnp->pn_path, MAXPATHLEN, &pnp->pn_pathlen);	pnp->pn_pathlen--;		/* don't count null byte */	return (error);}/* * Combine two argument pathnames by putting * second argument before first in first's buffer, * and freeing second argument. * This isn't very general: it is designed specifically * for symbolic link processing. */pn_combine(pnp, sympnp)	register struct pathname *pnp;	register struct pathname *sympnp;{	if (pnp->pn_pathlen + sympnp->pn_pathlen >= MAXPATHLEN)		return (ENAMETOOLONG);	ovbcopy(pnp->pn_path, pnp->pn_buf + sympnp->pn_pathlen,	    (u_int)pnp->pn_pathlen);	bcopy(sympnp->pn_path, pnp->pn_buf, (u_int)sympnp->pn_pathlen);	pnp->pn_pathlen += sympnp->pn_pathlen;	pnp->pn_path = pnp->pn_buf;	return (0);}/* * Strip next component off a pathname and leave in * buffer comoponent which should have room for * MAXNAMLEN bytes and a null terminator character. */pn_getcomponent(pnp, component)	register struct pathname *pnp;	register char *component;{	register char *cp;	register int l;	register int n;	register char c;	cp = pnp->pn_path;	l = pnp->pn_pathlen;	n = MAXNAMLEN;	while ((l > 0) && (*cp != '/')) {		if (--n < 0)			return(ENAMETOOLONG);		c = *cp++;		if (c & 0x80)			return (EINVAL);		*component++ = c;		--l;	}	pnp->pn_path = cp;	pnp->pn_pathlen = l;	*component = 0;	return (0);}/* * skip over consecutive slashes in the pathname */voidpn_skipslash(pnp)	register struct pathname *pnp;{	while ((pnp->pn_pathlen > 0) && (*pnp->pn_path == '/')) {		pnp->pn_path++;		pnp->pn_pathlen--;	}}/* * Free pathname resources. */voidpn_free(pnp)	register struct pathname *pnp;{	/* kmem_free((caddr_t)pnp->pn_buf, (u_int)MAXPATHLEN); */	*(char **) pnp->pn_buf = pn_freelist;	pn_freelist = pnp->pn_buf;	pnp->pn_buf = 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -