I/O attribute structure
#include <sys/iofunc.h>
typedef struct _iofunc_attr {
IOFUNC_MOUNT_T *mount;
uint32_t flags;
int32_t lock_tid;
uint16_t lock_count;
uint16_t count;
uint16_t rcount;
uint16_t wcount;
uint16_t rlocks;
uint16_t wlocks;
struct _iofunc_mmap_list *mmap_list;
struct _iofunc_lock_list *lock_list;
void *lockobj;
void *acl;
#if !defined(_IOFUNC_OFFSET_BITS) || _IOFUNC_OFFSET_BITS == 64
#if __OFF_BITS__ == 64
off_t nbytes;
ino_t inode;
#else
off64_t nbytes;
ino64_t inode;
#endif
#elif _IOFUNC_OFFSET_BITS - 0 == 32
#if __OFF_BITS__ == 32
#if defined(__LITTLEENDIAN__)
off_t nbytes;
off_t nbytes_hi;
ino_t inode;
ino_t inode_hi;
#elif defined(__BIGENDIAN__)
off_t nbytes_hi;
off_t nbytes;
ino_t inode_hi;
ino_t inode;
#else
#error endian not configured for system
#endif
#else
#if defined(__LITTLEENDIAN__)
int32_t nbytes;
int32_t nbytes_hi;
int32_t inode;
int32_t inode_hi;
#elif defined(__BIGENDIAN__)
int32_t nbytes_hi;
int32_t nbytes;
int32_t inode_hi;
int32_t inode;
#else
#error endian not configured for system
#endif
#endif
#else
#error _IOFUNC_OFFSET_BITS value is unsupported
#endif
uid_t uid;
gid_t gid;
time_t mtime;
time_t atime;
time_t ctime;
mode_t mode;
nlink_t nlink;
dev_t rdev;
} iofunc_attr_t;
The iofunc_attr_t structure describes the attributes of the device that's associated with a resource manager. You typically use iofunc_attr_init() to initialize this structure.
The members include the following:
In addition to the above, your resource manager can use in any way the bits in the range defined by IOFUNC_ATTR_PRIVATE (see <sys/iofunc.h>).
The resource manager layer automatically locks the attribute (using iofunc_attr_lock()) for you when certain handler functions are called (i.e. IO_*).
For a file, this would contain the file's size. For special devices (e.g., /dev/null) that don't support lseek() or have a radically different interpretation for lseek(), this field isn't used (because you wouldn't use any of the helper functions, but would supply your own instead). In these cases, we recommend that you set this field to zero, unless there's a meaningful interpretation that you care to put to it.
To fill the members with the correct time, call iofunc_time_update().