Improved ucdata loading error handling

This commit is contained in:
Stig Venaas 2000-11-09 12:39:18 +00:00
parent ba37cbc233
commit b44cc963c2
3 changed files with 102 additions and 50 deletions

View File

@ -110,7 +110,10 @@ static unsigned long _ucprop_size;
static unsigned short *_ucprop_offsets;
static unsigned long *_ucprop_ranges;
static void
/*
* Return -1 on error, 0 if okay
*/
static int
_ucprop_load(char *paths, int reload)
{
FILE *in;
@ -122,7 +125,7 @@ _ucprop_load(char *paths, int reload)
/*
* The character properties have already been loaded.
*/
return;
return 0;
/*
* Unload the current character property data in preparation for
@ -135,7 +138,7 @@ _ucprop_load(char *paths, int reload)
}
if ((in = _ucopenfile(paths, "ctype.dat", "rb")) == 0)
return;
return -1;
/*
* Load the header.
@ -149,7 +152,7 @@ _ucprop_load(char *paths, int reload)
if ((_ucprop_size = hdr.cnt) == 0) {
fclose(in);
return;
return -1;
}
/*
@ -198,6 +201,7 @@ _ucprop_load(char *paths, int reload)
for (i = 0; i < _ucprop_offsets[_ucprop_size]; i++)
_ucprop_ranges[i] = endian_long(_ucprop_ranges[i]);
}
return 0;
}
static void
@ -284,7 +288,10 @@ static unsigned long _uccase_size;
static unsigned short _uccase_len[2];
static unsigned long *_uccase_map;
static void
/*
* Return -1 on error, 0 if okay
*/
static int
_uccase_load(char *paths, int reload)
{
FILE *in;
@ -296,14 +303,14 @@ _uccase_load(char *paths, int reload)
/*
* The case mappings have already been loaded.
*/
return;
return 0;
free((char *) _uccase_map);
_uccase_size = 0;
}
if ((in = _ucopenfile(paths, "case.dat", "rb")) == 0)
return;
return -1;
/*
* Load the header.
@ -339,6 +346,7 @@ _uccase_load(char *paths, int reload)
for (i = 0; i < _uccase_size; i++)
_uccase_map[i] = endian_long(_uccase_map[i]);
}
return 0;
}
static void
@ -471,7 +479,10 @@ static unsigned long _ucdcmp_size;
static unsigned long *_ucdcmp_nodes;
static unsigned long *_ucdcmp_decomp;
static void
/*
* Return -1 on error, 0 if okay
*/
static int
_ucdcmp_load(char *paths, int reload)
{
FILE *in;
@ -483,14 +494,14 @@ _ucdcmp_load(char *paths, int reload)
/*
* The decompositions have already been loaded.
*/
return;
return 0;
free((char *) _ucdcmp_nodes);
_ucdcmp_size = 0;
}
if ((in = _ucopenfile(paths, "decomp.dat", "rb")) == 0)
return;
return -1;
/*
* Load the header.
@ -518,7 +529,8 @@ _ucdcmp_load(char *paths, int reload)
if (hdr.bom == 0xfffe) {
for (i = 0; i < size; i++)
_ucdcmp_nodes[i] = endian_long(_ucdcmp_nodes[i]);
}
}
return 0;
}
static void
@ -587,7 +599,10 @@ ucdecomp_hangul(unsigned long code, unsigned long *num, unsigned long decomp[])
static unsigned long _uccmcl_size;
static unsigned long *_uccmcl_nodes;
static void
/*
* Return -1 on error, 0 if okay
*/
static int
_uccmcl_load(char *paths, int reload)
{
FILE *in;
@ -599,14 +614,14 @@ _uccmcl_load(char *paths, int reload)
/*
* The combining classes have already been loaded.
*/
return;
return 0;
free((char *) _uccmcl_nodes);
_uccmcl_size = 0;
}
if ((in = _ucopenfile(paths, "cmbcl.dat", "rb")) == 0)
return;
return -1;
/*
* Load the header.
@ -632,7 +647,8 @@ _uccmcl_load(char *paths, int reload)
if (hdr.bom == 0xfffe) {
for (i = 0; i < _uccmcl_size; i++)
_uccmcl_nodes[i] = endian_long(_uccmcl_nodes[i]);
}
}
return 0;
}
static void
@ -676,7 +692,10 @@ static unsigned long *_ucnum_nodes;
static unsigned long _ucnum_size;
static short *_ucnum_vals;
void
/*
* Return -1 on error, 0 if okay
*/
static int
_ucnumb_load(char *paths, int reload)
{
FILE *in;
@ -688,14 +707,14 @@ _ucnumb_load(char *paths, int reload)
/*
* The numbers have already been loaded.
*/
return;
return 0;
free((char *) _ucnum_nodes);
_ucnum_size = 0;
}
if ((in = _ucopenfile(paths, "num.dat", "rb")) == 0)
return;
return -1;
/*
* Load the header.
@ -732,7 +751,8 @@ _ucnumb_load(char *paths, int reload)
for (i = 0; i < size; i++)
_ucnum_vals[i] = endian_short(_ucnum_vals[i]);
}
}
return 0;
}
static void
@ -845,19 +865,24 @@ ucgetdigit(unsigned long code)
*
**************************************************************************/
void
/*
* Return 0 if okay, negative on error
*/
int
ucdata_load(char *paths, int masks)
{
int error = 0;
if (masks & UCDATA_CTYPE)
_ucprop_load(paths, 0);
error |= _ucprop_load(paths, 0) < 0 ? UCDATA_CTYPE : 0;
if (masks & UCDATA_CASE)
_uccase_load(paths, 0);
error |= _uccase_load(paths, 0) < 0 ? UCDATA_CASE : 0;
if (masks & UCDATA_DECOMP)
_ucdcmp_load(paths, 0);
error |= _ucdcmp_load(paths, 0) < 0 ? UCDATA_DECOMP : 0;
if (masks & UCDATA_CMBCL)
_uccmcl_load(paths, 0);
error |= _uccmcl_load(paths, 0) < 0 ? UCDATA_CMBCL : 0;
if (masks & UCDATA_NUM)
_ucnumb_load(paths, 0);
error |= _ucnumb_load(paths, 0) < 0 ? UCDATA_NUM : 0;
return -error;
}
void
@ -875,19 +900,24 @@ ucdata_unload(int masks)
_ucnumb_unload();
}
void
/*
* Return 0 if okay, negative on error
*/
int
ucdata_reload(char *paths, int masks)
{
int error = 0;
if (masks & UCDATA_CTYPE)
_ucprop_load(paths, 1);
error |= _ucprop_load(paths, 1) < 0 ? UCDATA_CTYPE : 0;
if (masks & UCDATA_CASE)
_uccase_load(paths, 1);
error |= _uccase_load(paths, 1) < 0 ? UCDATA_CASE : 0;
if (masks & UCDATA_DECOMP)
_ucdcmp_load(paths, 1);
error |= _ucdcmp_load(paths, 1) < 0 ? UCDATA_DECOMP : 0;
if (masks & UCDATA_CMBCL)
_uccmcl_load(paths, 1);
error |= _uccmcl_load(paths, 1) < 0 ? UCDATA_CMBCL : 0;
if (masks & UCDATA_NUM)
_ucnumb_load(paths, 1);
error |= _ucnumb_load(paths, 1) < 0 ? UCDATA_NUM : 0;
return -error;
}
#ifdef TEST

View File

@ -286,9 +286,9 @@ extern int ucgetdigit __((unsigned long code));
/*
* Functions to load, unload, and reload specific data files.
*/
extern void ucdata_load __((char *paths, int mask));
extern int ucdata_load __((char *paths, int mask));
extern void ucdata_unload __((int mask));
extern void ucdata_reload __((char *paths, int mask));
extern int ucdata_reload __((char *paths, int mask));
#ifdef UCDATA_DEPRECATED
/*

View File

@ -208,7 +208,9 @@ read_config( const char *fname )
default_search_base = ch_strdup( cargv[1] );
default_search_nbase = ch_strdup( cargv[1] );
load_ucdata( NULL );
if ( load_ucdata( NULL ) < 0 ) {
return( 1 );
}
if( dn_normalize( default_search_nbase ) == NULL ) {
Debug( LDAP_DEBUG_ANY, "%s: line %d: "
"invalid default search base \"%s\"\n",
@ -351,6 +353,7 @@ read_config( const char *fname )
/* set UCDATA path */
} else if ( strcasecmp( cargv[0], "ucdata-path" ) == 0 ) {
int err;
if ( cargc < 2 ) {
Debug( LDAP_DEBUG_ANY,
"%s: line %d: missing path in \"ucdata-path <path>\" line\n",
@ -358,11 +361,14 @@ read_config( const char *fname )
return( 1 );
}
if ( load_ucdata( cargv[1] ) == 0 ) {
Debug( LDAP_DEBUG_ANY,
"%s: line %d: ucdata already loaded, ucdata-path must be set earlier in the file and/or be specified only once!\n",
fname, lineno, 0 );
return 1;
err = load_ucdata( cargv[1] );
if ( err <= 0 ) {
if ( err == 0 ) {
Debug( LDAP_DEBUG_ANY,
"%s: line %d: ucdata already loaded, ucdata-path must be set earlier in the file and/or be specified only once!\n",
fname, lineno, 0 );
}
return( 1 );
}
/* set time limit */
@ -420,7 +426,9 @@ read_config( const char *fname )
fname, lineno, tmp_be->be_suffix[0] );
} else {
char *dn = ch_strdup( cargv[1] );
load_ucdata( NULL );
if ( load_ucdata( NULL ) < 0 ) {
return( 1 );
}
if( dn_validate( dn ) == NULL ) {
Debug( LDAP_DEBUG_ANY, "%s: line %d: "
"suffix DN invalid \"%s\"\n",
@ -479,7 +487,9 @@ read_config( const char *fname )
char *alias, *aliased_dn;
alias = ch_strdup( cargv[1] );
load_ucdata( NULL );
if ( load_ucdata( NULL ) < 0 ) {
return( 1 );
}
(void) dn_normalize( alias );
aliased_dn = ch_strdup( cargv[2] );
@ -531,7 +541,9 @@ read_config( const char *fname )
be->be_root_dn = ch_strdup( cargv[1] );
be->be_root_ndn = ch_strdup( cargv[1] );
load_ucdata( NULL );
if ( load_ucdata( NULL ) < 0 ) {
return( 1 );
}
if( dn_normalize( be->be_root_ndn ) == NULL ) {
free( be->be_root_dn );
free( be->be_root_ndn );
@ -932,7 +944,9 @@ read_config( const char *fname )
fname, lineno, 0 );
} else {
be->be_update_ndn = ch_strdup( cargv[1] );
load_ucdata( NULL );
if ( load_ucdata( NULL ) < 0 ) {
return( 1 );
}
if( dn_normalize( be->be_update_ndn ) == NULL ) {
Debug( LDAP_DEBUG_ANY,
"%s: line %d: updatedn DN is invalid\n",
@ -1162,7 +1176,9 @@ read_config( const char *fname )
free( saveline );
}
fclose( fp );
load_ucdata( NULL );
if ( load_ucdata( NULL ) < 0 ) {
return( 1 );
}
return( 0 );
}
@ -1295,17 +1311,23 @@ fp_getline_init( int *lineno )
buf[0] = '\0';
}
/* Loads ucdata, returns 1 if loading, 0 if already loaded */
/* Loads ucdata, returns 1 if loading, 0 if already loaded, -1 on error */
static int
load_ucdata( char *path )
{
static int loaded = 0;
int err;
if ( loaded ) {
return 0;
return( 0 );
}
err = ucdata_load( path ? path : SLAPD_DEFAULT_UCDATA,
UCDATA_CASE|UCDATA_CTYPE|UCDATA_NUM );
if ( err ) {
Debug( LDAP_DEBUG_ANY, "error loading ucdata (error %d)\n",
err, 0, 0 );
return( -1 );
}
ucdata_load( path ? path : SLAPD_DEFAULT_UCDATA,
UCDATA_CASE|UCDATA_CTYPE|UCDATA_NUM );
loaded = 1;
return 1;
return( 1 );
}