diff --git a/README.md b/README.md index de5a30e..8c8f91a 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ sudo make install ## Usage ```sh -sbotc [-j] [-T] [-n] [-c ] [-s ] [-p ] [-k ] [-K ] +sbotc [-j] [-T] [-n] [-c ] [-s ] [-p ] [-u ] [-k ] [-K ] [-t ] [...] ``` diff --git a/sbotc.1 b/sbotc.1 index 6f2677d..cc050cb 100644 --- a/sbotc.1 +++ b/sbotc.1 @@ -13,6 +13,7 @@ .Op Fl c Ar cap .Op Fl s Ar host .Op Fl p Ar port +.Op Fl u Ar socket_path .Op Fl k Ar key .Op Fl K Ar keypair_seed .Op Fl t Ar type @@ -44,6 +45,11 @@ Capability key for secret-handshake. Default is SSB's capability key, The hostname to connect to. Default is localhost. .It Fl p Ar port The port to connect to. Default is 8008. +.It Fl u Ar socket_path +Unix socket path to connect to, instead of TCP socket. Conflicts with +.Fl p +and +.Fl s . .It Fl k Ar key The key to connect to. Default is your public key, as read from your private key file. diff --git a/sbotc.c b/sbotc.c index d095ac7..0a6118c 100644 --- a/sbotc.c +++ b/sbotc.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -96,7 +97,7 @@ static const unsigned char ssb_cap[] = { }; static void usage() { - fputs("usage: sbotc [-j] [-T] [-n] [-c ] [-s ] [-p ] [-k ] [-K ] \n" + fputs("usage: sbotc [-j] [-T] [-n] [-c ] [-s ] [-p ] [-u ] [-k ] [-K ]\n" " [-t ] [...]\n", stderr); exit(EXIT_FAILURE); } @@ -818,6 +819,7 @@ int main(int argc, char *argv[]) { const char *port = "8008"; const char *typestr = NULL, *methodstr; const char *shs_cap_key_str = NULL; + const char *socket_path = NULL; size_t argument_len; unsigned char private_key[64]; unsigned char public_key[32]; @@ -830,6 +832,8 @@ int main(int argc, char *argv[]) { ssize_t len; bool test = false; bool noauth = false; + bool host_arg = false; + bool port_arg = false; bool shs_cap_key_str_arg = false; get_app_dir(app_dir, sizeof(app_dir)); @@ -854,10 +858,11 @@ int main(int argc, char *argv[]) { case 'c': shs_cap_key_str = argv[++i]; shs_cap_key_str_arg = true; break; case 'j': ptype = pkt_type_json; break; case 'T': test = true; break; - case 's': host = argv[++i]; break; + case 's': host = argv[++i]; host_arg = true; break; case 'k': key = argv[++i]; break; case 'K': keypair_seed_str = argv[++i]; break; - case 'p': port = argv[++i]; break; + case 'p': port = argv[++i]; port_arg = true; break; + case 'u': socket_path = argv[++i]; break; case 't': typestr = argv[++i]; break; case 'n': noauth = true; break; default: usage(); @@ -928,6 +933,21 @@ int main(int argc, char *argv[]) { infd = STDIN_FILENO; outfd = STDOUT_FILENO; s = -1; + + } else if (socket_path) { + if (port_arg) errx(1, "-p port conflicts with -u socket_path"); + if (host_arg) errx(1, "-s host conflicts with -u socket_path"); + struct sockaddr_un name; + size_t path_len = strlen(socket_path); + if (path_len >= sizeof(name.sun_path)-1) errx(1, "socket path too long"); + s = socket(AF_UNIX, SOCK_STREAM, 0); + if (s < 0) err(1, "socket"); + memset(&name, 0, sizeof(struct sockaddr_un)); + name.sun_family = AF_UNIX; + strncpy(name.sun_path, socket_path, sizeof(name.sun_path) - 1); + rc = connect(s, (const struct sockaddr *)&name, sizeof name); + if (rc < 0) err(1, "connect"); + } else { s = tcp_connect(host, port); if (s < 0) err(1, "tcp_connect");