1#include <err.h>2#include <stdio.h>3#include <stdlib.h>4#include <string.h>5#include <unistd.h>67#include <sys/socket.h>8#include <sys/types.h>9#include <sys/un.h>1011static struct sockaddr_un addr;1213int14main(int argc, char **argv)15{16 int sfd;17 ssize_t ret;18 char *path, buf[BUFSIZ];1920#ifdef __OpenBSD__21 if (pledge("stdio unix", NULL) == -1)22 err(EXIT_FAILURE, "pledge failed");23#endif2425 if (argc <= 1) {26 fprintf(stderr, "USAGE: %s PATH\n", argv[0]);27 return EXIT_FAILURE;28 }2930 path = argv[1];31 if (strlen(path) >= sizeof(addr.sun_path)) {32 fprintf(stderr, "The given path is too long\n");33 return EXIT_FAILURE;34 }3536 if ((sfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)37 err(EXIT_FAILURE, "socket failed");3839 addr.sun_family = AF_UNIX;40 strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);4142 if (connect(sfd, (struct sockaddr*)&addr,43 sizeof(struct sockaddr_un)) == -1)44 err(EXIT_FAILURE, "connect failed");4546 while ((ret = read(sfd, buf, sizeof(buf))) > 0) {47 if (write(STDOUT_FILENO, buf, ret) == -1)48 err(EXIT_FAILURE, "write failed");49 }50 if (ret == -1)51 err(EXIT_FAILURE, "read filed");5253 return EXIT_SUCCESS;54}