5106 lines · 126.3 KB · C
RawDownload
	sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",		bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],		bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);	return PyString_FromString(buf);}#endif  /* Create an object representing the given socket address,   suitable for passing it back to bind(), connect() etc.   The family field of the sockaddr structure is inspected   to determine what kind of address it really is. */ /*ARGSUSED*/static PyObject *makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto){	if (addrlen == 0) {		/* No address -- may be recvfrom() from known socket */		Py_INCREF(Py_None);		return Py_None;	} #ifdef __BEOS__	/* XXX: BeOS version of accept() doesn't set family correctly */	addr->sa_family = AF_INET;#endif 	switch (addr->sa_family) { 	case AF_INET:	{		struct sockaddr_in *a;		PyObject *addrobj = makeipaddr(addr, sizeof(*a));		PyObject *ret = NULL;		if (addrobj) {			a = (struct sockaddr_in *)addr;			ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));			Py_DECREF(addrobj);		}		return ret;	} #if defined(AF_UNIX)	case AF_UNIX:	{		struct sockaddr_un *a = (struct sockaddr_un *) addr;#ifdef linux		if (a->sun_path[0] == 0) {  /* Linux abstract namespace */			addrlen -= (sizeof(*a) - sizeof(a->sun_path));			return PyString_FromStringAndSize(a->sun_path,							  addrlen);		}		else#endif /* linux */		{			/* regular NULL-terminated string */			return PyString_FromString(a->sun_path);		}	}#endif /* AF_UNIX */ #if defined(AF_NETLINK)       case AF_NETLINK:       {               struct sockaddr_nl *a = (struct sockaddr_nl *) addr;               return Py_BuildValue("II", a->nl_pid, a->nl_groups);       }#endif /* AF_NETLINK */ #ifdef ENABLE_IPV6	case AF_INET6:	{		struct sockaddr_in6 *a;		PyObject *addrobj = makeipaddr(addr, sizeof(*a));		PyObject *ret = NULL;		if (addrobj) {			a = (struct sockaddr_in6 *)addr;			ret = Py_BuildValue("Oiii",					    addrobj,					    ntohs(a->sin6_port),					    a->sin6_flowinfo,					    a->sin6_scope_id);			Py_DECREF(addrobj);		}		return ret;	}#endif #ifdef USE_BLUETOOTH	case AF_BLUETOOTH:		switch (proto) { 		case BTPROTO_L2CAP:		{			struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;			PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));			PyObject *ret = NULL;			if (addrobj) {				ret = Py_BuildValue("Oi",						    addrobj,						    _BT_L2_MEMB(a, psm));				Py_DECREF(addrobj);			}			return ret;		} 		case BTPROTO_RFCOMM:		{			struct sockaddr_rc *a = (struct sockaddr_rc *) addr;			PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));			PyObject *ret = NULL;			if (addrobj) {				ret = Py_BuildValue("Oi",						    addrobj,						    _BT_RC_MEMB(a, channel));				Py_DECREF(addrobj);			}			return ret;		} #if !defined(__FreeBSD__)		case BTPROTO_SCO:		{			struct sockaddr_sco *a = (struct sockaddr_sco *) addr;			return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));		}#endif 		}#endif #ifdef HAVE_NETPACKET_PACKET_H	case AF_PACKET:	{		struct sockaddr_ll *a = (struct sockaddr_ll *)addr;		char *ifname = "";		struct ifreq ifr;		/* need to look up interface name give index */		if (a->sll_ifindex) {			ifr.ifr_ifindex = a->sll_ifindex;			if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)				ifname = ifr.ifr_name;		}		return Py_BuildValue("shbhs#",				     ifname,				     ntohs(a->sll_protocol),				     a->sll_pkttype,				     a->sll_hatype,				     a->sll_addr,				     a->sll_halen);	}#endif 	/* More cases here... */ 	default:		/* If we don't know the address family, don't raise an		   exception -- return it as a tuple. */		return Py_BuildValue("is#",				     addr->sa_family,				     addr->sa_data,				     sizeof(addr->sa_data)); 	}}  /* Parse a socket address argument according to the socket object's   address family.  Return 1 if the address was in the proper format,   0 of not.  The address is returned through addr_ret, its length   through len_ret. */ static intgetsockaddrarg(PySocketSockObject *s, PyObject *args,	       struct sockaddr *addr_ret, int *len_ret){	switch (s->sock_family) { #if defined(AF_UNIX)	case AF_UNIX:	{		struct sockaddr_un* addr;		char *path;		int len;		if (!PyArg_Parse(args, "t#", &path, &len))			return 0; 		addr = (struct sockaddr_un*)addr_ret;#ifdef linux		if (len > 0 && path[0] == 0) {			/* Linux abstract namespace extension */			if (len > sizeof addr->sun_path) {				PyErr_SetString(socket_error,						"AF_UNIX path too long");				return 0;			}		}		else#endif /* linux */                {			/* regular NULL-terminated string */			if (len >= sizeof addr->sun_path) {				PyErr_SetString(socket_error,						"AF_UNIX path too long");				return 0;			}			addr->sun_path[len] = 0;		}		addr->sun_family = s->sock_family;		memcpy(addr->sun_path, path, len);#if defined(PYOS_OS2)		*len_ret = sizeof(*addr);#else		*len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);#endif		return 1;	}#endif /* AF_UNIX */ #if defined(AF_NETLINK)	case AF_NETLINK:	{		struct sockaddr_nl* addr;		int pid, groups;		addr = (struct sockaddr_nl *)addr_ret;		if (!PyTuple_Check(args)) {			PyErr_Format(				PyExc_TypeError,				"getsockaddrarg: "				"AF_NETLINK address must be tuple, not %.500s",				args->ob_type->tp_name);			return 0;		}		if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))			return 0;		addr->nl_family = AF_NETLINK;		addr->nl_pid = pid;		addr->nl_groups = groups;		*len_ret = sizeof(*addr);		return 1;	}#endif 	case AF_INET:	{		struct sockaddr_in* addr;		char *host;		int port, result;		if (!PyTuple_Check(args)) {			PyErr_Format(				PyExc_TypeError,				"getsockaddrarg: "				"AF_INET address must be tuple, not %.500s",				args->ob_type->tp_name);			return 0;		}		if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",				      "idna", &host, &port))			return 0;		addr=(struct sockaddr_in*)addr_ret;                result = setipaddr(host, (struct sockaddr *)addr,                                   sizeof(*addr),  AF_INET);                PyMem_Free(host);                if (result < 0)			return 0;		addr->sin_family = AF_INET;		addr->sin_port = htons((short)port);		*len_ret = sizeof *addr;		return 1;	} #ifdef ENABLE_IPV6	case AF_INET6:	{		struct sockaddr_in6* addr;		char *host;		int port, flowinfo, scope_id, result;		flowinfo = scope_id = 0;		if (!PyTuple_Check(args)) {			PyErr_Format(				PyExc_TypeError,				"getsockaddrarg: "				"AF_INET6 address must be tuple, not %.500s",				args->ob_type->tp_name);			return 0;		}		if (!PyArg_ParseTuple(args, "eti|ii",				      "idna", &host, &port, &flowinfo,				      &scope_id)) {			return 0;		}		addr = (struct sockaddr_in6*)addr_ret;                result = setipaddr(host, (struct sockaddr *)addr,                                   sizeof(*addr), AF_INET6);                PyMem_Free(host);                if (result < 0)			return 0;		addr->sin6_family = s->sock_family;		addr->sin6_port = htons((short)port);		addr->sin6_flowinfo = flowinfo;		addr->sin6_scope_id = scope_id;		*len_ret = sizeof *addr;		return 1;	}#endif #ifdef USE_BLUETOOTH	case AF_BLUETOOTH:	{		switch (s->sock_proto) {		case BTPROTO_L2CAP:		{			struct sockaddr_l2 *addr;			char *straddr; 			addr = (struct sockaddr_l2 *)addr_ret;			_BT_L2_MEMB(addr, family) = AF_BLUETOOTH;			if (!PyArg_ParseTuple(args, "si", &straddr,					      &_BT_L2_MEMB(addr, psm))) {				PyErr_SetString(socket_error, "getsockaddrarg: "						"wrong format");				return 0;			}			if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)				return 0; 			*len_ret = sizeof *addr;			return 1;		}		case BTPROTO_RFCOMM:		{			struct sockaddr_rc *addr;			char *straddr; 			addr = (struct sockaddr_rc *)addr_ret;			_BT_RC_MEMB(addr, family) = AF_BLUETOOTH;			if (!PyArg_ParseTuple(args, "si", &straddr,					      &_BT_RC_MEMB(addr, channel))) {				PyErr_SetString(socket_error, "getsockaddrarg: "						"wrong format");				return 0;			}			if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)				return 0; 			*len_ret = sizeof *addr;			return 1;		}#if !defined(__FreeBSD__)		case BTPROTO_SCO:		{			struct sockaddr_sco *addr;			char *straddr; 			addr = (struct sockaddr_sco *)addr_ret;			_BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;			straddr = PyString_AsString(args);			if (straddr == NULL) {				PyErr_SetString(socket_error, "getsockaddrarg: "						"wrong format");				return 0;			}			if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)				return 0; 			*len_ret = sizeof *addr;			return 1;		}#endif		default:			PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");			return 0;		}	}#endif #ifdef HAVE_NETPACKET_PACKET_H	case AF_PACKET:	{		struct sockaddr_ll* addr;		struct ifreq ifr;		char *interfaceName;		int protoNumber;		int hatype = 0;		int pkttype = 0;		char *haddr = NULL;		unsigned int halen = 0; 		if (!PyTuple_Check(args)) {			PyErr_Format(				PyExc_TypeError,				"getsockaddrarg: "				"AF_PACKET address must be tuple, not %.500s",				args->ob_type->tp_name);			return 0;		}		if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,				      &protoNumber, &pkttype, &hatype,				      &haddr, &halen))			return 0;		strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));		ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';		if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {		        s->errorhandler();			return 0;		}		if (halen > 8) {		  PyErr_SetString(PyExc_ValueError,				  "Hardware address must be 8 bytes or less");		  return 0;		}		addr = (struct sockaddr_ll*)addr_ret;		addr->sll_family = AF_PACKET;		addr->sll_protocol = htons((short)protoNumber);		addr->sll_ifindex = ifr.ifr_ifindex;		addr->sll_pkttype = pkttype;		addr->sll_hatype = hatype;		if (halen != 0) {		  memcpy(&addr->sll_addr, haddr, halen);		}		addr->sll_halen = halen;		*len_ret = sizeof *addr;		return 1;	}#endif 	/* More cases here... */ 	default:		PyErr_SetString(socket_error, "getsockaddrarg: bad family");		return 0; 	}}  /* Get the address length according to the socket object's address family.   Return 1 if the family is known, 0 otherwise.  The length is returned   through len_ret. */ static intgetsockaddrlen(PySocketSockObject *s, socklen_t *len_ret){	switch (s->sock_family) { #if defined(AF_UNIX)	case AF_UNIX:	{		*len_ret = sizeof (struct sockaddr_un);		return 1;	}#endif /* AF_UNIX */#if defined(AF_NETLINK)       case AF_NETLINK:       {               *len_ret = sizeof (struct sockaddr_nl);               return 1;       }#endif 	case AF_INET:	{		*len_ret = sizeof (struct sockaddr_in);		return 1;	} #ifdef ENABLE_IPV6	case AF_INET6:	{		*len_ret = sizeof (struct sockaddr_in6);		return 1;	}#endif #ifdef USE_BLUETOOTH	case AF_BLUETOOTH:	{		switch(s->sock_proto)		{ 		case BTPROTO_L2CAP:			*len_ret = sizeof (struct sockaddr_l2);			return 1;		case BTPROTO_RFCOMM:			*len_ret = sizeof (struct sockaddr_rc);			return 1;#if !defined(__FreeBSD__)		case BTPROTO_SCO:			*len_ret = sizeof (struct sockaddr_sco);			return 1;#endif		default:			PyErr_SetString(socket_error, "getsockaddrlen: "					"unknown BT protocol");			return 0; 		}	}#endif

Lines 1001–1500 of 5106. Previous lines