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

📄 system.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 4 页
字号:
		}		size -= total_size;	}	return total_size;}#endif#if defined(HAVE_ATTR_LIST) && defined(HAVE_SYS_ATTRIBUTES_H)static char attr_buffer[ATTR_MAX_VALUELEN];static ssize_t irix_attr_list(const char *path, int filedes, char *list, size_t size, int flags){	int retval = 0, index;	attrlist_cursor_t *cursor = 0;	int total_size = 0;	attrlist_t * al = (attrlist_t *)attr_buffer;	attrlist_ent_t *ae;	size_t ent_size, left = size;	char *bp = list;	while (True) {	    if (filedes)		retval = attr_listf(filedes, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor);	    else		retval = attr_list(path, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor);	    if (retval) break;	    for (index = 0; index < al->al_count; index++) {		ae = ATTR_ENTRY(attr_buffer, index);		ent_size = strlen(ae->a_name) + sizeof("user.");		if (left >= ent_size) {		    strncpy(bp, "user.", sizeof("user."));		    strncat(bp, ae->a_name, ent_size - sizeof("user."));		    bp += ent_size;		    left -= ent_size;		} else if (size) {		    errno = ERANGE;		    retval = -1;		    break;		}		total_size += ent_size;	    }	    if (al->al_more == 0) break;	}	if (retval == 0) {	    flags |= ATTR_ROOT;	    cursor = 0;	    while (True) {		if (filedes)		    retval = attr_listf(filedes, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor);		else		    retval = attr_list(path, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor);		if (retval) break;		for (index = 0; index < al->al_count; index++) {		    ae = ATTR_ENTRY(attr_buffer, index);		    ent_size = strlen(ae->a_name) + sizeof("system.");		    if (left >= ent_size) {			strncpy(bp, "system.", sizeof("system."));			strncat(bp, ae->a_name, ent_size - sizeof("system."));			bp += ent_size;			left -= ent_size;		    } else if (size) {			errno = ERANGE;			retval = -1;			break;		    }		    total_size += ent_size;		}		if (al->al_more == 0) break;	    }	}	return (ssize_t)(retval ? retval : total_size);}#endifssize_t sys_listxattr (const char *path, char *list, size_t size){#if defined(HAVE_LISTXATTR)	return listxattr(path, list, size);#elif defined(HAVE_EXTATTR_LIST_FILE)	extattr_arg arg;	arg.path = path;	return bsd_attr_list(0, arg, list, size);#elif defined(HAVE_ATTR_LIST) && defined(HAVE_SYS_ATTRIBUTES_H)	return irix_attr_list(path, 0, list, size, 0);#else	errno = ENOSYS;	return -1;#endif}ssize_t sys_llistxattr (const char *path, char *list, size_t size){#if defined(HAVE_LLISTXATTR)	return llistxattr(path, list, size);#elif defined(HAVE_EXTATTR_LIST_LINK)	extattr_arg arg;	arg.path = path;	return bsd_attr_list(1, arg, list, size);#elif defined(HAVE_ATTR_LIST) && defined(HAVE_SYS_ATTRIBUTES_H)	return irix_attr_list(path, 0, list, size, ATTR_DONTFOLLOW);#else	errno = ENOSYS;	return -1;#endif}ssize_t sys_flistxattr (int filedes, char *list, size_t size){#if defined(HAVE_FLISTXATTR)	return flistxattr(filedes, list, size);#elif defined(HAVE_EXTATTR_LIST_FD)	extattr_arg arg;	arg.filedes = filedes;	return bsd_attr_list(2, arg, list, size);#elif defined(HAVE_ATTR_LISTF)	return irix_attr_list(NULL, filedes, list, size, 0);#else	errno = ENOSYS;	return -1;#endif}int sys_removexattr (const char *path, const char *name){#if defined(HAVE_REMOVEXATTR)	return removexattr(path, name);#elif defined(HAVE_EXTATTR_DELETE_FILE)	char *s;	int attrnamespace = (strncmp(name, "system", 6) == 0) ? 		EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;	const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;	return extattr_delete_file(path, attrnamespace, attrname);#elif defined(HAVE_ATTR_REMOVE)	int flags = 0;	char *attrname = strchr(name,'.') + 1;		if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT;	return attr_remove(path, attrname, flags);#else	errno = ENOSYS;	return -1;#endif}int sys_lremovexattr (const char *path, const char *name){#if defined(HAVE_LREMOVEXATTR)	return lremovexattr(path, name);#elif defined(HAVE_EXTATTR_DELETE_LINK)	char *s;	int attrnamespace = (strncmp(name, "system", 6) == 0) ? 		EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;	const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;	return extattr_delete_link(path, attrnamespace, attrname);#elif defined(HAVE_ATTR_REMOVE)	int flags = ATTR_DONTFOLLOW;	char *attrname = strchr(name,'.') + 1;		if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT;	return attr_remove(path, attrname, flags);#else	errno = ENOSYS;	return -1;#endif}int sys_fremovexattr (int filedes, const char *name){#if defined(HAVE_FREMOVEXATTR)	return fremovexattr(filedes, name);#elif defined(HAVE_EXTATTR_DELETE_FD)	char *s;	int attrnamespace = (strncmp(name, "system", 6) == 0) ? 		EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;	const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;	return extattr_delete_fd(filedes, attrnamespace, attrname);#elif defined(HAVE_ATTR_REMOVEF)	int flags = 0;	char *attrname = strchr(name,'.') + 1;		if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT;	return attr_removef(filedes, attrname, flags);#else	errno = ENOSYS;	return -1;#endif}#if !defined(HAVE_SETXATTR)#define XATTR_CREATE  0x1       /* set value, fail if attr already exists */#define XATTR_REPLACE 0x2       /* set value, fail if attr does not exist */#endifint sys_setxattr (const char *path, const char *name, const void *value, size_t size, int flags){#if defined(HAVE_SETXATTR)	return setxattr(path, name, value, size, flags);#elif defined(HAVE_EXTATTR_SET_FILE)	char *s;	int retval = 0;	int attrnamespace = (strncmp(name, "system", 6) == 0) ? 		EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;	const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;	if (flags) {		/* Check attribute existence */		retval = extattr_get_file(path, attrnamespace, attrname, NULL, 0);		if (retval < 0) {			/* REPLACE attribute, that doesn't exist */			if (flags & XATTR_REPLACE && errno == ENOATTR) {				errno = ENOATTR;				return -1;			}			/* Ignore other errors */		}		else {			/* CREATE attribute, that already exists */			if (flags & XATTR_CREATE) {				errno = EEXIST;				return -1;			}		}	}	retval = extattr_set_file(path, attrnamespace, attrname, value, size);	return (retval < 0) ? -1 : 0;#elif defined(HAVE_ATTR_SET)	int myflags = 0;	char *attrname = strchr(name,'.') + 1;		if (strncmp(name, "system", 6) == 0) myflags |= ATTR_ROOT;	if (flags & XATTR_CREATE) myflags |= ATTR_CREATE;	if (flags & XATTR_REPLACE) myflags |= ATTR_REPLACE;	return attr_set(path, attrname, (const char *)value, size, myflags);#else	errno = ENOSYS;	return -1;#endif}int sys_lsetxattr (const char *path, const char *name, const void *value, size_t size, int flags){#if defined(HAVE_LSETXATTR)	return lsetxattr(path, name, value, size, flags);#elif defined(HAVE_EXTATTR_SET_LINK)	char *s;	int retval = 0;	int attrnamespace = (strncmp(name, "system", 6) == 0) ? 		EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;	const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;	if (flags) {		/* Check attribute existence */		retval = extattr_get_link(path, attrnamespace, attrname, NULL, 0);		if (retval < 0) {			/* REPLACE attribute, that doesn't exist */			if (flags & XATTR_REPLACE && errno == ENOATTR) {				errno = ENOATTR;				return -1;			}			/* Ignore other errors */		}		else {			/* CREATE attribute, that already exists */			if (flags & XATTR_CREATE) {				errno = EEXIST;				return -1;			}		}	}	retval = extattr_set_link(path, attrnamespace, attrname, value, size);	return (retval < 0) ? -1 : 0;#elif defined(HAVE_ATTR_SET)	int myflags = ATTR_DONTFOLLOW;	char *attrname = strchr(name,'.') + 1;		if (strncmp(name, "system", 6) == 0) myflags |= ATTR_ROOT;	if (flags & XATTR_CREATE) myflags |= ATTR_CREATE;	if (flags & XATTR_REPLACE) myflags |= ATTR_REPLACE;	return attr_set(path, attrname, (const char *)value, size, myflags);#else	errno = ENOSYS;	return -1;#endif}int sys_fsetxattr (int filedes, const char *name, const void *value, size_t size, int flags){#if defined(HAVE_FSETXATTR)	return fsetxattr(filedes, name, value, size, flags);#elif defined(HAVE_EXTATTR_SET_FD)	char *s;	int retval = 0;	int attrnamespace = (strncmp(name, "system", 6) == 0) ? 		EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;	const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;	if (flags) {		/* Check attribute existence */		retval = extattr_get_fd(filedes, attrnamespace, attrname, NULL, 0);		if (retval < 0) {			/* REPLACE attribute, that doesn't exist */			if (flags & XATTR_REPLACE && errno == ENOATTR) {				errno = ENOATTR;				return -1;			}			/* Ignore other errors */		}		else {			/* CREATE attribute, that already exists */			if (flags & XATTR_CREATE) {				errno = EEXIST;				return -1;			}		}	}	retval = extattr_set_fd(filedes, attrnamespace, attrname, value, size);	return (retval < 0) ? -1 : 0;#elif defined(HAVE_ATTR_SETF)	int myflags = 0;	char *attrname = strchr(name,'.') + 1;		if (strncmp(name, "system", 6) == 0) myflags |= ATTR_ROOT;	if (flags & XATTR_CREATE) myflags |= ATTR_CREATE;	if (flags & XATTR_REPLACE) myflags |= ATTR_REPLACE;	return attr_setf(filedes, attrname, (const char *)value, size, myflags);#else	errno = ENOSYS;	return -1;#endif}/**************************************************************************** Return the major devicenumber for UNIX extensions.****************************************************************************/                                                                                                                uint32 unix_dev_major(SMB_DEV_T dev){#if defined(HAVE_DEVICE_MAJOR_FN)        return (uint32)major(dev);#else        return (uint32)(dev >> 8);#endif}                                                                                                                /**************************************************************************** Return the minor devicenumber for UNIX extensions.****************************************************************************/                                                                                                                uint32 unix_dev_minor(SMB_DEV_T dev){#if defined(HAVE_DEVICE_MINOR_FN)        return (uint32)minor(dev);#else        return (uint32)(dev & 0xff);#endif}#if defined(WITH_AIO)/******************************************************************* An aio_read wrapper that will deal with 64-bit sizes.********************************************************************/                                                                                                                                           int sys_aio_read(SMB_STRUCT_AIOCB *aiocb){#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_READ64)        return aio_read64(aiocb);#elif defined(HAVE_AIO_READ)        return aio_read(aiocb);#else	errno = ENOSYS;	return -1;#endif}/******************************************************************* An aio_write wrapper that will deal with 64-bit sizes.********************************************************************/                                                                                                                                           int sys_aio_write(SMB_STRUCT_AIOCB *aiocb){#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_WRITE64)        return aio_write64(aiocb);#elif defined(HAVE_AIO_WRITE)        return aio_write(aiocb);#else	errno = ENOSYS;	return -1;#endif}/******************************************************************* An aio_return wrapper that will deal with 64-bit sizes.********************************************************************/                                                                                                                                           ssize_t sys_aio_return(SMB_STRUCT_AIOCB *aiocb){#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_RETURN64)        return aio_return64(aiocb);#elif defined(HAVE_AIO_RETURN)        return aio_return(aiocb);#else	errno = ENOSYS;	return -1;#endif}/******************************************************************* An aio_cancel wrapper that will deal with 64-bit sizes.********************************************************************/int sys_aio_cancel(int fd, SMB_STRUCT_AIOCB *aiocb){#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_CANCEL64)        return aio_cancel64(fd, aiocb);#elif defined(HAVE_AIO_CANCEL)        return aio_cancel(fd, aiocb);#else	errno = ENOSYS;	return -1;#endif}/******************************************************************* An aio_error wrapper that will deal with 64-bit sizes.********************************************************************/int sys_aio_error(const SMB_STRUCT_AIOCB *aiocb){#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_ERROR64)        return aio_error64(aiocb);#elif defined(HAVE_AIO_ERROR)        return aio_error(aiocb);#else	errno = ENOSYS;	return -1;#endif}/******************************************************************* An aio_fsync wrapper that will deal with 64-bit sizes.********************************************************************/int sys_aio_fsync(int op, SMB_STRUCT_AIOCB *aiocb){#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_FSYNC64)        return aio_fsync64(op, aiocb);#elif defined(HAVE_AIO_FSYNC)        return aio_fsync(op, aiocb);#else	errno = ENOSYS;	return -1;#endif}/******************************************************************* An aio_fsync wrapper that will deal with 64-bit sizes.********************************************************************/int sys_aio_suspend(const SMB_STRUCT_AIOCB * const cblist[], int n, const struct timespec *timeout){#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_SUSPEND64)        return aio_suspend64(cblist, n, timeout);#elif defined(HAVE_AIO_FSYNC)        return aio_suspend(cblist, n, timeout);#else	errno = ENOSYS;	return -1;#endif}#else /* !WITH_AIO */int sys_aio_read(SMB_STRUCT_AIOCB *aiocb){	errno = ENOSYS;	return -1;}int sys_aio_write(SMB_STRUCT_AIOCB *aiocb){	errno = ENOSYS;	return -1;}ssize_t sys_aio_return(SMB_STRUCT_AIOCB *aiocb){	errno = ENOSYS;	return -1;}int sys_aio_cancel(int fd, SMB_STRUCT_AIOCB *aiocb){	errno = ENOSYS;	return -1;}int sys_aio_error(const SMB_STRUCT_AIOCB *aiocb){	errno = ENOSYS;	return -1;}int sys_aio_fsync(int op, SMB_STRUCT_AIOCB *aiocb){	errno = ENOSYS;	return -1;}int sys_aio_suspend(const SMB_STRUCT_AIOCB * const cblist[], int n, const struct timespec *timeout){	errno = ENOSYS;	return -1;}#endif /* WITH_AIO */

⌨️ 快捷键说明

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