diff options
-rwxr-xr-x | curtis/.bin/pbcopy.c | 55 | ||||
-rwxr-xr-x | curtis/.bin/pbd.c | 55 | ||||
-rwxr-xr-x | link.sh | 1 |
3 files changed, 53 insertions, 58 deletions
diff --git a/curtis/.bin/pbcopy.c b/curtis/.bin/pbcopy.c deleted file mode 100755 index 23403d2d..00000000 --- a/curtis/.bin/pbcopy.c +++ /dev/null @@ -1,55 +0,0 @@ -#if 0 -cc -Wall -Wextra -pedantic $@ -o $(dirname $0)/pbcopy $0 && \ -exec cc -Wall -Wextra -pedantic -DPBPASTE $@ -o $(dirname $0)/pbpaste $0 -#endif - -// pbcopy and pbpaste implementation which connects to pbd. - -#include <arpa/inet.h> -#include <err.h> -#include <netinet/in.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 EX_OK; -} diff --git a/curtis/.bin/pbd.c b/curtis/.bin/pbd.c index e7b61d12..a90974e6 100755 --- a/curtis/.bin/pbd.c +++ b/curtis/.bin/pbd.c @@ -1,9 +1,13 @@ #if 0 -exec cc -Wall -Wextra -pedantic $@ -o $(dirname $0)/pbd $0 +cc -Wall -Wextra -pedantic $@ -o $(dirname $0)/pbd $0 && \ +cc -Wall -Wextra -pedantic -DPBCOPY $@ -o $(dirname $0)/pbcopy $0 && \ +exec cc -Wall -Wextra -pedantic -DPBCOPY -DPBPASTE $@ -o $(dirname $0)/pbpaste $0 #endif -// TCP server which pipes between macOS pbcopy and pbpaste. +// TCP server which pipes between macOS pbcopy and pbpaste, and pbcopy and +// pbpaste implementations which connect to it. +#include <arpa/inet.h> #include <err.h> #include <netinet/in.h> #include <stdint.h> @@ -14,6 +18,8 @@ exec cc -Wall -Wextra -pedantic $@ -o $(dirname $0)/pbd $0 #include <sysexits.h> #include <unistd.h> +#ifndef PBCOPY + static void spawn(const char *cmd, int childFd, int parentFd) { pid_t pid = fork(); if (pid < 0) err(EX_OSERR, "fork"); @@ -71,3 +77,48 @@ int main() { if (error) err(EX_IOERR, "close"); } } + +#else + +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 EX_OK; +} + +#endif diff --git a/link.sh b/link.sh index c83a9368..ffdaf413 100755 --- a/link.sh +++ b/link.sh @@ -24,7 +24,6 @@ link() { link '.bin/bri.c' link '.bin/jrp.c' link '.bin/manpager' -link '.bin/pbcopy.c' link '.bin/pbd.c' link '.bin/xx.c' link '.config/git/config' |