Updated: April 19, 2023 |
Handle an _IO_LSEEK message
#include <sys/iofunc.h> int iofunc_lseek ( resmgr_context_t* ctp, io_lseek_t* msg, iofunc_ocb_t* ocb, iofunc_attr_t* attr );
libc
Use the -l c option to qcc to link against this library. This library is usually included automatically.
The iofunc_lseek() helper function implements POSIX semantics for the client's lseek() call, which is received as an _IO_LSEEK message by the resource manager.
The iofunc_lseek() function handles the three different whence cases: SEEK_SET, SEEK_CUR, and SEEK_END, updating the ocb->offset field with the new position.
Note that if the IOFUNC_MOUNT_32BIT flag isn't set in the mount structure, iofunc_lseek() handles 64-bit position offsets. If the flag is set (meaning this device supports only 32-bit offsets), the resulting offset value is treated as a 32-bit offset, and if it overflows 32 bits, it's truncated to LONG_MAX. Also, this function handles combine messages correctly, simplifying the work required to support lseek().
io_lseek_t structure
The io_lseek_t structure holds the _IO_LSEEK message received by the resource manager:
struct _io_lseek { uint16_t type; uint16_t combine_len; short whence; uint16_t flags; uint64_t offset; }; typedef union { struct _io_lseek i; uint64_t o; } io_lseek_t;
The I/O message structures are unions of an input message (coming to the resource manager) and an output or reply message (going back to the client).
The i member is a structure of type _io_lseek that contains the following members:
The o member is the offset after the operation is complete.
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | No |
Signal handler | Yes |
Thread | Yes |