1/*	$OpenBSD: schema.h,v 1.7 2010/11/04 15:35:00 martinh Exp $ */
2
3/*
4 * Copyright (c) 2010 Martin Hedenfalk <martinh@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#ifndef _schema_h_
20#define _schema_h_
21
22#define OBJ_NAME(obj)	 ((obj)->names ? SLIST_FIRST((obj)->names)->name : \
23				(obj)->oid)
24#define ATTR_NAME(at)	 OBJ_NAME(at)
25
26enum usage {
27	USAGE_USER_APP,
28	USAGE_DIR_OP,		/* operational attribute */
29	USAGE_DIST_OP,		/* operational attribute */
30	USAGE_DSA_OP		/* operational attribute */
31};
32
33enum match_rule_type {
34	MATCH_EQUALITY,
35	MATCH_ORDERING,
36	MATCH_SUBSTR,
37};
38
39struct name {
40	SLIST_ENTRY(name)	 next;
41	char			*name;
42};
43SLIST_HEAD(name_list, name);
44
45struct schema;
46struct syntax {
47	char			*oid;
48	char			*desc;
49	int			(*is_valid)(struct schema *schema, char *value,
50					size_t len);
51};
52
53struct match_rule
54{
55	char			*oid;
56	char			*name;
57	enum match_rule_type	 type;
58	int			(*prepare)(char *value, size_t len);
59	const char		*syntax_oid;
60	const char		**alt_syntax_oids;
61};
62
63struct attr_type {
64	RB_ENTRY(attr_type)	 link;
65	char			*oid;
66	struct name_list	*names;
67	char			*desc;
68	int			 obsolete;
69	struct attr_type	*sup;
70	const struct match_rule	*equality;
71	const struct match_rule	*ordering;
72	const struct match_rule	*substr;
73	const struct syntax	*syntax;
74	int			 single;
75	int			 collective;
76	int			 immutable;	/* no-user-modification */
77	enum usage		 usage;
78};
79RB_HEAD(attr_type_tree, attr_type);
80RB_PROTOTYPE(attr_type_tree, attr_type, link, attr_oid_cmp);
81
82struct attr_ptr {
83	SLIST_ENTRY(attr_ptr)	 next;
84	struct attr_type	*attr_type;
85};
86SLIST_HEAD(attr_list, attr_ptr);
87
88enum object_kind {
89	KIND_ABSTRACT,
90	KIND_STRUCTURAL,
91	KIND_AUXILIARY
92};
93
94struct object;
95struct obj_ptr {
96	SLIST_ENTRY(obj_ptr)	 next;
97	struct object		*object;
98};
99SLIST_HEAD(obj_list, obj_ptr);
100
101struct object {
102	RB_ENTRY(object)	 link;
103	char			*oid;
104	struct name_list	*names;
105	char			*desc;
106	int			 obsolete;
107	struct obj_list		*sup;
108	enum object_kind	 kind;
109	struct attr_list	*must;
110	struct attr_list	*may;
111};
112RB_HEAD(object_tree, object);
113RB_PROTOTYPE(object_tree, object, link, obj_oid_cmp);
114
115struct oidname {
116	RB_ENTRY(oidname)	 link;
117	const char		*on_name;
118#define	on_attr_type		 on_ptr.ou_attr_type
119#define	on_object		 on_ptr.ou_object
120	union	{
121		struct attr_type	*ou_attr_type;
122		struct object		*ou_object;
123	} on_ptr;
124};
125RB_HEAD(oidname_tree, oidname);
126RB_PROTOTYPE(oidname_tree, oidname, link, oidname_cmp);
127
128struct symoid {
129	RB_ENTRY(symoid)	 link;
130	char			*name;		/* symbolic name */
131	char			*oid;
132};
133RB_HEAD(symoid_tree, symoid);
134RB_PROTOTYPE(symoid_tree, symoid, link, symoid_cmp);
135
136#define SCHEMA_MAXPUSHBACK	128
137
138struct schema
139{
140	struct attr_type_tree	 attr_types;
141	struct oidname_tree	 attr_names;
142	struct object_tree	 objects;
143	struct oidname_tree	 object_names;
144	struct symoid_tree	 symbolic_oids;
145
146	FILE			*fp;
147	const char		*filename;
148	char			 pushback_buffer[SCHEMA_MAXPUSHBACK];
149	int			 pushback_index;
150	int			 lineno;
151	int			 error;
152};
153
154struct schema		*schema_new(void);
155int			 schema_parse(struct schema *schema,
156			    const char *filename);
157int			 schema_dump_object(struct object *obj,
158			    char *buf, size_t size);
159int			 schema_dump_attribute(struct attr_type *obj,
160			    char *buf, size_t size);
161int			 schema_dump_match_rule(struct match_rule *mr,
162			    char *buf, size_t size);
163
164struct attr_type	*lookup_attribute_by_oid(struct schema *schema, char *oid);
165struct attr_type	*lookup_attribute_by_name(struct schema *schema, char *name);
166struct attr_type	*lookup_attribute(struct schema *schema, char *oid_or_name);
167struct object		*lookup_object_by_oid(struct schema *schema, char *oid);
168struct object		*lookup_object_by_name(struct schema *schema, char *name);
169struct object		*lookup_object(struct schema *schema, char *oid_or_name);
170char			*lookup_symbolic_oid(struct schema *schema, char *name);
171int			 is_oidstr(const char *oidstr);
172
173/* syntax.c */
174const struct syntax	*syntax_lookup(const char *oid);
175
176/* matching.c */
177extern struct match_rule match_rules[];
178extern int num_match_rules;
179const struct match_rule *match_rule_lookup(const char *oid);
180
181#endif
182
183