diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2022-03-17 13:03:03 +0100 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2022-03-17 13:03:03 +0100 |
commit | 147b51e37d82460a67d159756cccacfb64ef1405 (patch) | |
tree | c3b2665421eb337e186cf3626af88ec4177685ae /src/psock.c | |
parent | 54fb5592b4724934535a606f1981ea439533a4a8 (diff) |
second whatever
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
Diffstat (limited to 'src/psock.c')
-rw-r--r-- | src/psock.c | 75 |
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) |