aboutsummaryrefslogtreecommitdiffstats
path: root/skeletons
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2006-07-13 11:19:01 +0000
committerLev Walkin <vlm@lionet.info>2006-07-13 11:19:01 +0000
commit1eded3544e880b2a2c9ee122ace2c64710d04981 (patch)
tree4a3cb942269f507b8fde8b50bb9bc5cd4d6330be /skeletons
parent397d59d448f62adf830af96dabdae97c294a7765 (diff)
*** empty log message ***
Diffstat (limited to 'skeletons')
-rw-r--r--skeletons/BIT_STRING.c6
-rw-r--r--skeletons/GeneralizedTime.c4
-rw-r--r--skeletons/IA5String.c6
-rw-r--r--skeletons/NativeReal.c3
-rw-r--r--skeletons/NumericString.c6
-rw-r--r--skeletons/OBJECT_IDENTIFIER.c6
-rw-r--r--skeletons/PrintableString.c6
-rw-r--r--skeletons/UTCTime.c4
-rw-r--r--skeletons/UTF8String.c12
-rw-r--r--skeletons/VisibleString.c6
-rw-r--r--skeletons/asn_application.h24
-rw-r--r--skeletons/asn_internal.h2
-rw-r--r--skeletons/constr_CHOICE.c12
-rw-r--r--skeletons/constr_SEQUENCE.c10
-rw-r--r--skeletons/constr_SET.c10
-rw-r--r--skeletons/constr_SET_OF.c6
-rw-r--r--skeletons/constraints.c133
-rw-r--r--skeletons/constraints.h17
18 files changed, 129 insertions, 144 deletions
diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c
index 900f41db..7434a2e1 100644
--- a/skeletons/BIT_STRING.c
+++ b/skeletons/BIT_STRING.c
@@ -45,18 +45,18 @@ asn_TYPE_descriptor_t asn_DEF_BIT_STRING = {
*/
int
BIT_STRING_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- asn_app_consume_bytes_f *app_errlog, void *app_key) {
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
if(st && st->buf) {
if(st->size == 1 && st->bits_unused) {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: invalid padding byte (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
}
} else {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c
index 79f62e82..015fc6a1 100644
--- a/skeletons/GeneralizedTime.c
+++ b/skeletons/GeneralizedTime.c
@@ -148,14 +148,14 @@ asn_TYPE_descriptor_t asn_DEF_GeneralizedTime = {
*/
int
GeneralizedTime_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- asn_app_consume_bytes_f *app_errlog, void *app_key) {
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
const GeneralizedTime_t *st = (const GeneralizedTime_t *)sptr;
time_t tloc;
errno = EPERM; /* Just an unlikely error code */
tloc = asn_GT2time(st, 0, 0);
if(tloc == -1 && errno != EPERM) {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: Invalid time format: %s (%s:%d)",
td->name, strerror(errno), __FILE__, __LINE__);
return -1;
diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c
index a4d7ff84..abc9ff38 100644
--- a/skeletons/IA5String.c
+++ b/skeletons/IA5String.c
@@ -37,7 +37,7 @@ asn_TYPE_descriptor_t asn_DEF_IA5String = {
int
IA5String_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- asn_app_consume_bytes_f *app_errlog, void *app_key) {
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
const IA5String_t *st = (const IA5String_t *)sptr;
if(st && st->buf) {
@@ -49,7 +49,7 @@ IA5String_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
*/
for(; buf < end; buf++) {
if(*buf > 0x7F) {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value byte %ld out of range: "
"%d > 127 (%s:%d)",
td->name,
@@ -60,7 +60,7 @@ IA5String_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
}
}
} else {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c
index 34eef231..1683f901 100644
--- a/skeletons/NativeReal.c
+++ b/skeletons/NativeReal.c
@@ -168,6 +168,7 @@ NativeReal_decode_xer(asn_codec_ctx_t *opt_codec_ctx,
const void *buf_ptr, size_t size) {
asn_dec_rval_t rval;
REAL_t *st = 0;
+ REAL_t **stp = &st;
double *Dbl = (double *)*sptr;
if(!Dbl) {
@@ -180,7 +181,7 @@ NativeReal_decode_xer(asn_codec_ctx_t *opt_codec_ctx,
}
}
- rval = REAL_decode_xer(opt_codec_ctx, td, (void **)&st, opt_mname,
+ rval = REAL_decode_xer(opt_codec_ctx, td, (void **)stp, opt_mname,
buf_ptr, size);
if(rval.code == RC_OK) {
if(asn_REAL2double(st, Dbl)) {
diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c
index e3302c6a..f980dcdc 100644
--- a/skeletons/NumericString.c
+++ b/skeletons/NumericString.c
@@ -37,7 +37,7 @@ asn_TYPE_descriptor_t asn_DEF_NumericString = {
int
NumericString_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- asn_app_consume_bytes_f *app_errlog, void *app_key) {
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
const NumericString_t *st = (const NumericString_t *)sptr;
if(st && st->buf) {
@@ -55,7 +55,7 @@ NumericString_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
case 0x35: case 0x36: case 0x37: case 0x38: case 0x39:
continue;
}
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value byte %ld (%d) "
"not in NumericString alphabet (%s:%d)",
td->name,
@@ -65,7 +65,7 @@ NumericString_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
return -1;
}
} else {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c
index a7cd52d5..53d5353e 100644
--- a/skeletons/OBJECT_IDENTIFIER.c
+++ b/skeletons/OBJECT_IDENTIFIER.c
@@ -39,19 +39,19 @@ asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER = {
int
OBJECT_IDENTIFIER_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- asn_app_consume_bytes_f *app_errlog, void *app_key) {
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
const OBJECT_IDENTIFIER_t *st = (const OBJECT_IDENTIFIER_t *)sptr;
if(st && st->buf) {
if(st->size < 1) {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: at least one numerical value "
"expected (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
}
} else {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c
index 57f65731..5533253f 100644
--- a/skeletons/PrintableString.c
+++ b/skeletons/PrintableString.c
@@ -60,7 +60,7 @@ static int _PrintableString_alphabet[256] = {
int
PrintableString_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- asn_app_consume_bytes_f *app_errlog, void *app_key) {
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
const PrintableString_t *st = (const PrintableString_t *)sptr;
if(st && st->buf) {
@@ -73,7 +73,7 @@ PrintableString_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
*/
for(; buf < end; buf++) {
if(!_PrintableString_alphabet[*buf]) {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value byte %ld (%d) "
"not in PrintableString alphabet "
"(%s:%d)",
@@ -85,7 +85,7 @@ PrintableString_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
}
}
} else {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c
index 9032dbd6..5d7ba84e 100644
--- a/skeletons/UTCTime.c
+++ b/skeletons/UTCTime.c
@@ -48,14 +48,14 @@ asn_TYPE_descriptor_t asn_DEF_UTCTime = {
*/
int
UTCTime_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- asn_app_consume_bytes_f *app_errlog, void *app_key) {
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
const UTCTime_t *st = (const UTCTime_t *)sptr;
time_t tloc;
errno = EPERM; /* Just an unlikely error code */
tloc = asn_UT2time(st, 0, 0);
if(tloc == -1 && errno != EPERM) {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: Invalid time format: %s (%s:%d)",
td->name, strerror(errno), __FILE__, __LINE__);
return -1;
diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c
index 5d0334f9..85f2ccd8 100644
--- a/skeletons/UTF8String.c
+++ b/skeletons/UTF8String.c
@@ -67,30 +67,30 @@ static int32_t UTF8String_mv[7] = { 0, 0,
int
UTF8String_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- asn_app_consume_bytes_f *app_errlog, void *app_key) {
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
ssize_t len = UTF8String_length((const UTF8String_t *)sptr);
switch(len) {
case U8E_EINVAL:
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value not given", td->name);
break;
case U8E_TRUNC:
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: truncated UTF-8 sequence (%s:%d)",
td->name, __FILE__, __LINE__);
break;
case U8E_ILLSTART:
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: UTF-8 illegal start of encoding (%s:%d)",
td->name, __FILE__, __LINE__);
break;
case U8E_NOTCONT:
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: UTF-8 not continuation (%s:%d)",
td->name, __FILE__, __LINE__);
break;
case U8E_NOTMIN:
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: UTF-8 not minimal sequence (%s:%d)",
td->name, __FILE__, __LINE__);
break;
diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c
index 2a88169d..7c705013 100644
--- a/skeletons/VisibleString.c
+++ b/skeletons/VisibleString.c
@@ -37,7 +37,7 @@ asn_TYPE_descriptor_t asn_DEF_VisibleString = {
int
VisibleString_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- asn_app_consume_bytes_f *app_errlog, void *app_key) {
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
const VisibleString_t *st = (const VisibleString_t *)sptr;
if(st && st->buf) {
@@ -52,7 +52,7 @@ VisibleString_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
*/
for(; buf < end; buf++) {
if(*buf < 0x20 || *buf > 0x7e) {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value byte %ld (%d) "
"not in VisibleString alphabet (%s:%d)",
td->name,
@@ -63,7 +63,7 @@ VisibleString_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
}
}
} else {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
diff --git a/skeletons/asn_application.h b/skeletons/asn_application.h
index d6393416..3f2a4504 100644
--- a/skeletons/asn_application.h
+++ b/skeletons/asn_application.h
@@ -1,15 +1,15 @@
/*-
- * Copyright (c) 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Copyright (c) 2004, 2006 Lev Walkin <vlm@lionet.info>. All rights reserved.
* Redistribution and modifications are permitted subject to BSD license.
*/
/*
- * Application-level ASN.1 API.
+ * Application-level ASN.1 callbacks.
*/
#ifndef _ASN_APPLICATION_H_
#define _ASN_APPLICATION_H_
-#include <asn_system.h> /* for platform-dependent types */
-#include <asn_codecs.h> /* for ASN.1 codecs specifics */
+#include "asn_system.h" /* for platform-dependent types */
+#include "asn_codecs.h" /* for ASN.1 codecs specifics */
#ifdef __cplusplus
extern "C" {
@@ -25,10 +25,24 @@ extern "C" {
typedef int (asn_app_consume_bytes_f)(const void *buffer, size_t size,
void *application_specific_key);
-#include <constr_TYPE.h> /* for asn_TYPE_descriptor_t */
+/*
+ * A callback of this type is called whenever constraint validation fails
+ * on some ASN.1 type. See "constraints.h" for more details on constraint
+ * validation.
+ * This callback specifies a descriptor of the ASN.1 type which failed
+ * the constraint check, as well as human readable message on what
+ * particular constraint has failed.
+ */
+typedef void (asn_app_constraint_failed_f)(void *application_specific_key,
+ struct asn_TYPE_descriptor_s *type_descriptor_which_failed,
+ const void *structure_which_failed_ptr,
+ const char *error_message_format, ...)
+ __attribute__((format(printf, 4, 5)));
#ifdef __cplusplus
}
#endif
+#include "constr_TYPE.h" /* for asn_TYPE_descriptor_t */
+
#endif /* _ASN_APPLICATION_H_ */
diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h
index 89c9c418..67f055a6 100644
--- a/skeletons/asn_internal.h
+++ b/skeletons/asn_internal.h
@@ -9,7 +9,7 @@
#ifndef _ASN_INTERNAL_H_
#define _ASN_INTERNAL_H_
-#include <asn_application.h> /* Application-visible API */
+#include "asn_application.h" /* Application-visible API */
#ifndef __NO_ASSERT_H__ /* Include assert.h only for internal use. */
#include <assert.h> /* for assert() macro */
diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c
index 26fd8dd2..84a3b4e3 100644
--- a/skeletons/constr_CHOICE.c
+++ b/skeletons/constr_CHOICE.c
@@ -475,12 +475,12 @@ CHOICE_outmost_tag(asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber
int
CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- asn_app_consume_bytes_f *app_errlog, void *app_key) {
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics;
int present;
if(!sptr) {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
@@ -499,7 +499,7 @@ CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
if(!memb_ptr) {
if(elm->optional)
return 0;
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: mandatory CHOICE element %s absent (%s:%d)",
td->name, elm->name, __FILE__, __LINE__);
return -1;
@@ -510,10 +510,10 @@ CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
if(elm->memb_constraints) {
return elm->memb_constraints(elm->type, memb_ptr,
- app_errlog, app_key);
+ ctfailcb, app_key);
} else {
int ret = elm->type->check_constraints(elm->type,
- memb_ptr, app_errlog, app_key);
+ memb_ptr, ctfailcb, app_key);
/*
* Cannot inherit it eralier:
* need to make sure we get the updated version.
@@ -522,7 +522,7 @@ CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
return ret;
}
} else {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: no CHOICE element given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c
index 80cd6af3..d38afb5a 100644
--- a/skeletons/constr_SEQUENCE.c
+++ b/skeletons/constr_SEQUENCE.c
@@ -972,11 +972,11 @@ SEQUENCE_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) {
int
SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- asn_app_consume_bytes_f *app_errlog, void *app_key) {
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
int edx;
if(!sptr) {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
@@ -994,7 +994,7 @@ SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
if(!memb_ptr) {
if(elm->optional)
continue;
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: mandatory element %s absent (%s:%d)",
td->name, elm->name, __FILE__, __LINE__);
return -1;
@@ -1005,11 +1005,11 @@ SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
if(elm->memb_constraints) {
int ret = elm->memb_constraints(elm->type, memb_ptr,
- app_errlog, app_key);
+ ctfailcb, app_key);
if(ret) return ret;
} else {
int ret = elm->type->check_constraints(elm->type,
- memb_ptr, app_errlog, app_key);
+ memb_ptr, ctfailcb, app_key);
if(ret) return ret;
/*
* Cannot inherit it earlier:
diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c
index bb99eed5..6d2d6c15 100644
--- a/skeletons/constr_SET.c
+++ b/skeletons/constr_SET.c
@@ -938,11 +938,11 @@ SET_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) {
int
SET_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- asn_app_consume_bytes_f *app_errlog, void *app_key) {
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
int edx;
if(!sptr) {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
@@ -960,7 +960,7 @@ SET_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
if(!memb_ptr) {
if(elm->optional)
continue;
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: mandatory element %s absent (%s:%d)",
td->name, elm->name, __FILE__, __LINE__);
return -1;
@@ -971,11 +971,11 @@ SET_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
if(elm->memb_constraints) {
int ret = elm->memb_constraints(elm->type, memb_ptr,
- app_errlog, app_key);
+ ctfailcb, app_key);
if(ret) return ret;
} else {
int ret = elm->type->check_constraints(elm->type,
- memb_ptr, app_errlog, app_key);
+ memb_ptr, ctfailcb, app_key);
if(ret) return ret;
/*
* Cannot inherit it earlier:
diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c
index bb6d2d39..56429635 100644
--- a/skeletons/constr_SET_OF.c
+++ b/skeletons/constr_SET_OF.c
@@ -812,14 +812,14 @@ SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) {
int
SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
- asn_app_consume_bytes_f *app_errlog, void *app_key) {
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
asn_TYPE_member_t *elm = td->elements;
asn_constr_check_f *constr;
const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr);
int i;
if(!sptr) {
- _ASN_ERRLOG(app_errlog, app_key,
+ _ASN_CTFAIL(app_key, td,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
@@ -838,7 +838,7 @@ SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
if(!memb_ptr) continue;
- ret = constr(elm->type, memb_ptr, app_errlog, app_key);
+ ret = constr(elm->type, memb_ptr, ctfailcb, app_key);
if(ret) return ret;
}
diff --git a/skeletons/constraints.c b/skeletons/constraints.c
index e3843528..1bdda73e 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 @@ asn_generic_no_constraint(asn_TYPE_descriptor_t *type_descriptor,
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 @@ asn_generic_unknown_constraint(asn_TYPE_descriptor_t *type_descriptor,
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;
-
- if(avail > size)
- avail = size + 1;
-
- 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;
- }
-
-}
+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;
-int
-asn_check_constraints(asn_TYPE_descriptor_t *type_descriptor,
- const void *struct_ptr, char *errbuf, size_t *errlen) {
-
- if(errlen) {
- struct __fill_errbuf_arg arg;
- int ret;
-
- 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;
-
- return ret;
- } else {
- return type_descriptor->check_constraints(type_descriptor,
- struct_ptr, 0, 0);
- }
-}
+ arg->failed_type = td;
+ arg->failed_struct_ptr = sptr;
-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;
+ maxlen = arg->errlen;
+ if(maxlen <= 0)
+ return;
va_start(ap, fmt);
- ret = vsnprintf(buf, sizeof(buf), fmt, ap);
+ vlen = vsnprintf(arg->errbuf, maxlen, fmt, ap);
va_end(ap);
- if(ret < 0) {
+ 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.
*/
- ret = sizeof("<broken vsnprintf>") - 1;
- memcpy(buf, "<broken vsnprintf>", ret + 1);
- /* Fall through */
+ vlen = sizeof("<broken vsnprintf>") - 1;
+ maxlen--;
+ arg->errlen = vlen < maxlen ? vlen : maxlen;
+ memcpy(arg->errbuf, "<broken vsnprintf>", arg->errlen);
+ arg->errbuf[arg->errlen] = 0;
}
- if(ret < (ssize_t)sizeof(buf)) {
- (void)cb(buf, ret, key);
- return;
- }
+ return;
+}
- /*
- * More space required to hold the message.
- */
- len = ret + 1;
- p = (char *)alloca(len);
- if(!p) return; /* Can fail on !x86. */
+int
+asn_check_constraints(asn_TYPE_descriptor_t *type_descriptor,
+ const void *struct_ptr, char *errbuf, size_t *errlen) {
+ struct errbufDesc arg;
+ int ret;
-
- 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;
- }
+ arg.failed_type = 0;
+ arg.failed_struct_ptr = 0;
+ arg.errbuf = errbuf;
+ arg.errlen = errlen ? *errlen : 0;
- (void)cb(p, ret, key);
+ ret = type_descriptor->check_constraints(type_descriptor,
+ struct_ptr, _asn_i_ctfailcb, &arg);
+ if(ret == -1 && errlen)
+ *errlen = arg.errlen;
+
+ return ret;
}
+
diff --git a/skeletons/constraints.h b/skeletons/constraints.h
index 51fad8ed..5032345e 100644
--- a/skeletons/constraints.h
+++ b/skeletons/constraints.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Copyright (c) 2004, 2006 Lev Walkin <vlm@lionet.info>. All rights reserved.
* Redistribution and modifications are permitted subject to BSD license.
*/
#ifndef _ASN1_CONSTRAINTS_VALIDATOR_H_
@@ -20,6 +20,10 @@ struct asn_TYPE_descriptor_s; /* Forward declaration */
* they could be passed as NULL's. If constraints validation fails,
* errlen will contain the actual number of bytes taken from the errbuf
* to encode an error message (properly 0-terminated).
+ *
+ * RETURN VALUES:
+ * This function returns 0 in case all ASN.1 constraints are met
+ * and -1 if one or more constraints were failed.
*/
int
asn_check_constraints(struct asn_TYPE_descriptor_s *type_descriptor,
@@ -28,6 +32,7 @@ asn_check_constraints(struct asn_TYPE_descriptor_s *type_descriptor,
size_t *errlen /* Length of the error description */
);
+
/*
* Generic type for constraint checking callback,
* associated with every type descriptor.
@@ -35,8 +40,8 @@ asn_check_constraints(struct asn_TYPE_descriptor_s *type_descriptor,
typedef int (asn_constr_check_f)(
struct asn_TYPE_descriptor_s *type_descriptor,
const void *struct_ptr,
- asn_app_consume_bytes_f *optional_app_errlog, /* Log the error */
- void *optional_app_key /* Opaque key passed to app_errlog */
+ asn_app_constraint_failed_f *optional_callback, /* Log the error */
+ void *optional_app_key /* Opaque key passed to a callback */
);
/*******************************
@@ -49,11 +54,7 @@ asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */
/*
* Invoke the callback with a complete error message.
*/
-/* Preprocessor may not support variable args macros, so act strangely */
-#define _ASN_ERRLOG if(app_errlog) _asn_i_log_error
-
-void _asn_i_log_error(asn_app_consume_bytes_f *, void *key,
- const char *fmt, ...) __attribute__ ((format(printf, 3, 4)));
+#define _ASN_CTFAIL if(ctfailcb) ctfailcb
#ifdef __cplusplus
}