Structure of a resource manager's connect message
struct _io_connect {
uint16_t type;
uint16_t subtype;
uint32_t file_type;
uint16_t reply_max;
uint16_t entry_max;
uint32_t key;
uint32_t handle;
uint32_t ioflag;
uint32_t mode;
uint16_t sflag;
uint16_t access;
uint16_t zero;
uint16_t path_len;
uint8_t eflag;
uint8_t extra_type;
uint16_t extra_len;
char path[1];
};
The _io_connect structure is used to describe a connect message
that a resource manager receives and sends.
The members include:
- type
- _IO_CONNECT
- subtype
- The type of connection that the message concerns; one of:
- _IO_CONNECT_COMBINE — combine with an I/O message.
- _IO_CONNECT_COMBINE_CLOSE — combine with I/O
message and always close.
- _IO_CONNECT_OPEN
- _IO_CONNECT_UNLINK
- _IO_CONNECT_RENAME
- _IO_CONNECT_MKNOD
- _IO_CONNECT_READLINK
- _IO_CONNECT_LINK
- _IO_CONNECT_RSVD_UNBLOCK — place holder in the
jump table.
- _IO_CONNECT_MOUNT
- file_type
- The file type; one of the following (defined in
<sys/ftype.h>):
- _FTYPE_ANY — the path name can be anything.
- _FTYPE_LINK — reserved for the Process Manager.
- _FTYPE_MOUNT — receive mount requests on the path
(path must be NULL).
- _FTYPE_MQUEUE — reserved for a message-queue manager.
- _FTYPE_PIPE — reserved for a pipe manager.
- _FTYPE_SEM — reserved for a semaphore manager.
- _FTYPE_SHMEM — reserved for a shared memory object.
- _FTYPE_SOCKET — reserved for a socket manager.
- _FTYPE_SYMLINK — reserved for the Process Manager.
- reply_max
- The maximum length of the reply message.
- entry_max
- The maximum number of _io_connect_entry structures that
the resource manager is willing to accept.
If a path could reference more than one resource manager, it returns
a list of _io_connect_entry structures referring to the
overlapping resource managers.
- key
- Reserved.
- handle
- The handle returned by
resmgr_attach().
- ioflag
- The bottom two bits are modified from traditional Unix values to more
useful bit flags:
- O_RDONLY (0) is converted to
_IO_FLAG_RD (0x01)
- O_WRONLY (1) is converted to
_IO_FLAG_WR (0x02)
- O_RDWR (2) is converted to _IO_FLAG_RD
| _IO_FLAG_WR (0x03)
Note that this translation can be performed without overlapping
other O_* flags.
To check for permissions, use the following:
- ioflag & _IO_FLAG_RD for read permission
- ioflag & _IO_FLAG_WR for write permission
- If the file is open for reading and writing, both bits are set.
The remaining values of ioflag are outside this
range and are not modified. These values are:
- O_APPEND — if set, the file offset is set to
the end of the file prior to each write.
- O_CREAT — create the file.
- O_DSYNC — if set, this flag affects subsequent
I/O calls; each call to
write()
waits until all data is successfully transferred
to the storage device such that it's readable on any subsequent open of
the file (even one that follows a system failure) in the absence of a
failure of the physical storage medium. If the physical storage medium
implements a non-write-through cache, then a system failure may be
interpreted as a failure of the physical storage medium, and data may
not be readable even if this flag is set and the write()
indicates that it succeeded.
- O_EXCL — if you set both O_EXCL
and O_CREAT,
open() fails if the file exists. The check for the
existence of the file and the creation of the file if it doesn't
exist are atomic; no other process that's attempting the same
operation with the same filename at the same time will succeed.
Specifying O_EXCL
without O_CREAT has no effect.
- O_LARGEFILE — allow the file offset to be
64 bits long.
- O_NOCTTY — if set, and path identifies
a terminal device, the
open() function doesn't cause the terminal device to become
the controlling terminal for the process.
- O_NONBLOCK — don't block.
- O_REALIDS — use the real
uid/gid for permissions checking.
- O_RSYNC — read I/O operations on the file
descriptor complete at the same level of integrity as
specified by the O_DSYNC and O_SYNC flags.
- O_SYNC — if set, this flag affects subsequent
I/O calls; each call to
read()
or
write()
is complete only when both the data has been successfully transferred
(either read or written) and all file system information relevant to
that I/O operation (including that required to retrieve said data) is
successfully transferred, including file update and/or access times,
and so on. See the discussion of a successful data transfer in
O_DSYNC, above.
- O_TRUNC — if the file exists and is a regular
file, and the file is successfully
opened O_WRONLY or O_RDWR,
the file length is truncated to zero and the mode and owner are left
unchanged. O_TRUNC has no effect on FIFO or block or
character special files or directories. Using O_TRUNC
with O_RDONLY has no effect.
- mode
- Contains the type and access permissions of the file.
The type is one of:
- S_IFBLK — block special.
- S_IFCHR — character special.
- S_IFDIR — directory.
- S_IFIFO — FIFO special.
- S_IFLNK — symbolic link.
- S_IFMT — type of file.
- S_IFNAM — special named file.
- S_IFREG — regular.
- S_IFSOCK — socket.
The permissions are a combination of:
Owner
|
Group
|
Others
|
Permission |
S_IRUSR
|
S_IRGRP
|
S_IROTH
|
Read |
S_IRWXU
|
S_IRWXG
|
S_IRWXO
|
Read, write, execute/search. A bitwise
inclusive OR of the other three
constants (S_IRWXU is OR of IRUSR, S_IWSUR and S_IXUSR.) |
S_IWUSR
|
S_IWGRP
|
S_IWOTH
|
Write |
S_IXUSR
|
S_IXGRP
|
S_IXOTH
|
Execute/search |
The following bits define miscellaneous permissions used by other
implementations:
Bit
|
Equivalent
|
S_IEXEC
|
S_IXUSR
|
S_IREAD
|
S_IRUSR
|
S_IWRITE
|
S_IWUSR
|
- sflag
- How the client wants the file to be shared; a combination of the
following bits:
- SH_COMPAT — set compatibility mode.
- SH_DENYRW — prevent read or write access to the
file.
- SH_DENYWR — prevent write access to the file.
- SH_DENYRD — prevent read access to the file.
- SH_DENYNO — permit both read and write access
to the file.
- access
- Contains a combination of _IO_FLAG_RD and
_IO_FLAG_WR bits, which are
used internally as the access permissions to allow from ioflag.
- path_len
- The length of the path member.
- eflag
- Extended flags:
- _IO_CONNECT_EFLAG_DIR — the path referenced a
directory.
- _IO_CONNECT_EFLAG_DOT — the last component of a
path was . or .. (i.e. the current or parent
directory).
- extra_type
- One of:
- _IO_CONNECT_EXTRA_NONE
- _IO_CONNECT_EXTRA_LINK
- _IO_CONNECT_EXTRA_SYMLINK
- _IO_CONNECT_EXTRA_MQUEUE
- _IO_CONNECT_EXTRA_PHOTON
- _IO_CONNECT_EXTRA_SOCKET
- _IO_CONNECT_EXTRA_SEM
- _IO_CONNECT_EXTRA_RESMGR_LINK
- _IO_CONNECT_EXTRA_PROC_SYMLINK
- _IO_CONNECT_EXTRA_RENAME
- _IO_CONNECT_EXTRA_MOUNT
- _IO_CONNECT_EXTRA_MOUNT_OCB
- extra_len
- The length of any extra data included in the message.
- path
- The path that the client is trying to connect to, relative to the
resource manager's mountpoint.
QNX Neutrino
_io_connect_ftype_reply,
_io_connect_link_reply,
resmgr_connect_funcs_t
“The _IO_OPEN message for filesystems”
in the Filesystem Resource Managers
chapter of Writing a Resource Manager