XQuartz: More work on the Mach-IPC startup path
(cherry picked from commit 49cd0b185f
)
This commit is contained in:
parent
4160d13b48
commit
f8929b9e5b
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user