00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "JackConstants.h"
00022 #include "JackChannel.h"
00023 #include "JackLibGlobals.h"
00024 #include "JackServerLaunch.h"
00025 #include "JackPlatformPlug.h"
00026
00027 using namespace Jack;
00028
00029 #ifndef WIN32
00030
00031 #if defined(JACK_DBUS)
00032
00033 #include <dbus/dbus.h>
00034
00035 static int start_server_dbus(const char* server_name)
00036 {
00037 DBusError err;
00038 DBusConnection *conn;
00039 DBusMessage *msg;
00040
00041
00042 dbus_error_init(&err);
00043
00044
00045 conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
00046 if (dbus_error_is_set(&err)) {
00047 fprintf(stderr, "Connection Error (%s)\n", err.message);
00048 dbus_error_free(&err);
00049 }
00050 if (NULL == conn) {
00051 return 1;
00052 }
00053
00054 msg = dbus_message_new_method_call(
00055 "org.jackaudio.service",
00056 "/org/jackaudio/Controller",
00057 "org.jackaudio.JackControl",
00058 "StartServer");
00059 if (NULL == msg) {
00060 fprintf(stderr, "Message Null\n");
00061 return 1;
00062 }
00063
00064
00065 if (!dbus_connection_send(conn, msg, NULL))
00066 {
00067 fprintf(stderr, "Out Of Memory!\n");
00068 return 1;
00069 }
00070
00071 dbus_message_unref(msg);
00072 dbus_connection_flush(conn);
00073 dbus_error_free(&err);
00074
00075 return 0;
00076 }
00077
00078 #else
00079
00080
00081 static void start_server_aux(const char* server_name)
00082 {
00083 FILE* fp = 0;
00084 char filename[255];
00085 char arguments[255];
00086 char buffer[255];
00087 char* command = 0;
00088 size_t pos = 0;
00089 size_t result = 0;
00090 char** argv = 0;
00091 int i = 0;
00092 int good = 0;
00093 int ret;
00094
00095 snprintf(filename, 255, "%s/.jackdrc", getenv("HOME"));
00096 fp = fopen(filename, "r");
00097
00098 if (!fp) {
00099 fp = fopen("/etc/jackdrc", "r");
00100 }
00101
00102 if (!fp) {
00103 fp = fopen("/etc/jackd.conf", "r");
00104 }
00105
00106 if (fp) {
00107 arguments[0] = '\0';
00108 ret = fscanf(fp, "%s", buffer);
00109 while (ret != 0 && ret != EOF) {
00110 strcat(arguments, buffer);
00111 strcat(arguments, " ");
00112 ret = fscanf(fp, "%s", buffer);
00113 }
00114 if (strlen(arguments) > 0) {
00115 good = 1;
00116 }
00117 fclose(fp);
00118 }
00119
00120 if (!good) {
00121 command = (char*)(JACK_LOCATION "/jackd");
00122 strncpy(arguments, JACK_LOCATION "/jackd -T -d "JACK_DEFAULT_DRIVER, 255);
00123 } else {
00124 result = strcspn(arguments, " ");
00125 command = (char*)malloc(result + 1);
00126 strncpy(command, arguments, result);
00127 command[result] = '\0';
00128 }
00129
00130 argv = (char**)malloc(255);
00131
00132 while (1) {
00133
00134 if (i == 1) {
00135 argv[i] = (char*)malloc(strlen ("-T") + 1);
00136 strcpy (argv[i++], "-T");
00137 if (server_name) {
00138 size_t optlen = strlen("-n");
00139 char* buf = (char*)malloc(optlen + strlen(server_name) + 1);
00140 strcpy(buf, "-n");
00141 strcpy(buf + optlen, server_name);
00142 argv[i++] = buf;
00143 }
00144 }
00145
00146 result = strcspn(arguments + pos, " ");
00147 if (result == 0) {
00148 break;
00149 }
00150 argv[i] = (char*)malloc(result + 1);
00151 strncpy(argv[i], arguments + pos, result);
00152 argv[i][result] = '\0';
00153 pos += result + 1;
00154 ++i;
00155 }
00156 argv[i] = 0;
00157 execv(command, argv);
00158
00159
00160
00161 fprintf(stderr, "exec of JACK server (command = \"%s\") failed: %s\n", command, strerror(errno));
00162 }
00163
00164 #endif
00165
00166 static int start_server(const char* server_name, jack_options_t options)
00167 {
00168 if ((options & JackNoStartServer) || getenv("JACK_NO_START_SERVER")) {
00169 return 1;
00170 }
00171
00172 #if defined(JACK_DBUS)
00173 return start_server_dbus(server_name);
00174 #else
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 switch (fork()) {
00186 case 0:
00187 switch (fork()) {
00188 case 0:
00189 start_server_aux(server_name);
00190 _exit(99);
00191 case - 1:
00192 _exit(98);
00193 default:
00194 _exit(0);
00195 }
00196 case - 1:
00197 return 1;
00198 }
00199
00200
00201 return 0;
00202 #endif
00203 }
00204
00205 static int server_connect(char* server_name)
00206 {
00207 JackClientChannel channel;
00208 int res = channel.ServerCheck(server_name);
00209 channel.Close();
00210 return res;
00211 }
00212
00213 int try_start_server(jack_varargs_t* va, jack_options_t options, jack_status_t* status)
00214 {
00215 if (server_connect(va->server_name) < 0) {
00216 int trys;
00217 if (start_server(va->server_name, options)) {
00218 int my_status1 = *status | JackFailure | JackServerFailed;
00219 *status = (jack_status_t)my_status1;
00220 return -1;
00221 }
00222 trys = 5;
00223 do {
00224 sleep(1);
00225 if (--trys < 0) {
00226 int my_status1 = *status | JackFailure | JackServerFailed;
00227 *status = (jack_status_t)my_status1;
00228 return -1;
00229 }
00230 } while (server_connect(va->server_name) < 0);
00231 int my_status1 = *status | JackServerStarted;
00232 *status = (jack_status_t)my_status1;
00233 }
00234
00235 return 0;
00236 }
00237
00238 #endif