termux-packages/packages/python/Modules-socketmodule.c.patch
2018-06-08 03:49:50 +02:00

79 lines
2.1 KiB
Diff

diff -u -r ../Python-3.6.5/Modules/socketmodule.c ./Modules/socketmodule.c
--- ../Python-3.6.5/Modules/socketmodule.c 2018-03-28 11:19:31.000000000 +0200
+++ ./Modules/socketmodule.c 2018-06-08 03:28:51.003730525 +0200
@@ -5373,17 +5373,74 @@
This only returns the protocol number, since the other info is
already known or not useful (like the list of aliases). */
+#ifdef __ANDROID__
+struct protocol_name_and_number {
+ char* name;
+ int number;
+};
+#endif
+
/*ARGSUSED*/
static PyObject *
socket_getprotobyname(PyObject *self, PyObject *args)
{
+#ifdef __ANDROID__
+ /* http://git.musl-libc.org/cgit/musl/tree/src/network/proto.c */
+ static const struct protocol_name_and_number protocols[] = {
+ {"ip", 0},
+ {"icmp", 1},
+ {"igmp", 2},
+ {"ggp", 3},
+ {"ipencap", 4},
+ {"st", 5},
+ {"tcp", 6},
+ {"egp", 8},
+ {"pup", 12},
+ {"udp", 17},
+ {"hmp", 20},
+ {"xns-idp", 22},
+ {"iso-tp4", 29},
+ {"xtp", 36},
+ {"ddp", 37},
+ {"idpr-cmtp", 38},
+ {"ipv6", 41},
+ {"ipv6-route", 43},
+ {"ipv6-frag", 44},
+ {"idrp", 45},
+ {"rsvp", 46},
+ {"gre", 47},
+ {"esp", 50},
+ {"ah", 51},
+ {"skip", 57},
+ {"ipv6-icmp", 58},
+ {"ipv6-nonxt", 59},
+ {"ipv6-opts", 60},
+ {"rspf", 73},
+ {"vmtp", 81},
+ {"ospf", 89},
+ {"ipip", 94},
+ {"encap", 98},
+ {"pim", 103},
+ {"raw", 255}
+ };
+ int i;
+#endif
const char *name;
struct protoent *sp;
if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
return NULL;
+#ifdef __ANDROID__
+ for (i = 0; i < sizeof(protocols) / sizeof(protocols[0]); i++) {
+ if (strcmp(protocols[i].name, name) == 0) {
+ return PyLong_FromLong((long) protocols[i].number);
+ }
+ }
+ sp = NULL;
+#else
Py_BEGIN_ALLOW_THREADS
sp = getprotobyname(name);
Py_END_ALLOW_THREADS
+#endif
if (sp == NULL) {
PyErr_SetString(PyExc_OSError, "protocol not found");
return NULL;