1 /* $NetBSD: attr.h,v 1.2 2017/02/14 01:16:48 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_MASTER_FN) (VSTREAM *, int,...); 34 typedef int (*ATTR_SCAN_SLAVE_FN) (ATTR_SCAN_MASTER_FN, VSTREAM *, int, void *); 35 typedef int (*ATTR_PRINT_MASTER_FN) (VSTREAM *, int,...); 36 typedef int (*ATTR_PRINT_SLAVE_FN) (ATTR_PRINT_MASTER_FN, VSTREAM *, int, 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 51 /* 52 * Optional sender-specified grouping for hash or nameval tables. 53 */ 54 #define ATTR_TYPE_OPEN '{' 55 #define ATTR_TYPE_CLOSE '}' 56 #define ATTR_NAME_OPEN "{" 57 #define ATTR_NAME_CLOSE "}" 58 59 #define ATTR_HASH_LIMIT 1024 /* Size of hash table */ 60 61 /* 62 * Typechecking support for variadic function arguments. See check_arg(3h) 63 * for documentation. 64 */ 65 #define SEND_ATTR_INT(name, val) ATTR_TYPE_INT, CHECK_CPTR(ATTR, char, (name)), CHECK_VAL(ATTR, int, (val)) 66 #define SEND_ATTR_STR(name, val) ATTR_TYPE_STR, CHECK_CPTR(ATTR, char, (name)), CHECK_CPTR(ATTR, char, (val)) 67 #define SEND_ATTR_HASH(val) ATTR_TYPE_HASH, CHECK_CPTR(ATTR, HTABLE, (val)) 68 #define SEND_ATTR_NV(val) ATTR_TYPE_NV, CHECK_CPTR(ATTR, NVTABLE, (val)) 69 #define SEND_ATTR_LONG(name, val) ATTR_TYPE_LONG, CHECK_CPTR(ATTR, char, (name)), CHECK_VAL(ATTR, long, (val)) 70 #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)) 71 #define SEND_ATTR_FUNC(func, val) ATTR_TYPE_FUNC, CHECK_VAL(ATTR, ATTR_PRINT_SLAVE_FN, (func)), CHECK_CPTR(ATTR, void, (val)) 72 73 #define RECV_ATTR_INT(name, val) ATTR_TYPE_INT, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, int, (val)) 74 #define RECV_ATTR_STR(name, val) ATTR_TYPE_STR, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, VSTRING, (val)) 75 #define RECV_ATTR_HASH(val) ATTR_TYPE_HASH, CHECK_PTR(ATTR, HTABLE, (val)) 76 #define RECV_ATTR_NV(val) ATTR_TYPE_NV, CHECK_PTR(ATTR, NVTABLE, (val)) 77 #define RECV_ATTR_LONG(name, val) ATTR_TYPE_LONG, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, long, (val)) 78 #define RECV_ATTR_DATA(name, val) ATTR_TYPE_DATA, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, VSTRING, (val)) 79 #define RECV_ATTR_FUNC(func, val) ATTR_TYPE_FUNC, CHECK_VAL(ATTR, ATTR_SCAN_SLAVE_FN, (func)), CHECK_PTR(ATTR, void, (val)) 80 81 CHECK_VAL_HELPER_DCL(ATTR, ssize_t); 82 CHECK_VAL_HELPER_DCL(ATTR, long); 83 CHECK_VAL_HELPER_DCL(ATTR, int); 84 CHECK_PTR_HELPER_DCL(ATTR, void); 85 CHECK_PTR_HELPER_DCL(ATTR, long); 86 CHECK_PTR_HELPER_DCL(ATTR, int); 87 CHECK_PTR_HELPER_DCL(ATTR, VSTRING); 88 CHECK_PTR_HELPER_DCL(ATTR, NVTABLE); 89 CHECK_PTR_HELPER_DCL(ATTR, HTABLE); 90 CHECK_CPTR_HELPER_DCL(ATTR, void); 91 CHECK_CPTR_HELPER_DCL(ATTR, char); 92 CHECK_CPTR_HELPER_DCL(ATTR, NVTABLE); 93 CHECK_CPTR_HELPER_DCL(ATTR, HTABLE); 94 CHECK_VAL_HELPER_DCL(ATTR, ATTR_PRINT_SLAVE_FN); 95 CHECK_VAL_HELPER_DCL(ATTR, ATTR_SCAN_SLAVE_FN); 96 97 /* 98 * Flags that control processing. See attr_scan(3) for documentation. 99 */ 100 #define ATTR_FLAG_NONE 0 101 #define ATTR_FLAG_MISSING (1<<0) /* Flag missing attribute */ 102 #define ATTR_FLAG_EXTRA (1<<1) /* Flag spurious attribute */ 103 #define ATTR_FLAG_MORE (1<<2) /* Don't skip or terminate */ 104 105 #define ATTR_FLAG_STRICT (ATTR_FLAG_MISSING | ATTR_FLAG_EXTRA) 106 #define ATTR_FLAG_ALL (07) 107 108 /* 109 * Default to null-terminated, as opposed to base64-encoded. 110 */ 111 #define attr_print attr_print0 112 #define attr_vprint attr_vprint0 113 #define attr_scan attr_scan0 114 #define attr_vscan attr_vscan0 115 #define attr_scan_more attr_scan_more0 116 117 /* 118 * attr_print64.c. 119 */ 120 extern int attr_print64(VSTREAM *, int,...); 121 extern int attr_vprint64(VSTREAM *, int, va_list); 122 123 /* 124 * attr_scan64.c. 125 */ 126 extern int WARN_UNUSED_RESULT attr_scan64(VSTREAM *, int,...); 127 extern int WARN_UNUSED_RESULT attr_vscan64(VSTREAM *, int, va_list); 128 extern int WARN_UNUSED_RESULT attr_scan_more64(VSTREAM *); 129 130 /* 131 * attr_print0.c. 132 */ 133 extern int attr_print0(VSTREAM *, int,...); 134 extern int attr_vprint0(VSTREAM *, int, va_list); 135 136 /* 137 * attr_scan0.c. 138 */ 139 extern int WARN_UNUSED_RESULT attr_scan0(VSTREAM *, int,...); 140 extern int WARN_UNUSED_RESULT attr_vscan0(VSTREAM *, int, va_list); 141 extern int WARN_UNUSED_RESULT attr_scan_more0(VSTREAM *); 142 143 /* 144 * attr_scan_plain.c. 145 */ 146 extern int attr_print_plain(VSTREAM *, int,...); 147 extern int attr_vprint_plain(VSTREAM *, int, va_list); 148 extern int attr_scan_more_plain(VSTREAM *); 149 150 /* 151 * attr_print_plain.c. 152 */ 153 extern int WARN_UNUSED_RESULT attr_scan_plain(VSTREAM *, int,...); 154 extern int WARN_UNUSED_RESULT attr_vscan_plain(VSTREAM *, int, va_list); 155 156 /* 157 * Attribute names for testing the compatibility of the read and write 158 * routines. 159 */ 160 #ifdef TEST 161 #define ATTR_NAME_INT "number" 162 #define ATTR_NAME_STR "string" 163 #define ATTR_NAME_LONG "long_number" 164 #define ATTR_NAME_DATA "data" 165 #endif 166 167 /* LICENSE 168 /* .ad 169 /* .fi 170 /* The Secure Mailer license must be distributed with this software. 171 /* AUTHOR(S) 172 /* Wietse Venema 173 /* IBM T.J. Watson Research 174 /* P.O. Box 704 175 /* Yorktown Heights, NY 10598, USA 176 /*--*/ 177 178 #endif 179