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                    zero;
    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.
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

See also:

iofunc_attr_t, iofunc_lseek_default(), iofunc_ocb_t, lseek(), resmgr_context_t

Writing a Resource Manager

Resource Managers chapter of Getting Started with QNX Neutrino