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