diff options
author | sternenseemann <0rpkxez4ksa01gb3typccl0i@systemli.org> | 2020-12-15 18:03:42 +0100 |
---|---|---|
committer | sternenseemann <0rpkxez4ksa01gb3typccl0i@systemli.org> | 2020-12-15 18:03:42 +0100 |
commit | c915ee800628c4a6cad9713092ea14da408ba17d (patch) | |
tree | f224a6862c87663062ec14e304a7cdc2623ed86f | |
parent | 5d444f2fed3900b71a4776f6ee9f32140a9b007a (diff) |
feat(bs-renderflipdot): specify preferred ip protocol version
-rw-r--r-- | bs-renderflipdot.c | 38 | ||||
-rw-r--r-- | doc/man/bs-renderflipdot.1 | 9 |
2 files changed, 30 insertions, 17 deletions
diff --git a/bs-renderflipdot.c b/bs-renderflipdot.c index ceb0b3d..e237645 100644 --- a/bs-renderflipdot.c +++ b/bs-renderflipdot.c @@ -32,7 +32,7 @@ void print_usage(const char *name) { for(size_t i = 0; i < name_len; i++) { fputc(' ', stderr); } - fputs(" [-h HOST] [-p PORT] [-W WIDTH] [-H HEIGHT] TEXT\n", stderr); + fputs(" [-4|-6] [-h HOST] [-p PORT] [-W WIDTH] [-H HEIGHT] TEXT\n", stderr); fputs(name, stderr); fputs(" -?\n", stderr); @@ -47,19 +47,22 @@ void print_usage(const char *name) { " -p port of the flipdots to use (default: %s)\n" " -W width of the target flipdot display (default: %d)\n" " -H height of the target flipdot display (default: %d)\n" + " -4 only use IPv4 for connecting\n" + " -6 only use IPv6 for connecting\n" " -? display this help screen\n", DEFAULT_FONT_SIZE, DEFAULT_HOST, DEFAULT_PORT, DEFAULT_FLIPDOT_WIDTH, DEFAULT_FLIPDOT_HEIGHT); } -bool send_bitarray(const char *host, const char *port, uint8_t *bits, ssize_t bits_size, const char *progname) { +bool send_bitarray(const char *host, const char *port, int family, uint8_t *bits, ssize_t bits_size, const char *progname) { struct addrinfo *addrs; struct addrinfo hints; + bool result = false; + memset(&hints, 0, sizeof(hints)); - // TODO: seems like flipdot impls are v4 only - hints.ai_family = AF_INET; + hints.ai_family = family; hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = AI_NUMERICSERV; @@ -68,22 +71,16 @@ bool send_bitarray(const char *host, const char *port, uint8_t *bits, ssize_t bi return false; } - if(addrs == NULL) { - return false; - } - int sockfd = socket(addrs->ai_family, SOCK_DGRAM, IPPROTO_UDP); if(sockfd < 0) { print_error(progname, "could not create socket"); - freeaddrinfo(addrs); - return false; - } - - bool result = sendto(sockfd, bits, bits_size, 0, - addrs->ai_addr, addrs->ai_addrlen) == bits_size; + } else { + result = sendto(sockfd, bits, bits_size, 0, + addrs->ai_addr, addrs->ai_addrlen) == bits_size; - close(sockfd); + close(sockfd); + } freeaddrinfo(addrs); @@ -99,6 +96,7 @@ int main(int argc, char **argv) { int flipdot_height = DEFAULT_FLIPDOT_HEIGHT; bool dry_run = false; bool invert = false; + int ip_family = AF_UNSPEC; int opt; int fontcount = 0; @@ -110,8 +108,14 @@ int main(int argc, char **argv) { bool parse_error = false; - while(!parse_error && (opt = getopt(argc, argv, "inh:p:s:f:?W:H:")) != -1) { + while(!parse_error && (opt = getopt(argc, argv, "46inh:p:s:f:?W:H:")) != -1) { switch(opt) { + case '4': + ip_family = AF_INET; + break; + case '6': + ip_family = AF_INET6; + break; case 'i': invert = true; break; @@ -225,7 +229,7 @@ int main(int argc, char **argv) { uint8_t *bits = bs_view_bitarray(view, &size); if(size > 0) { - if(!send_bitarray(host, port, bits, (ssize_t) size, argv[0])) { + if(!send_bitarray(host, port, ip_family, bits, (ssize_t) size, argv[0])) { status = 1; } } else { diff --git a/doc/man/bs-renderflipdot.1 b/doc/man/bs-renderflipdot.1 index 38e0c88..7f56132 100644 --- a/doc/man/bs-renderflipdot.1 +++ b/doc/man/bs-renderflipdot.1 @@ -15,6 +15,8 @@ .Op Fl H Ar height .Op Fl h Ar host .Op Fl p Ar port +.Op Fl 4 +.Op Fl 6 .Ar text .Sh DESCRIPTION .Nm @@ -65,6 +67,13 @@ Port of the target flipdot display. Only relevant if is not given, .Sy 2323 is the default value. +.It Fl 4 +Use IPv4 address of target host if any. +Otherwise the one returned first by +.Xr getaddrinfo 3 +is used. +.It Fl 6 +Use IPv6 address of target host if any. .It Fl ? Show usage information. .El |