14cc62415SBruce Evans /*- 2d63027b6SPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3d63027b6SPedro F. Giffuni * 43f54a085SPoul-Henning Kamp * Copyright (c) 1992, 1993 53f54a085SPoul-Henning Kamp * The Regents of the University of California. All rights reserved. 63f54a085SPoul-Henning Kamp * Copyright (c) 2000 73f54a085SPoul-Henning Kamp * Poul-Henning Kamp. All rights reserved. 8a1dc2096SDima Dorfman * Copyright (c) 2002 9a1dc2096SDima Dorfman * Dima Dorfman. All rights reserved. 103f54a085SPoul-Henning Kamp * 113f54a085SPoul-Henning Kamp * This code is derived from software donated to Berkeley by 123f54a085SPoul-Henning Kamp * Jan-Simon Pendry. 133f54a085SPoul-Henning Kamp * 143f54a085SPoul-Henning Kamp * Redistribution and use in source and binary forms, with or without 153f54a085SPoul-Henning Kamp * modification, are permitted provided that the following conditions 163f54a085SPoul-Henning Kamp * are met: 173f54a085SPoul-Henning Kamp * 1. Redistributions of source code must retain the above copyright 183f54a085SPoul-Henning Kamp * notice, this list of conditions and the following disclaimer. 193f54a085SPoul-Henning Kamp * 2. Neither the name of the University nor the names of its contributors 203f54a085SPoul-Henning Kamp * may be used to endorse or promote products derived from this software 213f54a085SPoul-Henning Kamp * without specific prior written permission. 223f54a085SPoul-Henning Kamp * 233f54a085SPoul-Henning Kamp * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 243f54a085SPoul-Henning Kamp * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 253f54a085SPoul-Henning Kamp * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 263f54a085SPoul-Henning Kamp * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 273f54a085SPoul-Henning Kamp * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 283f54a085SPoul-Henning Kamp * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 293f54a085SPoul-Henning Kamp * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 303f54a085SPoul-Henning Kamp * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 313f54a085SPoul-Henning Kamp * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 323f54a085SPoul-Henning Kamp * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 333f54a085SPoul-Henning Kamp * SUCH DAMAGE. 343f54a085SPoul-Henning Kamp * 353f54a085SPoul-Henning Kamp * @(#)kernfs.h 8.6 (Berkeley) 3/29/95 363f54a085SPoul-Henning Kamp * From: FreeBSD: src/sys/miscfs/kernfs/kernfs.h 1.14 373f54a085SPoul-Henning Kamp * 383f54a085SPoul-Henning Kamp * $FreeBSD$ 393f54a085SPoul-Henning Kamp */ 403f54a085SPoul-Henning Kamp 4193bcdfe2SPoul-Henning Kamp #ifndef _FS_DEVFS_DEVFS_H_ 4293bcdfe2SPoul-Henning Kamp #define _FS_DEVFS_DEVFS_H_ 433f54a085SPoul-Henning Kamp 44a1dc2096SDima Dorfman #define DEVFS_MAGIC 0xdb0a087a 45a1dc2096SDima Dorfman 46a1dc2096SDima Dorfman /* 47a1dc2096SDima Dorfman * Identifiers. The ruleset and rule numbers are 16-bit values. The 48a1dc2096SDima Dorfman * "rule ID" is a combination of the ruleset and rule number; it 49a1dc2096SDima Dorfman * should be able to univocally describe a rule in the system. In 50a1dc2096SDima Dorfman * this implementation, the upper 16 bits of the rule ID is the 51a1dc2096SDima Dorfman * ruleset number; the lower 16 bits, the rule number within the 52a1dc2096SDima Dorfman * aforementioned ruleset. 53a1dc2096SDima Dorfman */ 54a1dc2096SDima Dorfman typedef uint16_t devfs_rnum; 55a1dc2096SDima Dorfman typedef uint16_t devfs_rsnum; 56a1dc2096SDima Dorfman typedef uint32_t devfs_rid; 57a1dc2096SDima Dorfman 58a1dc2096SDima Dorfman /* 59a1dc2096SDima Dorfman * Identifier manipulators. 60a1dc2096SDima Dorfman */ 61a1dc2096SDima Dorfman #define rid2rsn(rid) ((rid) >> 16) 62a1dc2096SDima Dorfman #define rid2rn(rid) ((rid) & 0xffff) 63a1dc2096SDima Dorfman #define mkrid(rsn, rn) ((rn) | ((rsn) << 16)) 64a1dc2096SDima Dorfman 65a1dc2096SDima Dorfman /* 66a1dc2096SDima Dorfman * Plain DEVFS rule. This gets shared between kernel and userland 67a1dc2096SDima Dorfman * verbatim, so it shouldn't contain any pointers or other kernel- or 68a1dc2096SDima Dorfman * userland-specific values. 69a1dc2096SDima Dorfman */ 70a1dc2096SDima Dorfman struct devfs_rule { 71a1dc2096SDima Dorfman uint32_t dr_magic; /* Magic number. */ 72a1dc2096SDima Dorfman devfs_rid dr_id; /* Identifier. */ 73a1dc2096SDima Dorfman 74a1dc2096SDima Dorfman /* 75a1dc2096SDima Dorfman * Conditions under which this rule should be applied. These 76a1dc2096SDima Dorfman * are ANDed together since OR can be simulated by using 77a1dc2096SDima Dorfman * multiple rules. dr_icond determines which of the other 78a1dc2096SDima Dorfman * variables we should process. 79a1dc2096SDima Dorfman */ 80a1dc2096SDima Dorfman int dr_icond; 81a1dc2096SDima Dorfman #define DRC_DSWFLAGS 0x001 82a1dc2096SDima Dorfman #define DRC_PATHPTRN 0x002 83a1dc2096SDima Dorfman int dr_dswflags; /* cdevsw flags to match. */ 84a1dc2096SDima Dorfman #define DEVFS_MAXPTRNLEN 200 85a1dc2096SDima Dorfman char dr_pathptrn[DEVFS_MAXPTRNLEN]; /* Pattern to match path. */ 86a1dc2096SDima Dorfman 87a1dc2096SDima Dorfman /* 88a1dc2096SDima Dorfman * Things to change. dr_iacts determines which of the other 89a1dc2096SDima Dorfman * variables we should process. 90a1dc2096SDima Dorfman */ 91a1dc2096SDima Dorfman int dr_iacts; 92a1dc2096SDima Dorfman #define DRA_BACTS 0x001 93a1dc2096SDima Dorfman #define DRA_UID 0x002 94a1dc2096SDima Dorfman #define DRA_GID 0x004 95a1dc2096SDima Dorfman #define DRA_MODE 0x008 96a1dc2096SDima Dorfman #define DRA_INCSET 0x010 97a1dc2096SDima Dorfman int dr_bacts; /* Boolean (on/off) action. */ 98a1dc2096SDima Dorfman #define DRB_HIDE 0x001 /* Hide entry (DE_WHITEOUT). */ 99a1dc2096SDima Dorfman #define DRB_UNHIDE 0x002 /* Unhide entry. */ 100a1dc2096SDima Dorfman uid_t dr_uid; 101a1dc2096SDima Dorfman gid_t dr_gid; 102a1dc2096SDima Dorfman mode_t dr_mode; 103a1dc2096SDima Dorfman devfs_rsnum dr_incset; /* Included ruleset. */ 104a1dc2096SDima Dorfman }; 105a1dc2096SDima Dorfman 106a1dc2096SDima Dorfman /* 107a1dc2096SDima Dorfman * Rule-related ioctls. 108a1dc2096SDima Dorfman */ 109a1dc2096SDima Dorfman #define DEVFSIO_RADD _IOWR('D', 0, struct devfs_rule) 110a1dc2096SDima Dorfman #define DEVFSIO_RDEL _IOW('D', 1, devfs_rid) 111a1dc2096SDima Dorfman #define DEVFSIO_RAPPLY _IOW('D', 2, struct devfs_rule) 112a1dc2096SDima Dorfman #define DEVFSIO_RAPPLYID _IOW('D', 3, devfs_rid) 113a1dc2096SDima Dorfman #define DEVFSIO_RGETNEXT _IOWR('D', 4, struct devfs_rule) 114a1dc2096SDima Dorfman 115a1dc2096SDima Dorfman #define DEVFSIO_SUSE _IOW('D', 10, devfs_rsnum) 116a1dc2096SDima Dorfman #define DEVFSIO_SAPPLY _IOW('D', 11, devfs_rsnum) 117a1dc2096SDima Dorfman #define DEVFSIO_SGETNEXT _IOWR('D', 12, devfs_rsnum) 118a1dc2096SDima Dorfman 119a1dc2096SDima Dorfman /* XXX: DEVFSIO_RS_GET_INFO for refcount, active if any, etc. */ 120a1dc2096SDima Dorfman 121a1dc2096SDima Dorfman #ifdef _KERNEL 1223f54a085SPoul-Henning Kamp 1234cc62415SBruce Evans #ifdef MALLOC_DECLARE 1243f54a085SPoul-Henning Kamp MALLOC_DECLARE(M_DEVFS); 1254cc62415SBruce Evans #endif 1263f54a085SPoul-Henning Kamp 127*d485c77fSKonstantin Belousov #endif /* _KERNEL */ 128*d485c77fSKonstantin Belousov 1296adc5230SJaakko Heinonen struct componentname; 1306adc5230SJaakko Heinonen 131d318c565SJaakko Heinonen TAILQ_HEAD(devfs_dlist_head, devfs_dirent); 132d318c565SJaakko Heinonen 1333f54a085SPoul-Henning Kamp struct devfs_dirent { 134e606a3c6SPoul-Henning Kamp struct cdev_priv *de_cdp; 1353f54a085SPoul-Henning Kamp int de_inode; 136a481b90bSPoul-Henning Kamp int de_flags; 13764040d39SJaakko Heinonen #define DE_WHITEOUT 0x01 13864040d39SJaakko Heinonen #define DE_DOT 0x02 13964040d39SJaakko Heinonen #define DE_DOTDOT 0x04 14064040d39SJaakko Heinonen #define DE_DOOMED 0x08 14164040d39SJaakko Heinonen #define DE_COVERED 0x10 142d318c565SJaakko Heinonen #define DE_USER 0x20 143e7f9b744SKonstantin Belousov int de_holdcnt; 1443f54a085SPoul-Henning Kamp struct dirent *de_dirent; 1453f54a085SPoul-Henning Kamp TAILQ_ENTRY(devfs_dirent) de_list; 146d318c565SJaakko Heinonen struct devfs_dlist_head de_dlist; 147a481b90bSPoul-Henning Kamp struct devfs_dirent *de_dir; 148a481b90bSPoul-Henning Kamp int de_links; 1493f54a085SPoul-Henning Kamp mode_t de_mode; 1503f54a085SPoul-Henning Kamp uid_t de_uid; 1513f54a085SPoul-Henning Kamp gid_t de_gid; 152eca8a663SRobert Watson struct label *de_label; 1533f54a085SPoul-Henning Kamp struct timespec de_atime; 1543f54a085SPoul-Henning Kamp struct timespec de_mtime; 1553f54a085SPoul-Henning Kamp struct timespec de_ctime; 1563f54a085SPoul-Henning Kamp struct vnode *de_vnode; 1573f54a085SPoul-Henning Kamp char *de_symlink; 1583b444436SMateusz Guzik int de_usecount; 1593f54a085SPoul-Henning Kamp }; 1603f54a085SPoul-Henning Kamp 161*d485c77fSKonstantin Belousov #include <sys/_lock.h> 162*d485c77fSKonstantin Belousov #include <sys/_sx.h> 163*d485c77fSKonstantin Belousov 1643f54a085SPoul-Henning Kamp struct devfs_mount { 165e606a3c6SPoul-Henning Kamp u_int dm_idx; 166990b4b2dSRobert Watson struct mount *dm_mount; 167a481b90bSPoul-Henning Kamp struct devfs_dirent *dm_rootdir; 1683f54a085SPoul-Henning Kamp unsigned dm_generation; 169e7f9b744SKonstantin Belousov int dm_holdcnt; 170e606a3c6SPoul-Henning Kamp struct sx dm_lock; 171a1dc2096SDima Dorfman devfs_rsnum dm_ruleset; 1723f54a085SPoul-Henning Kamp }; 1733f54a085SPoul-Henning Kamp 174e606a3c6SPoul-Henning Kamp #define DEVFS_ROOTINO 2 1755e080af4SPoul-Henning Kamp 176*d485c77fSKonstantin Belousov #ifdef _KERNEL 177*d485c77fSKonstantin Belousov 178e606a3c6SPoul-Henning Kamp extern unsigned devfs_rule_depth; 179a481b90bSPoul-Henning Kamp 1803f54a085SPoul-Henning Kamp #define VFSTODEVFS(mp) ((struct devfs_mount *)((mp)->mnt_data)) 1813f54a085SPoul-Henning Kamp 182e7f9b744SKonstantin Belousov #define DEVFS_DE_HOLD(de) ((de)->de_holdcnt++) 183e7f9b744SKonstantin Belousov #define DEVFS_DE_DROP(de) (--(de)->de_holdcnt == 0) 184e7f9b744SKonstantin Belousov 185e7f9b744SKonstantin Belousov #define DEVFS_DMP_HOLD(dmp) ((dmp)->dm_holdcnt++) 186e7f9b744SKonstantin Belousov #define DEVFS_DMP_DROP(dmp) (--(dmp)->dm_holdcnt == 0) 187e7f9b744SKonstantin Belousov 18889d10571SJaakko Heinonen #define DEVFS_DEL_VNLOCKED 0x01 18989d10571SJaakko Heinonen #define DEVFS_DEL_NORECURSE 0x02 19089d10571SJaakko Heinonen 19127877c99SJaakko Heinonen void devfs_rules_apply(struct devfs_mount *, struct devfs_dirent *); 19227877c99SJaakko Heinonen void devfs_rules_cleanup(struct devfs_mount *); 19327877c99SJaakko Heinonen int devfs_rules_ioctl(struct devfs_mount *, u_long, caddr_t, 19427877c99SJaakko Heinonen struct thread *); 19517d84d61SMartin Matuska void devfs_ruleset_set(devfs_rsnum rsnum, struct devfs_mount *dm); 19617d84d61SMartin Matuska void devfs_ruleset_apply(struct devfs_mount *dm); 19727877c99SJaakko Heinonen int devfs_allocv(struct devfs_dirent *, struct mount *, int, 19827877c99SJaakko Heinonen struct vnode **); 1996adc5230SJaakko Heinonen char *devfs_fqpn(char *, struct devfs_mount *, struct devfs_dirent *, 2006adc5230SJaakko Heinonen struct componentname *); 20127877c99SJaakko Heinonen void devfs_delete(struct devfs_mount *, struct devfs_dirent *, int); 20227877c99SJaakko Heinonen void devfs_dirent_free(struct devfs_dirent *); 203ca423b85SMateusz Guzik int devfs_populate_needed(struct devfs_mount *dm); 20427877c99SJaakko Heinonen void devfs_populate(struct devfs_mount *); 20527877c99SJaakko Heinonen void devfs_cleanup(struct devfs_mount *); 20627877c99SJaakko Heinonen void devfs_unmount_final(struct devfs_mount *); 20727877c99SJaakko Heinonen struct devfs_dirent *devfs_newdirent(char *, int); 20827877c99SJaakko Heinonen struct devfs_dirent *devfs_parent_dirent(struct devfs_dirent *); 20927877c99SJaakko Heinonen struct devfs_dirent *devfs_vmkdir(struct devfs_mount *, char *, int, 21027877c99SJaakko Heinonen struct devfs_dirent *, u_int); 21127877c99SJaakko Heinonen struct devfs_dirent *devfs_find(struct devfs_dirent *, const char *, int, 21227877c99SJaakko Heinonen int); 21393bcdfe2SPoul-Henning Kamp 2143b444436SMateusz Guzik void devfs_ctty_ref(struct vnode *); 2153b444436SMateusz Guzik void devfs_ctty_unref(struct vnode *); 2163b444436SMateusz Guzik int devfs_usecount(struct vnode *); 2173b444436SMateusz Guzik 2183f54a085SPoul-Henning Kamp #endif /* _KERNEL */ 2194cc62415SBruce Evans 2204cc62415SBruce Evans #endif /* !_FS_DEVFS_DEVFS_H_ */ 221