# See the License for the specific language governing permissions and
# limitations under the License.
-"""Python wrapper for sendmsg."""
+"""Python wrapper for C socket calls and data structures."""
import ctypes
import ctypes.util
import cstruct
-# Data structures used by sendmsg.
+# Data structures.
CMsgHdr = cstruct.Struct("cmsghdr", "@Lii", "len level type")
Iovec = cstruct.Struct("iovec", "@LL", "base len")
MsgHdr = cstruct.Struct("msghdr", "@LLLLLLi",
return CMSG_ALIGNTO * ((length / CMSG_ALIGNTO) + (length % CMSG_ALIGNTO != 0))
+def MaybeRaiseSocketError(ret):
+ if ret < 0:
+ errno = ctypes.get_errno()
+ raise socket.error(errno, os.strerror(errno))
+
+
def Sockaddr(addr):
if ":" in addr[0]:
family = socket.AF_INET6
return msg_control
+def Bind(s, to):
+ """Python wrapper for connect."""
+ ret = libc.bind(s.fileno(), to.CPointer(), len(to))
+ MaybeRaiseSocketError(ret)
+ return ret
+
+def Connect(s, to):
+ """Python wrapper for connect."""
+ ret = libc.connect(s.fileno(), to.CPointer(), len(to))
+ MaybeRaiseSocketError(ret)
+ return ret
+
+
def Sendmsg(s, to, data, control, flags):
"""Python wrapper for sendmsg.
Args:
s: A Python socket object. Becomes sockfd.
- to: A Python socket address tuple. Becomes msg->msg_name.
+ to: An address tuple, or a SockaddrIn[6] struct. Becomes msg->msg_name.
data: A string, the data to write. Goes into msg->msg_iov.
control: A list of cmsg options. Becomes msg->msg_control.
flags: An integer. Becomes msg->msg_flags.
# Convert the destination address into a struct sockaddr.
if to:
- name = Sockaddr(to)
- msg_name = name.CPointer()
- msg_namelen = len(name)
+ if isinstance(to, tuple):
+ to = Sockaddr(to)
+ msg_name = to.CPointer()
+ msg_namelen = len(to)
else:
msg_name = 0
msg_namelen = 0
# Call sendmsg.
ret = libc.sendmsg(s.fileno(), msghdr, 0)
-
- if ret < 0:
- errno = ctypes.get_errno()
- raise socket.error(errno, os.strerror(errno))
+ MaybeRaiseSocketError(ret)
return ret
from scapy import all as scapy
+import csocket
import cstruct
import iproute
import net_test
-import sendmsg
IFF_TUN = 1
4: (net_test.SOL_IP, IP_PKTINFO),
6: (net_test.SOL_IPV6, IPV6_PKTINFO)}[version]
cmsgs.append((cmsg_level, cmsg_name, pktinfo))
- sendmsg.Sendmsg(s, (dstaddr, dstport), payload, cmsgs, sendmsg.MSG_CONFIRM)
+ csocket.Sendmsg(s, (dstaddr, dstport), payload, cmsgs, csocket.MSG_CONFIRM)
def ReceiveEtherPacketOn(self, netid, packet):
posix.write(self.tuns[netid].fileno(), str(packet))
from scapy import all as scapy
+import csocket
import iproute
import multinetwork_base
import multinetwork_test
import net_test
-import sendmsg
# Setsockopt values.
IPV6_ADDR_PREFERENCES = 72
pktinfo = multinetwork_base.MakePktInfo(6, address, 0)
cmsgs = [(net_test.SOL_IPV6, IPV6_PKTINFO, pktinfo)]
s = self.BuildSocket(6, net_test.UDPSocket, netid, "mark")
- return sendmsg.Sendmsg(s, (dest, 53), "Hello", cmsgs, 0)
+ return csocket.Sendmsg(s, (dest, 53), "Hello", cmsgs, 0)
def assertAddressUsable(self, address, netid):
self.BindToAddress(address)