]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/constraint.c
Sync with HEAD for OL 2.4.5
[openldap] / servers / slapd / overlays / constraint.c
index 447a48b6f4f27240ee9b87da41e8080d90d6fc62..aed82a66208e7b0352df91480926311baee2de35 100644 (file)
@@ -64,6 +64,7 @@ static ConfigTable constraintcfg[] = {
       4, 4, 0, ARG_MAGIC | CONSTRAINT_ATTRIBUTE, constraint_cf_gen,
       "( OLcfgOvAt:13.1 NAME 'olcConstraintAttribute' "
       "DESC 'regular expression constraint for attribute' "
+         "EQUALITY caseIgnoreMatch "
       "SYNTAX OMsDirectoryString )", NULL, NULL },
     { NULL, NULL, 0, 0, 0, ARG_IGNORED }
 };
@@ -86,7 +87,6 @@ constraint_cf_gen( ConfigArgs *c )
     struct berval bv;
     int i, rc = 0;
     constraint ap = { NULL, NULL, NULL  }, *a2 = NULL;
-    regmatch_t rm[2];
     const char *text = NULL;
     
     switch ( c->op ) {
@@ -137,32 +137,24 @@ constraint_cf_gen( ConfigArgs *c )
                         
                         on->on_bi.bi_private = NULL;
                     } else {
-                        constraint *cpp;
+                        constraint **cpp;
                         
                             /* zap constraint numbered 'valx' */
-                        for(i=0, cp = cn, cpp = NULL;
+                        for(i=0, cp = cn, cpp = &cn;
                             (cp) && (i<c->valx);
-                            i++, cpp = cp, cp=cp->ap_next);
+                            i++, cpp = &cp->ap_next, cp = *cpp);
 
-                        if (cpp) {
+                        if (cp) {
                                 /* zap cp, and join cpp to cp->ap_next */
-                            cpp->ap_next = cp->ap_next;
+                            *cpp = cp->ap_next;
                             if (cp->re) {
                                 regfree(cp->re);
                                 ch_free(cp->re);
                             }
                             if (cp->re_str) ch_free(cp->re_str);
                             ch_free(cp);
-                        } else {
-                                /* zap the list head */
-                            if (cn->re) {
-                                regfree(cn->re);
-                                ch_free(cn->re);
-                            }
-                            if (cn->re_str) ch_free(cn->re_str);
-                            ch_free(cn);
-                            on->on_bi.bi_private = cn->ap_next;
                         }
+                        on->on_bi.bi_private = cn;
                     }
                     
                     break;
@@ -176,9 +168,10 @@ constraint_cf_gen( ConfigArgs *c )
             switch (c->type) {
                 case CONSTRAINT_ATTRIBUTE:
                     if ( slap_str2ad( c->argv[1], &ap.ap, &text ) ) {
-                        Debug( LDAP_DEBUG_CONFIG,
-                               "constraint_add: <%s>: attribute description unknown %s.\n",
-                               c->argv[1], text, 0 );
+                                               snprintf( c->cr_msg, sizeof( c->cr_msg ),
+                                                       "%s <%s>: %s\n", c->argv[0], c->argv[1], text );
+                        Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                               "%s: %s\n", c->log, c->cr_msg, 0 );
                         return( ARG_BAD_CONF );
                     }
 
@@ -192,17 +185,21 @@ constraint_cf_gen( ConfigArgs *c )
                             
                             regerror( err, ap.re, errmsg, sizeof(errmsg) );
                             ch_free(ap.re);
-                            Debug( LDAP_DEBUG_CONFIG,
-                                   "%s: Illegal regular expression \"%s\": Error %s\n",
-                                   c->argv[1], c->argv[3], errmsg);
+                                                       snprintf( c->cr_msg, sizeof( c->cr_msg ),
+                                   "%s %s: Illegal regular expression \"%s\": Error %s",
+                                   c->argv[0], c->argv[1], c->argv[3], errmsg);
+                            Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                                                                       "%s: %s\n", c->log, c->cr_msg, 0 );
                             ap.re = NULL;
                             return( ARG_BAD_CONF );
                         }
                         ap.re_str = ch_strdup( c->argv[3] );
                     } else {
-                        Debug( LDAP_DEBUG_CONFIG,
-                               "%s: Unknown constraint type: %s\n",
-                               c->argv[1], c->argv[2], 0 );
+                                               snprintf( c->cr_msg, sizeof( c->cr_msg ),
+                               "%s %s: Unknown constraint type: %s",
+                               c->argv[0], c->argv[1], c->argv[2] );
+                        Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                               "%s: %s\n", c->log, c->cr_msg, 0 );
                         return ( ARG_BAD_CONF );
                     }
                     
@@ -240,14 +237,14 @@ constraint_violation( constraint *c, struct berval *bv )
 }
 
 static char *
-print_message( const char *fmt, AttributeDescription *a )
+print_message( const char *errtext, AttributeDescription *a )
 {
     char *ret;
     int sz;
     
-    sz = strlen(fmt) + a->ad_cname.bv_len + 1;
+    sz = strlen(errtext) + sizeof(" on ") + a->ad_cname.bv_len;
     ret = ch_malloc(sz);
-    snprintf( ret, sz, fmt, a->ad_cname.bv_val );
+    snprintf( ret, sz, "%s on %s", errtext, a->ad_cname.bv_val );
     return ret;
 }
 
@@ -259,7 +256,7 @@ constraint_add( Operation *op, SlapReply *rs )
     constraint *c = on->on_bi.bi_private, *cp;
     BerVarray b = NULL;
     int i;
-    const char *rsv = "add breaks regular expression constraint on %s";
+    const char *rsv = "add breaks regular expression constraint";
     char *msg;
     
     if ((a = op->ora_e->e_attrs) == NULL) {
@@ -304,7 +301,7 @@ constraint_modify( Operation *op, SlapReply *rs )
     Modifications *m;
     BerVarray b = NULL;
     int i;
-    const char *rsv = "modify breaks regular expression constraint on %s";
+    const char *rsv = "modify breaks regular expression constraint";
     char *msg;
     
     if ((m = op->orm_modlist) == NULL) {
@@ -346,8 +343,8 @@ constraint_modify( Operation *op, SlapReply *rs )
 
 static int
 constraint_close(
-    BackendDB *be
-    )
+       BackendDB *be,
+       ConfigReply *cr )
 {
     slap_overinst *on = (slap_overinst *) be->bd_info;
     constraint *ap, *a2;