xref: /netbsd-src/external/ibm-public/postfix/dist/src/util/attr.h (revision c48c605c14fd8622b523d1d6a3f0c0bad133ea89)
1 /*	$NetBSD: attr.h,v 1.5 2023/12/23 20:30:46 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_UINT(name, val)	ATTR_TYPE_INT, CHECK_CPTR(ATTR, char, (name)), CHECK_VAL(ATTR, unsigned, (val))
68 #define SEND_ATTR_STR(name, val)	ATTR_TYPE_STR, CHECK_CPTR(ATTR, char, (name)), CHECK_CPTR(ATTR, char, (val))
69 #define SEND_ATTR_HASH(val)		ATTR_TYPE_HASH, CHECK_CPTR(ATTR, HTABLE, (val))
70 #define SEND_ATTR_NV(val)		ATTR_TYPE_NV, CHECK_CPTR(ATTR, NVTABLE, (val))
71 #define SEND_ATTR_LONG(name, val)	ATTR_TYPE_LONG, CHECK_CPTR(ATTR, char, (name)), CHECK_VAL(ATTR, long, (val))
72 #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))
73 #define SEND_ATTR_FUNC(func, val)	ATTR_TYPE_FUNC, CHECK_VAL(ATTR, ATTR_PRINT_CUSTOM_FN, (func)), CHECK_CPTR(ATTR, void, (val))
74 
75 #define RECV_ATTR_INT(name, val)	ATTR_TYPE_INT, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, int, (val))
76 #define RECV_ATTR_UINT(name, val)	ATTR_TYPE_INT, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, unsigned, (val))
77 #define RECV_ATTR_STR(name, val)	ATTR_TYPE_STR, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, VSTRING, (val))
78 #define RECV_ATTR_STREQ(name, val)	ATTR_TYPE_STREQ, CHECK_CPTR(ATTR, char, (name)), CHECK_CPTR(ATTR, char, (val))
79 #define RECV_ATTR_HASH(val)		ATTR_TYPE_HASH, CHECK_PTR(ATTR, HTABLE, (val))
80 #define RECV_ATTR_NV(val)		ATTR_TYPE_NV, CHECK_PTR(ATTR, NVTABLE, (val))
81 #define RECV_ATTR_LONG(name, val)	ATTR_TYPE_LONG, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, long, (val))
82 #define RECV_ATTR_DATA(name, val)	ATTR_TYPE_DATA, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, VSTRING, (val))
83 #define RECV_ATTR_FUNC(func, val)	ATTR_TYPE_FUNC, CHECK_VAL(ATTR, ATTR_SCAN_CUSTOM_FN, (func)), CHECK_PTR(ATTR, void, (val))
84 
85 CHECK_VAL_HELPER_DCL(ATTR, ssize_t);
86 CHECK_VAL_HELPER_DCL(ATTR, long);
87 CHECK_VAL_HELPER_DCL(ATTR, int);
88 CHECK_VAL_HELPER_DCL(ATTR, unsigned);
89 CHECK_PTR_HELPER_DCL(ATTR, void);
90 CHECK_PTR_HELPER_DCL(ATTR, long);
91 CHECK_PTR_HELPER_DCL(ATTR, int);
92 CHECK_PTR_HELPER_DCL(ATTR, unsigned);
93 CHECK_PTR_HELPER_DCL(ATTR, VSTRING);
94 CHECK_PTR_HELPER_DCL(ATTR, NVTABLE);
95 CHECK_PTR_HELPER_DCL(ATTR, HTABLE);
96 CHECK_CPTR_HELPER_DCL(ATTR, void);
97 CHECK_CPTR_HELPER_DCL(ATTR, char);
98 CHECK_CPTR_HELPER_DCL(ATTR, NVTABLE);
99 CHECK_CPTR_HELPER_DCL(ATTR, HTABLE);
100 CHECK_VAL_HELPER_DCL(ATTR, ATTR_PRINT_CUSTOM_FN);
101 CHECK_VAL_HELPER_DCL(ATTR, ATTR_SCAN_CUSTOM_FN);
102 
103  /*
104   * Flags that control processing. See attr_scan(3) for documentation.
105   */
106 #define ATTR_FLAG_NONE		0
107 #define ATTR_FLAG_MISSING	(1<<0)	/* Flag missing attribute */
108 #define ATTR_FLAG_EXTRA		(1<<1)	/* Flag spurious attribute */
109 #define ATTR_FLAG_MORE		(1<<2)	/* Don't skip or terminate */
110 #define ATTR_FLAG_PRINTABLE	(1<<3)	/* Sanitize received strings */
111 
112 #define ATTR_FLAG_STRICT	(ATTR_FLAG_MISSING | ATTR_FLAG_EXTRA)
113 #define ATTR_FLAG_ALL		(017)
114 
115  /*
116   * Default to null-terminated, as opposed to base64-encoded.
117   */
118 #define attr_print	attr_print0
119 #define attr_vprint	attr_vprint0
120 #define attr_scan	attr_scan0
121 #define attr_vscan	attr_vscan0
122 #define attr_scan_more	attr_scan_more0
123 
124  /*
125   * attr_print64.c.
126   */
127 extern int attr_print64(VSTREAM *, int,...);
128 extern int attr_vprint64(VSTREAM *, int, va_list);
129 
130  /*
131   * attr_scan64.c.
132   */
133 extern int WARN_UNUSED_RESULT attr_scan64(VSTREAM *, int,...);
134 extern int WARN_UNUSED_RESULT attr_vscan64(VSTREAM *, int, va_list);
135 extern int WARN_UNUSED_RESULT attr_scan_more64(VSTREAM *);
136 
137  /*
138   * attr_print0.c.
139   */
140 extern int attr_print0(VSTREAM *, int,...);
141 extern int attr_vprint0(VSTREAM *, int, va_list);
142 
143  /*
144   * attr_scan0.c.
145   */
146 extern int WARN_UNUSED_RESULT attr_scan0(VSTREAM *, int,...);
147 extern int WARN_UNUSED_RESULT attr_vscan0(VSTREAM *, int, va_list);
148 extern int WARN_UNUSED_RESULT attr_scan_more0(VSTREAM *);
149 
150  /*
151   * attr_scan_plain.c.
152   */
153 extern int attr_print_plain(VSTREAM *, int,...);
154 extern int attr_vprint_plain(VSTREAM *, int, va_list);
155 extern int attr_scan_more_plain(VSTREAM *);
156 
157  /*
158   * attr_print_plain.c.
159   */
160 extern int WARN_UNUSED_RESULT attr_scan_plain(VSTREAM *, int,...);
161 extern int WARN_UNUSED_RESULT attr_vscan_plain(VSTREAM *, int, va_list);
162 
163  /*
164   * Attribute names for testing the compatibility of the read and write
165   * routines.
166   */
167 #ifdef TEST
168 #define ATTR_NAME_INT		"number"
169 #define ATTR_NAME_STR		"string"
170 #define ATTR_NAME_LONG		"long_number"
171 #define ATTR_NAME_DATA		"data"
172 #endif
173 
174 /* LICENSE
175 /* .ad
176 /* .fi
177 /*	The Secure Mailer license must be distributed with this software.
178 /* AUTHOR(S)
179 /*	Wietse Venema
180 /*	IBM T.J. Watson Research
181 /*	P.O. Box 704
182 /*	Yorktown Heights, NY 10598, USA
183 /*
184 /*	Wietse Venema
185 /*	Google, Inc.
186 /*	111 8th Avenue
187 /*	New York, NY 10011, USA
188 /*--*/
189 
190 #endif
191