Fixed crashing upon GNUSTEP_*_ROOT being unset; cache them; use a default

if GNUSTEP_SYSTEM_ROOT is not set; fixed memory leak


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@9672 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
nico 2001-04-23 11:29:18 +00:00
parent 9e8bb6adda
commit 44dc95e7e9

View file

@ -375,11 +375,12 @@ NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directoryKey,
NSSearchPathDomainMask domainMask, NSSearchPathDomainMask domainMask,
BOOL expandTilde) BOOL expandTilde)
{ {
NSDictionary *env; /* We read these four only once */
NSString *gnustep_user_root; static NSString *gnustep_user_root = nil; /* GNUSTEP_USER_ROOT */
NSString *gnustep_local_root; static NSString *gnustep_local_root = nil; /* GNUSTEP_LOCAL_ROOT */
NSString *gnustep_network_root; static NSString *gnustep_network_root = nil; /* GNUSTEP_NETWORK_ROOT */
NSString *gnustep_system_root; static NSString *gnustep_system_root = nil; /* GNUSTEP_SYSTEM_ROOT */
NSFileManager *fm;
NSString *adminDir = @"Administrator"; NSString *adminDir = @"Administrator";
NSString *appsDir = @"Apps"; NSString *appsDir = @"Apps";
NSString *demosDir = @"Demos"; NSString *demosDir = @"Demos";
@ -389,203 +390,152 @@ NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directoryKey,
NSString *docDir = @"Documentation"; NSString *docDir = @"Documentation";
NSMutableArray *paths = [NSMutableArray new]; NSMutableArray *paths = [NSMutableArray new];
NSString *path; NSString *path;
NSFileManager *fm; unsigned i, count;
int i;
env = [[NSProcessInfo processInfo] environment]; if (gnustep_user_root == nil)
gnustep_user_root = [env objectForKey: @"GNUSTEP_USER_ROOT"]; {
gnustep_local_root = [env objectForKey: @"GNUSTEP_LOCAL_ROOT"]; NS_DURING
gnustep_network_root = [env objectForKey: @"GNUSTEP_NETWORK_ROOT"]; {
gnustep_system_root = [env objectForKey: @"GNUSTEP_SYSTEM_ROOT"]; NSDictionary *env;
[gnustep_global_lock lock];
env = [[NSProcessInfo processInfo] environment];
/* Any of the following might be nil */
gnustep_system_root = [env objectForKey: @"GNUSTEP_SYSTEM_ROOT"];
TEST_RETAIN (gnustep_system_root);
if (gnustep_system_root == nil)
{
/* This is pretty important as we need it to load
character sets, language settings and similar
resources. Use fprintf to avoid recursive calls. */
fprintf (stderr,
"Warning - GNUSTEP_SYSTEM_ROOT is not set "
"- using /usr/GNUstep/System as a default\n");
gnustep_system_root = @"/usr/GNUstep/System";
}
gnustep_local_root = [env objectForKey: @"GNUSTEP_LOCAL_ROOT"];
TEST_RETAIN (gnustep_local_root);
gnustep_network_root = [env objectForKey: @"GNUSTEP_NETWORK_ROOT"];
TEST_RETAIN (gnustep_network_root);
gnustep_user_root = [env objectForKey: @"GNUSTEP_USER_ROOT"];
TEST_RETAIN (gnustep_user_root);
[gnustep_global_lock unlock];
}
NS_HANDLER
{
// unlock then re-raise the exception
[gnustep_global_lock unlock];
[localException raise];
}
NS_ENDHANDLER
}
/* The order in which we return paths is important - user must come
first, followed by local, followed by network, followed by system.
The calling code can then loop on the returned paths, and stop as
soon as it finds something. So things in user automatically
override things in system etc. */
/* FIXME - The following code will not respect this order for
NSAllApplicationsDirectory. This should be fixed I think. */
#define ADD_PATH(mask, base_dir, add_dir) \
if (domainMask & mask) \
{ \
path = [base_dir stringByAppendingPathComponent: add_dir]; \
if (path != nil) \
[paths addObject: path]; \
}
if (directoryKey == NSApplicationDirectory if (directoryKey == NSApplicationDirectory
|| directoryKey == NSAllApplicationsDirectory) || directoryKey == NSAllApplicationsDirectory)
{ {
if (domainMask & NSUserDomainMask) ADD_PATH (NSUserDomainMask, gnustep_user_root, appsDir);
{ ADD_PATH (NSLocalDomainMask, gnustep_local_root, appsDir);
[paths addObject: ADD_PATH (NSNetworkDomainMask, gnustep_network_root, appsDir);
[gnustep_user_root stringByAppendingPathComponent: appsDir]]; ADD_PATH (NSSystemDomainMask, gnustep_system_root, appsDir);
}
if (domainMask & NSLocalDomainMask)
{
[paths addObject:
[gnustep_local_root stringByAppendingPathComponent: appsDir]];
}
if (domainMask & NSNetworkDomainMask)
{
[paths addObject:
[gnustep_network_root stringByAppendingPathComponent: appsDir]];
}
if (domainMask & NSSystemDomainMask)
{
[paths addObject:
[gnustep_system_root stringByAppendingPathComponent: appsDir]];
}
} }
if (directoryKey == NSDemoApplicationDirectory if (directoryKey == NSDemoApplicationDirectory
|| directoryKey == NSAllApplicationsDirectory); /* FIXME */ || directoryKey == NSAllApplicationsDirectory);
{ {
if (domainMask & NSSystemDomainMask) NSString *devDemosDir = [devDir stringByAppendingPathComponent: demosDir];
{ ADD_PATH (NSSystemDomainMask, gnustep_system_root, devDemosDir);
[paths addObject: [NSString pathWithComponents: }
[NSArray arrayWithObjects: gnustep_system_root,
devDir, demosDir, nil]]];
}
}
if (directoryKey == NSDeveloperApplicationDirectory if (directoryKey == NSDeveloperApplicationDirectory
|| directoryKey == NSAllApplicationsDirectory) || directoryKey == NSAllApplicationsDirectory)
{ {
if (domainMask & NSUserDomainMask); /* FIXME */ NSString *devAppsDir = [devDir stringByAppendingPathComponent: appsDir];
if (domainMask & NSLocalDomainMask)
{ /* FIXME - why not NSUserDomainMask ? */
[paths addObject: [NSString pathWithComponents: ADD_PATH (NSLocalDomainMask, gnustep_local_root, devAppsDir);
[NSArray arrayWithObjects: gnustep_local_root, ADD_PATH (NSNetworkDomainMask, gnustep_network_root, devAppsDir);
devDir, appsDir, nil]]]; ADD_PATH (NSSystemDomainMask, gnustep_system_root, devAppsDir);
}
if (domainMask & NSNetworkDomainMask)
{
[paths addObject: [NSString pathWithComponents:
[NSArray arrayWithObjects: gnustep_network_root,
devDir, appsDir, nil]]];
}
if (domainMask & NSSystemDomainMask)
{
[paths addObject: [NSString pathWithComponents:
[NSArray arrayWithObjects: gnustep_system_root,
devDir, appsDir, nil]]];
}
} }
if (directoryKey == NSAdminApplicationDirectory if (directoryKey == NSAdminApplicationDirectory
|| directoryKey == NSAllApplicationsDirectory) || directoryKey == NSAllApplicationsDirectory)
{ {
if (domainMask & NSUserDomainMask); /* FIXME */ NSString *devAdminDir = [devDir stringByAppendingPathComponent:
/* users have no Administrator directory */ adminDir];
if (domainMask & NSLocalDomainMask) /* FIXME - NSUserDomainMask ? - users have no Administrator directory */
{ ADD_PATH (NSLocalDomainMask, gnustep_local_root, devAdminDir);
[paths addObject: [NSString pathWithComponents: ADD_PATH (NSNetworkDomainMask, gnustep_network_root, devAdminDir);
[NSArray arrayWithObjects: gnustep_local_root, ADD_PATH (NSSystemDomainMask, gnustep_system_root, devAdminDir);
devDir, adminDir, nil]]]; }
}
if (domainMask & NSNetworkDomainMask)
{
[paths addObject: [NSString pathWithComponents:
[NSArray arrayWithObjects: gnustep_network_root,
devDir, adminDir, nil]]];
}
if (domainMask & NSSystemDomainMask)
{
[paths addObject: [NSString pathWithComponents:
[NSArray arrayWithObjects: gnustep_system_root,
devDir, adminDir, nil]]];
}
}
if (directoryKey == NSLibraryDirectory if (directoryKey == NSLibraryDirectory
|| directoryKey == NSAllLibrariesDirectory) || directoryKey == NSAllLibrariesDirectory)
{ {
if (domainMask & NSUserDomainMask) ADD_PATH (NSUserDomainMask, gnustep_user_root, libraryDir);
{ ADD_PATH (NSLocalDomainMask, gnustep_local_root, libraryDir);
[paths addObject: ADD_PATH (NSNetworkDomainMask, gnustep_network_root, libraryDir);
[gnustep_user_root stringByAppendingPathComponent: libraryDir]]; ADD_PATH (NSSystemDomainMask, gnustep_system_root, libraryDir);
}
if (domainMask & NSLocalDomainMask)
{
[paths addObject:
[gnustep_local_root stringByAppendingPathComponent: libraryDir]];
}
if (domainMask & NSNetworkDomainMask)
{
[paths addObject:
[gnustep_network_root stringByAppendingPathComponent: libraryDir]];
}
if (domainMask & NSSystemDomainMask)
{
[paths addObject:
[gnustep_system_root stringByAppendingPathComponent: libraryDir]];
}
} }
if (directoryKey == NSDeveloperDirectory) if (directoryKey == NSDeveloperDirectory)
{ {
if (domainMask & NSUserDomainMask); /* FIXME */ /* FIXME - why not NSUserDomainMask ? */
/* users have no Developer directory */ ADD_PATH (NSLocalDomainMask, gnustep_local_root, devDir);
if (domainMask & NSLocalDomainMask) ADD_PATH (NSNetworkDomainMask, gnustep_network_root, devDir);
{ ADD_PATH (NSSystemDomainMask, gnustep_system_root, devDir);
[paths addObject:
[gnustep_local_root stringByAppendingPathComponent: devDir]];
}
if (domainMask & NSNetworkDomainMask)
{
[paths addObject:
[gnustep_network_root stringByAppendingPathComponent: devDir]];
}
if (domainMask & NSSystemDomainMask)
{
[paths addObject:
[gnustep_system_root stringByAppendingPathComponent: devDir]];
}
} }
if (directoryKey == NSUserDirectory) if (directoryKey == NSUserDirectory)
{ {
if (domainMask & NSUserDomainMask) if (domainMask & NSUserDomainMask)
{ {
[paths addObject: [NSHomeDirectory() path = [NSHomeDirectory() stringByAppendingPathComponent:
stringByAppendingPathComponent: @"GNUstep"]]; @"GNUstep"];
[paths addObject: path];
} }
} }
if (directoryKey == NSDocumentationDirectory) if (directoryKey == NSDocumentationDirectory)
{ {
if (domainMask & NSUserDomainMask) ADD_PATH (NSUserDomainMask, gnustep_user_root, docDir);
{ ADD_PATH (NSLocalDomainMask, gnustep_local_root, docDir);
[paths addObject: ADD_PATH (NSNetworkDomainMask, gnustep_network_root, docDir);
[gnustep_user_root stringByAppendingPathComponent: docDir]]; ADD_PATH (NSSystemDomainMask, gnustep_system_root, docDir);
}
if (domainMask & NSLocalDomainMask)
{
[paths addObject:
[gnustep_local_root stringByAppendingPathComponent: docDir]];
}
if (domainMask & NSNetworkDomainMask)
{
[paths addObject:
[gnustep_network_root stringByAppendingPathComponent: docDir]];
}
if (domainMask & NSSystemDomainMask)
{
[paths addObject:
[gnustep_system_root stringByAppendingPathComponent: docDir]];
}
} }
if (directoryKey == GSLibrariesDirectory) if (directoryKey == GSLibrariesDirectory)
{ {
if (domainMask & NSUserDomainMask) ADD_PATH (NSUserDomainMask, gnustep_user_root, libsDir);
{ ADD_PATH (NSLocalDomainMask, gnustep_local_root, libsDir);
[paths addObject: ADD_PATH (NSNetworkDomainMask, gnustep_network_root, libsDir);
[gnustep_user_root stringByAppendingPathComponent: libsDir]]; ADD_PATH (NSSystemDomainMask, gnustep_system_root, libsDir);
}
if (domainMask & NSLocalDomainMask)
{
[paths addObject:
[gnustep_local_root stringByAppendingPathComponent: libsDir]];
}
if (domainMask & NSNetworkDomainMask)
{
[paths addObject:
[gnustep_network_root stringByAppendingPathComponent: libsDir]];
}
if (domainMask & NSSystemDomainMask)
{
[paths addObject:
[gnustep_system_root stringByAppendingPathComponent: libsDir]];
}
} }
#undef ADD_PATH
fm = [NSFileManager defaultManager]; fm = [NSFileManager defaultManager];
for (i = 0; i < [paths count]; i++)
count = [paths count];
for (i = 0; i < count; i++)
{ {
path = [paths objectAtIndex: i]; path = [paths objectAtIndex: i];
// remove bad paths // remove bad paths
if ([fm fileExistsAtPath: path] == NO) if ([fm fileExistsAtPath: path] == NO)
{ {
[paths removeObjectAtIndex: i--]; [paths removeObjectAtIndex: i];
i--;
count--;
} }
/* /*
* this may look like a performance hit at first glance, but if these * this may look like a performance hit at first glance, but if these
@ -594,14 +544,15 @@ NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directoryKey,
else if (expandTilde == YES) else if (expandTilde == YES)
{ {
[paths replaceObjectAtIndex: i [paths replaceObjectAtIndex: i
withObject: [path stringByExpandingTildeInPath]]; withObject: [path stringByExpandingTildeInPath]];
} }
else else
{ {
[paths replaceObjectAtIndex: i [paths replaceObjectAtIndex: i
withObject: [path stringByAbbreviatingWithTildeInPath]]; withObject: [path stringByAbbreviatingWithTildeInPath]];
} }
} }
AUTORELEASE (paths);
return paths; return paths;
} }