/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2010 The OpenLDAP Foundation.
+ * Copyright 1998-2011 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
c->type = arg_user;
memset(&c->values, 0, sizeof(c->values));
if(arg_type == ARG_STRING) {
+ assert( c->argc == 2 );
if ( !check_only )
c->value_string = ch_strdup(c->argv[1]);
} else if(arg_type == ARG_BERVAL) {
+ assert( c->argc == 2 );
if ( !check_only )
ber_str2bv( c->argv[1], 0, 1, &c->value_bv );
} else if(arg_type == ARG_DN) {
struct berval bv;
+ assert( c->argc == 2 );
ber_str2bv( c->argv[1], 0, 0, &bv );
rc = dnPrettyNormal( NULL, &bv, &c->value_dn, &c->value_ndn, NULL );
if ( rc != LDAP_SUCCESS ) {
}
} else if(arg_type == ARG_ATDESC) {
const char *text = NULL;
+ assert( c->argc == 2 );
c->value_ad = NULL;
rc = slap_str2ad( c->argv[1], &c->value_ad, &text );
if ( rc != LDAP_SUCCESS ) {
iarg = 0; larg = 0; barg = 0;
switch(arg_type) {
case ARG_INT:
+ assert( c->argc == 2 );
if ( lutil_atoix( &iarg, c->argv[1], 0 ) != 0 ) {
snprintf( c->cr_msg, sizeof( c->cr_msg ),
"<%s> unable to parse \"%s\" as int",
}
break;
case ARG_UINT:
+ assert( c->argc == 2 );
if ( lutil_atoux( &uiarg, c->argv[1], 0 ) != 0 ) {
snprintf( c->cr_msg, sizeof( c->cr_msg ),
"<%s> unable to parse \"%s\" as unsigned int",
}
break;
case ARG_LONG:
+ assert( c->argc == 2 );
if ( lutil_atolx( &larg, c->argv[1], 0 ) != 0 ) {
snprintf( c->cr_msg, sizeof( c->cr_msg ),
"<%s> unable to parse \"%s\" as long",
}
break;
case ARG_ULONG:
+ assert( c->argc == 2 );
if ( lutil_atoulx( &ularg, c->argv[1], 0 ) != 0 ) {
snprintf( c->cr_msg, sizeof( c->cr_msg ),
"<%s> unable to parse \"%s\" as unsigned long",
break;
case ARG_BER_LEN_T: {
unsigned long l;
+ assert( c->argc == 2 );
if ( lutil_atoulx( &l, c->argv[1], 0 ) != 0 ) {
snprintf( c->cr_msg, sizeof( c->cr_msg ),
"<%s> unable to parse \"%s\" as ber_len_t",
barg = (ber_len_t)l;
} break;
case ARG_ON_OFF:
+ /* note: this is an explicit exception
+ * to the "need exactly 2 args" rule */
if (c->argc == 1) {
iarg = 1;
} else if ( !strcasecmp(c->argv[1], "on") ||
c->value_string = ch_strdup(*(char **)ptr);
break;
case ARG_BERVAL:
- ber_dupbv( &c->value_bv, (struct berval *)ptr ); break;
+ c->value_bv = *((struct berval *)ptr); break;
case ARG_ATDESC:
c->value_ad = *(AttributeDescription **)ptr; break;
}
return rc;
}
+/* Return the verbs as a single string, separated by delim */
+int
+mask_to_verbstring(slap_verbmasks *v, slap_mask_t m0, char delim, struct berval *bv)
+{
+ int i, rc = 1;
+
+ BER_BVZERO( bv );
+ if (m0) {
+ slap_mask_t m = m0;
+ char *ptr;
+ for (i=0; !BER_BVISNULL(&v[i].word); i++) {
+ if (!v[i].mask) continue;
+ if (( m & v[i].mask ) == v[i].mask ) {
+ bv->bv_len += v[i].word.bv_len + 1;
+ rc = 0;
+ m ^= v[i].mask;
+ if ( !m ) break;
+ }
+ }
+ bv->bv_val = ch_malloc(bv->bv_len);
+ bv->bv_len--;
+ ptr = bv->bv_val;
+ m = m0;
+ for (i=0; !BER_BVISNULL(&v[i].word); i++) {
+ if (!v[i].mask) continue;
+ if (( m & v[i].mask ) == v[i].mask ) {
+ ptr = lutil_strcopy(ptr, v[i].word.bv_val);
+ *ptr++ = delim;
+ m ^= v[i].mask;
+ if ( !m ) break;
+ }
+ }
+ ptr[-1] = '\0';
+ }
+ return rc;
+}
+
+/* Parse a verbstring */
+int
+verbstring_to_mask(slap_verbmasks *v, char *str, char delim, slap_mask_t *m) {
+ int j;
+ char *d;
+ struct berval bv;
+
+ do {
+ bv.bv_val = str;
+ d = strchr( str, delim );
+ if ( d )
+ bv.bv_len = d - str;
+ else
+ bv.bv_len = strlen( str );
+ j = bverb_to_mask( &bv, v );
+ if(BER_BVISNULL(&v[j].word)) return 1;
+ while (!v[j].mask) j--;
+ *m |= v[j].mask;
+ str += bv.bv_len + 1;
+ } while ( d );
+ return(0);
+}
+
int
slap_verbmasks_init( slap_verbmasks **vp, slap_verbmasks *v )
{
{ BER_BVNULL, 0 }
};
-static int
-slap_sb_uri(
- struct berval *val,
- void *bcp,
- slap_cf_aux_table *tab0,
- const char *tabmsg,
- int unparse )
-{
- slap_bindconf *bc = bcp;
- if ( unparse ) {
- if ( bc->sb_uri.bv_len >= val->bv_len )
- return -1;
- val->bv_len = bc->sb_uri.bv_len;
- AC_MEMCPY( val->bv_val, bc->sb_uri.bv_val, val->bv_len );
- } else {
- bc->sb_uri = *val;
-#ifdef HAVE_TLS
- if ( ldap_is_ldaps_url( val->bv_val ))
- bc->sb_tls_do_init = 1;
-#endif
- }
- return 0;
-}
-
static int
slap_keepalive_parse(
struct berval *val,
return 0;
}
+static int
+slap_sb_uri(
+ struct berval *val,
+ void *bcp,
+ slap_cf_aux_table *tab0,
+ const char *tabmsg,
+ int unparse )
+{
+ slap_bindconf *bc = bcp;
+ if ( unparse ) {
+ if ( bc->sb_uri.bv_len >= val->bv_len )
+ return -1;
+ val->bv_len = bc->sb_uri.bv_len;
+ AC_MEMCPY( val->bv_val, bc->sb_uri.bv_val, val->bv_len );
+ } else {
+ bc->sb_uri = *val;
+#ifdef HAVE_TLS
+ if ( ldap_is_ldaps_url( val->bv_val ))
+ bc->sb_tls_do_init = 1;
+#endif
+ }
+ return 0;
+}
+
static slap_cf_aux_table bindkey[] = {
{ BER_BVC("uri="), 0, 'x', 1, slap_sb_uri },
{ BER_BVC("version="), offsetof(slap_bindconf, sb_version), 'i', 0, versionkey },
rc = lutil_atoulx( ulptr, val, 0 );
break;
- case 'x':
- if ( tab->aux != NULL ) {
- struct berval value;
- slap_cf_aux_table_parse_x *func = (slap_cf_aux_table_parse_x *)tab->aux;
-
- ber_str2bv( val, 0, 1, &value );
-
- rc = func( &value, (void *)((char *)dst + tab->off), tab, tabmsg, 0 );
-
- } else {
- rc = 1;
- }
- break;
-
case 'x':
if ( tab->aux != NULL ) {
struct berval value;
}
break;
- case 'x':
- *ptr++ = ' ';
- ptr = lutil_strcopy( ptr, tab->key.bv_val );
- if ( tab->quote ) *ptr++ = '"';
- if ( tab->aux != NULL ) {
- struct berval value;
- slap_cf_aux_table_parse_x *func = (slap_cf_aux_table_parse_x *)tab->aux;
- int rc;
-
- value.bv_val = ptr;
- value.bv_len = buf + sizeof( buf ) - ptr;
-
- rc = func( &value, (void *)((char *)src + tab->off), tab, "(unparse)", 1 );
- if ( rc == 0 ) {
- ptr += value.bv_len;
- }
- }
- if ( tab->quote ) *ptr++ = '"';
- break;
-
default:
assert( 0 );
}
bc->sb_tls_crlcheck = NULL;
}
#endif
+ if ( bc->sb_tls_ctx ) {
+ ldap_pvt_tls_ctx_free( bc->sb_tls_ctx );
+ bc->sb_tls_ctx = NULL;
+ }
#endif
}