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