iofunc_lseek()
Handle an _IO_LSEEK message
Synopsis:
#include <sys/iofunc.h>
int iofunc_lseek ( resmgr_context_t* ctp,
io_lseek_t* msg,
iofunc_ocb_t* ocb,
iofunc_attr_t* attr );
Arguments:
- ctp
- A pointer to a resmgr_context_t structure that the resource-manager library uses to pass context information between functions.
- msg
- A pointer to the io_lseek_t structure that contains the message that the resource manager received; see below.
- ocb
- A pointer to the iofunc_ocb_t structure for the Open Control Block that was created when the client opened the resource.
- attr
- A pointer to the iofunc_attr_t structure that describes the characteristics of the device that's associated with your resource manager.
Library:
libc
Use the -l c option to qcc to link against this library. This library is usually included automatically.
Description:
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:
- type
- _IO_LSEEK.
- combine_len
- If the message is a combine message, _IO_COMBINE_FLAG is set in this member. For more information, see Combine Messages chapter of Writing a Resource Manager.
- whence
- SEEK_SET, SEEK_CUR, or SEEK_END.
- flags
- Flags that affect the operation:
- _IO_LSEEK_IGNORE_NON_SEEKABLE — the client sets this flag if it wants the resource manager to ignore the request if lseek operations aren't supported. In this case, the resource manager shouldn't change the offset.
- offset
- The relative offset from the file position determined by the whence member.
The o member is the offset after the operation is complete.
Returns:
- -1
- Success; the resource manager library should return a one-part IOV to the client.
- EOK
- The message is a combine message, and no error occurred.
- EINVAL
- The whence member in the _IO_LSEEK message wasn't one of SEEK_SET, SEEK_CUR, or SEEK_END, or the resulting position after the offset was applied resulted in a negative number (overflow).
- EOVERFLOW
- The resulting file offset is a value that can't be represented correctly in an object of type off_t.
Classification:
Safety: | |
---|---|
Cancellation point | No |
Signal handler | Yes |
Thread | Yes |