20 #include "JackConstants.h"
21 #include "driver_interface.h"
22 #include "JackTools.h"
23 #include "JackError.h"
38 void JackTools::KillServer()
43 kill(GetPID(), SIGINT);
47 int JackTools::MkDir(
const char* path)
50 return CreateDirectory(path, NULL) == 0;
52 return mkdir(path, 0777) != 0;
56 #define DEFAULT_TMP_DIR "/tmp"
57 char* jack_tmpdir = (
char*)DEFAULT_TMP_DIR;
59 int JackTools::GetPID()
68 int JackTools::GetUID()
78 const char* JackTools::DefaultServerName()
80 const char* server_name;
81 if ((server_name = getenv(
"JACK_DEFAULT_SERVER")) == NULL) {
82 server_name = JACK_DEFAULT_SERVER_NAME;
90 char* JackTools::UserDir()
95 char* JackTools::ServerDir(
const char* server_name,
char* server_dir)
100 void JackTools::CleanupFiles(
const char* server_name) {}
102 int JackTools::GetTmpdir()
108 char* JackTools::UserDir()
110 static char user_dir[JACK_PATH_MAX + 1] =
"";
113 if (user_dir[0] ==
'\0') {
114 if (getenv (
"JACK_PROMISCUOUS_SERVER")) {
115 snprintf(user_dir,
sizeof(user_dir),
"%s/jack", jack_tmpdir);
117 snprintf(user_dir,
sizeof(user_dir),
"%s/jack-%d", jack_tmpdir, GetUID());
125 char* JackTools::ServerDir(
const char* server_name,
char* server_dir)
130 snprintf(server_dir, JACK_PATH_MAX + 1,
"%s/%s", UserDir(), server_name);
134 void JackTools::CleanupFiles(
const char* server_name)
137 struct dirent *dirent;
138 char dir_name[JACK_PATH_MAX + 1] =
"";
139 ServerDir(server_name, dir_name);
158 if ((dir = opendir(dir_name)) == NULL) {
163 while ((dirent = readdir(dir)) != NULL) {
165 char fullpath[JACK_PATH_MAX + 1];
167 if ((strcmp(dirent->d_name,
".") == 0) || (strcmp (dirent->d_name,
"..") == 0)) {
171 snprintf(fullpath,
sizeof(fullpath),
"%s/%s", dir_name, dirent->d_name);
173 if (unlink(fullpath)) {
174 jack_error(
"cannot unlink `%s' (%s)", fullpath, strerror(errno));
181 if (rmdir(dir_name)) {
182 jack_error(
"cannot remove `%s' (%s)", dir_name, strerror(errno));
186 if (rmdir(UserDir())) {
187 if (errno != ENOTEMPTY) {
188 jack_error(
"cannot remove `%s' (%s)", UserDir(), strerror(errno));
193 int JackTools::GetTmpdir()
197 char buf[JACK_PATH_MAX + 2];
199 if ((in = popen(
"jackd -l",
"r")) == NULL) {
203 if (fgets(buf,
sizeof(buf), in) == NULL) {
210 if (buf[len - 1] !=
'\n') {
216 jack_tmpdir = (
char *)malloc(len);
217 memcpy(jack_tmpdir, buf, len - 1);
218 jack_tmpdir[len - 1] =
'\0';
225 void JackTools::RewriteName(
const char* name,
char* new_name)
228 for (i = 0; i < strlen(name); i++) {
229 if ((name[i] ==
'/') || (name[i] ==
'\\')) {
232 new_name[i] = name[i];
240 void BuildClientPath(
char* path_to_so,
int path_len,
const char* so_name)
242 snprintf(path_to_so, path_len, ADDON_DIR
"/%s.dll", so_name);
245 void PrintLoadError(
const char* so_name)
250 DWORD dw = GetLastError();
253 FORMAT_MESSAGE_ALLOCATE_BUFFER |
254 FORMAT_MESSAGE_FROM_SYSTEM |
255 FORMAT_MESSAGE_IGNORE_INSERTS,
258 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
263 lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
264 (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)so_name) + 40) *
sizeof(TCHAR));
265 _snprintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) /
sizeof(TCHAR),
266 TEXT(
"error loading %s err = %s"), so_name, lpMsgBuf);
271 LocalFree(lpDisplayBuf);
276 void PrintLoadError(
const char* so_name)
278 jack_log(
"error loading %s err = %s", so_name, dlerror());
281 void BuildClientPath(
char* path_to_so,
int path_len,
const char* so_name)
283 const char* internal_dir;
284 if ((internal_dir = getenv(
"JACK_INTERNAL_DIR")) == 0) {
285 if ((internal_dir = getenv(
"JACK_DRIVER_DIR")) == 0) {
286 internal_dir = ADDON_DIR;
290 snprintf(path_to_so, path_len,
"%s/%s.so", internal_dir, so_name);
SERVER_EXPORT void jack_error(const char *fmt,...)
SERVER_EXPORT void jack_log(const char *fmt,...)