ldb: lay foundation for proper utc/generalized time handling
[ddiss/samba.git] / lib / ldb / common / attrib_handlers.c
index 73e1705593bf1d9db2bb3b88f3a3e82723855696..daeb422aca3c6c54a43dfb6367fb106048724b87 100644 (file)
@@ -380,6 +380,27 @@ static int ldb_comparison_utctime(struct ldb_context *ldb, void *mem_ctx,
 */
 static int ldb_canonicalise_utctime(struct ldb_context *ldb, void *mem_ctx,
                                    const struct ldb_val *in, struct ldb_val *out)
+{
+       time_t t;
+       int ret;
+       ret = ldb_val_to_time(in, &t);
+       if (ret != LDB_SUCCESS) {
+               return ret;
+       }
+       out->data = (uint8_t *)ldb_timestring_utc(mem_ctx, t);
+       if (out->data == NULL) {
+               ldb_oom(ldb);
+               return LDB_ERR_OPERATIONS_ERROR;
+       }
+       out->length = strlen((char *)out->data);
+       return 0;
+}
+
+/*
+  canonicalise a generalized time
+*/
+static int ldb_canonicalise_generalizedtime(struct ldb_context *ldb, void *mem_ctx,
+                                       const struct ldb_val *in, struct ldb_val *out)
 {
        time_t t;
        int ret;
@@ -443,6 +464,13 @@ static const struct ldb_schema_syntax ldb_standard_syntaxes[] = {
                .comparison_fn   = ldb_comparison_utctime
        },
        { 
+               .name            = LDB_SYNTAX_GENERALIZED_TIME,
+               .ldif_read_fn    = ldb_handler_copy,
+               .ldif_write_fn   = ldb_handler_copy,
+               .canonicalise_fn = ldb_canonicalise_generalizedtime,
+               .comparison_fn   = ldb_comparison_utctime
+       },
+       {
                .name            = LDB_SYNTAX_BOOLEAN,
                .ldif_read_fn    = ldb_handler_copy,
                .ldif_write_fn   = ldb_handler_copy,