00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef ADDON_DIR
00022 #include "config.h"
00023 #endif
00024
00025 #include "JackChannel.h"
00026 #include "JackLibGlobals.h"
00027 #include "JackServerLaunch.h"
00028
00029 using namespace Jack;
00030
00031 #ifndef WIN32
00032
00033
00034 static void start_server_aux(const char* server_name)
00035 {
00036 FILE* fp = 0;
00037 char filename[255];
00038 char arguments[255];
00039 char buffer[255];
00040 char* command = 0;
00041 size_t pos = 0;
00042 size_t result = 0;
00043 char** argv = 0;
00044 int i = 0;
00045 int good = 0;
00046 int ret;
00047
00048 snprintf(filename, 255, "%s/.jackdrc", getenv("HOME"));
00049 fp = fopen(filename, "r");
00050
00051 if (!fp) {
00052 fp = fopen("/etc/jackdrc", "r");
00053 }
00054
00055 if (!fp) {
00056 fp = fopen("/etc/jackd.conf", "r");
00057 }
00058
00059 if (fp) {
00060 arguments[0] = '\0';
00061 ret = fscanf(fp, "%s", buffer);
00062 while (ret != 0 && ret != EOF) {
00063 strcat(arguments, buffer);
00064 strcat(arguments, " ");
00065 ret = fscanf(fp, "%s", buffer);
00066 }
00067 if (strlen(arguments) > 0) {
00068 good = 1;
00069 }
00070 fclose(fp);
00071 }
00072
00073 if (!good) {
00074 command = (char*)(JACK_LOCATION "/jackd");
00075 strncpy(arguments, JACK_LOCATION "/jackd -T -d "JACK_DEFAULT_DRIVER, 255);
00076 } else {
00077 result = strcspn(arguments, " ");
00078 command = (char*)malloc(result + 1);
00079 strncpy(command, arguments, result);
00080 command[result] = '\0';
00081 }
00082
00083 argv = (char**)malloc(255);
00084
00085 while (1) {
00086
00087 if (i == 1) {
00088 argv[i] = (char*)malloc(strlen ("-T") + 1);
00089 strcpy (argv[i++], "-T");
00090 if (server_name) {
00091 size_t optlen = strlen("-n");
00092 char* buf = (char*)malloc(optlen + strlen(server_name) + 1);
00093 strcpy(buf, "-n");
00094 strcpy(buf + optlen, server_name);
00095 argv[i++] = buf;
00096 }
00097 }
00098
00099 result = strcspn(arguments + pos, " ");
00100 if (result == 0) {
00101 break;
00102 }
00103 argv[i] = (char*)malloc(result + 1);
00104 strncpy(argv[i], arguments + pos, result);
00105 argv[i][result] = '\0';
00106 pos += result + 1;
00107 ++i;
00108 }
00109 argv[i] = 0;
00110 execv(command, argv);
00111
00112
00113
00114 fprintf(stderr, "exec of JACK server (command = \"%s\") failed: %s\n", command, strerror(errno));
00115 }
00116
00117 static int start_server(const char* server_name, jack_options_t options)
00118 {
00119 if ((options & JackNoStartServer) || getenv("JACK_NO_START_SERVER")) {
00120 return 1;
00121 }
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 switch (fork()) {
00133 case 0:
00134 switch (fork()) {
00135 case 0:
00136 start_server_aux(server_name);
00137 _exit(99);
00138 case -1:
00139 _exit(98);
00140 default:
00141 _exit(0);
00142 }
00143 case -1:
00144 return 1;
00145 }
00146
00147
00148 return 0;
00149 }
00150
00151 int server_connect(char* server_name)
00152 {
00153 JackClientChannelInterface* channel = JackGlobals::MakeClientChannel();
00154 int res = channel->ServerCheck(server_name);
00155 channel->Close();
00156 delete channel;
00157 return res;
00158 }
00159
00160 int try_start_server(jack_varargs_t* va, jack_options_t options, jack_status_t* status)
00161 {
00162 if (server_connect(va->server_name) < 0) {
00163 int trys;
00164 if (start_server(va->server_name, options)) {
00165 int my_status1 = *status | JackFailure | JackServerFailed;
00166 *status = (jack_status_t)my_status1;
00167 return -1;
00168 }
00169 trys = 5;
00170 do {
00171 sleep(1);
00172 if (--trys < 0) {
00173 int my_status1 = *status | JackFailure | JackServerFailed;
00174 *status = (jack_status_t)my_status1;
00175 return -1;
00176 }
00177 } while (server_connect(va->server_name) < 0);
00178 int my_status1 = *status | JackServerStarted;
00179 *status = (jack_status_t)my_status1;
00180 }
00181
00182 return 0;
00183 }
00184
00185 #endif