#include "sanitizedCarbon.h"
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include <fcntl.h>
#include <unistd.h>
#include <CoreFoundation/CoreFoundation.h>
#include "quartzCommon.h"
#include "X11Controller.h"
#include "darwin.h"
#include "darwinEvents.h"
#include "quartzAudio.h"
#include "quartz.h"
#include "opaque.h"
#include "micmap.h"
#include <assert.h>
#include <pthread.h>
int dix_main(int argc, char **argv, char **envp);
struct arg {
int argc;
char **argv;
char **envp;
};
static void server_thread (void *arg) {
struct arg args = *((struct arg *)arg);
free(arg);
exit (dix_main(args.argc, args.argv, args.envp));
}
static pthread_t create_thread (void *func, void *arg) {
pthread_attr_t attr;
pthread_t tid;
pthread_attr_init (&attr);
pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&tid, &attr, func, arg);
pthread_attr_destroy (&attr);
return tid;
}
void QuartzInitServer(int argc, char **argv, char **envp) {
struct arg *args = (struct arg*)malloc(sizeof(struct arg));
if(!args)
FatalError("Could not allocate memory.\n");
args->argc = argc;
args->argv = argv;
args->envp = envp;
APPKIT_THREAD_ID = pthread_self();
SERVER_THREAD_ID = create_thread(server_thread, args);
if (!SERVER_THREAD_ID) {
FatalError("can't create secondary thread\n");
}
}
int server_main(int argc, char **argv, char **envp) {
int i;
int fd[2];
unsetenv("CFProcessPath");
assert( pipe(fd) == 0 );
darwinEventReadFD = fd[0];
darwinEventWriteFD = fd[1];
fcntl(darwinEventReadFD, F_SETFL, O_NONBLOCK);
for (i = 1; i < argc; i++) {
if (!strcmp( argv[i], "-showconfig" ) || !strcmp( argv[i], "-version" )) {
DarwinPrintBanner();
exit(0);
}
}
QuartzAudioInit();
X11ControllerMain(argc, argv, envp);
exit(0);
}