blob: e384352854994c2fb58e500dd48527eb1476e459 [file] [log] [blame]
Lev Walkina9cc46e2004-09-22 16:06:28 +00001#include <asn_internal.h>
Lev Walkinf15320b2004-06-03 03:38:44 +00002#include <constraints.h>
Lev Walkinf15320b2004-06-03 03:38:44 +00003
4int
Lev Walkin5e033762004-09-29 13:26:15 +00005asn_generic_no_constraint(asn_TYPE_descriptor_t *type_descriptor,
Lev Walkinf15320b2004-06-03 03:38:44 +00006 const void *struct_ptr, asn_app_consume_bytes_f *cb, void *key) {
Lev Walkind9bd7752004-06-05 08:17:50 +00007
8 (void)type_descriptor; /* Unused argument */
9 (void)struct_ptr; /* Unused argument */
10 (void)cb; /* Unused argument */
11 (void)key; /* Unused argument */
12
Lev Walkinf15320b2004-06-03 03:38:44 +000013 /* Nothing to check */
14 return 0;
15}
16
17int
Lev Walkin5e033762004-09-29 13:26:15 +000018asn_generic_unknown_constraint(asn_TYPE_descriptor_t *type_descriptor,
Lev Walkinf15320b2004-06-03 03:38:44 +000019 const void *struct_ptr, asn_app_consume_bytes_f *cb, void *key) {
Lev Walkind9bd7752004-06-05 08:17:50 +000020
21 (void)type_descriptor; /* Unused argument */
22 (void)struct_ptr; /* Unused argument */
23 (void)cb; /* Unused argument */
24 (void)key; /* Unused argument */
25
Lev Walkinf15320b2004-06-03 03:38:44 +000026 /* Unknown how to check */
27 return 0;
28}
29
30struct __fill_errbuf_arg {
31 char *errbuf;
32 size_t errlen;
33 size_t erroff;
34};
35
36static int
37__fill_errbuf(const void *buffer, size_t size, void *app_key) {
Lev Walkinc2346572004-08-11 09:07:36 +000038 struct __fill_errbuf_arg *arg = (struct __fill_errbuf_arg *)app_key;
Lev Walkinf15320b2004-06-03 03:38:44 +000039 size_t avail = arg->errlen - arg->erroff;
40
41 if(avail > size)
42 avail = size + 1;
43
44 switch(avail) {
45 default:
46 memcpy(arg->errbuf + arg->erroff, buffer, avail - 1);
47 arg->erroff += avail - 1;
48 case 1:
49 arg->errbuf[arg->erroff] = '\0';
50 case 0:
51 return 0;
52 }
53
54}
55
56int
Lev Walkin5e033762004-09-29 13:26:15 +000057asn_check_constraints(asn_TYPE_descriptor_t *type_descriptor,
Lev Walkinf15320b2004-06-03 03:38:44 +000058 const void *struct_ptr, char *errbuf, size_t *errlen) {
59
60 if(errlen) {
61 struct __fill_errbuf_arg arg;
62 int ret;
63
64 arg.errbuf = errbuf;
65 arg.errlen = *errlen;
66 arg.erroff = 0;
67
68 ret = type_descriptor->check_constraints(type_descriptor,
69 struct_ptr, __fill_errbuf, &arg);
70
71 if(ret == -1)
72 *errlen = arg.erroff;
73
74 return ret;
75 } else {
76 return type_descriptor->check_constraints(type_descriptor,
77 struct_ptr, 0, 0);
78 }
79}
80
81void
82_asn_i_log_error(asn_app_consume_bytes_f *cb, void *key, const char *fmt, ...) {
83 char buf[64];
84 char *p;
85 va_list ap;
86 ssize_t ret;
87 size_t len;
88
89 va_start(ap, fmt);
90 ret = vsnprintf(buf, sizeof(buf), fmt, ap);
91 va_end(ap);
92 if(ret < 0) {
93 /*
94 * The libc on this system is broken.
95 */
96 ret = sizeof("<broken vsnprintf>") - 1;
97 memcpy(buf, "<broken vsnprintf>", ret + 1);
98 /* Fall through */
99 }
100
Lev Walkind9bd7752004-06-05 08:17:50 +0000101 if(ret < (ssize_t)sizeof(buf)) {
Lev Walkin8e8078a2004-09-26 13:10:40 +0000102 (void)cb(buf, ret, key);
Lev Walkinf15320b2004-06-03 03:38:44 +0000103 return;
104 }
105
106 /*
107 * More space required to hold the message.
108 */
109 len = ret + 1;
Lev Walkinc2346572004-08-11 09:07:36 +0000110 p = (char *)alloca(len);
Lev Walkin7e0d2cb2004-08-11 07:41:45 +0000111 if(!p) return; /* Can fail on !x86. */
Lev Walkinf15320b2004-06-03 03:38:44 +0000112
113
114 va_start(ap, fmt);
Lev Walkin906654e2004-09-10 15:49:15 +0000115 ret = vsnprintf(p, len, fmt, ap);
Lev Walkinf15320b2004-06-03 03:38:44 +0000116 va_end(ap);
Lev Walkind9bd7752004-06-05 08:17:50 +0000117 if(ret < 0 || ret >= (ssize_t)len) {
Lev Walkinf15320b2004-06-03 03:38:44 +0000118 ret = sizeof("<broken vsnprintf>") - 1;
119 memcpy(buf, "<broken vsnprintf>", ret + 1);
Lev Walkin906654e2004-09-10 15:49:15 +0000120 p = buf;
Lev Walkinf15320b2004-06-03 03:38:44 +0000121 }
122
Lev Walkin8e8078a2004-09-26 13:10:40 +0000123 (void)cb(p, ret, key);
Lev Walkinf15320b2004-06-03 03:38:44 +0000124}