XQuartz: More work on the Mach-IPC startup path
(cherry picked from commit 49cd0b185fd6c99b07357a74734b6a4023faca84)
This commit is contained in:
		
							parent
							
								
									3b57c59bb0
								
							
						
					
					
						commit
						cbb4e80eb7
					
				| 
						 | 
				
			
			@ -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