At 12/16/2010 07:21 PM, Daniel P. Berrange Write:
Introduces a simple wrapper around the raw POSIX sockets APIs
and name resolution APIs. Allows for easy creation of client
and server sockets with correct usage of name resolution APIs
for protocol agnostic socket setup.
It can listen for UNIX and TCP stream sockets.
It can connect to UNIX, TCP streams directly, or indirectly
to UNIX sockets via an SSH tunnel or external command
* src/Makefile.am: Add to libvirt-net-rpc.la
* src/rpc/virnetsocket.c, src/rpc/virnetsocket.h: Generic
sockets APIs
---
.x-sc_avoid_write | 1 +
po/POTFILES.in | 1 +
src/Makefile.am | 3 +-
src/rpc/virnetsocket.c | 723 ++++++++++++++++++++++++++++++++++++++++++++++++
src/rpc/virnetsocket.h | 100 +++++++
5 files changed, 827 insertions(+), 1 deletions(-)
create mode 100644 src/rpc/virnetsocket.c
create mode 100644 src/rpc/virnetsocket.h
<snip>
+static virNetSocketPtr virNetSocketNew(virSocketAddrPtr localAddr,
+ virSocketAddrPtr remoteAddr,
+ int fd, int errfd, pid_t pid)
+{
+ virNetSocketPtr sock;
+ int no_slow_start = 1;
+
+ VIR_DEBUG("localAddr=%p remoteAddr=%p fd=%d errfd=%d pid=%d",
+ localAddr, remoteAddr,
+ fd, errfd, pid);
+
+ if (virSetCloseExec(fd) < 0 ||
+ virSetNonBlock(fd) < 0)
+ return NULL;
+
+ if (VIR_ALLOC(sock) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
+
+ sock->localAddr = *localAddr;
In the function virNetSocketNewConnectCommand():
if (!(*retsock = virNetSocketNew(NULL, NULL, sv[0], errfd[0], pid)))
goto error;
So we should check whether localAddr is NULL before dereferencing it.
+ if (remoteAddr)
+ sock->remoteAddr = *remoteAddr;
+ sock->fd = fd;
+ sock->errfd = errfd;
+ sock->pid = pid;
+
+ /* Disable nagle */
+ if (sock->localAddr.data.sa.sa_family != AF_UNIX)
+ setsockopt (fd, IPPROTO_TCP, TCP_NODELAY,
+ (void *)&no_slow_start,
+ sizeof(no_slow_start));
+
+
+ DEBUG("local family = %d remote family = %d",
+ localAddr->data.sa.sa_family,
+ remoteAddr ? remoteAddr->data.sa.sa_family : 0);
we should check
localAddr
+ if (!(sock->localAddrStr = virSocketFormatAddrFull(localAddr,
true, ";")))
+ goto error;
we should check localAddr
+
+ if (remoteAddr &&
+ !(sock->remoteAddrStr = virSocketFormatAddrFull(remoteAddr, true,
";")))
+ goto error;
+
+ sock->client = localAddr && !remoteAddr ? false : true;
+
+ VIR_DEBUG("sock=%p localAddrStr=%s remoteAddrStr=%s",
+ sock, NULLSTR(sock->localAddrStr), NULLSTR(sock->remoteAddrStr));
+
+ return sock;
+
+error:
+ virNetSocketFree(sock);
+ return NULL;
+}
+
+
<snip>
+ virCommandSetInputFD(cmd, sv[1]);
+ virCommandSetOutputFD(cmd, &sv[1]);
+ virCommandSetOutputFD(cmd, &errfd[1]);
s/virCommandSetOutputFD/virCommandSetErrorFD/