aboutsummaryrefslogtreecommitdiffstats
path: root/skeletons
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2005-07-03 05:29:36 +0000
committerLev Walkin <vlm@lionet.info>2005-07-03 05:29:36 +0000
commit7b3713a836a6a13840b1a1b0c9f4d965e3431fa6 (patch)
treee5509639e1f113d402d97d4b2c691f4e8d55d698 /skeletons
parent82d80390f3ed3b48690da66abcb16eacf08aecca (diff)
stricter encoding
Diffstat (limited to 'skeletons')
-rw-r--r--skeletons/UTCTime.c43
1 files changed, 23 insertions, 20 deletions
diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c
index e650b744..c2079fbd 100644
--- a/skeletons/UTCTime.c
+++ b/skeletons/UTCTime.c
@@ -8,7 +8,7 @@
#include <time.h>
#include <errno.h>
-#ifndef __NO_ASN_TABLE__
+#ifndef __ASN_INTERNAL_TEST_MODE__
/*
* UTCTime basic type description.
@@ -39,7 +39,7 @@ asn_TYPE_descriptor_t asn_DEF_UTCTime = {
0 /* No specifics */
};
-#endif /* __NO_ASN_TABLE__ */
+#endif /* __ASN_INTERNAL_TEST_MODE__ */
/*
* Check that the time looks like the time.
@@ -62,36 +62,39 @@ UTCTime_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
return 0;
}
+#ifndef __ASN_INTERNAL_TEST_MODE__
+
asn_enc_rval_t
UTCTime_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
int ilevel, enum xer_encoder_flags_e flags,
asn_app_consume_bytes_f *cb, void *app_key) {
- OCTET_STRING_t st;
if(flags & XER_F_CANONICAL) {
- char buf[32];
+ asn_enc_rval_t rv;
+ UTCTime_t *ut;
struct tm tm;
- ssize_t ret;
errno = EPERM;
if(asn_UT2time((UTCTime_t *)sptr, &tm, 1) == -1
&& errno != EPERM)
_ASN_ENCODE_FAILED;
-
- ret = snprintf(buf, sizeof(buf), "%02d%02d%02d%02d%02d%02dZ",
- tm.tm_year % 100, tm.tm_mon + 1, tm.tm_mday,
- tm.tm_hour, tm.tm_min, tm.tm_sec);
- assert(ret > 0 && ret < (int)sizeof(buf));
-
- st.buf = (uint8_t *)buf;
- st.size = ret;
- sptr = &st;
- }
- return OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags,
- cb, app_key);
+ /* Fractions are not allowed in UTCTime */
+ ut = asn_time2GT(0, 0, 1);
+ if(!ut) _ASN_ENCODE_FAILED;
+
+ rv = OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags,
+ cb, app_key);
+ OCTET_STRING_free(&asn_DEF_UTCTime, ut, 0);
+ return rv;
+ } else {
+ return OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags,
+ cb, app_key);
+ }
}
+#endif /* __ASN_INTERNAL_TEST_MODE__ */
+
int
UTCTime_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
asn_app_consume_bytes_f *cb, void *app_key) {
@@ -110,7 +113,7 @@ UTCTime_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
return (cb("<bad-value>", 11, app_key) < 0) ? -1 : 0;
ret = snprintf(buf, sizeof(buf),
- "%04d-%02d-%02d %02d:%02d%02d (GMT)",
+ "%04d-%02d-%02d %02d:%02d:%02d (GMT)",
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec);
assert(ret > 0 && ret < (int)sizeof(buf));
@@ -122,11 +125,11 @@ UTCTime_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
time_t
asn_UT2time(const UTCTime_t *st, struct tm *_tm, int as_gmt) {
- char buf[17+2]; /* "AAMMJJhhmmss+hhmm" = 17, + 2 = 19 */
+ char buf[24]; /* "AAMMJJhhmmss+hhmm" + cushion */
GeneralizedTime_t gt;
if(!st || !st->buf
- || st->size < 11 || st->size > ((int)sizeof(buf) - 2)) {
+ || st->size < 11 || st->size >= ((int)sizeof(buf) - 2)) {
errno = EINVAL;
return -1;
}