diff options
author | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2008-05-14 01:13:15 -0700 |
---|---|---|
committer | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2008-05-14 01:16:04 -0700 |
commit | cbb4e80eb7cc8dc2aff5e5268b49cdb7b3c3d5fa (patch) | |
tree | 8d874b0755919025ef93514335c27c5c86c14d90 | |
parent | 3b57c59bb08c9a3211f4ae57d9e2fb569d61bf2f (diff) |
XQuartz: More work on the Mach-IPC startup path
(cherry picked from commit 49cd0b185fd6c99b07357a74734b6a4023faca84)
-rw-r--r-- | hw/xquartz/mach-startup/bundle-main.c | 45 | ||||
-rw-r--r-- | hw/xquartz/mach-startup/mach_startup_types.h | 4 | ||||
-rw-r--r-- | hw/xquartz/mach-startup/stub.c | 32 |
3 files changed, 70 insertions, 11 deletions
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c index a66afa805..cd64e425c 100644 --- a/hw/xquartz/mach-startup/bundle-main.c +++ b/hw/xquartz/mach-startup/bundle-main.c @@ -73,7 +73,26 @@ kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv, mach_msg_type_number_t argvCnt, string_array_t envp, mach_msg_type_number_t envpCnt) { - if(server_main(argvCnt - 1, argv, envp) == 0) + /* And now back to char ** */ + char **_argv = alloca((argvCnt + 1) * sizeof(char *)); + char **_envp = alloca((envpCnt + 1) * sizeof(char *)); + size_t i; + + if(!_argv || !_envp) { + return KERN_FAILURE; + } + + for(i=0; i < argvCnt; i++) { + _argv[i] = argv[i]; + } + _argv[argvCnt] = NULL; + + for(i=0; i < envpCnt; i++) { + _envp[i] = envp[i]; + } + _envp[envpCnt] = NULL; + + if(server_main(argvCnt, _argv, _envp) == 0) return KERN_SUCCESS; else return KERN_FAILURE; @@ -212,20 +231,38 @@ int main(int argc, char **argv, char **envp) { #ifdef NEW_LAUNCH_METHOD kern_return_t kr; mach_port_t mp; - - sleep(2); + string_array_t newenvp; + string_array_t newargv; /* We need to count envp */ int envpc; for(envpc=0; envp[envpc]; envpc++); + /* We have fixed-size string lengths due to limitations in IPC, + * so we need to copy our argv and envp. + */ + newargv = (string_array_t)alloca(argc * sizeof(string_t)); + newenvp = (string_array_t)alloca(envpc * sizeof(string_t)); + + if(!newargv || !newenvp) { + fprintf(stderr, "Memory allocation failure\n"); + exit(EXIT_FAILURE); + } + + for(i=0; i < argc; i++) { + strlcpy(newargv[i], argv[i], STRING_T_SIZE); + } + for(i=0; i < envpc; i++) { + strlcpy(newenvp[i], envp[i], STRING_T_SIZE); + } + kr = bootstrap_look_up(bootstrap_port, SERVER_BOOTSTRAP_NAME, &mp); if (kr != KERN_SUCCESS) { fprintf(stderr, "bootstrap_look_up(): %s\n", bootstrap_strerror(kr)); exit(EXIT_FAILURE); } - kr = start_x11_server(mp, argv, argc + 1, envp, envpc + 1); + kr = start_x11_server(mp, newargv, argc, newenvp, envpc); if (kr != KERN_SUCCESS) { fprintf(stderr, "start_x11_server: %s\n", mach_error_string(kr)); exit(EXIT_FAILURE); diff --git a/hw/xquartz/mach-startup/mach_startup_types.h b/hw/xquartz/mach-startup/mach_startup_types.h index 03939af97..97ac147cd 100644 --- a/hw/xquartz/mach-startup/mach_startup_types.h +++ b/hw/xquartz/mach-startup/mach_startup_types.h @@ -2,7 +2,9 @@ #define _MACH_STARTUP_TYPES_H_ #define SERVER_BOOTSTRAP_NAME "org.x.X11" +#define STRING_T_SIZE 1024 -typedef char ** string_array_t; +typedef char string_t[STRING_T_SIZE]; +typedef string_t * string_array_t; #endif diff --git a/hw/xquartz/mach-startup/stub.c b/hw/xquartz/mach-startup/stub.c index ed917cfcd..fae97201f 100644 --- a/hw/xquartz/mach-startup/stub.c +++ b/hw/xquartz/mach-startup/stub.c @@ -111,9 +111,10 @@ static void set_x11_path() { int main(int argc, char **argv, char **envp) { #ifdef NEW_LAUNCH_METHOD_2 int envpc; - char *newargv[3]; kern_return_t kr; mach_port_t mp; + string_array_t newenvp; + string_array_t newargv; #endif if(argc == 2 && !strcmp(argv[1], "-version")) { @@ -137,10 +138,11 @@ int main(int argc, char **argv, char **envp) { } if(child == 0) { - newargv[0] = x11_path; - newargv[1] = "--listenonly"; - newargv[2] = NULL; - return execvp(x11_path, newargv); + char *_argv[3]; + _argv[0] = x11_path; + _argv[1] = "--listenonly"; + _argv[2] = NULL; + return execvp(x11_path, _argv); } /* Try connecting for 10 seconds */ @@ -160,7 +162,25 @@ int main(int argc, char **argv, char **envp) { /* Count envp */ for(envpc=0; envp[envpc]; envpc++); - kr = start_x11_server(mp, argv, argc + 1, envp, envpc + 1); + /* We have fixed-size string lengths due to limitations in IPC, + * so we need to copy our argv and envp. + */ + newargv = (string_array_t)alloca(argc * sizeof(string_t)); + newenvp = (string_array_t)alloca(envpc * sizeof(string_t)); + + if(!newargv || !newenvp) { + fprintf(stderr, "Memory allocation failure\n"); + exit(EXIT_FAILURE); + } + + for(i=0; i < argc; i++) { + strlcpy(newargv[i], argv[i], STRING_T_SIZE); + } + for(i=0; i < envpc; i++) { + strlcpy(newenvp[i], envp[i], STRING_T_SIZE); + } + + kr = start_x11_server(mp, newargv, argc, newenvp, envpc); if (kr != KERN_SUCCESS) { fprintf(stderr, "start_x11_server: %s\n", mach_error_string(kr)); return EXIT_FAILURE; |