00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "JackSocket.h"
00021 #include "JackError.h"
00022 #include <string.h>
00023
00024 namespace Jack
00025 {
00026
00027 JackClientSocket::JackClientSocket(int socket): fSocket(socket)
00028 {}
00029
00030 void JackClientSocket::SetReadTimeOut(long sec)
00031 {
00032 struct timeval timout;
00033 timout.tv_sec = sec;
00034 timout.tv_usec = 0;
00035 if (setsockopt(fSocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timout, sizeof(timeval)) < 0) {
00036 JackLog("setsockopt SO_RCVTIMEO fd = %ld err = (%s)\n", fSocket, strerror(errno));
00037 }
00038 }
00039
00040 void JackClientSocket::SetWriteTimeOut(long sec)
00041 {
00042 struct timeval timout;
00043 timout.tv_sec = sec ;
00044 timout.tv_usec = 0;
00045 if (setsockopt(fSocket, SOL_SOCKET, SO_SNDTIMEO, (const char*)&timout, sizeof(timeval)) < 0) {
00046 JackLog("setsockopt SO_SNDTIMEO fd = %ld err = (%s)\n", fSocket, strerror(errno));
00047 }
00048 }
00049
00050 int JackClientSocket::Connect(const char* dir, const char* name, int which)
00051 {
00052 struct sockaddr_un addr;
00053
00054 if ((fSocket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
00055 jack_error("Cannot create socket (%s)", strerror(errno));
00056 return -1;
00057 }
00058
00059 addr.sun_family = AF_UNIX;
00060 snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, "%s/jack_%s", dir, name);
00061
00062 JackLog("Connect: addr.sun_path %s\n", addr.sun_path);
00063
00064 if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
00065 jack_error("Cannot connect to server socket (%s)", strerror(errno));
00066 close(fSocket);
00067 return -1;
00068 }
00069
00070 #ifdef __APPLE__
00071 int on = 1 ;
00072 if (setsockopt(fSocket, SOL_SOCKET, SO_NOSIGPIPE, (const char*)&on, sizeof(on)) < 0) {
00073 JackLog("setsockopt SO_NOSIGPIPE fd = %ld err = %s\n", fSocket, strerror(errno));
00074 }
00075 #endif
00076
00077 return 0;
00078 }
00079
00080 int JackClientSocket::Connect(const char* dir, int which)
00081 {
00082 struct sockaddr_un addr;
00083
00084 if ((fSocket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
00085 jack_error("Cannot create socket (%s)", strerror(errno));
00086 return -1;
00087 }
00088
00089 addr.sun_family = AF_UNIX;
00090 snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, "%s/jack_%d", dir, which);
00091
00092 JackLog("Connect: addr.sun_path %s\n", addr.sun_path);
00093
00094 if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
00095 jack_error("Cannot connect to server socket (%s)", strerror(errno));
00096 close(fSocket);
00097 return -1;
00098 }
00099
00100 #ifdef __APPLE__
00101 int on = 1 ;
00102 if (setsockopt(fSocket, SOL_SOCKET, SO_NOSIGPIPE, (const char*)&on, sizeof(on)) < 0) {
00103 JackLog("setsockopt SO_NOSIGPIPE fd = %ld err = %s\n", fSocket, strerror(errno));
00104 }
00105 #endif
00106
00107 return 0;
00108 }
00109
00110 int JackClientSocket::Close()
00111 {
00112 JackLog("JackClientSocket::Close\n");
00113
00114 if (fSocket > 0) {
00115 close(fSocket);
00116 fSocket = -1;
00117 return 0;
00118 } else {
00119 return -1;
00120 }
00121 }
00122
00123 int JackClientSocket::Read(void* data, int len)
00124 {
00125 int len1;
00126 JackLog("JackClientSocket::Read len = %ld\n", len);
00127
00128 if ((len1 = read(fSocket, data, len)) != len) {
00129 jack_error("Cannot read socket %d %d (%s)", len, len1, strerror(errno));
00130 if (errno == EWOULDBLOCK) {
00131 JackLog("JackClientSocket::Read time out\n");
00132 return 0;
00133 } else {
00134 return -1;
00135 }
00136 } else {
00137 return 0;
00138 }
00139 }
00140
00141 int JackClientSocket::Write(void* data, int len)
00142 {
00143 if (write(fSocket, data, len) != len) {
00144 jack_error("Cannot write socket fd %ld (%s)", fSocket, strerror(errno));
00145 return -1;
00146 } else {
00147 return 0;
00148 }
00149 }
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 int JackServerSocket::Bind(const char* dir, const char* name, int which)
00184 {
00185 struct sockaddr_un addr;
00186
00187 if ((fSocket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
00188 jack_error("Cannot create server socket (%s)", strerror(errno));
00189 return -1;
00190 }
00191
00192 addr.sun_family = AF_UNIX;
00193
00194
00195 snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, "%s/jack_%s", dir, name);
00196 snprintf(fName, sizeof(addr.sun_path) - 1, "%s/jack_%s", dir, name);
00197
00198
00199
00200
00201
00202
00203 JackLog("Bind: addr.sun_path %s\n", addr.sun_path);
00204 unlink(fName);
00205
00206 JackLog("Bind: addr.sun_path %s\n", addr.sun_path);
00207 unlink(fName);
00208
00209 if (bind(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
00210 jack_error("Cannot bind server to socket (%s)", strerror(errno));
00211 goto error;
00212 }
00213
00214 if (listen(fSocket, 1) < 0) {
00215 jack_error("Cannot enable listen on server socket (%s)", strerror(errno));
00216 goto error;
00217 }
00218
00219 return 0;
00220
00221 error:
00222 unlink(fName);
00223 close(fSocket);
00224 return -1;
00225 }
00226
00227 int JackServerSocket::Bind(const char* dir, int which)
00228 {
00229 struct sockaddr_un addr;
00230
00231 if ((fSocket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
00232 jack_error ("Cannot create server socket (%s)", strerror(errno));
00233 return -1;
00234 }
00235
00236 addr.sun_family = AF_UNIX;
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249 snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, "%s/jack_%d", dir, which);
00250 snprintf(fName, sizeof(addr.sun_path) - 1, "%s/jack_%d", dir, which);
00251
00252
00253
00254
00255
00256
00257 JackLog("Bind: addr.sun_path %s\n", addr.sun_path);
00258 unlink(fName);
00259
00260 if (bind(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
00261 jack_error("Cannot bind server to socket (%s)", strerror(errno));
00262 goto error;
00263 }
00264
00265 if (listen(fSocket, 1) < 0) {
00266 jack_error("Cannot enable listen on server socket (%s)", strerror(errno));
00267 goto error;
00268 }
00269
00270 return 0;
00271
00272 error:
00273 unlink(fName);
00274 close(fSocket);
00275 return -1;
00276 }
00277
00278 JackClientSocket* JackServerSocket::Accept()
00279 {
00280 struct sockaddr_un client_addr;
00281 socklen_t client_addrlen;
00282
00283 memset(&client_addr, 0, sizeof(client_addr));
00284 client_addrlen = sizeof(client_addr);
00285
00286 int fd = accept(fSocket, (struct sockaddr*) & client_addr, &client_addrlen);
00287 if (fd < 0) {
00288 jack_error("Cannot accept new connection (%s)", strerror(errno));
00289 return 0;
00290 } else {
00291 return new JackClientSocket(fd);
00292 }
00293 }
00294
00295 int JackServerSocket::Close()
00296 {
00297 JackLog("JackServerSocket::Close %s\n", fName);
00298
00299 if (fSocket > 0) {
00300
00301 close(fSocket);
00302 unlink(fName);
00303 fSocket = -1;
00304 return 0;
00305 } else {
00306 return -1;
00307 }
00308 }
00309
00310 }
00311
00312