📄 system.c
字号:
} 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 + -