iofunc_lseek()

Updated: April 19, 2023

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
(QNX Neutrino 7.0 or later) 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:

QNX Neutrino

Safety:  
Cancellation point No
Interrupt handler No
Signal handler Yes
Thread Yes