X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Flimits.c;h=c4b9b9012cd7e8381def6feb7e77dba1fbb24456;hb=410d51446154d4bcac1bd1c83b83892f4a75b9e7;hp=19cc9e55283cca0b4492eba4e565d4c9d1068e5f;hpb=59aea479632ec3fe94bd09a76a04532663528ec6;p=openldap
diff --git a/servers/slapd/limits.c b/servers/slapd/limits.c
index 19cc9e5528..c4b9b9012c 100644
--- a/servers/slapd/limits.c
+++ b/servers/slapd/limits.c
@@ -1,7 +1,17 @@
/* limits.c - routines to handle regex-based size and time limits */
-/*
- * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+/* $OpenLDAP$/
+/* This work is part of OpenLDAP Software .
+ *
+ * Copyright 1998-2003 The OpenLDAP Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * .
*/
#include "portable.h"
@@ -147,6 +157,19 @@ add_limits(
assert( be );
assert( limit );
+ switch ( type ) {
+ case SLAP_LIMITS_ANONYMOUS:
+ case SLAP_LIMITS_USERS:
+ case SLAP_LIMITS_ANY:
+ for ( i = 0; be->be_limits && be->be_limits[ i ]; i++ ) {
+ if ( be->be_limits[ i ]->lm_type == type ) {
+ return( -1 );
+ }
+ }
+ break;
+ }
+
+
lm = ( struct slap_limits * )ch_calloc( sizeof( struct slap_limits ), 1 );
switch ( type ) {
@@ -161,7 +184,7 @@ add_limits(
bv.bv_val = (char *) pattern;
bv.bv_len = strlen( pattern );
- rc = dnNormalize2( NULL, &bv, &lm->lm_dn_pat );
+ rc = dnNormalize( 0, NULL, NULL, &bv, &lm->lm_dn_pat, NULL );
if ( rc != LDAP_SUCCESS ) {
ch_free( lm );
return( -1 );
@@ -217,7 +240,7 @@ parse_limits(
int type = SLAP_LIMITS_UNDEFINED;
char *pattern;
struct slap_limits_set limit;
- int i;
+ int i, rc = 0;
assert( be );
@@ -396,7 +419,23 @@ parse_limits(
limit.lms_s_hard = limit.lms_s_soft;
}
- return( add_limits( be, type, pattern, &limit ) );
+ rc = add_limits( be, type, pattern, &limit );
+ if ( rc ) {
+
+#ifdef NEW_LOGGING
+ LDAP_LOG( CONFIG, CRIT,
+ "%s : line %d: unable to add limit in "
+ "\"limits \" line.\n",
+ fname, lineno, 0 );
+#else
+ Debug( LDAP_DEBUG_ANY,
+ "%s : line %d: unable to add limit in "
+ "\"limits \" line.\n",
+ fname, lineno, 0 );
+#endif
+ }
+
+ return( rc );
}
int
@@ -456,12 +495,16 @@ parse_limit(
}
} else if ( arg[0] == '=' ) {
- char *next = NULL;
-
arg++;
- limit->lms_t_soft = strtol( arg, &next, 10 );
- if ( next == arg || limit->lms_t_soft < -1 ) {
- return( 1 );
+ if ( strcasecmp( arg, "none" ) == 0 ) {
+ limit->lms_t_soft = -1;
+ } else {
+ char *next = NULL;
+
+ limit->lms_t_soft = strtol( arg, &next, 10 );
+ if ( next == arg || limit->lms_t_soft < -1 ) {
+ return( 1 );
+ }
}
limit->lms_t_hard = 0;
@@ -529,18 +572,40 @@ parse_limit(
return( 1 );
}
}
+
+ } else if ( strncasecmp( arg, "pr", sizeof( "pr" ) - 1 ) == 0 ) {
+ arg += sizeof( "pr" ) - 1;
+ if ( arg[0] != '=' ) {
+ return( 1 );
+ }
+ arg++;
+ if ( strcasecmp( arg, "noEstimate" ) == 0 ) {
+ limit->lms_s_pr_hide = 1;
+ } else {
+ char *next = NULL;
+
+ limit->lms_s_pr =
+ strtol( arg, &next, 10 );
+ if ( next == arg || limit->lms_s_pr < -1 ) {
+ return( 1 );
+ }
+ }
} else {
return( 1 );
}
} else if ( arg[0] == '=' ) {
- char *next = NULL;
-
arg++;
- limit->lms_s_soft = strtol( arg, &next, 10 );
- if ( next == arg || limit->lms_s_soft < -1 ) {
- return( 1 );
+ if ( strcasecmp( arg, "none" ) == 0 ) {
+ limit->lms_s_soft = -1;
+ } else {
+ char *next = NULL;
+
+ limit->lms_s_soft = strtol( arg, &next, 10 );
+ if ( next == arg || limit->lms_s_soft < -1 ) {
+ return( 1 );
+ }
}
limit->lms_s_hard = 0;