1/*
2 * Copyright 2009 Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _FBSD_COMPAT_SYS_SYSCTL_H_
6#define _FBSD_COMPAT_SYS_SYSCTL_H_
7
8
9#include <sys/queue.h>
10
11
12#ifdef _KERNEL
13
14struct sysctl_req {
15	void *newptr;
16};
17
18struct sysctl_ctx_list {
19};
20
21struct sysctl_oid_list {
22};
23
24
25#define SYSCTL_HANDLER_ARGS void *oidp, void *arg1, int arg2, \
26	struct sysctl_req *req
27
28#define OID_AUTO	(-1)
29
30#define CTLTYPE		0xf	/* Mask for the type */
31#define	CTLTYPE_NODE	1	/* name is a node */
32#define	CTLTYPE_INT	2	/* name describes an integer */
33#define	CTLTYPE_STRING	3	/* name describes a string */
34#define	CTLTYPE_QUAD	4	/* name describes a 64-bit number */
35#define	CTLTYPE_OPAQUE	5	/* name describes a structure */
36#define	CTLTYPE_STRUCT	CTLTYPE_OPAQUE	/* name describes a structure */
37#define	CTLTYPE_UINT	6	/* name describes an unsigned integer */
38#define	CTLTYPE_LONG	7	/* name describes a long */
39#define	CTLTYPE_ULONG	8	/* name describes an unsigned long */
40#define CTLTYPE_U64		9	/* name describes an unsigned 64-bit number */
41
42#define CTLFLAG_RD	0x80000000	/* Allow reads of variable */
43#define CTLFLAG_WR	0x40000000	/* Allow writes to the variable */
44#define CTLFLAG_RW	(CTLFLAG_RD|CTLFLAG_WR)
45#define CTLFLAG_NOLOCK	0x20000000	/* XXX Don't Lock */
46#define CTLFLAG_ANYBODY	0x10000000	/* All users can set this var */
47#define CTLFLAG_SECURE	0x08000000	/* Permit set only if securelevel<=0 */
48#define CTLFLAG_PRISON	0x04000000	/* Prisoned roots can fiddle */
49#define CTLFLAG_DYN	0x02000000	/* Dynamic oid - can be freed */
50#define CTLFLAG_SKIP	0x01000000	/* Skip this sysctl when listing */
51#define CTLMASK_SECURE	0x00F00000	/* Secure level */
52#define CTLFLAG_TUN	0x00080000	/* Tunable variable */
53#define CTLFLAG_MPSAFE  0x00040000	/* Handler is MP safe */
54#define CTLFLAG_RDTUN	(CTLFLAG_RD|CTLFLAG_TUN)
55
56
57static inline int
58sysctl_ctx_init(struct sysctl_ctx_list *clist)
59{
60	return -1;
61}
62
63
64static inline int
65sysctl_ctx_free(struct sysctl_ctx_list *clist)
66{
67	return -1;
68}
69
70
71static inline void *
72sysctl_add_oid(struct sysctl_ctx_list *clist, void *parent, int nbr,
73	const char *name, int kind, void *arg1, int arg2,
74	int (*handler) (SYSCTL_HANDLER_ARGS), const char *fmt, const char *descr)
75{
76	return NULL;
77}
78
79
80static inline int sysctl_handle_long(SYSCTL_HANDLER_ARGS) { return -1; }
81static inline int sysctl_handle_opaque(SYSCTL_HANDLER_ARGS) { return -1; }
82static inline int sysctl_handle_quad(SYSCTL_HANDLER_ARGS) { return -1; }
83static inline int sysctl_handle_int(SYSCTL_HANDLER_ARGS) { return -1; }
84static inline int sysctl_handle_64(SYSCTL_HANDLER_ARGS) { return -1; }
85static inline int sysctl_handle_string(SYSCTL_HANDLER_ARGS) { return -1; }
86
87
88#define SYSCTL_OUT(r, p, l) -1
89
90#define __DESCR(x) ""
91
92#define SYSCTL_ADD_OID(ctx, parent, nbr, name, kind, a1, a2, handler, fmt, descr) \
93	sysctl_add_oid(ctx, parent, nbr, name, kind, a1, a2, handler, fmt, \
94	__DESCR(descr))
95
96#define SYSCTL_ADD_NODE(ctx, parent, nbr, name, access, handler, descr)	\
97	sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_NODE|(access),		\
98	0, 0, handler, "N", __DESCR(descr))
99
100#define SYSCTL_ADD_STRING(ctx, parent, nbr, name, access, arg, len, descr)	\
101	sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_STRING|(access),			\
102	arg, len, sysctl_handle_string, "A", __DESCR(descr))
103
104#define SYSCTL_ADD_INT(ctx, parent, nbr, name, access, ptr, val, descr)	\
105	sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_INT|(access),		\
106	ptr, val, sysctl_handle_int, "I", __DESCR(descr))
107
108#define SYSCTL_ADD_UINT(ctx, parent, nbr, name, access, ptr, val, descr)	\
109	sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_UINT|(access),			\
110	ptr, val, sysctl_handle_int, "IU", __DESCR(descr))
111
112#define SYSCTL_ADD_XINT(ctx, parent, nbr, name, access, ptr, val, descr)	\
113	sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_UINT|(access),			\
114	ptr, val, sysctl_handle_int, "IX", __DESCR(descr))
115
116#define SYSCTL_ADD_LONG(ctx, parent, nbr, name, access, ptr, descr)	\
117	sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_LONG|(access),	\
118	ptr, 0, sysctl_handle_long, "L", __DESCR(descr))
119
120#define SYSCTL_ADD_ULONG(ctx, parent, nbr, name, access, ptr, descr)	\
121	sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_ULONG|(access),		\
122	ptr, 0, sysctl_handle_long, "LU", __DESCR(descr))
123
124#define SYSCTL_ADD_QUAD(ctx, parent, nbr, name, access, ptr, descr)	\
125	sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_QUAD|(access),	\
126	ptr, 0, sysctl_handle_quad, "Q", __DESCR(descr))
127
128#define SYSCTL_ADD_UQUAD(ctx, parent, nbr, name, access, ptr, descr)    \
129	sysctl_add_oid(ctx, parent, nbr, name,								\
130	CTLTYPE_U64 | CTLFLAG_MPSAFE | (access),							\
131	ptr, 0, sysctl_handle_64, "QU", __DESCR(descr))
132
133#define SYSCTL_ADD_OPAQUE(ctx, parent, nbr, name, access, ptr, len, fmt, descr) \
134	sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_OPAQUE|(access), \
135	ptr, len, sysctl_handle_opaque, fmt, __DESCR(descr))
136
137#define SYSCTL_ADD_STRUCT(ctx, parent, nbr, name, access, ptr, type, descr)	\
138	sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_OPAQUE|(access),			\
139	ptr, sizeof(struct type), sysctl_handle_opaque, "S," #type, __DESCR(descr))
140
141#define SYSCTL_ADD_PROC(ctx, parent, nbr, name, access, ptr, arg, handler, fmt, descr) \
142	sysctl_add_oid(ctx, parent, nbr, name, (access), ptr, arg, handler, fmt, \
143	__DESCR(descr))
144
145
146static inline void *
147SYSCTL_CHILDREN(void *ptr)
148{
149	return NULL;
150}
151
152
153#define SYSCTL_STATIC_CHILDREN(...) NULL
154
155#define SYSCTL_DECL(name) \
156	extern struct sysctl_oid_list sysctl_##name##_children
157
158#define SYSCTL_NODE(...)
159#define SYSCTL_INT(...)
160#define SYSCTL_UINT(...)
161#define SYSCTL_PROC(...)
162
163#endif
164
165#endif
166