open(9E)
NAME
open - gain access to a device
SYNOPSIS
Block and Character
#include <sys/types.h>
#include <sys/file.h>
#include <sys/errno.h>
#include <sys/open.h>
#include <sys/cred.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
int prefixopen(dev_t *devp, int flag, int otyp, cred_t
*cred_p);
STREAMS
#include <sys/file.h>
#include <sys/stream.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
int prefixopen(queue_t *q, dev_t *devp, int oflag, int
sflag, cred_t *cred_p);
INTERFACE LEVEL
Architecture independent level 1 (DDI/DKI). This entry point
is required, but it can be nulldev(9F)
PARAMETERS
Block and Character
devp Pointer to a device number.
flag A bit field passed from the user program open(2) sys-
tem call that instructs the driver on how to open the
file. Valid settings are:
FEXCL Open the device with exclusive access; fail all
other attempts to open the device.
FNDELAY
Open the device and return immediately. Do not
block the open even if something is wrong.
FREAD Open the device with read-only permission (if
ORed with FWRITE, then allow both read and
write access)
FWRITE
Open a device with write-only permission (if
ORed with FREAD, then allow both read and write
access)
otyp Parameter supplied so that the driver can determine
how many times a device was opened and for what rea-
sons. For OTYP_BLK and OTYP_CHR, the open() routine
may be called many times, but the close(9E) routine
is called only when the last reference to a device is
removed. If the device is accessed through file
descriptors, this is by a call to close(2) or exit(2)
If the device is accessed through memory mapping, this
is by a call to munmap(2) or exit(2) For OTYP_LYR,
there is exactly one close(9E) for each open()
called. This permits software drivers to exist above
hardware drivers and removes any ambiguity from the
hardware driver regarding how a device is used.
OTYP_BLK
Open occurred through block interface for the
device
OTYP_CHR
Open occurred through the raw/character inter-
face for the device
OTYP_LYR
Open a layered process. This flag is used when
one driver calls another driver's open() or
close(9E) routine. The calling driver will make
sure that there is one layered close for each
layered open. This flag applies to both block
and character devices.
cred_p
Pointer to the user credential structure.
STREAMS
q A pointer to the read queue.
devp Pointer to a device number. For STREAMS modules,
devp always points to the device number associated
with the driver at the end (tail) of the stream.
oflag Valid oflag values are FEXCL, FNDELAY, FREAD, and
FWRITEL, the same as those listed above for flag. For
STREAMS modules, oflag is always set to 0.
sflag Valid values are as follows:
CLONEOPEN
Indicates that the open() routine is called
through the clone driver. The driver should
return a unique device number.
MODOPEN
Modules should be called with sflag set to this
value. Modules should return an error if they
are called with sflag set to a different value.
Drivers should return an error if they are
called with sflag set to this value.
0 Indicates a driver is opened directly, without
calling the clone driver.
cred_p
Pointer to the user credential structure.
DESCRIPTION
The driver's open() routine is called by the kernel during
an open(2) or a mount(2) on the special file for the dev-
ice. The routine should verify that the minor number com-
ponent of *devp is valid, that the type of access requested
by otyp and flag is appropriate for the device, and, if
required, check permissions using the user credentials
pointed to by cred_p.
The open() routine is passed a pointer to a device number so
that the driver can change the minor number. This allows
drivers to dynamically create minor instances of the dev-
ice. An example of this might be a pseudo-terminal driver
that creates a new pseudo-terminal whenever it is opened.
A driver that chooses the minor number dynamically, normally
creates only one minor device node in attach(9E) with
ddi_create_minor_node(9F) then changes the minor number com-
ponent of *devp using makedevice(9F) and getmajor(9F) The
driver needs to keep track of available minor numbers inter-
nally:
*devp = makedevice(getmajor(*devp), new_minor);
RETURN VALUES
The open() routine should return 0 for success, or the
appropriate error number.
SEE ALSO
close(2), exit(2), mmap(2), mount(2), munmap(2), open(2),
intro(9E), attach(9E), close(9E), ddi_create_minor_node(9F),
getmajor(9F), getminor(9F), makedevice(9F), nulldev(9F)
Writing Device Drivers
STREAMS Programming Guide
WARNINGS
Do not attempt to change the major number.
Man(1) output converted with
man2html