This commit is contained in:
Joris Vink 2019-03-01 20:56:03 +01:00
parent 01c1a8f8f8
commit 31a9a70d5a
2 changed files with 34 additions and 33 deletions

View File

@ -208,12 +208,13 @@ struct pysocket_data {
int state; int state;
size_t length; size_t length;
struct kore_buf buffer; struct kore_buf buffer;
struct pysocket *socket;
struct kore_timer *timer;
union { union {
struct sockaddr_in ipv4; struct sockaddr_in ipv4;
struct sockaddr_un sun; struct sockaddr_un sun;
} sendaddr; } sendaddr;
struct pysocket *socket;
struct kore_timer *timer;
}; };
struct pysocket_op { struct pysocket_op {

View File

@ -19,6 +19,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/un.h>
#include <ctype.h> #include <ctype.h>
#include <libgen.h> #include <libgen.h>
@ -1680,13 +1681,11 @@ pysocket_sendto(struct pysocket *sock, PyObject *args)
case AF_INET: case AF_INET:
if (!PyArg_ParseTuple(args, "siy*", &ip, &port, &buf)) if (!PyArg_ParseTuple(args, "siy*", &ip, &port, &buf))
return (NULL); return (NULL);
if (port <= 0 || port >= USHRT_MAX) { if (port <= 0 || port >= USHRT_MAX) {
PyErr_SetString(PyExc_RuntimeError, "invalid port"); PyErr_SetString(PyExc_RuntimeError, "invalid port");
return (NULL); return (NULL);
} }
break; break;
case AF_UNIX: case AF_UNIX:
if (!PyArg_ParseTuple(args, "sy*", &sockaddr, &buf)) if (!PyArg_ParseTuple(args, "sy*", &sockaddr, &buf))
return (NULL); return (NULL);
@ -1708,12 +1707,17 @@ pysocket_sendto(struct pysocket *sock, PyObject *args)
break; break;
case AF_UNIX: case AF_UNIX:
op->data.sendaddr.sun.sun_family = AF_UNIX; op->data.sendaddr.sun.sun_family = AF_UNIX;
size_t maxwrite = sizeof(op->data.sendaddr.sun.sun_path);
if (kore_strlcpy(op->data.sendaddr.sun.sun_path, sockaddr, if (kore_strlcpy(op->data.sendaddr.sun.sun_path, sockaddr,
maxwrite) >= maxwrite) sizeof(op->data.sendaddr.sun.sun_path)) >=
fatal("pysocket_sendto: failed to write path"); sizeof(op->data.sendaddr.sun.sun_path)) {
Py_DECREF(ret);
PyErr_SetString(PyExc_RuntimeError,
"unix socket path too long");
return (NULL);
}
break; break;
default: default:
Py_DECREF(ret);
PyErr_SetString(PyExc_RuntimeError, "unsupported family"); PyErr_SetString(PyExc_RuntimeError, "unsupported family");
return (NULL); return (NULL);
} }
@ -2083,24 +2087,20 @@ pysocket_async_recv(struct pysocket_op *op)
ret = read(op->data.fd, op->data.buffer.data, ret = read(op->data.fd, op->data.buffer.data,
op->data.buffer.length); op->data.buffer.length);
} else { } else {
sendaddr = (struct sockaddr *)&op->data.sendaddr;
switch (op->data.socket->family) { switch (op->data.socket->family) {
case AF_INET: case AF_INET:
socklen = sizeof(op->data.sendaddr.ipv4); socklen = sizeof(op->data.sendaddr.ipv4);
sendaddr = (struct sockaddr *)&op->data.sendaddr.ipv4;
break; break;
case AF_UNIX: case AF_UNIX:
socklen = sizeof(op->data.sendaddr.sun); socklen = sizeof(op->data.sendaddr.sun);
sendaddr = (struct sockaddr *)&op->data.sendaddr.sun;
break; break;
default: default:
PyErr_SetString(PyExc_RuntimeError, "Unsupported family"); fatal("non AF_INET/AF_UNIX in %s", __func__);
return (NULL);
} }
ret = recvfrom(op->data.fd, op->data.buffer.data, ret = recvfrom(op->data.fd, op->data.buffer.data,
op->data.buffer.length, 0, op->data.buffer.length, 0, sendaddr, &socklen);
sendaddr,
&socklen);
} }
if (ret == -1) { if (ret == -1) {
@ -2141,6 +2141,7 @@ pysocket_async_recv(struct pysocket_op *op)
return (NULL); return (NULL);
break; break;
case AF_UNIX: case AF_UNIX:
printf("'%s'\n", op->data.sendaddr.sun.sun_path);
if ((tuple = Py_BuildValue("(sN)", if ((tuple = Py_BuildValue("(sN)",
op->data.sendaddr.sun.sun_path, bytes)) == NULL) op->data.sendaddr.sun.sun_path, bytes)) == NULL)
return (NULL); return (NULL);
@ -2166,8 +2167,8 @@ static PyObject *
pysocket_async_send(struct pysocket_op *op) pysocket_async_send(struct pysocket_op *op)
{ {
ssize_t ret; ssize_t ret;
const struct sockaddr *sendaddr;
socklen_t socklen; socklen_t socklen;
const struct sockaddr *sendaddr;
if (!(op->data.evt.flags & KORE_EVENT_WRITE)) { if (!(op->data.evt.flags & KORE_EVENT_WRITE)) {
Py_RETURN_NONE; Py_RETURN_NONE;
@ -2179,18 +2180,17 @@ pysocket_async_send(struct pysocket_op *op)
op->data.buffer.data + op->data.buffer.offset, op->data.buffer.data + op->data.buffer.offset,
op->data.buffer.length - op->data.buffer.offset); op->data.buffer.length - op->data.buffer.offset);
} else { } else {
sendaddr = (const struct sockaddr *)&op->data.sendaddr;
switch (op->data.socket->family) { switch (op->data.socket->family) {
case AF_INET: case AF_INET:
socklen = sizeof(op->data.sendaddr.ipv4); socklen = sizeof(op->data.sendaddr.ipv4);
sendaddr = (struct sockaddr *)&op->data.sendaddr.ipv4;
break; break;
case AF_UNIX: case AF_UNIX:
socklen = sizeof(op->data.sendaddr.sun); socklen = sizeof(op->data.sendaddr.sun);
sendaddr = (struct sockaddr *)&op->data.sendaddr.sun;
break; break;
default: default:
PyErr_SetString(PyExc_RuntimeError, "unsupported family"); fatal("non AF_INET/AF_UNIX in %s", __func__);
return (NULL);
} }
ret = sendto(op->data.fd, ret = sendto(op->data.fd,