diff options
author | Andrew Niefer | 2007-01-05 22:32:35 +0000 |
---|---|---|
committer | Andrew Niefer | 2007-01-05 22:32:35 +0000 |
commit | 728cd9e4210e94a7f6409ba5b786bac42a4823f0 (patch) | |
tree | 7891704bb2ed9d2b50b316b44e787b223d9c27a2 /bundles/org.eclipse.equinox.executable/library/carbon | |
parent | bfd4db2c8d7b2d85be4f2e96e4808e5f4c8e940b (diff) | |
download | rt.equinox.framework-728cd9e4210e94a7f6409ba5b786bac42a4823f0.tar.gz rt.equinox.framework-728cd9e4210e94a7f6409ba5b786bac42a4823f0.tar.xz rt.equinox.framework-728cd9e4210e94a7f6409ba5b786bac42a4823f0.zip |
bug 169337
Diffstat (limited to 'bundles/org.eclipse.equinox.executable/library/carbon')
-rw-r--r-- | bundles/org.eclipse.equinox.executable/library/carbon/eclipseCarbonMain.c | 460 |
1 files changed, 229 insertions, 231 deletions
diff --git a/bundles/org.eclipse.equinox.executable/library/carbon/eclipseCarbonMain.c b/bundles/org.eclipse.equinox.executable/library/carbon/eclipseCarbonMain.c index aff31fb6c..98146cc51 100644 --- a/bundles/org.eclipse.equinox.executable/library/carbon/eclipseCarbonMain.c +++ b/bundles/org.eclipse.equinox.executable/library/carbon/eclipseCarbonMain.c @@ -1,232 +1,230 @@ -/* - * Copyright (c) 2006 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - * Andrew Niefer - */ - -#include "eclipseCommon.h" - -#include <sys/stat.h> -#include <sys/types.h> -#include <fcntl.h> -#include <ctype.h> -#include <pwd.h> -#include <stdlib.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <sys/ioctl.h> -#include <unistd.h> - -#include <CoreServices/CoreServices.h> -#include <Carbon/Carbon.h> -#include <mach-o/dyld.h> - - -#define APP_PACKAGE_PATTERN ".app/Contents/MacOS/" -#define APP_PACKAGE "APP_PACKAGE" -#define JAVAROOT "JAVAROOT" - -static void debug(const char *fmt, ...); -static void dumpArgs(char *tag, int argc, char* argv[]); -static char *append(char *buffer, const char *s); -static char *appendc(char *buffer, char c); -static char *expandShell(char *arg, const char *appPackage, const char *javaRoot); -static char *my_strcasestr(const char *big, const char *little); - -static FILE *fgConsoleLog; -static char *fgAppPackagePath; -static int fgPid; - -extern int original_main(int argc, char* argv[]); -int main( int argc, char* argv[] ) { - - SInt32 systemVersion= 0; - if (Gestalt(gestaltSystemVersion, &systemVersion) == noErr) { - systemVersion &= 0xffff; - if (systemVersion < 0x1020) { - displayMessage(officialName, "Eclipse requires Jaguar (Mac OS X >= 10.2)"); - return 0; - } - } - - fgConsoleLog= fopen("/dev/console", "w"); - fgPid= getpid(); - - dumpArgs("start", argc, argv); - - if (argc > 1 && strncmp(argv[1], "-psn_", 5) == 0) { - - /* find path to application bundle (ignoring case) */ - char *pos= my_strcasestr(argv[0], APP_PACKAGE_PATTERN); - if (pos != NULL) { - int l= pos-argv[0] + 4; // reserve space for ".app" - fgAppPackagePath= malloc(l+1); - strncpy(fgAppPackagePath, argv[0], l); - fgAppPackagePath[l]= '\0'; // terminate result - } - - /* Get the main bundle for the app */ - CFBundleRef mainBundle= CFBundleGetMainBundle(); - if (mainBundle != NULL) { - - /* Get an instance of the info plist.*/ - CFDictionaryRef bundleInfoDict= CFBundleGetInfoDictionary(mainBundle); - - /* If we succeeded, look for our property. */ - if (bundleInfoDict != NULL) { - CFArrayRef ar= CFDictionaryGetValue(bundleInfoDict, CFSTR("Eclipse")); - if (ar) { - CFIndex size= CFArrayGetCount(ar); - if (size > 0) { - int i; - char **old_argv= argv; - argv= (char**) calloc(size+2, sizeof(char*)); - argc= 0; - argv[argc++]= old_argv[0]; - for (i= 0; i < size; i++) { - CFStringRef sr= (CFStringRef) CFArrayGetValueAtIndex (ar, i); - CFIndex argStringSize= CFStringGetMaximumSizeForEncoding(CFStringGetLength(sr), kCFStringEncodingUTF8); - char *s= malloc(argStringSize); - if (CFStringGetCString(sr, s, argStringSize, kCFStringEncodingUTF8)) { - argv[argc++]= expandShell(s, fgAppPackagePath, NULL); - } else { - fprintf(fgConsoleLog, "can't extract bytes\n"); - } - //free(s); - } - } - } else { - fprintf(fgConsoleLog, "no Eclipse dict found\n"); - } - } else { - fprintf(fgConsoleLog, "no bundle dict found\n"); - } - } else { - fprintf(fgConsoleLog, "no bundle found\n"); - } - } - int exitcode= original_main(argc, argv); - debug("<<<< exit(%d)\n", exitcode); - fclose(fgConsoleLog); - return exitcode; -} - -static void debug(const char *fmt, ...) { -#if DEBUG - va_list ap; - va_start(ap, fmt); - fprintf(fgConsoleLog, "%05d: ", fgPid); - vfprintf(fgConsoleLog, fmt, ap); - va_end(ap); -#endif -} - -static void dumpArgs(char *tag, int argc, char* argv[]) { -#if DEBUG - int i; - if (argc < 0) { - argc= 0; - for (i= 0; argv[i] != NULL; i++) - argc++; - } - debug(">>>> %s:", tag); - for (i= 0; i < argc && argv[i] != NULL; i++) - fprintf(fgConsoleLog, " <%s>", argv[i]); - fprintf(fgConsoleLog, "\n"); -#endif -} - -/* - * Expand $APP_PACKAGE, $JAVA_HOME, and does tilde expansion. - - A word beginning with an unquoted tilde character (~) is - subject to tilde expansion. All the characters up to a - slash (/) or the end of the word are treated as a username - and are replaced with the user's home directory. If the - username is missing (as in ~/foobar), the tilde is - replaced with the value of the HOME variable (the current - user's home directory). - */ -static char *expandShell(char *arg, const char *appPackage, const char *javaRoot) { - - if (index(arg, '~') == NULL && index(arg, '$') == NULL) - return arg; - - char *buffer= strdup(""); - char c, lastChar= ' '; - const char *cp= arg; - while ((c = *cp++) != 0) { - if (isspace(lastChar) && c == '~') { - char name[100], *dir= NULL; - int j= 0; - for (; (c = *cp) != 0; cp++) { - if (! isalnum(c)) - break; - name[j++]= c; - lastChar= c; - } - name[j]= '\0'; - if (j > 0) { - struct passwd *pw= getpwnam(name); - if (pw != NULL) - dir= pw->pw_dir; - } else { - dir= getenv("HOME"); - } - if (dir != NULL) - buffer= append(buffer, dir); - - } else if (c == '$') { - int l= strlen(APP_PACKAGE); - if (appPackage != NULL && strncmp(cp, APP_PACKAGE, l) == 0) { - cp+= l; - buffer= append(buffer, appPackage); - } else { - int l= strlen(JAVAROOT); - if (javaRoot != NULL && strncmp(cp, JAVAROOT, l) == 0) { - cp+= l; - buffer= append(buffer, javaRoot); - } else { - buffer= appendc(buffer, c); - } - } - } else - buffer= appendc(buffer, c); - lastChar= c; - } - return buffer; -} - -static char *my_strcasestr(const char *big, const char *little) { - char *cp, *s, *t; - for (cp= (char*) big; *cp; cp++) { - for (s= cp, t= (char*) little; *s && *t; s++, t++) - if (toupper(*s) != toupper(*t)) - break; - if (*t == '\0') - return cp; - } - return NULL; -} - -static char *append(char *buffer, const char *s) { - int bl= strlen(buffer); - int sl= strlen(s); - buffer= realloc(buffer, bl+sl+1); - strcpy(&buffer[bl], s); - return buffer; -} - -static char *appendc(char *buffer, char c) { - int bl= strlen(buffer); - buffer= realloc(buffer, bl+2); - buffer[bl++]= c; - buffer[bl]= '\0'; - return buffer; +/*
+ * Copyright (c) 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ * Andrew Niefer
+ */
+
+#include "eclipseCommon.h"
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <pwd.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#include <CoreServices/CoreServices.h>
+#include <Carbon/Carbon.h>
+#include <mach-o/dyld.h>
+
+
+#define APP_PACKAGE_PATTERN ".app/Contents/MacOS/"
+#define APP_PACKAGE "APP_PACKAGE"
+#define JAVAROOT "JAVAROOT"
+
+static void debug(const char *fmt, ...);
+static void dumpArgs(char *tag, int argc, char* argv[]);
+static char *append(char *buffer, const char *s);
+static char *appendc(char *buffer, char c);
+static char *expandShell(char *arg, const char *appPackage, const char *javaRoot);
+static char *my_strcasestr(const char *big, const char *little);
+
+static FILE *fgConsoleLog;
+static char *fgAppPackagePath;
+static int fgPid;
+
+extern int original_main(int argc, char* argv[]);
+int main( int argc, char* argv[] ) {
+
+ SInt32 systemVersion= 0;
+ if (Gestalt(gestaltSystemVersion, &systemVersion) == noErr) {
+ systemVersion &= 0xffff;
+ if (systemVersion < 0x1020) {
+ displayMessage(officialName, "Eclipse requires Jaguar (Mac OS X >= 10.2)");
+ return 0;
+ }
+ }
+
+ fgConsoleLog= fopen("/dev/console", "w");
+ fgPid= getpid();
+
+ dumpArgs("start", argc, argv);
+
+ /* find path to application bundle (ignoring case) */
+ char *pos= my_strcasestr(argv[0], APP_PACKAGE_PATTERN);
+ if (pos != NULL) {
+ int l= pos-argv[0] + 4; // reserve space for ".app"
+ fgAppPackagePath= malloc(l+1);
+ strncpy(fgAppPackagePath, argv[0], l);
+ fgAppPackagePath[l]= '\0'; // terminate result
+ }
+
+ /* Get the main bundle for the app */
+ CFBundleRef mainBundle= CFBundleGetMainBundle();
+ if (mainBundle != NULL) {
+
+ /* Get an instance of the info plist.*/
+ CFDictionaryRef bundleInfoDict= CFBundleGetInfoDictionary(mainBundle);
+
+ /* If we succeeded, look for our property. */
+ if (bundleInfoDict != NULL) {
+ CFArrayRef ar= CFDictionaryGetValue(bundleInfoDict, CFSTR("Eclipse"));
+ if (ar) {
+ CFIndex size= CFArrayGetCount(ar);
+ if (size > 0) {
+ int i;
+ char **old_argv= argv;
+ argv= (char**) calloc(size+2, sizeof(char*));
+ argc= 0;
+ argv[argc++]= old_argv[0];
+ for (i= 0; i < size; i++) {
+ CFStringRef sr= (CFStringRef) CFArrayGetValueAtIndex (ar, i);
+ CFIndex argStringSize= CFStringGetMaximumSizeForEncoding(CFStringGetLength(sr), kCFStringEncodingUTF8);
+ char *s= malloc(argStringSize);
+ if (CFStringGetCString(sr, s, argStringSize, kCFStringEncodingUTF8)) {
+ argv[argc++]= expandShell(s, fgAppPackagePath, NULL);
+ } else {
+ fprintf(fgConsoleLog, "can't extract bytes\n");
+ }
+ //free(s);
+ }
+ }
+ } else {
+ fprintf(fgConsoleLog, "no Eclipse dict found\n");
+ }
+ } else {
+ fprintf(fgConsoleLog, "no bundle dict found\n");
+ }
+ } else {
+ fprintf(fgConsoleLog, "no bundle found\n");
+ }
+
+ int exitcode= original_main(argc, argv);
+ debug("<<<< exit(%d)\n", exitcode);
+ fclose(fgConsoleLog);
+ return exitcode;
+}
+
+static void debug(const char *fmt, ...) {
+#if DEBUG
+ va_list ap;
+ va_start(ap, fmt);
+ fprintf(fgConsoleLog, "%05d: ", fgPid);
+ vfprintf(fgConsoleLog, fmt, ap);
+ va_end(ap);
+#endif
+}
+
+static void dumpArgs(char *tag, int argc, char* argv[]) {
+#if DEBUG
+ int i;
+ if (argc < 0) {
+ argc= 0;
+ for (i= 0; argv[i] != NULL; i++)
+ argc++;
+ }
+ debug(">>>> %s:", tag);
+ for (i= 0; i < argc && argv[i] != NULL; i++)
+ fprintf(fgConsoleLog, " <%s>", argv[i]);
+ fprintf(fgConsoleLog, "\n");
+#endif
+}
+
+/*
+ * Expand $APP_PACKAGE, $JAVA_HOME, and does tilde expansion.
+
+ A word beginning with an unquoted tilde character (~) is
+ subject to tilde expansion. All the characters up to a
+ slash (/) or the end of the word are treated as a username
+ and are replaced with the user's home directory. If the
+ username is missing (as in ~/foobar), the tilde is
+ replaced with the value of the HOME variable (the current
+ user's home directory).
+ */
+static char *expandShell(char *arg, const char *appPackage, const char *javaRoot) {
+
+ if (index(arg, '~') == NULL && index(arg, '$') == NULL)
+ return arg;
+
+ char *buffer= strdup("");
+ char c, lastChar= ' ';
+ const char *cp= arg;
+ while ((c = *cp++) != 0) {
+ if (isspace(lastChar) && c == '~') {
+ char name[100], *dir= NULL;
+ int j= 0;
+ for (; (c = *cp) != 0; cp++) {
+ if (! isalnum(c))
+ break;
+ name[j++]= c;
+ lastChar= c;
+ }
+ name[j]= '\0';
+ if (j > 0) {
+ struct passwd *pw= getpwnam(name);
+ if (pw != NULL)
+ dir= pw->pw_dir;
+ } else {
+ dir= getenv("HOME");
+ }
+ if (dir != NULL)
+ buffer= append(buffer, dir);
+
+ } else if (c == '$') {
+ int l= strlen(APP_PACKAGE);
+ if (appPackage != NULL && strncmp(cp, APP_PACKAGE, l) == 0) {
+ cp+= l;
+ buffer= append(buffer, appPackage);
+ } else {
+ int l= strlen(JAVAROOT);
+ if (javaRoot != NULL && strncmp(cp, JAVAROOT, l) == 0) {
+ cp+= l;
+ buffer= append(buffer, javaRoot);
+ } else {
+ buffer= appendc(buffer, c);
+ }
+ }
+ } else
+ buffer= appendc(buffer, c);
+ lastChar= c;
+ }
+ return buffer;
+}
+
+static char *my_strcasestr(const char *big, const char *little) {
+ char *cp, *s, *t;
+ for (cp= (char*) big; *cp; cp++) {
+ for (s= cp, t= (char*) little; *s && *t; s++, t++)
+ if (toupper(*s) != toupper(*t))
+ break;
+ if (*t == '\0')
+ return cp;
+ }
+ return NULL;
+}
+
+static char *append(char *buffer, const char *s) {
+ int bl= strlen(buffer);
+ int sl= strlen(s);
+ buffer= realloc(buffer, bl+sl+1);
+ strcpy(&buffer[bl], s);
+ return buffer;
+}
+
+static char *appendc(char *buffer, char c) {
+ int bl= strlen(buffer);
+ buffer= realloc(buffer, bl+2);
+ buffer[bl++]= c;
+ buffer[bl]= '\0';
+ return buffer;
}
\ No newline at end of file |