Skip to content

Instantly share code, notes, and snippets.

@Maximus-
Last active March 23, 2024 04:59
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Maximus-/487c70508e161680d550ccb343781859 to your computer and use it in GitHub Desktop.
Save Maximus-/487c70508e161680d550ccb343781859 to your computer and use it in GitHub Desktop.
Example of macOS sendmsg_x
// ./usr/include/sys/syscall.h:521:#define SYS_sendmsg_x 481
// ./kern/syscalls.master:751:480 AUE_NULL ALL { user_ssize_t recvmsg_x(int s, struct msghdr_x *msgp, u_int cnt, int flags); }
#include <sys/syscall.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
// from bsd/sys/socket.h
struct msghdr_x {
void *msg_name; /* optional address */
socklen_t msg_namelen; /* size of address */
struct iovec *msg_iov; /* scatter/gather array */
int msg_iovlen; /* # elements in msg_iov */
void *msg_control; /* ancillary data, see below */
socklen_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
size_t msg_datalen; /* byte length of buffer in msg_iov */
};
int main(int argc, char **argv) {
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in saddr = { };
saddr.sin_family = AF_INET;
saddr.sin_port = htons(4433);
memset(&saddr.sin_addr, 0x08080808, 4); // 8.8.8.8
int ret = connect(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));
if (ret < 0) {
printf("Failed to connect.\n");
return 1;
}
char *buf0 = "AAAAAAAAA";
char *buf1 = "BBBBBBBBB";
struct iovec msg_vec0 = { };
struct iovec msg_vec1 = { };
msg_vec0.iov_base = buf0;
msg_vec0.iov_len = strlen(buf0);
msg_vec1.iov_base = buf1;
msg_vec1.iov_len = strlen(buf1);
struct msghdr_x xmsghdr[2] = { };
xmsghdr[0].msg_iov = &msg_vec0;
xmsghdr[0].msg_iovlen = 1;
xmsghdr[1].msg_iov = &msg_vec1;
xmsghdr[1].msg_iovlen = 1;;
// ./kern/syscalls.master:751:480 AUE_NULL ALL { user_ssize_t recvmsg_x(int s, struct msghdr_x *msgp, u_int cnt, int flags); }
ret = syscall(SYS_sendmsg_x, sockfd, &xmsghdr, 2, 0);
printf("ret: %d\n", ret);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment