00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "JackConstants.h"
00021 #include "JackDriverLoader.h"
00022 #include "JackTools.h"
00023 #include <stdlib.h>
00024 #include <stdio.h>
00025 #include <assert.h>
00026
00027 #ifdef WIN32
00028 #include <process.h>
00029 #endif
00030
00031
00032 using namespace std;
00033
00034 namespace Jack {
00035
00036 #define DEFAULT_TMP_DIR "/tmp"
00037 char* jack_tmpdir = (char*)DEFAULT_TMP_DIR;
00038
00039 int JackTools::GetPID()
00040 {
00041 #ifdef WIN32
00042 return _getpid();
00043 #else
00044 return getpid();
00045 #endif
00046 }
00047
00048 int JackTools::GetUID()
00049 {
00050 #ifdef WIN32
00051 return _getpid();
00052
00053 #else
00054 return getuid();
00055 #endif
00056 }
00057
00058 const char* JackTools::DefaultServerName()
00059 {
00060 const char* server_name;
00061 if ((server_name = getenv("JACK_DEFAULT_SERVER")) == NULL)
00062 server_name = JACK_DEFAULT_SERVER_NAME;
00063 return server_name;
00064 }
00065
00066
00067 #ifdef WIN32
00068
00069 char* JackTools::UserDir()
00070 {
00071 return "";
00072 }
00073
00074 char* JackTools::ServerDir(const char* server_name, char* server_dir)
00075 {
00076 return "";
00077 }
00078
00079 void JackTools::CleanupFiles(const char* server_name) {}
00080
00081 int JackTools::GetTmpdir()
00082 {
00083 return 0;
00084 }
00085
00086 #else
00087 char* JackTools::UserDir()
00088 {
00089 static char user_dir[JACK_PATH_MAX + 1] = "";
00090
00091
00092 if (user_dir[0] == '\0') {
00093 if (getenv ("JACK_PROMISCUOUS_SERVER")) {
00094 snprintf(user_dir, sizeof(user_dir), "%s/jack", jack_tmpdir);
00095 } else {
00096 snprintf(user_dir, sizeof(user_dir), "%s/jack-%d", jack_tmpdir, GetUID());
00097 }
00098 }
00099
00100 return user_dir;
00101 }
00102
00103
00104 char* JackTools::ServerDir(const char* server_name, char* server_dir)
00105 {
00106
00107
00108
00109 snprintf(server_dir, JACK_PATH_MAX + 1, "%s/%s", UserDir(), server_name);
00110 return server_dir;
00111 }
00112
00113 void JackTools::CleanupFiles(const char* server_name)
00114 {
00115 DIR* dir;
00116 struct dirent *dirent;
00117 char dir_name[JACK_PATH_MAX + 1] = "";
00118 ServerDir(server_name, dir_name);
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 if ((dir = opendir(dir_name)) == NULL) {
00138 return;
00139 }
00140
00141
00142 while ((dirent = readdir(dir)) != NULL) {
00143
00144 char fullpath[JACK_PATH_MAX + 1];
00145
00146 if ((strcmp(dirent->d_name, ".") == 0) || (strcmp (dirent->d_name, "..") == 0)) {
00147 continue;
00148 }
00149
00150 snprintf(fullpath, sizeof(fullpath), "%s/%s", dir_name, dirent->d_name);
00151
00152 if (unlink(fullpath)) {
00153 jack_error("cannot unlink `%s' (%s)", fullpath, strerror(errno));
00154 }
00155 }
00156
00157 closedir(dir);
00158
00159
00160 if (rmdir(dir_name)) {
00161 jack_error("cannot remove `%s' (%s)", dir_name, strerror(errno));
00162 }
00163
00164
00165 if (rmdir(UserDir())) {
00166 if (errno != ENOTEMPTY) {
00167 jack_error("cannot remove `%s' (%s)", UserDir(), strerror(errno));
00168 }
00169 }
00170 }
00171
00172 int JackTools::GetTmpdir()
00173 {
00174 FILE* in;
00175 size_t len;
00176 char buf[JACK_PATH_MAX + 2];
00177
00178 if ((in = popen("jackd -l", "r")) == NULL) {
00179 return -1;
00180 }
00181
00182 if (fgets(buf, sizeof(buf), in) == NULL) {
00183 fclose(in);
00184 return -1;
00185 }
00186
00187 len = strlen(buf);
00188
00189 if (buf[len - 1] != '\n') {
00190
00191 fclose(in);
00192 return -1;
00193 }
00194
00195 jack_tmpdir = (char *)malloc(len);
00196 memcpy(jack_tmpdir, buf, len - 1);
00197 jack_tmpdir[len - 1] = '\0';
00198
00199 fclose(in);
00200 return 0;
00201 }
00202 #endif
00203
00204 void JackTools::RewriteName(const char* name, char* new_name)
00205 {
00206 size_t i;
00207 for (i = 0; i < strlen(name); i++) {
00208 if ((name[i] == '/') || (name[i] == '\\'))
00209 new_name[i] = '_';
00210 else
00211 new_name[i] = name[i];
00212 }
00213 new_name[i] = '\0';
00214 }
00215
00216 #ifdef WIN32
00217
00218 void BuildClientPath(char* path_to_so, int path_len, const char* so_name)
00219 {
00220 snprintf(path_to_so, path_len, ADDON_DIR "/%s.dll", so_name);
00221 }
00222
00223 void PrintLoadError(const char* so_name)
00224 {
00225
00226 LPVOID lpMsgBuf;
00227 LPVOID lpDisplayBuf;
00228 DWORD dw = GetLastError();
00229
00230 FormatMessage(
00231 FORMAT_MESSAGE_ALLOCATE_BUFFER |
00232 FORMAT_MESSAGE_FROM_SYSTEM |
00233 FORMAT_MESSAGE_IGNORE_INSERTS,
00234 NULL,
00235 dw,
00236 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
00237 (LPTSTR) &lpMsgBuf,
00238 0, NULL );
00239
00240
00241 lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
00242 (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)so_name) + 40) * sizeof(TCHAR));
00243 _snprintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR),
00244 TEXT("error loading %s err = %s"), so_name, lpMsgBuf);
00245
00246 jack_error((LPCTSTR)lpDisplayBuf);
00247
00248 LocalFree(lpMsgBuf);
00249 LocalFree(lpDisplayBuf);
00250 }
00251
00252 #else
00253
00254 void PrintLoadError(const char* so_name)
00255 {
00256 jack_log("error loading %s err = %s", so_name, dlerror());
00257 }
00258
00259 void BuildClientPath(char* path_to_so, int path_len, const char* so_name)
00260 {
00261 const char* internal_dir;
00262 if ((internal_dir = getenv("JACK_INTERNAL_DIR")) == 0) {
00263 if ((internal_dir = getenv("JACK_DRIVER_DIR")) == 0) {
00264 internal_dir = ADDON_DIR;
00265 }
00266 }
00267
00268 snprintf(path_to_so, path_len, "%s/%s.so", internal_dir, so_name);
00269 }
00270
00271 #endif
00272
00273 }
00274