9 from optparse import OptionParser
14 TUNSETIFF = 0x400454ca
17 usage = ("usage: %prog -a <address> -N <vif_name> -t <vif-type> -p <pi> ")
19 parser = OptionParser(usage = usage)
21 parser.add_option("-a", "--address", dest="address",
22 help="Socket address to send file descriptor to", type="str")
23 parser.add_option("-N", "--vif-name", dest="vif_name",
24 help="The name of the virtual interface", type="str")
25 parser.add_option("-t", "--vif-type", dest="vif_type",
26 help="Virtual interface type. Either IFF_TAP or IFF_TUN. "
27 "Defaults to IFF_TAP. ", default=IFF_TAP, type="str")
28 parser.add_option("-p", "--pi", dest="pi", action="store_true",
29 default=False, help="Enable PI header")
31 (options, args) = parser.parse_args()
34 if options.vif_type and options.vif_type == "IFF_TUN":
37 return (options.address, options.vif_name, vif_type, options.pi)
39 if __name__ == '__main__':
41 (address, vif_name, vif_type, pi) = get_options()
49 fd = os.open("/dev/net/tun", os.O_RDWR)
51 err = fcntl.ioctl(fd, TUNSETIFF, struct.pack("16sH", vif_name, flags))
54 raise RuntimeError("Could not retrive file descriptor from %s" % vif_name)
56 address = base64.b64decode(address)
58 sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
60 passfd.sendfd(sock, fd, '0')