]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
CLEANUP: tools: make str2sa_range() less awful for fd@ and sockpair@
authorWilly Tarreau <w@1wt.eu>
Fri, 4 Sep 2020 14:54:05 +0000 (16:54 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 16 Sep 2020 20:08:07 +0000 (22:08 +0200)
The code is built to match prefixes at one place and to parse the address
as a second step, except for fd@ and sockpair@ where the test first passes
via AF_UNSPEC that is changed again. This is ugly and confusing, so let's
proceed like for the other ones.

src/tools.c

index d948993b254256d97fe185dfb012aceceb5a2212..1fdfed67fdb889463f60a51808378140dc5c4d9b 100644 (file)
@@ -924,17 +924,23 @@ struct sockaddr_storage *str2sa_range(const char *str, int *port, int *low, int
                ss.ss_family = AF_UNSPEC;
                is_udp = 1;
        }
+       else if (strncmp(str2, "fd@", 3) == 0) {
+               str2 += 3;
+               ss.ss_family = AF_CUST_EXISTING_FD;
+       }
+       else if (strncmp(str2, "sockpair@", 9) == 0) {
+               str2 += 9;
+               ss.ss_family = AF_CUST_SOCKPAIR;
+       }
        else if (*str2 == '/') {
                ss.ss_family = AF_UNIX;
        }
        else
                ss.ss_family = AF_UNSPEC;
 
-       if (ss.ss_family == AF_UNSPEC && strncmp(str2, "sockpair@", 9) == 0) {
+       if (ss.ss_family == AF_CUST_SOCKPAIR) {
                char *endptr;
 
-               str2 += 9;
-
                ((struct sockaddr_in *)&ss)->sin_addr.s_addr = strtol(str2, &endptr, 10);
                ((struct sockaddr_in *)&ss)->sin_port = 0;
 
@@ -942,14 +948,10 @@ struct sockaddr_storage *str2sa_range(const char *str, int *port, int *low, int
                        memprintf(err, "file descriptor '%s' is not a valid integer in '%s'\n", str2, str);
                        goto out;
                }
-
-               ss.ss_family = AF_CUST_SOCKPAIR;
-
        }
-       else if (ss.ss_family == AF_UNSPEC && strncmp(str2, "fd@", 3) == 0) {
+       else if (ss.ss_family == AF_CUST_EXISTING_FD) {
                char *endptr;
 
-               str2 += 3;
                ((struct sockaddr_in *)&ss)->sin_addr.s_addr = strtol(str2, &endptr, 10);
                ((struct sockaddr_in *)&ss)->sin_port = 0;
 
@@ -957,9 +959,6 @@ struct sockaddr_storage *str2sa_range(const char *str, int *port, int *low, int
                        memprintf(err, "file descriptor '%s' is not a valid integer in '%s'\n", str2, str);
                        goto out;
                }
-
-               /* we return AF_CUST_EXISTING_FD if we use a file descriptor number */
-               ss.ss_family = AF_CUST_EXISTING_FD;
        }
        else if (ss.ss_family == AF_UNIX) {
                struct sockaddr_un *un = (struct sockaddr_un *)&ss;