Compare commits

...
2 Commits
5 changed files with 61 additions and 37 deletions
+4 -15
View File
@@ -1492,10 +1492,10 @@ Tcl_SocketObjCmd(
SKT_ASYNC, SKT_MYADDR, SKT_MYPORT, SKT_REUSEADDR, SKT_REUSEPORT,
SKT_SERVER
};
int optionIndex, a, server = 0, myport = 0, async = 0, reusep = -1,
int optionIndex, a, server = 0, async = 0, reusep = -1,
reusea = -1;
unsigned int flags = 0;
const char *host, *port, *myaddr = NULL;
const char *host, *port, *myaddr = NULL, *myport = NULL;
Tcl_Obj *script = NULL;
Tcl_Channel chan;
@@ -1532,18 +1532,13 @@ Tcl_SocketObjCmd(
myaddr = TclGetString(objv[a]);
break;
case SKT_MYPORT: {
const char *myPortName;
a++;
if (a >= objc) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"no argument given for -myport option", -1));
return TCL_ERROR;
}
myPortName = TclGetString(objv[a]);
if (TclSockGetPort(interp, myPortName, "tcp", &myport) != TCL_OK) {
return TCL_ERROR;
}
myport = TclGetString(objv[a]);
break;
}
case SKT_SERVER:
@@ -1670,13 +1665,7 @@ Tcl_SocketObjCmd(
Tcl_CreateCloseHandler(chan, TcpServerCloseProc, acceptCallbackPtr);
} else {
int portNum;
if (TclSockGetPort(interp, port, "tcp", &portNum) != TCL_OK) {
return TCL_ERROR;
}
chan = Tcl_OpenTcpClient(interp, portNum, host, myaddr, myport, async);
chan = TclOpenTcpClientEx(interp, port, host, myaddr, myport, async);
if (chan == NULL) {
return TCL_ERROR;
}
+5 -8
View File
@@ -158,7 +158,7 @@ TclCreateSocketAddress(
* family */
struct addrinfo **addrlist, /* Socket address list */
const char *host, /* Host. NULL implies INADDR_ANY */
int port, /* Port number */
const char *service, /* Service */
int willBind, /* Is this an address to bind() to or to
* connect() to? */
const char **errorMsgPtr) /* Place to store the error message detail, if
@@ -168,7 +168,7 @@ TclCreateSocketAddress(
struct addrinfo *p;
struct addrinfo *v4head = NULL, *v4ptr = NULL;
struct addrinfo *v6head = NULL, *v6ptr = NULL;
char *native = NULL, portbuf[TCL_INTEGER_SPACE], *portstring;
char *native = NULL;
const char *family = NULL;
Tcl_DString ds;
int result;
@@ -182,11 +182,8 @@ TclCreateSocketAddress(
* when the loopback device is the only available network interface.
*/
if (host != NULL && port == 0) {
portstring = NULL;
} else {
TclFormatInt(portbuf, port);
portstring = portbuf;
if (host != NULL && service != NULL && !strcmp(service, "0")) {
service = NULL;
}
(void) memset(&hints, 0, sizeof(hints));
@@ -231,7 +228,7 @@ TclCreateSocketAddress(
hints.ai_flags |= AI_PASSIVE;
}
result = getaddrinfo(native, portstring, &hints, addrlist);
result = getaddrinfo(native, service, &hints, addrlist);
if (host != NULL) {
Tcl_DStringFree(&ds);
+5 -1
View File
@@ -3068,8 +3068,12 @@ MODULE_SCOPE void TclpFinalizePipes(void);
MODULE_SCOPE void TclpFinalizeSockets(void);
MODULE_SCOPE int TclCreateSocketAddress(Tcl_Interp *interp,
struct addrinfo **addrlist,
const char *host, int port, int willBind,
const char *host, const char *service, int willBind,
const char **errorMsgPtr);
Tcl_Channel TclOpenTcpClientEx(Tcl_Interp *interp,
const char *service, const char *host,
const char *myaddr, const char *myservice,
unsigned int flags);
MODULE_SCOPE int TclpThreadCreate(Tcl_ThreadId *idPtr,
Tcl_ThreadCreateProc *proc, ClientData clientData,
int stackSize, int flags);
+23 -8
View File
@@ -1282,18 +1282,33 @@ Tcl_OpenTcpClient(
int async) /* If nonzero, attempt to do an asynchronous
* connect. Otherwise we do a blocking
* connect. */
{
char service[TCL_INTEGER_SPACE], myservice[TCL_INTEGER_SPACE];
TclFormatInt(service, port);
TclFormatInt(myservice, myport);
return TclOpenTcpClientEx(interp, service, host, myaddr, myservice, async!=0);
}
Tcl_Channel
TclOpenTcpClientEx(
Tcl_Interp *interp, /* For error reporting; can be NULL. */
const char *service, /* Port number to open. */
const char *host, /* Host on which to open port. */
const char *myaddr, /* Client-side address */
const char *myservice, /* Client-side port */
unsigned int flags) /* If nonzero, attempt to do an asynchronous
* connect. Otherwise we do a blocking
* connect. */
{
TcpState *statePtr;
const char *errorMsg = NULL;
struct addrinfo *addrlist = NULL, *myaddrlist = NULL;
char channelName[SOCK_CHAN_LENGTH];
/*
* Do the name lookups for the local and remote addresses.
*/
if (!TclCreateSocketAddress(interp, &addrlist, host, port, 0, &errorMsg)
|| !TclCreateSocketAddress(interp, &myaddrlist, myaddr, myport, 1,
if (!TclCreateSocketAddress(interp, &addrlist, host, service, 0, &errorMsg)
|| !TclCreateSocketAddress(interp, &myaddrlist, myaddr, myservice, 1,
&errorMsg)) {
if (addrlist != NULL) {
freeaddrinfo(addrlist);
@@ -1310,7 +1325,7 @@ Tcl_OpenTcpClient(
*/
statePtr = ckalloc(sizeof(TcpState));
memset(statePtr, 0, sizeof(TcpState));
statePtr->flags = async ? TCP_ASYNC_CONNECT : 0;
statePtr->flags = (flags&1) ? TCP_ASYNC_CONNECT : 0;
statePtr->cachedBlocking = TCL_MODE_BLOCKING;
statePtr->addrlist = addrlist;
statePtr->myaddrlist = myaddrlist;
@@ -1481,7 +1496,7 @@ Tcl_OpenTcpServerEx(
goto error;
}
if (!TclCreateSocketAddress(interp, &addrlist, myHost, port, 1, &errorMsg)) {
if (!TclCreateSocketAddress(interp, &addrlist, myHost, service, 1, &errorMsg)) {
my_errno = errno;
goto error;
}
+24 -5
View File
@@ -1873,7 +1873,7 @@ out:
/*
*----------------------------------------------------------------------
*
* Tcl_OpenTcpClient --
* Tcl_OpenTcpClient, TclOpenTcpClientEx --
*
* Opens a TCP client socket and creates a channel around it.
*
@@ -1897,6 +1897,25 @@ Tcl_OpenTcpClient(
int async) /* If nonzero, attempt to do an asynchronous
* connect. Otherwise we do a blocking
* connect. */
{
char service[TCL_INTEGER_SPACE], myservice[TCL_INTEGER_SPACE];
TclFormatInt(service, port);
TclFormatInt(myservice, myport);
return TclOpenTcpClientEx(interp, service, host, myaddr, myservice, async!=0);
}
Tcl_Channel
TclOpenTcpClientEx(
Tcl_Interp *interp, /* For error reporting; can be NULL. */
const char *service, /* Port number to open. */
const char *host, /* Host on which to open port. */
const char *myaddr, /* Client-side address */
const char *myservice, /* Client-side port */
unsigned int flags) /* If nonzero, attempt to do an asynchronous
* connect. Otherwise we do a blocking
* connect. */
{
TcpState *statePtr;
const char *errorMsg = NULL;
@@ -1921,8 +1940,8 @@ Tcl_OpenTcpClient(
* Do the name lookups for the local and remote addresses.
*/
if (!TclCreateSocketAddress(interp, &addrlist, host, port, 0, &errorMsg)
|| !TclCreateSocketAddress(interp, &myaddrlist, myaddr, myport, 1,
if (!TclCreateSocketAddress(interp, &addrlist, host, service, 0, &errorMsg)
|| !TclCreateSocketAddress(interp, &myaddrlist, myaddr, myservice, 1,
&errorMsg)) {
if (addrlist != NULL) {
freeaddrinfo(addrlist);
@@ -1937,7 +1956,7 @@ Tcl_OpenTcpClient(
statePtr = NewSocketInfo(INVALID_SOCKET);
statePtr->addrlist = addrlist;
statePtr->myaddrlist = myaddrlist;
if (async) {
if (flags&1) {
statePtr->flags |= TCP_ASYNC_CONNECT;
}
@@ -2078,7 +2097,7 @@ Tcl_OpenTcpServerEx(
goto error;
}
if (!TclCreateSocketAddress(interp, &addrlist, myHost, port, 1, &errorMsg)) {
if (!TclCreateSocketAddress(interp, &addrlist, myHost, service, 1, &errorMsg)) {
goto error;
}