NAME
make_dev, make_dev_cred, make_dev_credf, make_dev_p, make_dev_s, make_dev_alias, make_dev_alias_p, destroy_dev, destroy_dev_sched, destroy_dev_sched_cb, destroy_dev_drain, dev_depends — manage cdev's and DEVFS registration for devicesSYNOPSIS
#include <sys/param.h>#include <sys/conf.h> void
make_dev_args_init(struct make_dev_args *args); int
make_dev_s(struct make_dev_args *args, struct cdev **cdev, const char *fmt, ...); int
make_dev_alias_p(int flags, struct cdev **cdev, struct cdev *pdev, const char *fmt, ...); void
destroy_dev(struct cdev *dev); void
destroy_dev_sched(struct cdev *dev); void
destroy_dev_sched_cb(struct cdev *dev, void (*cb)(void *), void *arg); void
destroy_dev_drain(struct cdevsw *csw); void
dev_depends(struct cdev *pdev, struct cdev *cdev); LEGACY INTERFACES
struct cdev *
make_dev(struct cdevsw *cdevsw, int unit, uid_t uid, gid_t gid, int perms, const char *fmt, ...); struct cdev *
make_dev_cred(struct cdevsw *cdevsw, int unit, struct ucred *cr, uid_t uid, gid_t gid, int perms, const char *fmt, ...); struct cdev *
make_dev_credf(int flags, struct cdevsw *cdevsw, int unit, struct ucred *cr, uid_t uid, gid_t gid, int perms, const char *fmt, ...); int
make_dev_p(int flags, struct cdev **cdev, struct cdevsw *devsw, struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt, ...); struct cdev *
make_dev_alias(struct cdev *pdev, const char *fmt, ...);
DESCRIPTION
The make_dev_s() function creates a cdev structure for a new device, which is returned into the cdev argument. It also notifies devfs(5) of the presence of the new device, that causes corresponding nodes to be created. Besides this, a devctl(4) notification is sent. The function takes the structure struct make_dev_args args, which specifies the parameters for the device creation:struct make_dev_args { size_t mda_size; int mda_flags; struct cdevsw *mda_devsw; struct ucred *mda_cr; uid_t mda_uid; gid_t mda_gid; int mda_mode; int mda_unit; void *mda_si_drv1; void *mda_si_drv2; };
/
’ characters to denote subdirectories.
The permissions of the file specified in
args.mda_mode are defined in
<sys/stat.h>:
#define S_IRWXU 0000700 /* RWX mask for owner */ #define S_IRUSR 0000400 /* R for owner */ #define S_IWUSR 0000200 /* W for owner */ #define S_IXUSR 0000100 /* X for owner */ #define S_IRWXG 0000070 /* RWX mask for group */ #define S_IRGRP 0000040 /* R for group */ #define S_IWGRP 0000020 /* W for group */ #define S_IXGRP 0000010 /* X for group */ #define S_IRWXO 0000007 /* RWX mask for other */ #define S_IROTH 0000004 /* R for other */ #define S_IWOTH 0000002 /* W for other */ #define S_IXOTH 0000001 /* X for other */ #define S_ISUID 0004000 /* set user id on execution */ #define S_ISGID 0002000 /* set group id on execution */ #define S_ISVTX 0001000 /* sticky bit */ #ifndef _POSIX_SOURCE #define S_ISTXT 0001000 #endif
MAKEDEV_REF
- reference the created device
MAKEDEV_NOWAIT
- do not sleep, the call may fail
MAKEDEV_WAITOK
- allow the function to sleep to satisfy malloc
MAKEDEV_ETERNAL
- created device will be never destroyed
MAKEDEV_CHECKNAME
- return an error if the device name is invalid or already exists
MAKEDEV_NOWAIT
,
MAKEDEV_WAITOK
and
MAKEDEV_CHECKNAME
values are accepted for
the make_dev_alias_p() function.
The MAKEDEV_WAITOK
flag is assumed if none of
MAKEDEV_WAITOK
,
MAKEDEV_NOWAIT
is specified.
The dev_clone(9) event handler shall specify
MAKEDEV_REF
flag when creating a device in
response to lookup, to avoid race where the device created is destroyed
immediately after devfs_lookup(9) drops his
reference to cdev.
The MAKEDEV_ETERNAL
flag allows the kernel to
not acquire some locks when translating system calls into the cdevsw methods
calls. It is responsibility of the driver author to make sure that
destroy_dev() is never called on the returned
cdev. For the convenience, use the
MAKEDEV_ETERNAL_KLD
flag for the code that
can be compiled into kernel or loaded (and unloaded) as loadable module.
A panic will occur if the MAKEDEV_CHECKNAME
flag is not specified and the device name is invalid or already exists.
The make_dev_p() use of the form
struct cdev *dev; int res; res = make_dev_p(flags, &dev, cdevsw, cred, uid, gid, perms, name);
struct cdev *dev; struct make_dev_args args; int res; make_dev_args_init(&args); args.mda_flags = flags; args.mda_devsw = cdevsw; args.mda_cred = cred; args.mda_uid = uid; args.mda_gid = gid; args.mda_mode = perms; res = make_dev_s(&args, &dev, name);
(void) make_dev_s(&args, &dev, name);
make_dev_credf(0, cdevsw, unit, cr, uid, gid, perms, fmt, ...);
make_dev_credf(0, cdevsw, unit, NULL, uid, gid, perms, fmt, ...);
NULL
, the callback
cb is called, with argument
arg. The
destroy_dev_sched() function is the same as
destroy_dev_sched_cb(cdev, NULL, NULL);
RETURN VALUES
If successful, make_dev_s() and make_dev_p() will return 0, otherwise they will return an error. If successful, make_dev_credf() will return a valid cdev pointer, otherwise it will returnNULL
.
ERRORS
The make_dev_s(), make_dev_p() and make_dev_alias_p() calls will fail and the device will be not registered if:- [
ENOMEM
] - The
MAKEDEV_NOWAIT
flag was specified and a memory allocation request could not be satisfied. - [
ENAMETOOLONG
] - The
MAKEDEV_CHECKNAME
flag was specified and the provided device name is longer thanSPECNAMELEN
. - [
EINVAL
] - The
MAKEDEV_CHECKNAME
flag was specified and the provided device name is empty, contains a “.” or “..” path component or ends with ‘/
’. - [
EINVAL
] - The
MAKEDEV_CHECKNAME
flag was specified and the provided device name contains invalid characters. - [
EEXIST
] - The
MAKEDEV_CHECKNAME
flag was specified and the provided device name already exists.
SEE ALSO
devctl(4), devfs(5), dev_clone(9)HISTORY
The make_dev() and destroy_dev() functions first appeared in FreeBSD 4.0. The function make_dev_alias() first appeared in FreeBSD 4.1. The function dev_depends() first appeared in FreeBSD 5.0. The functions make_dev_credf(), destroy_dev_sched(), destroy_dev_sched_cb() first appeared in FreeBSD 7.0. The function make_dev_p() first appeared in FreeBSD 8.2. The function make_dev_s() first appeared in FreeBSD 11.0.March 2, 2016 | Debian |