/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2004 The OpenLDAP Foundation.
+ * Copyright 1998-2005 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
}
res = res1;
}
- res[pos] = sval;
- pos++;
+ res[pos++] = sval;
+ res[pos] = NULL;
parse_whsp(sp);
} else {
LDAP_VFREE(res);
return(NULL);
}
}
- res[pos] = NULL;
parse_whsp(sp);
return(res);
} else if ( kind == TK_QDESCR ) {
kind = get_token(sp,&sval);
if ( kind == TK_BAREWORD ||
( allow_quoted && kind == TK_QDSTRING ) ) {
- res[pos] = sval;
- pos++;
+ res[pos++] = sval;
+ res[pos] = NULL;
} else {
*code = LDAP_SCHERR_UNEXPTOKEN;
LDAP_FREE(sval);
}
res = res1;
}
- res[pos] = sval;
- pos++;
+ res[pos++] = sval;
+ res[pos] = NULL;
} else {
*code = LDAP_SCHERR_UNEXPTOKEN;
LDAP_FREE(sval);
return NULL;
}
}
- res[pos] = NULL;
parse_whsp(sp);
return(res);
} else if ( kind == TK_BAREWORD ||
case TK_RIGHTPAREN:
return syn;
case TK_BAREWORD:
- if ( !strcmp(sval,"NAME") ) {
+ if ( !strcasecmp(sval,"NAME") ) {
LDAP_FREE(sval);
if ( seen_name ) {
*code = LDAP_SCHERR_DUPOPT;
ldap_syntax_free(syn);
return NULL;
}
- } else if ( !strcmp(sval,"DESC") ) {
+ } else if ( !strcasecmp(sval,"DESC") ) {
LDAP_FREE(sval);
if ( seen_desc ) {
*code = LDAP_SCHERR_DUPOPT;
ss = savepos;
kind = get_token(&ss,&sval);
if ( kind == TK_BAREWORD ) {
- if ( !strcmp(sval, "NAME") ||
- !strcmp(sval, "DESC") ||
- !strcmp(sval, "OBSOLETE") ||
- !strcmp(sval, "SYNTAX") ||
- !strncmp(sval, "X-", 2) ) {
+ if ( !strcasecmp(sval, "NAME") ||
+ !strcasecmp(sval, "DESC") ||
+ !strcasecmp(sval, "OBSOLETE") ||
+ !strcasecmp(sval, "SYNTAX") ||
+ !strncasecmp(sval, "X-", 2) ) {
/* Missing OID, backtrack */
ss = savepos;
} else {
}
return mr;
case TK_BAREWORD:
- if ( !strcmp(sval,"NAME") ) {
+ if ( !strcasecmp(sval,"NAME") ) {
LDAP_FREE(sval);
if ( seen_name ) {
*code = LDAP_SCHERR_DUPOPT;
ldap_matchingrule_free(mr);
return NULL;
}
- } else if ( !strcmp(sval,"DESC") ) {
+ } else if ( !strcasecmp(sval,"DESC") ) {
LDAP_FREE(sval);
if ( seen_desc ) {
*code = LDAP_SCHERR_DUPOPT;
}
mr->mr_desc = sval;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"OBSOLETE") ) {
+ } else if ( !strcasecmp(sval,"OBSOLETE") ) {
LDAP_FREE(sval);
if ( seen_obsolete ) {
*code = LDAP_SCHERR_DUPOPT;
seen_obsolete = 1;
mr->mr_obsolete = LDAP_SCHEMA_YES;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"SYNTAX") ) {
+ } else if ( !strcasecmp(sval,"SYNTAX") ) {
LDAP_FREE(sval);
if ( seen_syntax ) {
*code = LDAP_SCHERR_DUPOPT;
ss = savepos;
kind = get_token(&ss,&sval);
if ( kind == TK_BAREWORD ) {
- if ( !strcmp(sval, "NAME") ||
- !strcmp(sval, "DESC") ||
- !strcmp(sval, "OBSOLETE") ||
- !strcmp(sval, "APPLIES") ||
- !strncmp(sval, "X-", 2) ) {
+ if ( !strcasecmp(sval, "NAME") ||
+ !strcasecmp(sval, "DESC") ||
+ !strcasecmp(sval, "OBSOLETE") ||
+ !strcasecmp(sval, "APPLIES") ||
+ !strncasecmp(sval, "X-", 2) ) {
/* Missing OID, backtrack */
ss = savepos;
} else {
}
return mru;
case TK_BAREWORD:
- if ( !strcmp(sval,"NAME") ) {
+ if ( !strcasecmp(sval,"NAME") ) {
LDAP_FREE(sval);
if ( seen_name ) {
*code = LDAP_SCHERR_DUPOPT;
ldap_matchingruleuse_free(mru);
return NULL;
}
- } else if ( !strcmp(sval,"DESC") ) {
+ } else if ( !strcasecmp(sval,"DESC") ) {
LDAP_FREE(sval);
if ( seen_desc ) {
*code = LDAP_SCHERR_DUPOPT;
}
mru->mru_desc = sval;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"OBSOLETE") ) {
+ } else if ( !strcasecmp(sval,"OBSOLETE") ) {
LDAP_FREE(sval);
if ( seen_obsolete ) {
*code = LDAP_SCHERR_DUPOPT;
seen_obsolete = 1;
mru->mru_obsolete = LDAP_SCHEMA_YES;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"APPLIES") ) {
+ } else if ( !strcasecmp(sval,"APPLIES") ) {
LDAP_FREE(sval);
if ( seen_applies ) {
*code = LDAP_SCHERR_DUPOPT;
ss = savepos;
kind = get_token(&ss,&sval);
if ( kind == TK_BAREWORD ) {
- if ( !strcmp(sval, "NAME") ||
- !strcmp(sval, "DESC") ||
- !strcmp(sval, "OBSOLETE") ||
- !strcmp(sval, "SUP") ||
- !strcmp(sval, "EQUALITY") ||
- !strcmp(sval, "ORDERING") ||
- !strcmp(sval, "SUBSTR") ||
- !strcmp(sval, "SYNTAX") ||
- !strcmp(sval, "SINGLE-VALUE") ||
- !strcmp(sval, "COLLECTIVE") ||
- !strcmp(sval, "NO-USER-MODIFICATION") ||
- !strcmp(sval, "USAGE") ||
- !strncmp(sval, "X-", 2) ) {
+ if ( !strcasecmp(sval, "NAME") ||
+ !strcasecmp(sval, "DESC") ||
+ !strcasecmp(sval, "OBSOLETE") ||
+ !strcasecmp(sval, "SUP") ||
+ !strcasecmp(sval, "EQUALITY") ||
+ !strcasecmp(sval, "ORDERING") ||
+ !strcasecmp(sval, "SUBSTR") ||
+ !strcasecmp(sval, "SYNTAX") ||
+ !strcasecmp(sval, "SINGLE-VALUE") ||
+ !strcasecmp(sval, "COLLECTIVE") ||
+ !strcasecmp(sval, "NO-USER-MODIFICATION") ||
+ !strcasecmp(sval, "USAGE") ||
+ !strncasecmp(sval, "X-", 2) ) {
/* Missing OID, backtrack */
ss = savepos;
} else if ( flags
case TK_RIGHTPAREN:
return at;
case TK_BAREWORD:
- if ( !strcmp(sval,"NAME") ) {
+ if ( !strcasecmp(sval,"NAME") ) {
LDAP_FREE(sval);
if ( seen_name ) {
*code = LDAP_SCHERR_DUPOPT;
ldap_attributetype_free(at);
return NULL;
}
- } else if ( !strcmp(sval,"DESC") ) {
+ } else if ( !strcasecmp(sval,"DESC") ) {
LDAP_FREE(sval);
if ( seen_desc ) {
*code = LDAP_SCHERR_DUPOPT;
}
at->at_desc = sval;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"OBSOLETE") ) {
+ } else if ( !strcasecmp(sval,"OBSOLETE") ) {
LDAP_FREE(sval);
if ( seen_obsolete ) {
*code = LDAP_SCHERR_DUPOPT;
seen_obsolete = 1;
at->at_obsolete = LDAP_SCHEMA_YES;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"SUP") ) {
+ } else if ( !strcasecmp(sval,"SUP") ) {
LDAP_FREE(sval);
if ( seen_sup ) {
*code = LDAP_SCHERR_DUPOPT;
ldap_attributetype_free(at);
return NULL;
}
- } else if ( !strcmp(sval,"EQUALITY") ) {
+ } else if ( !strcasecmp(sval,"EQUALITY") ) {
LDAP_FREE(sval);
if ( seen_equality ) {
*code = LDAP_SCHERR_DUPOPT;
ldap_attributetype_free(at);
return NULL;
}
- } else if ( !strcmp(sval,"ORDERING") ) {
+ } else if ( !strcasecmp(sval,"ORDERING") ) {
LDAP_FREE(sval);
if ( seen_ordering ) {
*code = LDAP_SCHERR_DUPOPT;
ldap_attributetype_free(at);
return NULL;
}
- } else if ( !strcmp(sval,"SUBSTR") ) {
+ } else if ( !strcasecmp(sval,"SUBSTR") ) {
LDAP_FREE(sval);
if ( seen_substr ) {
*code = LDAP_SCHERR_DUPOPT;
ldap_attributetype_free(at);
return NULL;
}
- } else if ( !strcmp(sval,"SYNTAX") ) {
+ } else if ( !strcasecmp(sval,"SYNTAX") ) {
LDAP_FREE(sval);
if ( seen_syntax ) {
*code = LDAP_SCHERR_DUPOPT;
}
}
parse_whsp(&ss);
- } else if ( !strcmp(sval,"SINGLE-VALUE") ) {
+ } else if ( !strcasecmp(sval,"SINGLE-VALUE") ) {
LDAP_FREE(sval);
if ( at->at_single_value ) {
*code = LDAP_SCHERR_DUPOPT;
}
at->at_single_value = LDAP_SCHEMA_YES;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"COLLECTIVE") ) {
+ } else if ( !strcasecmp(sval,"COLLECTIVE") ) {
LDAP_FREE(sval);
if ( at->at_collective ) {
*code = LDAP_SCHERR_DUPOPT;
}
at->at_collective = LDAP_SCHEMA_YES;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"NO-USER-MODIFICATION") ) {
+ } else if ( !strcasecmp(sval,"NO-USER-MODIFICATION") ) {
LDAP_FREE(sval);
if ( at->at_no_user_mod ) {
*code = LDAP_SCHERR_DUPOPT;
}
at->at_no_user_mod = LDAP_SCHEMA_YES;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"USAGE") ) {
+ } else if ( !strcasecmp(sval,"USAGE") ) {
LDAP_FREE(sval);
if ( seen_usage ) {
*code = LDAP_SCHERR_DUPOPT;
ss = savepos;
kind = get_token(&ss,&sval);
if ( kind == TK_BAREWORD ) {
- if ( !strcmp(sval, "NAME") ||
- !strcmp(sval, "DESC") ||
- !strcmp(sval, "OBSOLETE") ||
- !strcmp(sval, "SUP") ||
- !strcmp(sval, "ABSTRACT") ||
- !strcmp(sval, "STRUCTURAL") ||
- !strcmp(sval, "AUXILIARY") ||
- !strcmp(sval, "MUST") ||
- !strcmp(sval, "MAY") ||
- !strncmp(sval, "X-", 2) ) {
+ if ( !strcasecmp(sval, "NAME") ||
+ !strcasecmp(sval, "DESC") ||
+ !strcasecmp(sval, "OBSOLETE") ||
+ !strcasecmp(sval, "SUP") ||
+ !strcasecmp(sval, "ABSTRACT") ||
+ !strcasecmp(sval, "STRUCTURAL") ||
+ !strcasecmp(sval, "AUXILIARY") ||
+ !strcasecmp(sval, "MUST") ||
+ !strcasecmp(sval, "MAY") ||
+ !strncasecmp(sval, "X-", 2) ) {
/* Missing OID, backtrack */
ss = savepos;
} else if ( flags &
case TK_RIGHTPAREN:
return oc;
case TK_BAREWORD:
- if ( !strcmp(sval,"NAME") ) {
+ if ( !strcasecmp(sval,"NAME") ) {
LDAP_FREE(sval);
if ( seen_name ) {
*code = LDAP_SCHERR_DUPOPT;
ldap_objectclass_free(oc);
return NULL;
}
- } else if ( !strcmp(sval,"DESC") ) {
+ } else if ( !strcasecmp(sval,"DESC") ) {
LDAP_FREE(sval);
if ( seen_desc ) {
*code = LDAP_SCHERR_DUPOPT;
}
oc->oc_desc = sval;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"OBSOLETE") ) {
+ } else if ( !strcasecmp(sval,"OBSOLETE") ) {
LDAP_FREE(sval);
if ( seen_obsolete ) {
*code = LDAP_SCHERR_DUPOPT;
seen_obsolete = 1;
oc->oc_obsolete = LDAP_SCHEMA_YES;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"SUP") ) {
+ } else if ( !strcasecmp(sval,"SUP") ) {
LDAP_FREE(sval);
if ( seen_sup ) {
*code = LDAP_SCHERR_DUPOPT;
ldap_objectclass_free(oc);
return NULL;
}
- } else if ( !strcmp(sval,"ABSTRACT") ) {
+ } else if ( !strcasecmp(sval,"ABSTRACT") ) {
LDAP_FREE(sval);
if ( seen_kind ) {
*code = LDAP_SCHERR_DUPOPT;
seen_kind = 1;
oc->oc_kind = LDAP_SCHEMA_ABSTRACT;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"STRUCTURAL") ) {
+ } else if ( !strcasecmp(sval,"STRUCTURAL") ) {
LDAP_FREE(sval);
if ( seen_kind ) {
*code = LDAP_SCHERR_DUPOPT;
seen_kind = 1;
oc->oc_kind = LDAP_SCHEMA_STRUCTURAL;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"AUXILIARY") ) {
+ } else if ( !strcasecmp(sval,"AUXILIARY") ) {
LDAP_FREE(sval);
if ( seen_kind ) {
*code = LDAP_SCHERR_DUPOPT;
seen_kind = 1;
oc->oc_kind = LDAP_SCHEMA_AUXILIARY;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"MUST") ) {
+ } else if ( !strcasecmp(sval,"MUST") ) {
LDAP_FREE(sval);
if ( seen_must ) {
*code = LDAP_SCHERR_DUPOPT;
return NULL;
}
parse_whsp(&ss);
- } else if ( !strcmp(sval,"MAY") ) {
+ } else if ( !strcasecmp(sval,"MAY") ) {
LDAP_FREE(sval);
if ( seen_may ) {
*code = LDAP_SCHERR_DUPOPT;
savepos = ss;
cr->cr_oid = ldap_int_parse_numericoid(&ss,code,0);
if ( !cr->cr_oid ) {
- *errp = ss;
- ldap_contentrule_free(cr);
- return NULL;
+ if ( (flags & LDAP_SCHEMA_ALLOW_ALL) && (ss == savepos) ) {
+ /* Backtracking */
+ ss = savepos;
+ kind = get_token(&ss,&sval);
+ if ( kind == TK_BAREWORD ) {
+ if ( !strcasecmp(sval, "NAME") ||
+ !strcasecmp(sval, "DESC") ||
+ !strcasecmp(sval, "OBSOLETE") ||
+ !strcasecmp(sval, "AUX") ||
+ !strcasecmp(sval, "MUST") ||
+ !strcasecmp(sval, "MAY") ||
+ !strcasecmp(sval, "NOT") ||
+ !strncasecmp(sval, "X-", 2) ) {
+ /* Missing OID, backtrack */
+ ss = savepos;
+ } else if ( flags &
+ LDAP_SCHEMA_ALLOW_OID_MACRO ) {
+ /* Non-numerical OID, ignore */
+ int len = ss-savepos;
+ cr->cr_oid = LDAP_MALLOC(len+1);
+ strncpy(cr->cr_oid, savepos, len);
+ cr->cr_oid[len] = 0;
+ }
+ }
+ LDAP_FREE(sval);
+ } else {
+ *errp = ss;
+ ldap_contentrule_free(cr);
+ return NULL;
+ }
}
parse_whsp(&ss);
case TK_RIGHTPAREN:
return cr;
case TK_BAREWORD:
- if ( !strcmp(sval,"NAME") ) {
+ if ( !strcasecmp(sval,"NAME") ) {
LDAP_FREE(sval);
if ( seen_name ) {
*code = LDAP_SCHERR_DUPOPT;
ldap_contentrule_free(cr);
return NULL;
}
- } else if ( !strcmp(sval,"DESC") ) {
+ } else if ( !strcasecmp(sval,"DESC") ) {
LDAP_FREE(sval);
if ( seen_desc ) {
*code = LDAP_SCHERR_DUPOPT;
}
cr->cr_desc = sval;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"OBSOLETE") ) {
+ } else if ( !strcasecmp(sval,"OBSOLETE") ) {
LDAP_FREE(sval);
if ( seen_obsolete ) {
*code = LDAP_SCHERR_DUPOPT;
seen_obsolete = 1;
cr->cr_obsolete = LDAP_SCHEMA_YES;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"AUX") ) {
+ } else if ( !strcasecmp(sval,"AUX") ) {
LDAP_FREE(sval);
if ( seen_aux ) {
*code = LDAP_SCHERR_DUPOPT;
return NULL;
}
parse_whsp(&ss);
- } else if ( !strcmp(sval,"MUST") ) {
+ } else if ( !strcasecmp(sval,"MUST") ) {
LDAP_FREE(sval);
if ( seen_must ) {
*code = LDAP_SCHERR_DUPOPT;
return NULL;
}
parse_whsp(&ss);
- } else if ( !strcmp(sval,"MAY") ) {
+ } else if ( !strcasecmp(sval,"MAY") ) {
LDAP_FREE(sval);
if ( seen_may ) {
*code = LDAP_SCHERR_DUPOPT;
return NULL;
}
parse_whsp(&ss);
- } else if ( !strcmp(sval,"NOT") ) {
+ } else if ( !strcasecmp(sval,"NOT") ) {
LDAP_FREE(sval);
if ( seen_not ) {
*code = LDAP_SCHERR_DUPOPT;
}
return sr;
case TK_BAREWORD:
- if ( !strcmp(sval,"NAME") ) {
+ if ( !strcasecmp(sval,"NAME") ) {
LDAP_FREE(sval);
if ( seen_name ) {
*code = LDAP_SCHERR_DUPOPT;
ldap_structurerule_free(sr);
return NULL;
}
- } else if ( !strcmp(sval,"DESC") ) {
+ } else if ( !strcasecmp(sval,"DESC") ) {
LDAP_FREE(sval);
if ( seen_desc ) {
*code = LDAP_SCHERR_DUPOPT;
}
sr->sr_desc = sval;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"OBSOLETE") ) {
+ } else if ( !strcasecmp(sval,"OBSOLETE") ) {
LDAP_FREE(sval);
if ( seen_obsolete ) {
*code = LDAP_SCHERR_DUPOPT;
seen_obsolete = 1;
sr->sr_obsolete = LDAP_SCHEMA_YES;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"FORM") ) {
+ } else if ( !strcasecmp(sval,"FORM") ) {
LDAP_FREE(sval);
if ( seen_nameform ) {
*code = LDAP_SCHERR_DUPOPT;
}
return nf;
case TK_BAREWORD:
- if ( !strcmp(sval,"NAME") ) {
+ if ( !strcasecmp(sval,"NAME") ) {
LDAP_FREE(sval);
if ( seen_name ) {
*code = LDAP_SCHERR_DUPOPT;
ldap_nameform_free(nf);
return NULL;
}
- } else if ( !strcmp(sval,"DESC") ) {
+ } else if ( !strcasecmp(sval,"DESC") ) {
LDAP_FREE(sval);
if ( seen_desc ) {
*code = LDAP_SCHERR_DUPOPT;
}
nf->nf_desc = sval;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"OBSOLETE") ) {
+ } else if ( !strcasecmp(sval,"OBSOLETE") ) {
LDAP_FREE(sval);
if ( seen_obsolete ) {
*code = LDAP_SCHERR_DUPOPT;
seen_obsolete = 1;
nf->nf_obsolete = LDAP_SCHEMA_YES;
parse_whsp(&ss);
- } else if ( !strcmp(sval,"MUST") ) {
+ } else if ( !strcasecmp(sval,"MUST") ) {
LDAP_FREE(sval);
if ( seen_must ) {
*code = LDAP_SCHERR_DUPOPT;
return NULL;
}
parse_whsp(&ss);
- } else if ( !strcmp(sval,"MAY") ) {
+ } else if ( !strcasecmp(sval,"MAY") ) {
LDAP_FREE(sval);
if ( seen_may ) {
*code = LDAP_SCHERR_DUPOPT;