windows-nt/Source/XPSP1/NT/ds/security/tools/keytab2/opt/nonnull.c
2020-09-26 16:20:57 +08:00

149 lines
2.9 KiB
C

/*++
NONNULL.C
Code for finding unused OPT_NONNULLs
Copyright (C) 1997 Microsoft Corporation
Created, 6/10/1997 by DavidCHR
--*/
#include "private.h"
BOOL
FindUnusedOptions( optionStruct *options,
ULONG flags,
/* OPTIONAL */ PCHAR prefix,
PSAVEQUEUE pQueue ) {
PCHAR newprefix;
BOOL freeprefix;
BOOL ret = TRUE;
ULONG i;
for ( i = 0 ; !ARRAY_TERMINATED( options+i ); i++ ) {
if ( ( options[i].flags & OPT_MUTEX_MASK ) == OPT_SUBOPTION ) {
OPTIONS_DEBUG( "%s: OPT_SUBSTRUCT. ", options[i].cmd );
if (options[i].flags & OPT_RECURSE ) {
/* suboptions must be reparsed. we recurse on this structure,
copying the prefix into a newly allocated buffer. */
OPTIONS_DEBUG( "descending into substructure.\n" );
/* allocate the new prefix */
if ( prefix ) {
/* oldprefix:optionname = newprefix */
newprefix = (PCHAR) malloc( ( strlen( prefix ) +
strlen( options[i].cmd ) +
2 /* : and \0 */ ) *
sizeof( CHAR ) );
if ( !newprefix ) {
fprintf( stderr, "Failed to allocate new prefix-- cannot "
"parse suboption %s:%s.\n", prefix, options[i].cmd );
return FALSE;
}
sprintf( newprefix, "%s:%s", prefix, options[i].cmd );
freeprefix = TRUE;
} else {
/* optionname = prefix */
newprefix = options[i].cmd;
freeprefix = FALSE;
}
ASSERT( newprefix != NULL );
if ( !FindUnusedOptions( POPTU_CAST( options[i] )->optStruct,
flags,
newprefix,
pQueue ) ) {
ret = FALSE;
}
if ( freeprefix ) {
free( newprefix );
}
} else {
OPTIONS_DEBUG( "!OPT_RECURSE, so not descending.\n" );
}
continue;
}
if ( ( options[i].flags & OPT_NONNULL ) ||
( options [i].flags & OPT_ENVIRONMENT ) ) {
OPTIONS_DEBUG( "%s: OPT_NONNULL or OPT_ENV. pointer is 0x%x, ",
options[i].cmd,
POPTU_CAST( options[i] )->raw_data );
if ( *(POPTU_CAST( options[i] )->raw_data) == NULL ) {
OPTIONS_DEBUG( " *= NULL.\n" );
if ( ( options[i].flags & OPT_ENVIRONMENT ) &&
StoreEnvironmentOption( options+i, flags, pQueue ) ) {
OPTIONS_DEBUG( "found environment variable for %s...",
options[i].cmd );
} else if ( options[i].flags & OPT_NONNULL ) {
if ( prefix ) {
fprintf( stderr,
"option %s:%s must be specified and is missing.\n",
prefix, options[i].cmd );
} else {
fprintf( stderr,
"option %s must be specified and is missing.\n",
options[i].cmd );
}
ret = FALSE;
}
} else {
OPTIONS_DEBUG( "data is not null.\n" );
}
}
#if 0 // not really necessary debug info.
else if ( options[i].cmd ) {
OPTIONS_DEBUG( "%s is ok.\n", options[i].cmd );
}
#endif
}
return ret;
}