diff options
Diffstat (limited to 'bin/pbd.c')
-rw-r--r-- | bin/pbd.c | 152 |
1 files changed, 76 insertions, 76 deletions
diff --git a/bin/pbd.c b/bin/pbd.c index 13ba62d3..6b8d6ee0 100644 --- a/bin/pbd.c +++ b/bin/pbd.c @@ -29,108 +29,108 @@ #define UNUSED __attribute__((unused)) static void spawn(const char *cmd, int dest, int src) { - pid_t pid = fork(); - if (pid < 0) err(EX_OSERR, "fork"); - - if (pid) { - int status; - pid_t dead = waitpid(pid, &status, 0); - if (dead < 0) err(EX_OSERR, "waitpid(%d)", pid); - if (status) warnx("%s: status %d", cmd, status); - - } else { - int fd = dup2(src, dest); - if (fd < 0) err(EX_OSERR, "dup2"); - - execlp(cmd, cmd, NULL); - err(EX_UNAVAILABLE, "%s", cmd); - } + pid_t pid = fork(); + if (pid < 0) err(EX_OSERR, "fork"); + + if (pid) { + int status; + pid_t dead = waitpid(pid, &status, 0); + if (dead < 0) err(EX_OSERR, "waitpid(%d)", pid); + if (status) warnx("%s: status %d", cmd, status); + + } else { + int fd = dup2(src, dest); + if (fd < 0) err(EX_OSERR, "dup2"); + + execlp(cmd, cmd, NULL); + err(EX_UNAVAILABLE, "%s", cmd); + } } static int pbd(void) { - int error; + int error; - int server = socket(PF_INET, SOCK_STREAM, 0); - if (server < 0) err(EX_OSERR, "socket"); + int server = socket(PF_INET, SOCK_STREAM, 0); + if (server < 0) err(EX_OSERR, "socket"); - error = fcntl(server, F_SETFD, FD_CLOEXEC); - if (error) err(EX_IOERR, "fcntl"); + error = fcntl(server, F_SETFD, FD_CLOEXEC); + if (error) err(EX_IOERR, "fcntl"); - struct sockaddr_in addr = { - .sin_family = AF_INET, - .sin_port = htons(7062), - .sin_addr = { .s_addr = htonl(0x7F000001) }, - }; - error = bind(server, (struct sockaddr *)&addr, sizeof(addr)); - if (error) err(EX_UNAVAILABLE, "bind"); + struct sockaddr_in addr = { + .sin_family = AF_INET, + .sin_port = htons(7062), + .sin_addr = { .s_addr = htonl(0x7F000001) }, + }; + error = bind(server, (struct sockaddr *)&addr, sizeof(addr)); + if (error) err(EX_UNAVAILABLE, "bind"); - error = listen(server, 0); - if (error) err(EX_UNAVAILABLE, "listen"); + error = listen(server, 0); + if (error) err(EX_UNAVAILABLE, "listen"); - for (;;) { - int client = accept(server, NULL, NULL); - if (client < 0) err(EX_IOERR, "accept"); + for (;;) { + int client = accept(server, NULL, NULL); + if (client < 0) err(EX_IOERR, "accept"); - error = fcntl(client, F_SETFD, FD_CLOEXEC); - if (error) err(EX_IOERR, "fcntl"); + error = fcntl(client, F_SETFD, FD_CLOEXEC); + if (error) err(EX_IOERR, "fcntl"); - spawn("pbpaste", STDOUT_FILENO, client); + spawn("pbpaste", STDOUT_FILENO, client); - char p; - ssize_t peek = recv(client, &p, 1, MSG_PEEK); - if (peek < 0) err(EX_IOERR, "recv"); + char p; + ssize_t peek = recv(client, &p, 1, MSG_PEEK); + if (peek < 0) err(EX_IOERR, "recv"); - if (peek) spawn("pbcopy", STDIN_FILENO, client); + if (peek) spawn("pbcopy", STDIN_FILENO, client); - close(client); - } + close(client); + } } static int pbdClient(void) { - int client = socket(PF_INET, SOCK_STREAM, 0); - if (client < 0) err(EX_OSERR, "socket"); - - struct sockaddr_in addr = { - .sin_family = AF_INET, - .sin_port = htons(7062), - .sin_addr = { .s_addr = htonl(0x7F000001) }, - }; - int error = connect(client, (struct sockaddr *)&addr, sizeof(addr)); - if (error) err(EX_UNAVAILABLE, "connect"); - - return client; + int client = socket(PF_INET, SOCK_STREAM, 0); + if (client < 0) err(EX_OSERR, "socket"); + + struct sockaddr_in addr = { + .sin_family = AF_INET, + .sin_port = htons(7062), + .sin_addr = { .s_addr = htonl(0x7F000001) }, + }; + int error = connect(client, (struct sockaddr *)&addr, sizeof(addr)); + if (error) err(EX_UNAVAILABLE, "connect"); + + return client; } static void copy(int out, int in) { - char buf[4096]; - ssize_t readSize; - while (0 < (readSize = read(in, buf, sizeof(buf)))) { - ssize_t writeSize = write(out, buf, readSize); - if (writeSize < 0) err(EX_IOERR, "write(%d)", out); - if (writeSize < readSize) errx(EX_IOERR, "short write(%d)", out); - } - if (readSize < 0) err(EX_IOERR, "read(%d)", in); + char buf[4096]; + ssize_t readSize; + while (0 < (readSize = read(in, buf, sizeof(buf)))) { + ssize_t writeSize = write(out, buf, readSize); + if (writeSize < 0) err(EX_IOERR, "write(%d)", out); + if (writeSize < readSize) errx(EX_IOERR, "short write(%d)", out); + } + if (readSize < 0) err(EX_IOERR, "read(%d)", in); } static int pbcopy(void) { - int client = pbdClient(); - copy(client, STDIN_FILENO); - return EX_OK; + int client = pbdClient(); + copy(client, STDIN_FILENO); + return EX_OK; } static int pbpaste(void) { - int client = pbdClient(); - shutdown(client, SHUT_WR); - copy(STDOUT_FILENO, client); - return EX_OK; + int client = pbdClient(); + shutdown(client, SHUT_WR); + copy(STDOUT_FILENO, client); + return EX_OK; } int main(int argc UNUSED, char *argv[]) { - if (!argv[0][0] || !argv[0][1]) return EX_USAGE; - switch (argv[0][2]) { - case 'd': return pbd(); - case 'c': return pbcopy(); - case 'p': return pbpaste(); - default: return EX_USAGE; - } + if (!argv[0][0] || !argv[0][1]) return EX_USAGE; + switch (argv[0][2]) { + case 'd': return pbd(); + case 'c': return pbcopy(); + case 'p': return pbpaste(); + default: return EX_USAGE; + } } |