Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8c52e2d45d | ||
|
|
d61a4c1757 |
+4
-15
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user