20 #include "JackSocket.h"
21 #include "JackConstants.h"
22 #include "JackTools.h"
23 #include "JackError.h"
24 #include "promiscuous.h"
33 static void BuildName(
const char* client_name,
char* res,
const char* dir,
int which,
int size,
bool promiscuous)
35 char ext_client_name[SYNC_MAX_NAME_SIZE + 1];
36 JackTools::RewriteName(client_name, ext_client_name);
38 snprintf(res, size,
"%s/jack_%s_%d", dir, ext_client_name, which);
40 snprintf(res, size,
"%s/jack_%s_%d_%d", dir, ext_client_name, JackTools::GetUID(), which);
44 JackClientSocket::JackClientSocket(): JackClientRequestInterface(), fSocket(-1), fTimeOut(0)
46 const char* promiscuous = getenv(
"JACK_PROMISCUOUS_SERVER");
47 fPromiscuous = (promiscuous != NULL);
48 fPromiscuousGid = jack_group2gid(promiscuous);
51 JackClientSocket::JackClientSocket(
int socket): JackClientRequestInterface(), fSocket(socket),fTimeOut(0), fPromiscuous(false), fPromiscuousGid(-1)
54 #if defined(__sun__) || defined(sun)
56 void JackClientSocket::SetReadTimeOut(
long sec)
61 if ((flags = fcntl(fSocket, F_GETFL, 0)) < 0) {
62 jack_error(
"JackClientSocket::SetReadTimeOut error in fcntl F_GETFL");
67 if (fcntl(fSocket, F_SETFL, flags) < 0) {
68 jack_error(
"JackClientSocket::SetReadTimeOut error in fcntl F_SETFL");
73 void JackClientSocket::SetWriteTimeOut(
long sec)
78 if ((flags = fcntl(fSocket, F_GETFL, 0)) < 0) {
79 jack_error(
"JackClientSocket::SetWriteTimeOut error in fcntl F_GETFL");
84 if (fcntl(fSocket, F_SETFL, flags) < 0) {
85 jack_error(
"JackClientSocket::SetWriteTimeOut error in fcntl F_SETFL");
92 void JackClientSocket::SetReadTimeOut(
long sec)
94 struct timeval timout;
97 if (setsockopt(fSocket, SOL_SOCKET, SO_RCVTIMEO, (
const char*)&timout,
sizeof(timeval)) < 0) {
98 jack_error(
"SetReadTimeOut fd = %ld err = %s", fSocket, strerror(errno));
102 void JackClientSocket::SetWriteTimeOut(
long sec)
104 struct timeval timout;
105 timout.tv_sec = sec ;
107 if (setsockopt(fSocket, SOL_SOCKET, SO_SNDTIMEO, (
const char*)&timout,
sizeof(timeval)) < 0) {
108 jack_error(
"SetWriteTimeOut fd = %ld err = %s", fSocket, strerror(errno));
114 void JackClientSocket::SetNonBlocking(
bool onoff)
118 if (fcntl(fSocket, F_SETFL, flags | O_NONBLOCK) < 0) {
119 jack_error(
"SetNonBlocking fd = %ld err = %s", fSocket, strerror(errno));
124 int JackClientSocket::Connect(
const char* dir,
const char* name,
int which)
126 struct sockaddr_un addr;
128 if ((fSocket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
129 jack_error(
"Cannot create socket err = %s", strerror(errno));
133 addr.sun_family = AF_UNIX;
134 BuildName(name, addr.sun_path, dir, which,
sizeof(addr.sun_path), fPromiscuous);
135 jack_log(
"JackClientSocket::Connect : addr.sun_path %s", addr.sun_path);
137 if (connect(fSocket, (
struct sockaddr*)&addr,
sizeof(addr)) < 0) {
138 jack_error(
"Cannot connect to server socket err = %s", strerror(errno));
145 if (setsockopt(fSocket, SOL_SOCKET, SO_NOSIGPIPE, (
const char*)&on,
sizeof(on)) < 0) {
146 jack_log(
"setsockopt SO_NOSIGPIPE fd = %ld err = %s", fSocket, strerror(errno));
153 int JackClientSocket::Close()
155 jack_log(
"JackClientSocket::Close");
157 shutdown(fSocket, SHUT_RDWR);
166 int JackClientSocket::Read(
void* data,
int len)
170 #if defined(__sun__) || defined(sun)
177 tv.tv_sec = fTimeOut;
181 FD_SET(fSocket, &fdset);
184 res = select(fSocket + 1, &fdset, NULL, NULL, &tv);
185 }
while (res < 0 && errno == EINTR);
189 }
else if (res == 0) {
195 if ((res = read(fSocket, data, len)) != len) {
196 if (errno == EWOULDBLOCK || errno == EAGAIN) {
197 jack_error(
"JackClientSocket::Read time out");
199 }
else if (res != 0) {
200 jack_error(
"Cannot read socket fd = %d err = %s", fSocket, strerror(errno));
204 jack_error(
"Cannot read socket fd = %d err = %s", fSocket, strerror(errno));
212 int JackClientSocket::Write(
void* data,
int len)
216 #if defined(__sun__) || defined(sun)
223 tv.tv_sec = fTimeOut;
227 FD_SET(fSocket, &fdset);
230 res = select(fSocket + 1, NULL, &fdset, NULL, &tv);
231 }
while (res < 0 && errno == EINTR);
235 }
else if (res == 0) {
241 if ((res = write(fSocket, data, len)) != len) {
242 if (errno == EWOULDBLOCK || errno == EAGAIN) {
243 jack_log(
"JackClientSocket::Write time out");
245 }
else if (res != 0) {
246 jack_error(
"Cannot write socket fd = %ld err = %s", fSocket, strerror(errno));
250 jack_error(
"Cannot write socket fd = %ld err = %s", fSocket, strerror(errno));
258 JackServerSocket::JackServerSocket(): fSocket( -1)
260 const char* promiscuous = getenv(
"JACK_PROMISCUOUS_SERVER");
261 fPromiscuous = (promiscuous != NULL);
262 fPromiscuousGid = jack_group2gid(promiscuous);
265 int JackServerSocket::Bind(
const char* dir,
const char* name,
int which)
267 struct sockaddr_un addr;
269 if ((fSocket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
270 jack_error(
"Cannot create server socket err = %s", strerror(errno));
274 addr.sun_family = AF_UNIX;
276 BuildName(name, fName, dir, which,
sizeof(addr.sun_path), fPromiscuous);
277 strncpy(addr.sun_path, fName,
sizeof(addr.sun_path) - 1);
279 jack_log(
"JackServerSocket::Bind : addr.sun_path %s", addr.sun_path);
282 if (bind(fSocket, (
struct sockaddr*)&addr,
sizeof(addr)) < 0) {
283 jack_error(
"Cannot bind server to socket err = %s", strerror(errno));
287 if (listen(fSocket, 100) < 0) {
288 jack_error(
"Cannot enable listen on server socket err = %s", strerror(errno));
292 if (fPromiscuous && (jack_promiscuous_perms(-1, fName, fPromiscuousGid) < 0))
303 JackClientSocket* JackServerSocket::Accept()
305 struct sockaddr_un client_addr;
306 socklen_t client_addrlen;
308 memset(&client_addr, 0,
sizeof(client_addr));
309 client_addrlen =
sizeof(client_addr);
311 int fd = accept(fSocket, (
struct sockaddr*)&client_addr, &client_addrlen);
313 jack_error(
"Cannot accept new connection err = %s", strerror(errno));
316 return new JackClientSocket(fd);
320 int JackServerSocket::Close()
323 jack_log(
"JackServerSocket::Close %s", fName);
324 shutdown(fSocket, SHUT_RDWR);