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