diff options
Diffstat (limited to 'tests/sockbind.c')
-rw-r--r-- | tests/sockbind.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/tests/sockbind.c b/tests/sockbind.c new file mode 100644 index 0000000..f98b5ed --- /dev/null +++ b/tests/sockbind.c @@ -0,0 +1,70 @@ +#include <stdio.h> +#include <stddef.h> +#include <string.h> +#include <assert.h> +#include <unistd.h> +#include <sys/socket.h> +#include <sys/un.h> + +#define MAX_CLIENTS 1 +#ifdef DEBUG +#define DEBUGPRINT(fmt, ...) fprintf(stderr, "DEBUG: %s %s %d: " fmt, \ + __FILE__, __func__, __LINE__, __VA_ARGS__) +#else +#define DEBUGPRINT(...) (void)0 +#endif + +int main(int argc, char *argv[]){ + struct sockaddr_un sock = { + .sun_family = AF_UNIX + }; + int sfd; + if (argc < 1){ + fprintf(stderr, "Usage: %s PATH\n", argv[0]); + return 1; + } + strncpy(sock.sun_path, argv[1], sizeof(sock) - offsetof(struct sockaddr_un, sun_path)); + DEBUGPRINT("%s", "Constructed socket address\n"); + if ((sfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1){ + perror("socket"); + return 2; + } + DEBUGPRINT("Created socket fd=%d\n", sfd); + if (bind(sfd, (struct sockaddr*)&sock, sizeof(sock)) == -1){ + perror("bind"); + return 3; + } + if (listen(sfd, MAX_CLIENTS) == -1){ + perror("listen"); + return 4; + } + DEBUGPRINT("Listening to %d clients\n", MAX_CLIENTS); + { + struct sockaddr_un client_address; + socklen_t client_size = sizeof(client_address); + int cfd; + while ((cfd = accept(sfd, (struct sockaddr*)&client_address, + &client_size)) != -1) { + char buf[BUFSIZ]; + ssize_t rdcount = -1; + DEBUGPRINT("Listening to client fd=%d\n", cfd); + while ((rdcount = read(cfd, buf, sizeof(buf))) > 0) { + DEBUGPRINT("Read %zi bytes from client, " + "message was:\n%.*s", rdcount, + rdcount, buf); + write(STDOUT_FILENO, buf, rdcount); + } + assert(rdcount == 0 || rdcount == -1); + if (rdcount == -1) { + perror("read"); + return 5; + } + DEBUGPRINT("Finished listening to fd=%d\n", cfd); + close(cfd); + } + } + + close(sfd); + unlink(argv[1]); + return 0; +} |