aboutsummaryrefslogtreecommitdiff
path: root/src/psock.c
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2022-03-17 13:03:03 +0100
committerToni Uhlig <matzeton@googlemail.com>2022-03-17 13:03:03 +0100
commit147b51e37d82460a67d159756cccacfb64ef1405 (patch)
treec3b2665421eb337e186cf3626af88ec4177685ae /src/psock.c
parent54fb5592b4724934535a606f1981ea439533a4a8 (diff)
second whatever
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
Diffstat (limited to 'src/psock.c')
-rw-r--r--src/psock.c75
1 files changed, 72 insertions, 3 deletions
diff --git a/src/psock.c b/src/psock.c
index ca6f95d..8e1cbc3 100644
--- a/src/psock.c
+++ b/src/psock.c
@@ -11,7 +11,7 @@
#include <unistd.h>
-int psock_init(struct psock * psock, size_t max_descriptors)
+int psock_init(struct psock * psock, size_t max_descriptors, size_t packet_buffer_size)
{
struct epoll_event ev;
@@ -36,9 +36,21 @@ int psock_init(struct psock * psock, size_t max_descriptors)
goto error;
}
+ psock->packet.max = packet_buffer_size;
+ psock->packet.used = 0;
+ psock->packet.buffer = (uint8_t *)calloc(packet_buffer_size, sizeof(*psock->packet.buffer));
+ if (psock->packet.buffer == NULL)
+ {
+ goto error;
+ }
+
psock->remotes.max = max_descriptors;
psock->remotes.used = 0;
- psock->remotes.descriptors = (struct pdesc **)calloc(max_descriptors, sizeof(**psock->remotes.descriptors));
+ psock->remotes.descriptors = (struct pdesc *)calloc(max_descriptors, sizeof(*psock->remotes.descriptors));
+ if (psock->remotes.descriptors == NULL)
+ {
+ goto error;
+ }
return 0;
error:
@@ -64,9 +76,66 @@ void psock_free(struct psock * psock)
psock->epoll_fd = -1;
}
+static int psock_recvmsg(struct psock * psock)
+{
+ struct sockaddr_storage peer;
+ struct iovec iov;
+ struct msghdr hdr = {};
+ ssize_t nread;
+
+ iov.iov_base = (void *)psock->packet.buffer;
+ iov.iov_len = psock->packet.max;
+
+ hdr.msg_name = &peer;
+ hdr.msg_namelen = sizeof(peer);
+ hdr.msg_iov = &iov;
+ hdr.msg_iovlen = 1;
+
+ do {
+ nread = recvmsg(psock->icmp_fd, &hdr, 0);
+ } while (nread == -1 && errno == EINTR);
+
+ if (nread >= 0)
+ {
+ psock->packet.used = nread;
+
+ struct cmsghdr *cmsg = CMSG_FIRSTHDR(&hdr);
+ while (cmsg != NULL)
+ {
+ printf("CMSG TYPE/LEVEL/LEN: %d / %d / %zu\n", cmsg->cmsg_type, cmsg->cmsg_level, cmsg->cmsg_len);
+
+ cmsg = CMSG_NXTHDR(&hdr, cmsg);
+ }
+
+ return 0;
+ } else {
+ psock->packet.used = 0;
+ return -1;
+ }
+}
+
+static int psock_sendmsg(struct psock * psock)
+{
+ return -1;
+}
+
static void psock_handle_events(struct psock * psock)
{
- printf("!!!!!!\n");
+ if (psock_recvmsg(psock) == 0)
+ {
+ switch (pdesc_find_remote(psock))
+ {
+ case PDESC_REMOTE_NEW:
+ fprintf(stderr, "Remote NEW.\n");
+ break;
+ case PDESC_REMOTE_INVALID:
+ fprintf(stderr, "Remote INVALID\n");
+ break;
+ case PDESC_REMOTE_FOUND:
+ fprintf(stderr, "Remote FOUND\n");
+ break;
+ }
+ }
}
void psock_loop(struct psock * psock)