From ee442870809ebfd9eefd8868314cafa5c001d925 Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Fri, 6 Jan 2017 11:49:29 -0500 Subject: Implement pbcopy and pbpaste in C Ted Unangst broke my netcat implementation of pbpaste with this commit: , which, when /dev/null is attached to stdin, causes nc to exit and never read from the socket. Turns out the core functionality of netcat can be implemented in about 50 lines of C. --- .bin/pbcopy | 1 - .bin/pbcopy.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ .bin/pbpaste | 1 - install.sh | 3 +-- 4 files changed, 53 insertions(+), 4 deletions(-) delete mode 100755 .bin/pbcopy create mode 100755 .bin/pbcopy.c delete mode 100755 .bin/pbpaste diff --git a/.bin/pbcopy b/.bin/pbcopy deleted file mode 100755 index 925e098e..00000000 --- a/.bin/pbcopy +++ /dev/null @@ -1 +0,0 @@ -exec nc localhost 7062 > /dev/null diff --git a/.bin/pbcopy.c b/.bin/pbcopy.c new file mode 100755 index 00000000..37c334ca --- /dev/null +++ b/.bin/pbcopy.c @@ -0,0 +1,52 @@ +#if 0 +cc -Wall -Wextra -pedantic $@ -o $(dirname $0)/pbcopy $0 && \ +exec cc -Wall -Wextra -pedantic -DPBPASTE $@ -o $(dirname $0)/pbpaste $0 +#endif + +#include +#include +#include +#include +#include +#include + +int main() { + int error; + + 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) }, + }; + + error = connect(client, (struct sockaddr *)&addr, sizeof(addr)); + if (error) err(EX_OSERR, "connect"); + +#ifdef PBPASTE + int fdIn = client; + int fdOut = STDOUT_FILENO; + error = shutdown(client, SHUT_WR); + if (error) err(EX_OSERR, "shutdown"); +#else + int fdIn = STDIN_FILENO; + int fdOut = client; +#endif + + char readBuf[4096]; + ssize_t readLen; + while (0 < (readLen = read(fdIn, readBuf, sizeof(readBuf)))) { + char *writeBuf = readBuf; + ssize_t writeLen; + while (0 < (writeLen = write(fdOut, writeBuf, readLen))) { + writeBuf += writeLen; + readLen -= writeLen; + } + if (writeLen < 0) err(EX_IOERR, "write"); + } + if (readLen < 0) err(EX_IOERR, "read"); + + return 0; +} diff --git a/.bin/pbpaste b/.bin/pbpaste deleted file mode 100755 index 9ce6f6dd..00000000 --- a/.bin/pbpaste +++ /dev/null @@ -1 +0,0 @@ -exec nc localhost 7062 < /dev/null diff --git a/install.sh b/install.sh index eba39dbe..3c0c5ed3 100755 --- a/install.sh +++ b/install.sh @@ -28,9 +28,8 @@ fi link .bin/jrp.c link .bin/manpager -link .bin/pbcopy +link .bin/pbcopy.c link .bin/pbd.c -link .bin/pbpaste link .bin/xx.c link .config/git/config link .config/git/ignore -- cgit 1.4.1 June McEnroe 2019-01-14Add guides to psfedJune McEnroe 2019-01-14Check for NULL copy or undo buffers in psfedJune McEnroe 2019-01-14Add cash.7 READMEJune McEnroe 2019-01-14Document old=new argument of fc -sJune McEnroe 2019-01-14Allow replacing empty string with fc old=newJune McEnroe 2019-01-13Enable warnings in libeditJune McEnroe 2019-01-13Show full path in RPS1June McEnroe 2019-01-13Shorten $HOME to ~ in prompt expansionJune McEnroe 2019-01-13Document PSlitJune McEnroe 2019-01-13Document PS0June McEnroe 2019-01-13Set PS0 in cashJune McEnroe 2019-01-13Add PS0June McEnroe 2019-01-13Change default ENV from cashrc to env.shJune McEnroe 2019-01-13Use colours in cash promptsJune McEnroe 2019-01-12Set PSlit like NetBSD shJune McEnroe 2019-01-12Install gnupg2 from pkgsrc and symlink gpgJune McEnroe 2019-01-12Reference cash builtin man pages in cash.1 SEE ALSOJune McEnroe 2019-01-12Restore cash builtin man page datesJune McEnroe 2019-01-12Use local libeditJune McEnroe 2019-01-12Replace libedit MakefileJune McEnroe 2019-01-11Import /usr/src/lib/libedit from NetBSD 8.0June McEnroe 2019-01-11Add PSlit for prompt escapesJune McEnroe 2019-01-11Don't make depend automaticallyJune McEnroe