diff --git a/ChangeLog b/ChangeLog index 56c171ac4..6575c155b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sun Jan 16 9:10:00 1999 Richard Frith-Macdonald + + Moved objc-load.c to objc-load.m and filnd-exec.c to find-exec.m + Added logging functions to objc-load.m so that logging can be + enabled at runtime using --GNU-Debug=NSBundle + Sun Jan 9 15:20:00 1999 Richard Frith-Macdonald * Source/NSGAttributedString.m: ([-attributesAtIndex:effectiveRange:]) diff --git a/Source/GNUmakefile b/Source/GNUmakefile index 49b43e2e3..a71e4768f 100644 --- a/Source/GNUmakefile +++ b/Source/GNUmakefile @@ -333,6 +333,8 @@ NSUserDefaults.m \ NSValue.m \ NSZone.m \ externs.m \ +objc-load.m \ +find_exec.m \ NSURL.m \ NSURLHandle.m @@ -345,10 +347,6 @@ NSNUMBER_MFILES = \ NSNumber8.m NSNumber9.m NSNumber10.m NSNumber11.m \ NSNumber12.m -BASE_CFILES = \ -find_exec.c \ -objc-load.c - BASE_OTHER_SRCFILES = \ NSConcreteNumber.m \ NSCTemplateValue.m \ @@ -456,7 +454,7 @@ $(GNUSTEP_TARGET_CPU)/$(GNUSTEP_TARGET_OS)/config.h \ $(GNUSTEP_TARGET_CPU)/$(GNUSTEP_TARGET_OS)/GSConfig.h # The C source files to be compiled -libgnustep-base_C_FILES = $(GNU_CFILES) $(BASE_CFILES) +libgnustep-base_C_FILES = $(GNU_CFILES) # The Objective-C source files to be compiled libgnustep-base_OBJC_FILES = $(GNU_MFILES) \ diff --git a/Source/find_exec.m b/Source/find_exec.m new file mode 100644 index 000000000..386f0f1eb --- /dev/null +++ b/Source/find_exec.m @@ -0,0 +1,241 @@ +/* + find_exec.c - routine to find the executable path + + From the dld distribution -- copyrighted below. + Modified by Adam Fedor - traverse links + + Given a filename, objc_find_executable searches the directories listed in + environment variable PATH for a file with that filename. + A new copy of the complete path name of that file is returned. This new + string may be disposed by free() later on. +*/ + +/* This file is part of DLD, a dynamic link/unlink editor for C. + + Copyright (C) 1990 by W. Wilson Ho. + + The author can be reached electronically by how@cs.ucdavis.edu or + through physical mail at: + + W. Wilson Ho + Division of Computer Science + University of California at Davis + Davis, CA 95616 +*/ + +/* This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 1, or (at your option) any + later version. +*/ + +#include +#include + +#include + +#ifdef __WIN32__ +#include +#define S_IFLNK 0120000 +int readlink(char *path, char *buf, int bufsiz) { return (-1); } +int lstat(char *path, struct stat *buf) { return (-1); } +#define MAXPATHLEN 255 +#else +#include +#include +#include +#endif /* __WIN32__ */ + +#include +#include + +#define DEFAULT_PATH ".:~/bin::/usr/local/bin:/usr/new:/usr/ucb:/usr/bin:/bin:/usr/hosts" + +#if defined(__WIN32__) || defined(_WIN32) +#define PATH_SEPARATOR ';' +#define PATH_COMPONENT "\\" +#else +#define PATH_SEPARATOR ':' +#define PATH_COMPONENT "/" +#endif + +/* ABSOLUTE_FILENAME_P (fname): True if fname is an absolute filename */ +#if defined(atarist) || defined(__WIN32__) || defined(_WIN32) +#define ABSOLUTE_FILENAME_P(fname) ((fname[0] == '/') || \ + (fname[0] && (fname[1] == ':'))) +#else +#define ABSOLUTE_FILENAME_P(fname) (fname[0] == '/') +#endif /* atarist */ + +static char * +copy_of (s) +register char *s; +{ + register char *p = (char *) malloc (strlen(s)+1); + + if (!p) return 0; + + *p = 0; + strcpy (p, s); + return p; +} + +static int +find_full_path(char *path) +{ + struct stat statbuf; + + if ( stat(path, &statbuf) != 0) + return -1; + + if ( (lstat(path, &statbuf) == 0) + && (statbuf.st_mode & S_IFLNK) == S_IFLNK) { + char link[MAXPATHLEN+1]; + int cc; + cc = readlink(path, link, MAXPATHLEN); + if (cc == -1) + return -1; + link[cc] = '\0'; + if (ABSOLUTE_FILENAME_P(link)) { + strcpy(path, link); + } else if (strlen(path)+strlen(link) < MAXPATHLEN) { + char *p; + p = strrchr(path, '/'); + if (p) + *(p+1) = '\0'; + strcat(path, link); + } else + return -1; + } + + return 0; +} + +char * +objc_find_executable (const char *file) +{ + char *search; + register char *p; + int cwd_in_path = 0; + + if (ABSOLUTE_FILENAME_P(file)) { + search = copy_of(file); + find_full_path(search); + return search; +/* + return copy_of (file); +*/ + } + + if ((search = (char *) getenv("PATH")) == 0) + search = DEFAULT_PATH; + + p = search; + + while (*p) { + char name[MAXPATHLEN]; + register char *next; + + next = name; + + /* copy directory name into [name] */ + while (*p && *p != PATH_SEPARATOR) *next++ = *p++; + *next = 0; + if (*p) p++; + + if (name[0] == '.' && name[1] == 0) { +#ifdef HAVE_GETCWD + getcwd (name, MAXPATHLEN); +#else + getwd (name); +#endif + cwd_in_path = 1; + } + + strcat (name, PATH_COMPONENT); + strcat (name, file); + +/* + if (access (name, X_OK) == 0) +*/ + if (find_full_path (name) == 0) + return copy_of (name); + + /* Also add common executable extensions on windows */ +#if defined(__WIN32__) || defined(_WIN32) + { + int fl = strlen(name); + + strcat (name, ".com"); + if (find_full_path (name) == 0) + return copy_of (name); + name[fl] = '\0'; + + strcat (name, ".exe"); + if (find_full_path (name) == 0) + return copy_of (name); + name[fl] = '\0'; + + strcat (name, ".bat"); + if (find_full_path (name) == 0) + return copy_of (name); + name[fl] = '\0'; + + strcat (name, ".cmd"); + if (find_full_path (name) == 0) + return copy_of (name); + name[fl] = '\0'; + } +#endif + } + + /* + If '.' not in PATH, check this too + */ + if (!cwd_in_path) { + char name[MAXPATHLEN]; + +#ifdef HAVE_GETCWD + getcwd (name, MAXPATHLEN); +#else + getwd (name); +#endif + strcat (name, PATH_COMPONENT); + strcat (name, file); + +/* + if (access (name, X_OK) == 0) +*/ + if (find_full_path (name) == 0) + return copy_of (name); + + /* Also add common executable extensions on windows */ +#if defined(__WIN32__) || defined(_WIN32) + { + int fl = strlen(name); + + strcat (name, ".com"); + if (find_full_path (name) == 0) + return copy_of (name); + name[fl] = '\0'; + + strcat (name, ".exe"); + if (find_full_path (name) == 0) + return copy_of (name); + name[fl] = '\0'; + + strcat (name, ".bat"); + if (find_full_path (name) == 0) + return copy_of (name); + name[fl] = '\0'; + + strcat (name, ".cmd"); + if (find_full_path (name) == 0) + return copy_of (name); + name[fl] = '\0'; + } +#endif + } + + return 0; +} diff --git a/Source/objc-load.c b/Source/objc-load.m similarity index 93% rename from Source/objc-load.c rename to Source/objc-load.m index 271c3b222..69d873b4c 100644 --- a/Source/objc-load.c +++ b/Source/objc-load.m @@ -35,6 +35,8 @@ #include #include #include +#include +#include /* include the interface to the dynamic linker */ #include "dynamic-load.h" @@ -99,9 +101,8 @@ objc_initialize_loading(FILE *errorStream) dynamic_loaded = NO; path = objc_executable_location(); -#ifdef DEBUG - printf("Debug (objc-load): initializing dynamic loader for %s\n", path); -#endif + NSDebugFLLog(@"NSBundle", + @"Debug (objc-load): initializing dynamic loader for %s", path); if (__objc_dynamic_init(path)) { if (errorStream) __objc_dynamic_error(errorStream, "Error (objc-load): Cannot initialize dynamic linker"); @@ -152,9 +153,8 @@ objc_load_module( _objc_load_callback = objc_load_callback; /* Link in the object file */ -#ifdef DEBUG - printf("Debug (objc-load): Linking file %s\n", filename); -#endif + NSDebugFLLog(@"NSBundle", + @"Debug (objc-load): Linking file %s\n", filename); handle = __objc_dynamic_link(filename, 1, debugFilename); if (handle == 0) { if (errorStream) @@ -178,13 +178,11 @@ objc_load_module( return 1; } -#ifdef DEBUG - printf("Debug (objc-load): %d modules\n", (int)ctor_list[0]); -#endif + NSDebugFLLog(@"NSBundle", + @"Debug (objc-load): %d modules\n", (int)ctor_list[0]); for (i=1; ctor_list[i]; i++) { -#ifdef DEBUG - printf("Debug (objc-load): Invoking CTOR %p\n", ctor_list[i]); -#endif + NSDebugFLLog(@"NSBundle", + @"Debug (objc-load): Invoking CTOR %p\n", ctor_list[i]); ctor_list[i](); } #endif /* not __ELF__ */