summary refs log tree commit diff
path: root/.bin/pbcopy
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2017-01-06 11:49:29 -0500
committerJune McEnroe <june@causal.agency>2017-01-06 11:55:02 -0500
commit1eeb00eebb9aed478425fc5a531ec7656c2c5708 (patch)
tree1552211b217d72299161f2aa3b0759f3dc57fbd9 /.bin/pbcopy
parentAdd custom keyboard layout for macOS (diff)
downloadsrc-1eeb00eebb9aed478425fc5a531ec7656c2c5708.tar.gz
src-1eeb00eebb9aed478425fc5a531ec7656c2c5708.zip
Implement pbcopy and pbpaste in C
Ted Unangst broke my netcat implementation of pbpaste with this commit:
<https://github.com/openbsd/src/commit/bb978d8>, 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.
Diffstat (limited to '')
-rwxr-xr-x.bin/pbcopy1
-rwxr-xr-x.bin/pbcopy.c52
2 files changed, 52 insertions, 1 deletions
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 <arpa/inet.h>
+#include <err.h>
+#include <stdio.h>
+#include <sys/socket.h>
+#include <sysexits.h>
+#include <unistd.h>
+
+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;
+}
on LANG being set. 2020-09-20Add The Awakened KingdomJune McEnroe A cute extra novella. Finally finished this series. 2020-09-12Move /opt/local back, cheat port select to use system manJune McEnroe This is not really how you're supposed to use the select system, I don't think, since the mandoc package actually creates those files, but it does work. This lets me actually use the git installed by MacPorts. 2020-09-12Move /opt/local behind /usr againJune McEnroe The reason I did this with pkgsrc was because I actually don't want the man(1) from mandoc, since it won't follow MANSECT. Same applies to MacPorts. I wish I could disable its man(1) with a variant or whatever. 2020-09-12Enable toc in cgit renderings of man pagesJune McEnroe But keep it disabled for READMEs since they always use non-standard sections and the TOC is just distracting there, I think. Also add the style so its h1 is the same size as the ones inside sections... 2020-09-11Install mandoc on macOSJune McEnroe 2020-09-11Rewrite install script yet againJune McEnroe 2020-09-11Remove NetBSD from install scriptJune McEnroe I never use it. 2020-09-11Use MacPorts rather than pkgsrcJune McEnroe My system is probably such a mess now... 2020-09-11Add debian VM name to sshJune McEnroe 2020-09-11Add influencer tweetJune McEnroe 2020-09-10Add The Kingdom of GodsJune McEnroe Reading has really slowed down :( 2020-09-07Add SunglassesJune McEnroe An IRC find. 2020-09-06Add Between the BreathsJune McEnroe One of those good songs from a soundtrack of a film that probably isn't? The summary sounds a lot more interesting than the title implies, at least. 2020-09-04Open /dev/tty in nudgeJune McEnroe This makes it work even when it's run connected to a pipe, i.e. as the notify command of catgirl... 2020-09-04Add nudgeJune McEnroe 2020-09-03Build fbclock with -lzJune McEnroe I guess this got lost somewhere, long ago... 2020-08-29Add tweets from retweetsJune McEnroe