1
0
mirror of https://github.com/gryf/wmaker.git synced 2026-01-28 19:05:51 +01:00

- Added WMSetConnectionCloseOnExec() to specify if the socket of a

connection survives or not an exec* family call. By default all
  connections created by WINGs, set the socket to be closed on an exec*
  call. Use the function if you need the reverse.
This commit is contained in:
dan
2000-11-19 23:50:38 +00:00
parent 972620c7cd
commit 9d98d884ae
3 changed files with 43 additions and 16 deletions

View File

@@ -23,6 +23,7 @@
* TODO:
* - decide if we want to support connections with external sockets, else
* clean up the structure of the unneeded members.
* - decide what to do with all wsyserror() and wwarning() calls.
*
*/
@@ -255,7 +256,7 @@ setSocketNonBlocking(int sock, Bool flag) /*FOLD00*/
state = fcntl(sock, F_GETFL, 0);
if (state < 0) {
wsyserror("Failed to get socket flags with fcntl.");
/*wsyserror("Failed to get socket flags with fcntl."); should we do this? -Dan*/
return False;
}
@@ -272,7 +273,7 @@ setSocketNonBlocking(int sock, Bool flag) /*FOLD00*/
}
if (fcntl(sock, F_SETFL, state) < 0) {
wsyserror("Failed to set socket flags with fcntl.");
/*wsyserror("Failed to set socket flags with fcntl."); should we do this? -Dan */
return False;
}
@@ -360,6 +361,8 @@ createConnectionWithSocket(int sock, Bool closeOnRelease) /*FOLD00*/
wretain(cPtr);
memset(cPtr, 0, sizeof(WMConnection));
fcntl(sock, F_SETFD, FD_CLOEXEC); /* by default close on exec */
cPtr->sock = sock;
cPtr->openTimeout.timeout = OpenTimeout;
cPtr->openTimeout.handler = NULL;
@@ -381,7 +384,7 @@ createConnectionWithSocket(int sock, Bool closeOnRelease) /*FOLD00*/
return cPtr;
}
/*FOLD00*/
#if 0
WMConnection*
@@ -420,7 +423,7 @@ WMCreateConnectionWithSocket(int sock, Bool closeOnRelease) /*FOLD00*/
return cPtr;
}
#endif
/*FOLD00*/
/*
* host is the name on which we want to listen for incoming connections,
@@ -672,11 +675,8 @@ WMAcceptConnection(WMConnection *listener) /*FOLD00*/
int newSock;
WMConnection *newConnection;
if (listener->state!=WCListening) {
wwarning("Called 'WMAcceptConnection()' on a non-listening connection");
WCErrorCode = 0;
return NULL;
}
WCErrorCode = 0;
wassertrv(listener && listener->state==WCListening, NULL);
size = sizeof(clientname);
newSock = accept(listener->sock, (struct sockaddr*) &clientname, &size);
@@ -918,7 +918,7 @@ WMIsConnectionNonBlocking(WMConnection *cPtr) /*FOLD00*/
state = fcntl(cPtr->sock, F_GETFL, 0);
if (state < 0) {
wsyserror("Failed to get socket flags with fcntl.");
/*wsyserror("Failed to get socket flags with fcntl.");*/
/* If we can't use fcntl on socket, this probably also means we could
* not use fcntl to set non-blocking mode, and since a socket defaults
* to blocking when created, return False as the best assumption */
@@ -933,17 +933,33 @@ WMIsConnectionNonBlocking(WMConnection *cPtr) /*FOLD00*/
#endif
void
Bool
WMSetConnectionNonBlocking(WMConnection *cPtr, Bool flag) /*FOLD00*/
{
if (cPtr->sock < 0)
return;
wassertrv(cPtr!=NULL && cPtr->sock>=0, False);
if (cPtr->isNonBlocking == flag)
return;
return True;
if (setSocketNonBlocking(cPtr->sock, flag)==True)
if (setSocketNonBlocking(cPtr->sock, flag)==True) {
cPtr->isNonBlocking = flag;
return True;
}
return False;
}
Bool
WMSetConnectionCloseOnExec(WMConnection *cPtr, Bool flag)
{
wassertrv(cPtr!=NULL && cPtr->sock>=0, False);
if (fcntl(cPtr->sock, F_SETFD, (flag ? FD_CLOEXEC : 0)) < 0) {
return False;
}
return True;
}