r10915: added a standard attribute handler for a ldap UTC time string
authorAndrew Tridgell <tridge@samba.org>
Wed, 12 Oct 2005 07:54:15 +0000 (07:54 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:39:42 +0000 (13:39 -0500)
(This used to be commit efd7dd1a775c06f21924f35760f7768b4e8db449)

source4/lib/ldb/common/attrib_handlers.c
source4/lib/ldb/common/ldb_attributes.c
source4/lib/ldb/include/ldb.h

index d073203b3cf933edbf5471300ffc30b4af3e185e..4a6e3e3c7931c888fa4cf2ccc94d33ebac4afbc6 100644 (file)
@@ -224,6 +224,33 @@ static int ldb_comparison_objectclass(struct ldb_context *ldb, void *mem_ctx,
        return ret;
 }
 
+/*
+  compare two utc time values. 1 second resolution
+*/
+static int ldb_comparison_utctime(struct ldb_context *ldb, void *mem_ctx,
+                                 const struct ldb_val *v1, const struct ldb_val *v2)
+{
+       time_t t1, t2;
+       t1 = ldb_string_to_time((char *)v1->data);
+       t1 = ldb_string_to_time((char *)v1->data);
+       return (int)t2 - (int)t1;
+}
+
+/*
+  canonicalise a utc time
+*/
+static int ldb_canonicalise_utctime(struct ldb_context *ldb, void *mem_ctx,
+                                   const struct ldb_val *in, struct ldb_val *out)
+{
+       time_t t = ldb_string_to_time((char *)in->data);
+       out->data = (uint8_t *)ldb_timestring(mem_ctx, t);
+       if (out->data == NULL) {
+               return -1;
+       }
+       out->length = strlen((char *)out->data);
+       return 0;
+}
+
 /*
   table of standard attribute handlers
 */
@@ -267,6 +294,14 @@ static const struct ldb_attrib_handler ldb_standard_attribs[] = {
                .ldif_write_fn   = ldb_handler_copy,
                .canonicalise_fn = ldb_handler_fold,
                .comparison_fn   = ldb_comparison_objectclass
+       },
+       { 
+               .attr            = LDB_SYNTAX_UTC_TIME,
+               .flags           = 0,
+               .ldif_read_fn    = ldb_handler_copy,
+               .ldif_write_fn   = ldb_handler_copy,
+               .canonicalise_fn = ldb_canonicalise_utctime,
+               .comparison_fn   = ldb_comparison_utctime
        }
 };
 
index 47b4b1788b6ddbfbac97ee32edfc7122d3128bc7..bf955ece3d5c8738e37c034969881ce3eaf643fe 100644 (file)
@@ -138,6 +138,22 @@ void ldb_remove_attrib_handler(struct ldb_context *ldb, const char *attrib)
        ldb->schema.num_attrib_handlers--;
 }
 
+/*
+  setup a attribute handler using a standard syntax
+*/
+int ldb_set_attrib_handler_syntax(struct ldb_context *ldb, 
+                                 const char *attr, const char *syntax)
+{
+       const struct ldb_attrib_handler *h = ldb_attrib_handler_syntax(ldb, syntax);
+       struct ldb_attrib_handler h2;
+       if (h == NULL) {
+               ldb_debug(ldb, LDB_DEBUG_ERROR, "Unknown syntax '%s'\n", syntax);
+               return -1;
+       }
+       h2 = *h;
+       h2.attr = attr;
+       return ldb_set_attrib_handlers(ldb, &h2, 1);
+}
 
 /*
   setup the attribute handles for well known attributes
@@ -158,17 +174,8 @@ int ldb_setup_wellknown_attributes(struct ldb_context *ldb)
        };
        int i;
        for (i=0;i<ARRAY_SIZE(wellknown);i++) {
-               const struct ldb_attrib_handler *h = 
-                       ldb_attrib_handler_syntax(ldb, wellknown[i].syntax);
-               struct ldb_attrib_handler h2;
-               if (h == NULL) {
-                       ldb_debug(ldb, LDB_DEBUG_ERROR, "Unknown syntax '%s'\n",
-                                 wellknown[i].syntax);
-                       return -1;
-               }
-               h2 = *h;
-               h2.attr = wellknown[i].attr;
-               if (ldb_set_attrib_handlers(ldb, &h2, 1) != 0) {
+               if (ldb_set_attrib_handler_syntax(ldb, wellknown[i].attr, 
+                                                 wellknown[i].syntax) != 0) {
                        return -1;
                }
        }
index 0af88f8427110cacc5a7a1e6de7000502723f7d1..d346d0edacbbc85f95cfa71cff9fead078217bba 100644 (file)
@@ -251,6 +251,7 @@ struct ldb_attrib_handler {
 #define LDB_SYNTAX_DIRECTORY_STRING     "1.3.6.1.4.1.1466.115.121.1.15"
 #define LDB_SYNTAX_INTEGER              "1.3.6.1.4.1.1466.115.121.1.27"
 #define LDB_SYNTAX_OCTET_STRING         "1.3.6.1.4.1.1466.115.121.1.40"
+#define LDB_SYNTAX_UTC_TIME             "1.3.6.1.4.1.1466.115.121.1.53"
 #define LDB_SYNTAX_OBJECTCLASS          "LDB_SYNTAX_OBJECTCLASS"
 
 /*
@@ -452,6 +453,8 @@ const char *ldb_msg_find_string(const struct ldb_message *msg,
 
 void ldb_msg_sort_elements(struct ldb_message *msg);
 
+struct ldb_message *ldb_msg_copy_shallow(TALLOC_CTX *mem_ctx, 
+                                        const struct ldb_message *msg);
 struct ldb_message *ldb_msg_copy(void *mem_ctx, 
                                 const struct ldb_message *msg);