20 #include "JackConstants.h"
21 #include "JackDriverLoader.h"
22 #include "JackTools.h"
23 #include "JackError.h"
38 void JackTools::KillServer()
43 kill(GetPID(), SIGINT);
47 void JackTools::ThrowJackNetException()
49 throw JackNetException();
52 int JackTools::MkDir(
const char* path)
55 return CreateDirectory(path, NULL) == 0;
57 return mkdir(path, 0777) != 0;
61 #define DEFAULT_TMP_DIR "/tmp"
62 char* jack_tmpdir = (
char*)DEFAULT_TMP_DIR;
64 int JackTools::GetPID()
73 int JackTools::GetUID()
83 const char* JackTools::DefaultServerName()
85 const char* server_name;
86 if ((server_name = getenv(
"JACK_DEFAULT_SERVER")) == NULL) {
87 server_name = JACK_DEFAULT_SERVER_NAME;
95 char* JackTools::UserDir()
100 char* JackTools::ServerDir(
const char* server_name,
char* server_dir)
105 void JackTools::CleanupFiles(
const char* server_name) {}
107 int JackTools::GetTmpdir()
113 char* JackTools::UserDir()
115 static char user_dir[JACK_PATH_MAX + 1] =
"";
118 if (user_dir[0] ==
'\0') {
119 if (getenv (
"JACK_PROMISCUOUS_SERVER")) {
120 snprintf(user_dir,
sizeof(user_dir),
"%s/jack", jack_tmpdir);
122 snprintf(user_dir,
sizeof(user_dir),
"%s/jack-%d", jack_tmpdir, GetUID());
130 char* JackTools::ServerDir(
const char* server_name,
char* server_dir)
135 snprintf(server_dir, JACK_PATH_MAX + 1,
"%s/%s", UserDir(), server_name);
139 void JackTools::CleanupFiles(
const char* server_name)
142 struct dirent *dirent;
143 char dir_name[JACK_PATH_MAX + 1] =
"";
144 ServerDir(server_name, dir_name);
163 if ((dir = opendir(dir_name)) == NULL) {
168 while ((dirent = readdir(dir)) != NULL) {
170 char fullpath[JACK_PATH_MAX + 1];
172 if ((strcmp(dirent->d_name,
".") == 0) || (strcmp (dirent->d_name,
"..") == 0)) {
176 snprintf(fullpath,
sizeof(fullpath),
"%s/%s", dir_name, dirent->d_name);
178 if (unlink(fullpath)) {
179 jack_error(
"cannot unlink `%s' (%s)", fullpath, strerror(errno));
186 if (rmdir(dir_name)) {
187 jack_error(
"cannot remove `%s' (%s)", dir_name, strerror(errno));
191 if (rmdir(UserDir())) {
192 if (errno != ENOTEMPTY) {
193 jack_error(
"cannot remove `%s' (%s)", UserDir(), strerror(errno));
198 int JackTools::GetTmpdir()
202 char buf[JACK_PATH_MAX + 2];
204 if ((in = popen(
"jackd -l",
"r")) == NULL) {
208 if (fgets(buf,
sizeof(buf), in) == NULL) {
215 if (buf[len - 1] !=
'\n') {
221 jack_tmpdir = (
char *)malloc(len);
222 memcpy(jack_tmpdir, buf, len - 1);
223 jack_tmpdir[len - 1] =
'\0';
230 void JackTools::RewriteName(
const char* name,
char* new_name)
233 for (i = 0; i < strlen(name); i++) {
234 if ((name[i] ==
'/') || (name[i] ==
'\\')) {
237 new_name[i] = name[i];
245 void BuildClientPath(
char* path_to_so,
int path_len,
const char* so_name)
247 snprintf(path_to_so, path_len, ADDON_DIR
"/%s.dll", so_name);
250 void PrintLoadError(
const char* so_name)
255 DWORD dw = GetLastError();
258 FORMAT_MESSAGE_ALLOCATE_BUFFER |
259 FORMAT_MESSAGE_FROM_SYSTEM |
260 FORMAT_MESSAGE_IGNORE_INSERTS,
263 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
268 lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
269 (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)so_name) + 40) *
sizeof(TCHAR));
270 _snprintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) /
sizeof(TCHAR),
271 TEXT(
"error loading %s err = %s"), so_name, lpMsgBuf);
276 LocalFree(lpDisplayBuf);
281 void PrintLoadError(
const char* so_name)
283 jack_log(
"error loading %s err = %s", so_name, dlerror());
286 void BuildClientPath(
char* path_to_so,
int path_len,
const char* so_name)
288 const char* internal_dir;
289 if ((internal_dir = getenv(
"JACK_INTERNAL_DIR")) == 0) {
290 if ((internal_dir = getenv(
"JACK_DRIVER_DIR")) == 0) {
291 internal_dir = ADDON_DIR;
295 snprintf(path_to_so, path_len,
"%s/%s.so", internal_dir, so_name);