
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/