xattr.c

来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 215 行

C
215
字号
/*  File: fs/devpts/xattr.c   Derived from fs/ext3/xattr.c, changed in the following ways:      drop everything related to persistent storage of EAs      pass dentry rather than inode to internal methods      only presently define a handler for security modules*/#include <linux/init.h>#include <linux/fs.h>#include <linux/slab.h>#include <linux/string.h>#include <asm/semaphore.h>#include "xattr.h"static struct devpts_xattr_handler *devpts_xattr_handlers[DEVPTS_XATTR_INDEX_MAX];static rwlock_t devpts_handler_lock = RW_LOCK_UNLOCKED;intdevpts_xattr_register(int name_index, struct devpts_xattr_handler *handler){	int error = -EINVAL;	if (name_index > 0 && name_index <= DEVPTS_XATTR_INDEX_MAX) {		write_lock(&devpts_handler_lock);		if (!devpts_xattr_handlers[name_index-1]) {			devpts_xattr_handlers[name_index-1] = handler;			error = 0;		}		write_unlock(&devpts_handler_lock);	}	return error;}voiddevpts_xattr_unregister(int name_index, struct devpts_xattr_handler *handler){	if (name_index > 0 || name_index <= DEVPTS_XATTR_INDEX_MAX) {		write_lock(&devpts_handler_lock);		devpts_xattr_handlers[name_index-1] = NULL;		write_unlock(&devpts_handler_lock);	}}static inline const char *strcmp_prefix(const char *a, const char *a_prefix){	while (*a_prefix && *a == *a_prefix) {		a++;		a_prefix++;	}	return *a_prefix ? NULL : a;}/* * Decode the extended attribute name, and translate it into * the name_index and name suffix. */static inline struct devpts_xattr_handler *devpts_xattr_resolve_name(const char **name){	struct devpts_xattr_handler *handler = NULL;	int i;	if (!*name)		return NULL;	read_lock(&devpts_handler_lock);	for (i=0; i<DEVPTS_XATTR_INDEX_MAX; i++) {		if (devpts_xattr_handlers[i]) {			const char *n = strcmp_prefix(*name,				devpts_xattr_handlers[i]->prefix);			if (n) {				handler = devpts_xattr_handlers[i];				*name = n;				break;			}		}	}	read_unlock(&devpts_handler_lock);	return handler;}static inline struct devpts_xattr_handler *devpts_xattr_handler(int name_index){	struct devpts_xattr_handler *handler = NULL;	if (name_index > 0 && name_index <= DEVPTS_XATTR_INDEX_MAX) {		read_lock(&devpts_handler_lock);		handler = devpts_xattr_handlers[name_index-1];		read_unlock(&devpts_handler_lock);	}	return handler;}/* * Inode operation getxattr() * * dentry->d_inode->i_sem down */ssize_tdevpts_getxattr(struct dentry *dentry, const char *name,	      void *buffer, size_t size){	struct devpts_xattr_handler *handler;	handler = devpts_xattr_resolve_name(&name);	if (!handler)		return -EOPNOTSUPP;	return handler->get(dentry, name, buffer, size);}/* * Inode operation listxattr() * * dentry->d_inode->i_sem down */ssize_tdevpts_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size){	struct devpts_xattr_handler *handler = NULL;	int i, error = 0;	unsigned int size = 0;	char *buf;	read_lock(&devpts_handler_lock);	for (i=0; i<DEVPTS_XATTR_INDEX_MAX; i++) {		handler = devpts_xattr_handlers[i];		if (handler)			size += handler->list(dentry, NULL);	}	if (!buffer) {		error = size;		goto out;	} else {		error = -ERANGE;		if (size > buffer_size)			goto out;	}	buf = buffer;	for (i=0; i<DEVPTS_XATTR_INDEX_MAX; i++) {		handler = devpts_xattr_handlers[i];		if (handler)			buf += handler->list(dentry, buf);	}	error = size;out:	read_unlock(&devpts_handler_lock);	return size;}/* * Inode operation setxattr() * * dentry->d_inode->i_sem down */intdevpts_setxattr(struct dentry *dentry, const char *name,	      const void *value, size_t size, int flags){	struct devpts_xattr_handler *handler;	if (size == 0)		value = "";  /* empty EA, do not remove */	handler = devpts_xattr_resolve_name(&name);	if (!handler)		return -EOPNOTSUPP;	return handler->set(dentry, name, value, size, flags);}/* * Inode operation removexattr() * * dentry->d_inode->i_sem down */intdevpts_removexattr(struct dentry *dentry, const char *name){	struct devpts_xattr_handler *handler;	handler = devpts_xattr_resolve_name(&name);	if (!handler)		return -EOPNOTSUPP;	return handler->set(dentry, name, NULL, 0, XATTR_REPLACE);}int __initinit_devpts_xattr(void){#ifdef CONFIG_DEVPTS_FS_SECURITY		int	err;	err = devpts_xattr_register(DEVPTS_XATTR_INDEX_SECURITY,				    &devpts_xattr_security_handler);	if (err)		return err;#endif	return 0;}voidexit_devpts_xattr(void){#ifdef CONFIG_DEVPTS_FS_SECURITY		devpts_xattr_unregister(DEVPTS_XATTR_INDEX_SECURITY,				&devpts_xattr_security_handler);#endif}

⌨️ 快捷键说明

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