*** empty log message ***
diff --git a/skeletons/constraints.c b/skeletons/constraints.c
index e384352..1bdda73 100644
--- a/skeletons/constraints.c
+++ b/skeletons/constraints.c
@@ -1,9 +1,9 @@
-#include <asn_internal.h>
-#include <constraints.h>
+#include "asn_internal.h"
+#include "constraints.h"
int
asn_generic_no_constraint(asn_TYPE_descriptor_t *type_descriptor,
- const void *struct_ptr, asn_app_consume_bytes_f *cb, void *key) {
+ const void *struct_ptr, asn_app_constraint_failed_f *cb, void *key) {
(void)type_descriptor; /* Unused argument */
(void)struct_ptr; /* Unused argument */
@@ -16,7 +16,7 @@
int
asn_generic_unknown_constraint(asn_TYPE_descriptor_t *type_descriptor,
- const void *struct_ptr, asn_app_consume_bytes_f *cb, void *key) {
+ const void *struct_ptr, asn_app_constraint_failed_f *cb, void *key) {
(void)type_descriptor; /* Unused argument */
(void)struct_ptr; /* Unused argument */
@@ -27,98 +27,67 @@
return 0;
}
-struct __fill_errbuf_arg {
- char *errbuf;
+struct errbufDesc {
+ asn_TYPE_descriptor_t *failed_type;
+ const void *failed_struct_ptr;
+ char *errbuf;
size_t errlen;
- size_t erroff;
};
-static int
-__fill_errbuf(const void *buffer, size_t size, void *app_key) {
- struct __fill_errbuf_arg *arg = (struct __fill_errbuf_arg *)app_key;
- size_t avail = arg->errlen - arg->erroff;
+static void
+_asn_i_ctfailcb(void *key, asn_TYPE_descriptor_t *td, const void *sptr, const char *fmt, ...) {
+ struct errbufDesc *arg = key;
+ va_list ap;
+ ssize_t vlen;
+ ssize_t maxlen;
- if(avail > size)
- avail = size + 1;
+ arg->failed_type = td;
+ arg->failed_struct_ptr = sptr;
- switch(avail) {
- default:
- memcpy(arg->errbuf + arg->erroff, buffer, avail - 1);
- arg->erroff += avail - 1;
- case 1:
- arg->errbuf[arg->erroff] = '\0';
- case 0:
- return 0;
+ maxlen = arg->errlen;
+ if(maxlen <= 0)
+ return;
+
+ va_start(ap, fmt);
+ vlen = vsnprintf(arg->errbuf, maxlen, fmt, ap);
+ va_end(ap);
+ if(vlen >= maxlen) {
+ arg->errbuf[maxlen-1] = '\0'; /* Ensuring libc correctness */
+ arg->errlen = maxlen - 1; /* Not counting termination */
+ return;
+ } else if(vlen >= 0) {
+ arg->errbuf[vlen] = '\0'; /* Ensuring libc correctness */
+ arg->errlen = vlen; /* Not counting termination */
+ } else {
+ /*
+ * The libc on this system is broken.
+ */
+ vlen = sizeof("<broken vsnprintf>") - 1;
+ maxlen--;
+ arg->errlen = vlen < maxlen ? vlen : maxlen;
+ memcpy(arg->errbuf, "<broken vsnprintf>", arg->errlen);
+ arg->errbuf[arg->errlen] = 0;
}
+ return;
}
int
asn_check_constraints(asn_TYPE_descriptor_t *type_descriptor,
- const void *struct_ptr, char *errbuf, size_t *errlen) {
+ const void *struct_ptr, char *errbuf, size_t *errlen) {
+ struct errbufDesc arg;
+ int ret;
- if(errlen) {
- struct __fill_errbuf_arg arg;
- int ret;
+ arg.failed_type = 0;
+ arg.failed_struct_ptr = 0;
+ arg.errbuf = errbuf;
+ arg.errlen = errlen ? *errlen : 0;
- arg.errbuf = errbuf;
- arg.errlen = *errlen;
- arg.erroff = 0;
-
- ret = type_descriptor->check_constraints(type_descriptor,
- struct_ptr, __fill_errbuf, &arg);
-
- if(ret == -1)
- *errlen = arg.erroff;
+ ret = type_descriptor->check_constraints(type_descriptor,
+ struct_ptr, _asn_i_ctfailcb, &arg);
+ if(ret == -1 && errlen)
+ *errlen = arg.errlen;
- return ret;
- } else {
- return type_descriptor->check_constraints(type_descriptor,
- struct_ptr, 0, 0);
- }
+ return ret;
}
-void
-_asn_i_log_error(asn_app_consume_bytes_f *cb, void *key, const char *fmt, ...) {
- char buf[64];
- char *p;
- va_list ap;
- ssize_t ret;
- size_t len;
-
- va_start(ap, fmt);
- ret = vsnprintf(buf, sizeof(buf), fmt, ap);
- va_end(ap);
- if(ret < 0) {
- /*
- * The libc on this system is broken.
- */
- ret = sizeof("<broken vsnprintf>") - 1;
- memcpy(buf, "<broken vsnprintf>", ret + 1);
- /* Fall through */
- }
-
- if(ret < (ssize_t)sizeof(buf)) {
- (void)cb(buf, ret, key);
- return;
- }
-
- /*
- * More space required to hold the message.
- */
- len = ret + 1;
- p = (char *)alloca(len);
- if(!p) return; /* Can fail on !x86. */
-
-
- va_start(ap, fmt);
- ret = vsnprintf(p, len, fmt, ap);
- va_end(ap);
- if(ret < 0 || ret >= (ssize_t)len) {
- ret = sizeof("<broken vsnprintf>") - 1;
- memcpy(buf, "<broken vsnprintf>", ret + 1);
- p = buf;
- }
-
- (void)cb(p, ret, key);
-}