about summary refs log tree commit diff
diff options
context:
space:
mode:
authorsternenseemann <0rpkxez4ksa01gb3typccl0i@systemli.org>2020-12-15 18:03:42 +0100
committersternenseemann <0rpkxez4ksa01gb3typccl0i@systemli.org>2020-12-15 18:03:42 +0100
commitc915ee800628c4a6cad9713092ea14da408ba17d (patch)
treef224a6862c87663062ec14e304a7cdc2623ed86f
parent5d444f2fed3900b71a4776f6ee9f32140a9b007a (diff)
feat(bs-renderflipdot): specify preferred ip protocol version
-rw-r--r--bs-renderflipdot.c38
-rw-r--r--doc/man/bs-renderflipdot.19
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