summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Huddleston <jeremyhu@freedesktop.org>2008-05-14 01:13:15 -0700
committerJeremy Huddleston <jeremyhu@freedesktop.org>2008-05-14 01:16:04 -0700
commitcbb4e80eb7cc8dc2aff5e5268b49cdb7b3c3d5fa (patch)
tree8d874b0755919025ef93514335c27c5c86c14d90
parent3b57c59bb08c9a3211f4ae57d9e2fb569d61bf2f (diff)
XQuartz: More work on the Mach-IPC startup path
(cherry picked from commit 49cd0b185fd6c99b07357a74734b6a4023faca84)
-rw-r--r--hw/xquartz/mach-startup/bundle-main.c45
-rw-r--r--hw/xquartz/mach-startup/mach_startup_types.h4
-rw-r--r--hw/xquartz/mach-startup/stub.c32
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;