mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-30 13:30:57 +08:00
*oc support in attr list
This commit is contained in:
parent
d600afca9f
commit
ffbb5d4ed2
@ -89,6 +89,10 @@ static int add_syncrepl LDAP_P(( Backend *, char **, int ));
|
|||||||
static int parse_syncrepl_line LDAP_P(( char **, int, syncinfo_t *));
|
static int parse_syncrepl_line LDAP_P(( char **, int, syncinfo_t *));
|
||||||
|
|
||||||
static int get_attrs_from_file LDAP_P(( char ***, const char *, const char * ));
|
static int get_attrs_from_file LDAP_P(( char ***, const char *, const char * ));
|
||||||
|
static int get_ocs_from_file LDAP_P((
|
||||||
|
ObjectClass ***, const char *, const char *));
|
||||||
|
static char **str2attrs( char ***, char *, const char * );
|
||||||
|
static ObjectClass **str2ocs( ObjectClass ***, char *, const char * );
|
||||||
|
|
||||||
int
|
int
|
||||||
read_config( const char *fname, int depth )
|
read_config( const char *fname, int depth )
|
||||||
@ -2280,6 +2284,8 @@ add_syncrepl(
|
|||||||
si->si_attrsonly = 0;
|
si->si_attrsonly = 0;
|
||||||
si->si_attrs = (char **) ch_calloc( 1, sizeof( char * ));
|
si->si_attrs = (char **) ch_calloc( 1, sizeof( char * ));
|
||||||
si->si_attrs[0] = NULL;
|
si->si_attrs[0] = NULL;
|
||||||
|
si->si_ocs = (ObjectClass **) ch_calloc( 1, sizeof( ObjectClass ));
|
||||||
|
si->si_ocs[0] = NULL;
|
||||||
si->si_exattrs = (char **) ch_calloc( 1, sizeof( char * ));
|
si->si_exattrs = (char **) ch_calloc( 1, sizeof( char * ));
|
||||||
si->si_exattrs[0] = NULL;
|
si->si_exattrs[0] = NULL;
|
||||||
si->si_type = LDAP_SYNC_REFRESH_ONLY;
|
si->si_type = LDAP_SYNC_REFRESH_ONLY;
|
||||||
@ -2543,9 +2549,14 @@ parse_syncrepl_line(
|
|||||||
ch_free( attr_fname );
|
ch_free( attr_fname );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if ( get_ocs_from_file( &si->si_ocs, attr_fname, " ,\t" )) {
|
||||||
|
ch_free( attr_fname );
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
ch_free( attr_fname );
|
ch_free( attr_fname );
|
||||||
} else {
|
} else {
|
||||||
str2clist( &si->si_attrs, val, " ,\t" );
|
str2attrs( &si->si_attrs, val, " ,\t" );
|
||||||
|
str2ocs( &si->si_ocs, val, " ,\t" );
|
||||||
}
|
}
|
||||||
} else if ( !strncasecmp( cargv[ i ],
|
} else if ( !strncasecmp( cargv[ i ],
|
||||||
EXATTRSSTR, sizeof( EXATTRSSTR ) - 1 ) )
|
EXATTRSSTR, sizeof( EXATTRSSTR ) - 1 ) )
|
||||||
@ -2561,7 +2572,7 @@ parse_syncrepl_line(
|
|||||||
}
|
}
|
||||||
ch_free( attr_fname );
|
ch_free( attr_fname );
|
||||||
} else {
|
} else {
|
||||||
str2clist( &si->si_exattrs, val, " ,\t" );
|
str2attrs( &si->si_exattrs, val, " ,\t" );
|
||||||
}
|
}
|
||||||
} else if ( !strncasecmp( cargv[ i ],
|
} else if ( !strncasecmp( cargv[ i ],
|
||||||
TYPESTR, sizeof( TYPESTR ) - 1 ) )
|
TYPESTR, sizeof( TYPESTR ) - 1 ) )
|
||||||
@ -2644,7 +2655,7 @@ parse_syncrepl_line(
|
|||||||
retry_list = (char **) ch_calloc( 1, sizeof( char * ));
|
retry_list = (char **) ch_calloc( 1, sizeof( char * ));
|
||||||
retry_list[0] = NULL;
|
retry_list[0] = NULL;
|
||||||
|
|
||||||
str2clist( &retry_list, val, " ,\t" );
|
slap_str2clist( &retry_list, val, " ,\t" );
|
||||||
|
|
||||||
for ( k = 0; retry_list && retry_list[k]; k++ ) ;
|
for ( k = 0; retry_list && retry_list[k]; k++ ) ;
|
||||||
n = k / 2;
|
n = k / 2;
|
||||||
@ -2710,8 +2721,130 @@ parse_syncrepl_line(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ObjectClass **
|
||||||
|
str2ocs( ObjectClass ***out, char *in, const char *brkstr )
|
||||||
|
{
|
||||||
|
char **clist;
|
||||||
|
int i, k = 0;
|
||||||
|
ObjectClass *oc;
|
||||||
|
|
||||||
|
clist = (char **) ch_calloc( 1, sizeof( char *));
|
||||||
|
clist[0] = NULL;
|
||||||
|
|
||||||
|
slap_str2clist( &clist, in, brkstr );
|
||||||
|
|
||||||
|
for ( i = 0; clist && clist[i]; i++ ) {
|
||||||
|
struct berval ocbv;
|
||||||
|
if (*clist[i] == '@' ) {
|
||||||
|
ber_str2bv( clist[i]+1, strlen(clist[i]+1), 1, &ocbv );
|
||||||
|
oc = oc_bvfind( &ocbv );
|
||||||
|
if ( oc ) {
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ch_free( ocbv.bv_val );
|
||||||
|
}
|
||||||
|
|
||||||
|
*out = ch_realloc( *out, (k + 1) * sizeof( ObjectClass *));
|
||||||
|
|
||||||
|
for ( i = 0; clist && clist[i]; i++ ) {
|
||||||
|
struct berval ocbv;
|
||||||
|
if (*clist[i] == '@' ) {
|
||||||
|
ber_str2bv( clist[i]+1, strlen(clist[i]+1), 1, &ocbv );
|
||||||
|
(*out)[i] = oc_bvfind( &ocbv );
|
||||||
|
}
|
||||||
|
ch_free( ocbv.bv_val );
|
||||||
|
}
|
||||||
|
|
||||||
|
(*out)[i] = NULL;
|
||||||
|
|
||||||
|
for ( i = 0; clist && clist[i]; i++ ) {
|
||||||
|
ch_free( clist[i] );
|
||||||
|
}
|
||||||
|
ch_free( clist );
|
||||||
|
|
||||||
|
return (*out);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char **
|
||||||
|
str2attrs( char ***out, char *in, const char *brkstr )
|
||||||
|
{
|
||||||
|
int i, j = 0, k = 0, l = 0;
|
||||||
|
ObjectClass *oc;
|
||||||
|
|
||||||
|
slap_str2clist( out, in , brkstr );
|
||||||
|
|
||||||
|
for ( i = 0; *out && (*out)[i]; i++ ) {
|
||||||
|
if ( *(*out)[i] == '@' ) {
|
||||||
|
struct berval ocbv;
|
||||||
|
ber_str2bv( (*out)[i]+1, strlen((*out)[i]+1), 1, &ocbv );
|
||||||
|
oc = oc_bvfind( &ocbv );
|
||||||
|
if ( oc ) {
|
||||||
|
k++;
|
||||||
|
for ( j = 0; oc->soc_required && oc->soc_required[j]; j++ );
|
||||||
|
l += j;
|
||||||
|
for ( j = 0; oc->soc_allowed && oc->soc_allowed[j]; j++ );
|
||||||
|
l += j;
|
||||||
|
}
|
||||||
|
ch_free( ocbv.bv_val );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*out = ch_realloc( *out, (i - k + l + 1) * sizeof( char * ));
|
||||||
|
|
||||||
|
for ( i = 0; *out && (*out)[i]; i++ ) {
|
||||||
|
retest1:
|
||||||
|
if ( *(*out)[i] == '@' ) {
|
||||||
|
struct berval ocbv;
|
||||||
|
ber_str2bv( (*out)[i]+1, strlen((*out)[i]+1), 1, &ocbv );
|
||||||
|
oc = oc_bvfind( &ocbv );
|
||||||
|
for ( k = i; (*out)[k]; k++ ) {
|
||||||
|
if ( k == i )
|
||||||
|
ch_free( (*out)[i] );
|
||||||
|
(*out)[k] = (*out)[k+1];
|
||||||
|
}
|
||||||
|
k--;
|
||||||
|
if ( oc ) {
|
||||||
|
for ( j = 0; oc->soc_required && oc->soc_required[j]; j++ ) {
|
||||||
|
(*out)[k++] = ch_strdup(
|
||||||
|
oc->soc_required[j]->sat_cname.bv_val );
|
||||||
|
}
|
||||||
|
for ( j = 0; oc->soc_allowed && oc->soc_allowed[j]; j++ ) {
|
||||||
|
(*out)[k++] = ch_strdup(
|
||||||
|
oc->soc_allowed[j]->sat_cname.bv_val );
|
||||||
|
}
|
||||||
|
(*out)[k] = NULL;
|
||||||
|
}
|
||||||
|
ch_free( ocbv.bv_val );
|
||||||
|
goto retest1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( i = 0; *out && (*out)[i]; i++ ) {
|
||||||
|
for ( j = i+1; *out && (*out)[j]; j++ ) {
|
||||||
|
retest2:
|
||||||
|
if ( !strcmp( (*out)[i], (*out)[j] )) {
|
||||||
|
ch_free( (*out)[j] );
|
||||||
|
for ( k = j; (*out)[k]; k++ ) {
|
||||||
|
(*out)[k] = (*out)[k+1];
|
||||||
|
}
|
||||||
|
if ( (*out)[j] != NULL )
|
||||||
|
goto retest2;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( i = 0; *out && (*out)[i]; i++ );
|
||||||
|
|
||||||
|
*out = ch_realloc( *out, (i + 1) * sizeof( char * ));
|
||||||
|
|
||||||
|
return (*out);
|
||||||
|
}
|
||||||
|
|
||||||
char **
|
char **
|
||||||
str2clist( char ***out, char *in, const char *brkstr )
|
slap_str2clist( char ***out, char *in, const char *brkstr )
|
||||||
{
|
{
|
||||||
char *str;
|
char *str;
|
||||||
char *s;
|
char *s;
|
||||||
@ -2755,7 +2888,7 @@ str2clist( char ***out, char *in, const char *brkstr )
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define LBUFSIZ 80
|
#define LBUFSIZ 80
|
||||||
int
|
static int
|
||||||
get_attrs_from_file( char ***attrs, const char *fname, const char *brkstr )
|
get_attrs_from_file( char ***attrs, const char *fname, const char *brkstr )
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
@ -2803,10 +2936,69 @@ get_attrs_from_file( char ***attrs, const char *fname, const char *brkstr )
|
|||||||
lcur = line + strlen( line );
|
lcur = line + strlen( line );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
str2clist( attrs, line, brkstr );
|
str2attrs( attrs, line, brkstr );
|
||||||
lcur = line;
|
lcur = line;
|
||||||
}
|
}
|
||||||
ch_free( line );
|
ch_free( line );
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#undef LBUFSIZ
|
||||||
|
|
||||||
|
#define LBUFSIZ 80
|
||||||
|
static int
|
||||||
|
get_ocs_from_file( ObjectClass ***ocs, const char *fname, const char *brkstr )
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
char *line = NULL;
|
||||||
|
char *lcur = NULL;
|
||||||
|
char *c;
|
||||||
|
size_t lmax = LBUFSIZ;
|
||||||
|
|
||||||
|
fp = fopen( fname, "r" );
|
||||||
|
if ( fp == NULL ) {
|
||||||
|
Debug( LDAP_DEBUG_ANY,
|
||||||
|
"get_ocs_from_file: failed to open attribute list file "
|
||||||
|
"\"%s\": %s\n", fname, strerror(errno), 0 );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
lcur = line = (char *) ch_malloc( lmax );
|
||||||
|
if ( !line ) {
|
||||||
|
Debug( LDAP_DEBUG_ANY,
|
||||||
|
"get_ocs_from_file: could not allocate memory\n",
|
||||||
|
0, 0, 0 );
|
||||||
|
fclose(fp);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ( fgets( lcur, LBUFSIZ, fp ) != NULL ) {
|
||||||
|
if (c = strchr( lcur, '\n' )) {
|
||||||
|
if ( c == line ) {
|
||||||
|
*c = '\0';
|
||||||
|
} else if ( *(c-1) == '\r' ) {
|
||||||
|
*(c-1) = '\0';
|
||||||
|
} else {
|
||||||
|
*c = '\0';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lmax += LBUFSIZ;
|
||||||
|
line = (char *) ch_realloc( line, lmax );
|
||||||
|
if ( !line ) {
|
||||||
|
Debug( LDAP_DEBUG_ANY,
|
||||||
|
"get_ocs_from_file: could not allocate memory\n",
|
||||||
|
0, 0, 0 );
|
||||||
|
fclose(fp);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
lcur = line + strlen( line );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
str2ocs( ocs, line, brkstr );
|
||||||
|
lcur = line;
|
||||||
|
}
|
||||||
|
ch_free( line );
|
||||||
|
fclose(fp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#undef LBUFSIZ
|
||||||
|
@ -366,7 +366,10 @@ LDAP_SLAPD_F (int) get_supported_controls LDAP_P (( char ***ctrloidsp, slap_mask
|
|||||||
*/
|
*/
|
||||||
LDAP_SLAPD_F (int) read_config LDAP_P(( const char *fname, int depth ));
|
LDAP_SLAPD_F (int) read_config LDAP_P(( const char *fname, int depth ));
|
||||||
LDAP_SLAPD_F (void) config_destroy LDAP_P ((void));
|
LDAP_SLAPD_F (void) config_destroy LDAP_P ((void));
|
||||||
LDAP_SLAPD_F (char **) str2clist LDAP_P(( char ***, char *, const char * ));
|
LDAP_SLAPD_F (char **) slap_str2clist LDAP_P((
|
||||||
|
char ***,
|
||||||
|
char *,
|
||||||
|
const char * ));
|
||||||
#ifdef LDAP_SLAPI
|
#ifdef LDAP_SLAPI
|
||||||
LDAP_SLAPD_V (int) slapi_plugins_used;
|
LDAP_SLAPD_V (int) slapi_plugins_used;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1444,6 +1444,7 @@ typedef struct syncinfo_s {
|
|||||||
int si_scope;
|
int si_scope;
|
||||||
int si_attrsonly;
|
int si_attrsonly;
|
||||||
char **si_attrs;
|
char **si_attrs;
|
||||||
|
ObjectClass **si_ocs;
|
||||||
char **si_exattrs;
|
char **si_exattrs;
|
||||||
int si_type;
|
int si_type;
|
||||||
time_t si_interval;
|
time_t si_interval;
|
||||||
|
@ -190,7 +190,7 @@ slap_tool_init(
|
|||||||
usage( tool, progname );
|
usage( tool, progname );
|
||||||
exit( EXIT_FAILURE );
|
exit( EXIT_FAILURE );
|
||||||
}
|
}
|
||||||
str2clist( &replica_id_strlist, replica_id_string, "," );
|
slap_str2clist( &replica_id_strlist, replica_id_string, "," );
|
||||||
for ( i = 0; replica_id_strlist && replica_id_strlist[i]; i++ ) ;
|
for ( i = 0; replica_id_strlist && replica_id_strlist[i]; i++ ) ;
|
||||||
replica_id_list = ch_calloc( i + 1, sizeof( int ) );
|
replica_id_list = ch_calloc( i + 1, sizeof( int ) );
|
||||||
for ( i = 0; replica_id_strlist && replica_id_strlist[i]; i++ ) {
|
for ( i = 0; replica_id_strlist && replica_id_strlist[i]; i++ ) {
|
||||||
|
@ -52,7 +52,7 @@ struct runqueue_s syncrepl_rq;
|
|||||||
void
|
void
|
||||||
init_syncrepl(syncinfo_t *si)
|
init_syncrepl(syncinfo_t *si)
|
||||||
{
|
{
|
||||||
int i, j, k, n;
|
int i, j, k, l, n;
|
||||||
char **tmp;
|
char **tmp;
|
||||||
|
|
||||||
if ( !sync_descs[0] ) {
|
if ( !sync_descs[0] ) {
|
||||||
@ -71,8 +71,9 @@ init_syncrepl(syncinfo_t *si)
|
|||||||
if ( strcmp( si->si_attrs[j], sync_descs[i]->ad_cname.bv_val )
|
if ( strcmp( si->si_attrs[j], sync_descs[i]->ad_cname.bv_val )
|
||||||
== 0 )
|
== 0 )
|
||||||
{
|
{
|
||||||
ch_free( si->si_attrs[j] );
|
|
||||||
for ( k = j; si->si_attrs[k] != NULL; k++ ) {
|
for ( k = j; si->si_attrs[k] != NULL; k++ ) {
|
||||||
|
if ( k == j )
|
||||||
|
ch_free( si->si_attrs[k] );
|
||||||
si->si_attrs[k] = si->si_attrs[k+1];
|
si->si_attrs[k] = si->si_attrs[k+1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -110,13 +111,28 @@ init_syncrepl(syncinfo_t *si)
|
|||||||
if ( strcmp( si->si_exattrs[j], sync_descs[i]->ad_cname.bv_val )
|
if ( strcmp( si->si_exattrs[j], sync_descs[i]->ad_cname.bv_val )
|
||||||
== 0 )
|
== 0 )
|
||||||
{
|
{
|
||||||
ch_free( si->si_exattrs[j] );
|
|
||||||
for ( k = j; si->si_exattrs[k] != NULL; k++ ) {
|
for ( k = j; si->si_exattrs[k] != NULL; k++ ) {
|
||||||
|
if ( k == j )
|
||||||
|
ch_free( si->si_exattrs[k] );
|
||||||
si->si_exattrs[k] = si->si_exattrs[k+1];
|
si->si_exattrs[k] = si->si_exattrs[k+1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for ( i = 0; si->si_exattrs[i] != NULL; i++ ) {
|
||||||
|
for ( j = 0; si->si_ocs[j]; j++ ) {
|
||||||
|
for ( k = 0; si->si_ocs[j]->soc_required[k]; k++ ) {
|
||||||
|
if (!strcmp( si->si_exattrs[i],
|
||||||
|
si->si_ocs[j]->soc_required[k]->sat_cname.bv_val )) {
|
||||||
|
for ( l = i; si->si_exattrs[l] != NULL; l++ ) {
|
||||||
|
if ( l == i )
|
||||||
|
ch_free( si->si_exattrs[l] );
|
||||||
|
si->si_exattrs[l] = si->si_exattrs[l+1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2033,6 +2049,9 @@ syncinfo_free( syncinfo_t *sie )
|
|||||||
}
|
}
|
||||||
ch_free( sie->si_attrs );
|
ch_free( sie->si_attrs );
|
||||||
}
|
}
|
||||||
|
if ( sie->si_ocs ) {
|
||||||
|
ch_free( sie->si_ocs );
|
||||||
|
}
|
||||||
if ( sie->si_exattrs ) {
|
if ( sie->si_exattrs ) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while ( sie->si_exattrs[i] != NULL ) {
|
while ( sie->si_exattrs[i] != NULL ) {
|
||||||
|
Loading…
Reference in New Issue
Block a user