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 using namespace std;
00032
00033 namespace Jack {
00034
00035 #define DEFAULT_TMP_DIR "/tmp"
00036 char* jack_tmpdir = (char*)DEFAULT_TMP_DIR;
00037
00038 int JackTools::GetPID()
00039 {
00040 #ifdef WIN32
00041 return _getpid();
00042 #else
00043 return getpid();
00044 #endif
00045 }
00046
00047 int JackTools::GetUID()
00048 {
00049 #ifdef WIN32
00050 return _getpid();
00051
00052 #else
00053 return getuid();
00054 #endif
00055 }
00056
00057 const char* JackTools::DefaultServerName()
00058 {
00059 const char* server_name;
00060 if ((server_name = getenv("JACK_DEFAULT_SERVER")) == NULL)
00061 server_name = JACK_DEFAULT_SERVER_NAME;
00062 return server_name;
00063 }
00064
00065
00066 #ifdef WIN32
00067
00068 char* JackTools::UserDir()
00069 {
00070 return "";
00071 }
00072
00073 char* JackTools::ServerDir(const char* server_name, char* server_dir)
00074 {
00075 return "";
00076 }
00077
00078 void JackTools::CleanupFiles(const char* server_name) {}
00079
00080 int JackTools::GetTmpdir()
00081 {
00082 return 0;
00083 }
00084
00085 #else
00086 char* JackTools::UserDir()
00087 {
00088 static char user_dir[JACK_PATH_MAX + 1] = "";
00089
00090
00091 if (user_dir[0] == '\0') {
00092 if (getenv ("JACK_PROMISCUOUS_SERVER")) {
00093 snprintf(user_dir, sizeof(user_dir), "%s/jack", jack_tmpdir);
00094 } else {
00095 snprintf(user_dir, sizeof(user_dir), "%s/jack-%d", jack_tmpdir, GetUID());
00096 }
00097 }
00098
00099 return user_dir;
00100 }
00101
00102
00103 char* JackTools::ServerDir(const char* server_name, char* server_dir)
00104 {
00105
00106
00107
00108 snprintf(server_dir, JACK_PATH_MAX + 1, "%s/%s", UserDir(), server_name);
00109 return server_dir;
00110 }
00111
00112 void JackTools::CleanupFiles(const char* server_name)
00113 {
00114 DIR* dir;
00115 struct dirent *dirent;
00116 char dir_name[JACK_PATH_MAX + 1] = "";
00117 ServerDir(server_name, dir_name);
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 if ((dir = opendir(dir_name)) == NULL) {
00137 return;
00138 }
00139
00140
00141 while ((dirent = readdir(dir)) != NULL) {
00142
00143 char fullpath[JACK_PATH_MAX + 1];
00144
00145 if ((strcmp(dirent->d_name, ".") == 0) || (strcmp (dirent->d_name, "..") == 0)) {
00146 continue;
00147 }
00148
00149 snprintf(fullpath, sizeof(fullpath), "%s/%s", dir_name, dirent->d_name);
00150
00151 if (unlink(fullpath)) {
00152 jack_error("cannot unlink `%s' (%s)", fullpath, strerror(errno));
00153 }
00154 }
00155
00156 closedir(dir);
00157
00158
00159 if (rmdir(dir_name)) {
00160 jack_error("cannot remove `%s' (%s)", dir_name, strerror(errno));
00161 }
00162
00163
00164 if (rmdir(UserDir())) {
00165 if (errno != ENOTEMPTY) {
00166 jack_error("cannot remove `%s' (%s)", UserDir(), strerror(errno));
00167 }
00168 }
00169 }
00170
00171 int JackTools::GetTmpdir() {
00172 FILE* in;
00173 size_t len;
00174 char buf[JACK_PATH_MAX + 2];
00175
00176 if ((in = popen("jackd -l", "r")) == NULL) {
00177 return -1;
00178 }
00179
00180 if (fgets(buf, sizeof(buf), in) == NULL) {
00181 fclose(in);
00182 return -1;
00183 }
00184
00185 len = strlen(buf);
00186
00187 if (buf[len - 1] != '\n') {
00188
00189 fclose(in);
00190 return -1;
00191 }
00192
00193 jack_tmpdir = (char *)malloc(len);
00194 memcpy(jack_tmpdir, buf, len - 1);
00195 jack_tmpdir[len - 1] = '\0';
00196
00197 fclose(in);
00198 return 0;
00199 }
00200 #endif
00201
00202 void JackTools::RewriteName(const char* name, char* new_name) {
00203 size_t i;
00204 for (i = 0; i < strlen(name); i++) {
00205 if ((name[i] == '/') || (name[i] == '\\'))
00206 new_name[i] = '_';
00207 else
00208 new_name[i] = name[i];
00209 }
00210 new_name[i] = '\0';
00211 }
00212
00213 }
00214