XQuartz: stub: Call LSOpenApplication instead of fork()/exec()
Reviewed-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
This commit is contained in:
parent
ccdd431cd8
commit
3fd87692e8
|
@ -52,39 +52,27 @@
|
||||||
|
|
||||||
#include "launchd_fd.h"
|
#include "launchd_fd.h"
|
||||||
|
|
||||||
static char x11_path[PATH_MAX + 1];
|
static CFURLRef x11appURL;
|
||||||
|
static FSRef x11_appRef;
|
||||||
static pid_t x11app_pid = 0;
|
static pid_t x11app_pid = 0;
|
||||||
aslclient aslc;
|
aslclient aslc;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_x11_path(void)
|
set_x11_path(void)
|
||||||
{
|
{
|
||||||
CFURLRef appURL = NULL;
|
|
||||||
OSStatus osstatus =
|
OSStatus osstatus =
|
||||||
LSFindApplicationForInfo(kLSUnknownCreator, CFSTR(
|
LSFindApplicationForInfo(kLSUnknownCreator, CFSTR(
|
||||||
kX11AppBundleId), nil, nil, &appURL);
|
kX11AppBundleId), nil, &x11_appRef, &x11appURL);
|
||||||
|
|
||||||
switch (osstatus) {
|
switch (osstatus) {
|
||||||
case noErr:
|
case noErr:
|
||||||
if (appURL == NULL) {
|
if (x11appURL == NULL) {
|
||||||
asl_log(
|
asl_log(
|
||||||
aslc, NULL, ASL_LEVEL_ERR,
|
aslc, NULL, ASL_LEVEL_ERR,
|
||||||
"Xquartz: Invalid response from LSFindApplicationForInfo(%s)",
|
"Xquartz: Invalid response from LSFindApplicationForInfo(%s)",
|
||||||
kX11AppBundleId);
|
kX11AppBundleId);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CFURLGetFileSystemRepresentation(appURL, true,
|
|
||||||
(unsigned char *)x11_path,
|
|
||||||
sizeof(x11_path))) {
|
|
||||||
asl_log(aslc, NULL, ASL_LEVEL_ERR,
|
|
||||||
"Xquartz: Error resolving URL for %s",
|
|
||||||
kX11AppBundleId);
|
|
||||||
exit(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
strlcat(x11_path, kX11AppBundlePath, sizeof(x11_path));
|
|
||||||
asl_log(aslc, NULL, ASL_LEVEL_INFO, "Xquartz: X11.app = %s", x11_path);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kLSApplicationNotFoundErr:
|
case kLSApplicationNotFoundErr:
|
||||||
|
@ -253,24 +241,23 @@ main(int argc, char **argv, char **envp)
|
||||||
server_bootstrap_name);
|
server_bootstrap_name);
|
||||||
set_x11_path();
|
set_x11_path();
|
||||||
|
|
||||||
/* This forking is ugly and will be cleaned up later */
|
char *listenOnlyArg = "--listenonly";
|
||||||
child = fork();
|
CFStringRef silentLaunchArg = CFStringCreateWithCString(NULL, listenOnlyArg, kCFStringEncodingUTF8);
|
||||||
if (child == -1) {
|
CFStringRef args[] = { silentLaunchArg };
|
||||||
asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Could not fork: %s",
|
CFArrayRef passArgv = CFArrayCreate(NULL, (const void**) args, 1, NULL);
|
||||||
strerror(
|
LSApplicationParameters params = { 0, /* CFIndex version == 0 */
|
||||||
errno));
|
kLSLaunchDefaults, /* LSLaunchFlags flags */
|
||||||
return EXIT_FAILURE;
|
&x11_appRef, /* FSRef application */
|
||||||
}
|
NULL, /* void* asyncLaunchRefCon*/
|
||||||
|
NULL, /* CFDictionaryRef environment */
|
||||||
|
passArgv, /* CFArrayRef arguments */
|
||||||
|
NULL /* AppleEvent* initialEvent */
|
||||||
|
};
|
||||||
|
|
||||||
if (child == 0) {
|
OSStatus status = LSOpenApplication(¶ms, NULL);
|
||||||
char *_argv[3];
|
if (status != noErr) {
|
||||||
_argv[0] = x11_path;
|
asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Unable to launch: %d", (int)status);
|
||||||
_argv[1] = "--listenonly";
|
return EXIT_FAILURE;
|
||||||
_argv[2] = NULL;
|
|
||||||
asl_log(aslc, NULL, ASL_LEVEL_NOTICE,
|
|
||||||
"Xquartz: Starting X server: %s --listenonly",
|
|
||||||
x11_path);
|
|
||||||
return execvp(x11_path, _argv);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try connecting for 10 seconds */
|
/* Try connecting for 10 seconds */
|
||||||
|
|
Loading…
Reference in New Issue