20 #include "JackConstants.h"
21 #include "JackDriverLoader.h"
22 #include "JackTools.h"
23 #include "JackError.h"
37 void JackTools::KillServer()
42 kill(GetPID(), SIGINT);
46 void JackTools::ThrowJackNetException()
48 throw JackNetException();
51 int JackTools::MkDir(
const char* path)
54 return CreateDirectory(path, NULL) == 0;
56 return mkdir(path, 0777) != 0;
60 #define DEFAULT_TMP_DIR "/tmp"
61 char* jack_tmpdir = (
char*)DEFAULT_TMP_DIR;
63 int JackTools::GetPID()
72 int JackTools::GetUID()
82 const char* JackTools::DefaultServerName()
84 const char* server_name;
85 if ((server_name = getenv(
"JACK_DEFAULT_SERVER")) == NULL)
86 server_name = JACK_DEFAULT_SERVER_NAME;
93 char* JackTools::UserDir()
98 char* JackTools::ServerDir(
const char* server_name,
char* server_dir)
103 void JackTools::CleanupFiles(
const char* server_name) {}
105 int JackTools::GetTmpdir()
111 char* JackTools::UserDir()
113 static char user_dir[JACK_PATH_MAX + 1] =
"";
116 if (user_dir[0] ==
'\0') {
117 if (getenv (
"JACK_PROMISCUOUS_SERVER")) {
118 snprintf(user_dir,
sizeof(user_dir),
"%s/jack", jack_tmpdir);
120 snprintf(user_dir,
sizeof(user_dir),
"%s/jack-%d", jack_tmpdir, GetUID());
128 char* JackTools::ServerDir(
const char* server_name,
char* server_dir)
133 snprintf(server_dir, JACK_PATH_MAX + 1,
"%s/%s", UserDir(), server_name);
137 void JackTools::CleanupFiles(
const char* server_name)
140 struct dirent *dirent;
141 char dir_name[JACK_PATH_MAX + 1] =
"";
142 ServerDir(server_name, dir_name);
161 if ((dir = opendir(dir_name)) == NULL) {
166 while ((dirent = readdir(dir)) != NULL) {
168 char fullpath[JACK_PATH_MAX + 1];
170 if ((strcmp(dirent->d_name,
".") == 0) || (strcmp (dirent->d_name,
"..") == 0)) {
174 snprintf(fullpath,
sizeof(fullpath),
"%s/%s", dir_name, dirent->d_name);
176 if (unlink(fullpath)) {
177 jack_error(
"cannot unlink `%s' (%s)", fullpath, strerror(errno));
184 if (rmdir(dir_name)) {
185 jack_error(
"cannot remove `%s' (%s)", dir_name, strerror(errno));
189 if (rmdir(UserDir())) {
190 if (errno != ENOTEMPTY) {
191 jack_error(
"cannot remove `%s' (%s)", UserDir(), strerror(errno));
196 int JackTools::GetTmpdir()
200 char buf[JACK_PATH_MAX + 2];
202 if ((in = popen(
"jackd -l",
"r")) == NULL) {
206 if (fgets(buf,
sizeof(buf), in) == NULL) {
213 if (buf[len - 1] !=
'\n') {
219 jack_tmpdir = (
char *)malloc(len);
220 memcpy(jack_tmpdir, buf, len - 1);
221 jack_tmpdir[len - 1] =
'\0';
228 void JackTools::RewriteName(
const char* name,
char* new_name)
231 for (i = 0; i < strlen(name); i++) {
232 if ((name[i] ==
'/') || (name[i] ==
'\\'))
235 new_name[i] = name[i];
242 void BuildClientPath(
char* path_to_so,
int path_len,
const char* so_name)
244 snprintf(path_to_so, path_len, ADDON_DIR
"/%s.dll", so_name);
247 void PrintLoadError(
const char* so_name)
252 DWORD dw = GetLastError();
255 FORMAT_MESSAGE_ALLOCATE_BUFFER |
256 FORMAT_MESSAGE_FROM_SYSTEM |
257 FORMAT_MESSAGE_IGNORE_INSERTS,
260 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
265 lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
266 (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)so_name) + 40) *
sizeof(TCHAR));
267 _snprintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) /
sizeof(TCHAR),
268 TEXT(
"error loading %s err = %s"), so_name, lpMsgBuf);
273 LocalFree(lpDisplayBuf);
278 void PrintLoadError(
const char* so_name)
280 jack_log(
"error loading %s err = %s", so_name, dlerror());
283 void BuildClientPath(
char* path_to_so,
int path_len,
const char* so_name)
285 const char* internal_dir;
286 if ((internal_dir = getenv(
"JACK_INTERNAL_DIR")) == 0) {
287 if ((internal_dir = getenv(
"JACK_DRIVER_DIR")) == 0) {
288 internal_dir = ADDON_DIR;
292 snprintf(path_to_so, path_len,
"%s/%s.so", internal_dir, so_name);