CONTRACT(5) | File Formats and Configurations | CONTRACT(5) |
contract - the contract file system
/system/contract
The /system/contract file system acts as the primary interface to the contract subsystem. There is a subdirectory of /system/contract for each available contract type.
/system/contract can be mounted on any mount point, in addition to the standard /system/contract mount point, and can be mounted several places at once. Such additional mounts are allowed in order to facilitate the confinement of processes to subtrees of the file system using chroot(8) and yet allow such processes to continue to use contract commands and interfaces.
A combination of standard system calls (for example, open(2), close(2), and poll(2)) and calls to libcontract(3LIB) access /system/contract files.
Consumers of the contract file system must be large file aware. See largefile(7) and lfcompile64(7).
At the top level, the /system/contract directory contains subdirectories named with each available contract type, and one special directory, all. Each of these directories is world-readable and world-searchable.
Each /system/contract/type directory contains a fixed number of files. It also contains a variable number of subdirectories corresponding to existing contracts of type type and named with the decimal representation of the contracts' IDs.
The following files are in a /system/contract/type directory:
template
You can use the following libcontract(3LIB) calls on a template file descriptor:
>
ct_tmpl_activate(3contract)
ct_tmpl_clear(3contract)
ct_tmpl_create(3contract)
See TERMS for additional template functions.
latest
bundle
pbundle
The /system/contract/all directory contains a numerically named file for each contract in the system. Each file is a symbolic link to the type-specific directory for that contract, that is /system/contract/all/id points to /system/contract/type/id.
Each /system/contract/type/id directory contains the following files:
ctl
The following libcontract(3LIB) calls can be made on a ctl file descriptor if the contract is owned by the caller:
ct_ctl_abandon(3contract) ct_ctl_newct(3contract) ct_ctl_ack(3contract) ct_ctl_qack(3contract)
The following libcontract(3LIB) call can be made on a ctl file descriptor if the contract doesn't have an owner:
ct_ctl_adopt(3contract)
status
ct_status_read(3contract)
See STATUS.
events
Only a process which has the same effective user ID as the process owning the contract, the same effective user ID as the contract's author, or has {PRIV_CONTRACT_OBSERVER} in its effective set can open the event endpoint for a contract.
The following terms are defined for all contracts:
cookie
informative event set
critical event set
A status object returned by ct_status_read(3CONTRACT) contains the following pieces of information:
contract ID
contract type
creator's zone ID
ownership state
contract holder
number of critical events
negotiation time
negotiation quantum time
negotiation event ID
cookie (term)
Informative event set (term)
Critical event set (term)
All three event endpoints, /system/contract/type/bundle, /system/contract/type/pbundle, and /system/contract/type/id/events, are accessed in the same manner.
The following libcontract(3LIB) interfaces are used with an event endpoint file descriptor:
ct_event_read(3contract) ct_event_read_critical(3contract) ct_event_reset(3contract)
To facilitate processes watching multiple event endpoints, it is possible to poll(2) on event endpoints. When it is possible to receive on an endpoint file descriptor, POLLIN is set for that descriptor.
An event object returned by ct_event_read(3CONTRACT) contains the following information:
contract ID
event ID
flags
event type
The following event types are defined:
CT_EV_NEGEND
CT_EV_NEGEND cannot be included in a contract's informative or critical event set. It is always delivered and always critical. If CT_EV_NEGEND indicates that the operation was successful, no further events are sent. The contract's owner should use ct_ctl_abandon(3CONTRACT) to abandon the contract.
A CT_EV_NEGEND event contains:
negotiation ID
new contract ID
/system/contract
/system/contract/all
/system/contract/all/id
/system/contract/type
/system/contract/type/template
/system/contract/type/bundle
/system/contract/type/pbundle
/system/contract/type /latest
/system/contract/type/ID
/system/contract/type/ID/events
/system/contract/type/ID/ctl
/system/contract/type/ID/status
ctrun(1), ctstat(1), ctwatch(1), close(2), ioctl(2), open(2), poll(2), ct_ctl_abandon(3CONTRACT), ct_event_get_evid(3CONTRACT), ct_event_get_flags(3CONTRACT), ct_event_get_nevid(3CONTRACT), ct_event_get_newct(3CONTRACT), ct_event_get_type(3CONTRACT), ct_event_read(3CONTRACT), ct_status_get_cookie(3CONTRACT), ct_status_get_critical(3CONTRACT), ct_status_get_holder(3CONTRACT), ct_status_get_id(3CONTRACT), ct_status_get_informative(3CONTRACT), ct_status_get_nevents(3CONTRACT), ct_status_get_nevid(3CONTRACT), ct_status_get_ntime(3CONTRACT), ct_status_get_qtime(3CONTRACT), ct_status_get_state(3CONTRACT), ct_status_get_type(3CONTRACT), ct_status_read(3CONTRACT), ct_tmpl_set_cookie(3CONTRACT), ct_tmpl_set_critical(3CONTRACT), ct_tmpl_set_informative(3CONTRACT), libcontract(3LIB), process(5), largefile(7), lfcompile(7), privileges(7), chroot(8)
November 26, 2017 | OmniOS |