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