summaryrefslogtreecommitdiffstats
path: root/src/asn1c/constraints.c
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2015-06-09 13:30:57 -0400
committerSimo Sorce <simo@redhat.com>2015-06-09 17:53:34 -0400
commitabd7c2e0ce5bd17997fb4c05eb2c7453060c0a3a (patch)
treef314e3a13669997c31a50511031298eba661566e /src/asn1c/constraints.c
parent9cfa62da9119d2cd62314e5328215f8ea45c64b1 (diff)
downloadmod_auth_gssapi-abd7c2e0ce5bd17997fb4c05eb2c7453060c0a3a.tar.gz
mod_auth_gssapi-abd7c2e0ce5bd17997fb4c05eb2c7453060c0a3a.tar.xz
mod_auth_gssapi-abd7c2e0ce5bd17997fb4c05eb2c7453060c0a3a.zip
Use a compiler to marshall/unmarshall the sessions
This way changes are easier, all is needed is to change the session.asn1 file to add or remove elements, and different session types can also be supported at the same time.
Diffstat (limited to 'src/asn1c/constraints.c')
-rw-r--r--src/asn1c/constraints.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/asn1c/constraints.c b/src/asn1c/constraints.c
new file mode 100644
index 0000000..1bdda73
--- /dev/null
+++ b/src/asn1c/constraints.c
@@ -0,0 +1,93 @@
+#include "asn_internal.h"
+#include "constraints.h"
+
+int
+asn_generic_no_constraint(asn_TYPE_descriptor_t *type_descriptor,
+ const void *struct_ptr, asn_app_constraint_failed_f *cb, void *key) {
+
+ (void)type_descriptor; /* Unused argument */
+ (void)struct_ptr; /* Unused argument */
+ (void)cb; /* Unused argument */
+ (void)key; /* Unused argument */
+
+ /* Nothing to check */
+ return 0;
+}
+
+int
+asn_generic_unknown_constraint(asn_TYPE_descriptor_t *type_descriptor,
+ const void *struct_ptr, asn_app_constraint_failed_f *cb, void *key) {
+
+ (void)type_descriptor; /* Unused argument */
+ (void)struct_ptr; /* Unused argument */
+ (void)cb; /* Unused argument */
+ (void)key; /* Unused argument */
+
+ /* Unknown how to check */
+ return 0;
+}
+
+struct errbufDesc {
+ asn_TYPE_descriptor_t *failed_type;
+ const void *failed_struct_ptr;
+ char *errbuf;
+ size_t errlen;
+};
+
+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;
+
+ arg->failed_type = td;
+ arg->failed_struct_ptr = sptr;
+
+ 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) {
+ struct errbufDesc arg;
+ int ret;
+
+ arg.failed_type = 0;
+ arg.failed_struct_ptr = 0;
+ arg.errbuf = errbuf;
+ arg.errlen = errlen ? *errlen : 0;
+
+ ret = type_descriptor->check_constraints(type_descriptor,
+ struct_ptr, _asn_i_ctfailcb, &arg);
+ if(ret == -1 && errlen)
+ *errlen = arg.errlen;
+
+ return ret;
+}
+