1 /*	$NetBSD: attr.h,v 1.4 2022/10/08 16:12:50 christos Exp $	*/
2 
3 #ifndef _ATTR_H_INCLUDED_
4 #define _ATTR_H_INCLUDED_
5 
6 /*++
7 /* NAME
8 /*	attr 3h
9 /* SUMMARY
10 /*	attribute list manipulations
11 /* SYNOPSIS
12 /*	#include "attr.h"
13  DESCRIPTION
14  .nf
15 
16  /*
17   * System library.
18   */
19 #include <stdarg.h>
20 
21  /*
22   * Utility library.
23   */
24 #include <vstream.h>
25 #include <vstring.h>
26 #include <htable.h>
27 #include <nvtable.h>
28 #include <check_arg.h>
29 
30  /*
31   * Delegation for better data abstraction.
32   */
33 typedef int (*ATTR_SCAN_COMMON_FN) (VSTREAM *, int,...);
34 typedef int (*ATTR_SCAN_CUSTOM_FN) (ATTR_SCAN_COMMON_FN, VSTREAM *, int, void *);
35 typedef int (*ATTR_PRINT_COMMON_FN) (VSTREAM *, int,...);
36 typedef int (*ATTR_PRINT_CUSTOM_FN) (ATTR_PRINT_COMMON_FN, VSTREAM *, int, const void *);
37 
38  /*
39   * Attribute types. See attr_scan(3) for documentation.
40   */
41 #define ATTR_TYPE_END		0	/* end of data */
42 #define ATTR_TYPE_INT		1	/* Unsigned integer */
43 #define ATTR_TYPE_NUM		ATTR_TYPE_INT
44 #define ATTR_TYPE_STR		2	/* Character string */
45 #define ATTR_TYPE_HASH		3	/* Hash table */
46 #define ATTR_TYPE_NV		3	/* Name-value table */
47 #define ATTR_TYPE_LONG		4	/* Unsigned long */
48 #define ATTR_TYPE_DATA		5	/* Binary data */
49 #define ATTR_TYPE_FUNC		6	/* Function pointer */
50 #define ATTR_TYPE_STREQ		7	/* Requires (name, value) match */
51 
52  /*
53   * Optional sender-specified grouping for hash or nameval tables.
54   */
55 #define ATTR_TYPE_OPEN		'{'
56 #define ATTR_TYPE_CLOSE		'}'
57 #define ATTR_NAME_OPEN		"{"
58 #define ATTR_NAME_CLOSE		"}"
59 
60 #define ATTR_HASH_LIMIT		1024	/* Size of hash table */
61 
62  /*
63   * Typechecking support for variadic function arguments. See check_arg(3h)
64   * for documentation.
65   */
66 #define SEND_ATTR_INT(name, val)	ATTR_TYPE_INT, CHECK_CPTR(ATTR, char, (name)), CHECK_VAL(ATTR, int, (val))
67 #define SEND_ATTR_STR(name, val)	ATTR_TYPE_STR, CHECK_CPTR(ATTR, char, (name)), CHECK_CPTR(ATTR, char, (val))
68 #define SEND_ATTR_HASH(val)		ATTR_TYPE_HASH, CHECK_CPTR(ATTR, HTABLE, (val))
69 #define SEND_ATTR_NV(val)		ATTR_TYPE_NV, CHECK_CPTR(ATTR, NVTABLE, (val))
70 #define SEND_ATTR_LONG(name, val)	ATTR_TYPE_LONG, CHECK_CPTR(ATTR, char, (name)), CHECK_VAL(ATTR, long, (val))
71 #define SEND_ATTR_DATA(name, len, val)	ATTR_TYPE_DATA, CHECK_CPTR(ATTR, char, (name)), CHECK_VAL(ATTR, ssize_t, (len)), CHECK_CPTR(ATTR, void, (val))
72 #define SEND_ATTR_FUNC(func, val)	ATTR_TYPE_FUNC, CHECK_VAL(ATTR, ATTR_PRINT_CUSTOM_FN, (func)), CHECK_CPTR(ATTR, void, (val))
73 
74 #define RECV_ATTR_INT(name, val)	ATTR_TYPE_INT, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, int, (val))
75 #define RECV_ATTR_STR(name, val)	ATTR_TYPE_STR, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, VSTRING, (val))
76 #define RECV_ATTR_STREQ(name, val)	ATTR_TYPE_STREQ, CHECK_CPTR(ATTR, char, (name)), CHECK_CPTR(ATTR, char, (val))
77 #define RECV_ATTR_HASH(val)		ATTR_TYPE_HASH, CHECK_PTR(ATTR, HTABLE, (val))
78 #define RECV_ATTR_NV(val)		ATTR_TYPE_NV, CHECK_PTR(ATTR, NVTABLE, (val))
79 #define RECV_ATTR_LONG(name, val)	ATTR_TYPE_LONG, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, long, (val))
80 #define RECV_ATTR_DATA(name, val)	ATTR_TYPE_DATA, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, VSTRING, (val))
81 #define RECV_ATTR_FUNC(func, val)	ATTR_TYPE_FUNC, CHECK_VAL(ATTR, ATTR_SCAN_CUSTOM_FN, (func)), CHECK_PTR(ATTR, void, (val))
82 
83 CHECK_VAL_HELPER_DCL(ATTR, ssize_t);
84 CHECK_VAL_HELPER_DCL(ATTR, long);
85 CHECK_VAL_HELPER_DCL(ATTR, int);
86 CHECK_PTR_HELPER_DCL(ATTR, void);
87 CHECK_PTR_HELPER_DCL(ATTR, long);
88 CHECK_PTR_HELPER_DCL(ATTR, int);
89 CHECK_PTR_HELPER_DCL(ATTR, VSTRING);
90 CHECK_PTR_HELPER_DCL(ATTR, NVTABLE);
91 CHECK_PTR_HELPER_DCL(ATTR, HTABLE);
92 CHECK_CPTR_HELPER_DCL(ATTR, void);
93 CHECK_CPTR_HELPER_DCL(ATTR, char);
94 CHECK_CPTR_HELPER_DCL(ATTR, NVTABLE);
95 CHECK_CPTR_HELPER_DCL(ATTR, HTABLE);
96 CHECK_VAL_HELPER_DCL(ATTR, ATTR_PRINT_CUSTOM_FN);
97 CHECK_VAL_HELPER_DCL(ATTR, ATTR_SCAN_CUSTOM_FN);
98 
99  /*
100   * Flags that control processing. See attr_scan(3) for documentation.
101   */
102 #define ATTR_FLAG_NONE		0
103 #define ATTR_FLAG_MISSING	(1<<0)	/* Flag missing attribute */
104 #define ATTR_FLAG_EXTRA		(1<<1)	/* Flag spurious attribute */
105 #define ATTR_FLAG_MORE		(1<<2)	/* Don't skip or terminate */
106 #define ATTR_FLAG_PRINTABLE	(1<<3)	/* Sanitize received strings */
107 
108 #define ATTR_FLAG_STRICT	(ATTR_FLAG_MISSING | ATTR_FLAG_EXTRA)
109 #define ATTR_FLAG_ALL		(017)
110 
111  /*
112   * Default to null-terminated, as opposed to base64-encoded.
113   */
114 #define attr_print	attr_print0
115 #define attr_vprint	attr_vprint0
116 #define attr_scan	attr_scan0
117 #define attr_vscan	attr_vscan0
118 #define attr_scan_more	attr_scan_more0
119 
120  /*
121   * attr_print64.c.
122   */
123 extern int attr_print64(VSTREAM *, int,...);
124 extern int attr_vprint64(VSTREAM *, int, va_list);
125 
126  /*
127   * attr_scan64.c.
128   */
129 extern int WARN_UNUSED_RESULT attr_scan64(VSTREAM *, int,...);
130 extern int WARN_UNUSED_RESULT attr_vscan64(VSTREAM *, int, va_list);
131 extern int WARN_UNUSED_RESULT attr_scan_more64(VSTREAM *);
132 
133  /*
134   * attr_print0.c.
135   */
136 extern int attr_print0(VSTREAM *, int,...);
137 extern int attr_vprint0(VSTREAM *, int, va_list);
138 
139  /*
140   * attr_scan0.c.
141   */
142 extern int WARN_UNUSED_RESULT attr_scan0(VSTREAM *, int,...);
143 extern int WARN_UNUSED_RESULT attr_vscan0(VSTREAM *, int, va_list);
144 extern int WARN_UNUSED_RESULT attr_scan_more0(VSTREAM *);
145 
146  /*
147   * attr_scan_plain.c.
148   */
149 extern int attr_print_plain(VSTREAM *, int,...);
150 extern int attr_vprint_plain(VSTREAM *, int, va_list);
151 extern int attr_scan_more_plain(VSTREAM *);
152 
153  /*
154   * attr_print_plain.c.
155   */
156 extern int WARN_UNUSED_RESULT attr_scan_plain(VSTREAM *, int,...);
157 extern int WARN_UNUSED_RESULT attr_vscan_plain(VSTREAM *, int, va_list);
158 
159  /*
160   * Attribute names for testing the compatibility of the read and write
161   * routines.
162   */
163 #ifdef TEST
164 #define ATTR_NAME_INT		"number"
165 #define ATTR_NAME_STR		"string"
166 #define ATTR_NAME_LONG		"long_number"
167 #define ATTR_NAME_DATA		"data"
168 #endif
169 
170 /* LICENSE
171 /* .ad
172 /* .fi
173 /*	The Secure Mailer license must be distributed with this software.
174 /* AUTHOR(S)
175 /*	Wietse Venema
176 /*	IBM T.J. Watson Research
177 /*	P.O. Box 704
178 /*	Yorktown Heights, NY 10598, USA
179 /*
180 /*	Wietse Venema
181 /*	Google, Inc.
182 /*	111 8th Avenue
183 /*	New York, NY 10011, USA
184 /*--*/
185 
186 #endif
187