Skip to content

Commit 9834498

Browse files
committed
Avoid str_cmp() in sk_set()
1 parent 9454b5c commit 9834498

File tree

1 file changed

+47
-29
lines changed

1 file changed

+47
-29
lines changed

src/main.c

+47-29
Original file line numberDiff line numberDiff line change
@@ -66,57 +66,75 @@ static void fd_set_nonblock (int fd)
6666
perror("fcntl O_NONBLOCK");
6767
}
6868

69-
static void sk_set (int fd, const char *name, const void *val, socklen_t len)
69+
enum sk_opt {
70+
sk_nodelay,
71+
sk_reuseaddr,
72+
sk_keepalive,
73+
sk_keepcnt,
74+
sk_keepidle,
75+
sk_keepintvl,
76+
sk_congestion,
77+
sk_defer_accept,
78+
};
79+
80+
static void sk_set (int fd, enum sk_opt opt, const void *val, socklen_t len)
7081
{
71-
if (!name || !val || len<=0)
82+
if (!val || len<=0)
7283
return;
7384

7485
struct {
7586
const char *name;
87+
const int present;
7688
const int level;
7789
const int option;
78-
} ops[] = {
79-
{ "TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY },
80-
{ "SO_REUSEADDR", SOL_SOCKET, SO_REUSEADDR },
81-
{ "SO_KEEPALIVE", SOL_SOCKET, SO_KEEPALIVE },
90+
} opts[] = {
91+
[sk_nodelay] = { "TCP_NODELAY", 1, IPPROTO_TCP, TCP_NODELAY, },
92+
[sk_reuseaddr] = { "SO_REUSEADDR", 1, SOL_SOCKET, SO_REUSEADDR, },
93+
[sk_keepalive] = { "SO_KEEPALIVE", 1, SOL_SOCKET, SO_KEEPALIVE, },
94+
[sk_keepcnt] = { "TCP_KEEPCNT",
8295
#ifdef TCP_KEEPCNT
83-
{ "TCP_KEEPCNT", IPPROTO_TCP, TCP_KEEPCNT },
96+
1, IPPROTO_TCP, TCP_KEEPCNT,
8497
#endif
98+
},
99+
[sk_keepidle] = { "TCP_KEEPIDLE",
85100
#ifdef TCP_KEEPIDLE
86-
{ "TCP_KEEPIDLE", IPPROTO_TCP, TCP_KEEPIDLE },
101+
1, IPPROTO_TCP, TCP_KEEPIDLE,
87102
#endif
103+
},
104+
[sk_keepintvl] = { "TCP_KEEPINTVL",
88105
#ifdef TCP_KEEPINTVL
89-
{ "TCP_KEEPINTVL", IPPROTO_TCP, TCP_KEEPINTVL },
106+
1, IPPROTO_TCP, TCP_KEEPINTVL,
90107
#endif
108+
},
109+
[sk_congestion] = { "TCP_CONGESTION",
91110
#ifdef TCP_CONGESTION
92-
{ "TCP_CONGESTION", IPPROTO_TCP, TCP_CONGESTION },
111+
1, IPPROTO_TCP, TCP_CONGESTION,
93112
#endif
113+
},
114+
[sk_defer_accept] = { "TCP_DEFER_ACCEPT",
94115
#ifdef TCP_DEFER_ACCEPT
95-
{ "TCP_DEFER_ACCEPT", IPPROTO_TCP, TCP_DEFER_ACCEPT },
116+
1, IPPROTO_TCP, TCP_DEFER_ACCEPT,
96117
#endif
118+
},
97119
};
98120

99-
for (int k=0; k<COUNT(ops); k++) {
100-
if (str_cmp(ops[k].name, name))
101-
continue;
102-
103-
if (setsockopt(fd, ops[k].level, ops[k].option, val, len)==-1)
104-
gt_log("couldn't set socket option `%s'\n", name);
105-
121+
if (!opts[opt].present) {
122+
gt_na(opts[opt].name);
106123
return;
107124
}
108125

109-
gt_na(name);
126+
if (setsockopt(fd, opts[opt].level, opts[opt].option, val, len)==-1)
127+
gt_log("couldn't set socket option `%s'\n", opts[opt].name);
110128
}
111129

112-
static void sk_set_int (int fd, const char *name, int val)
130+
static void sk_set_int (int fd, enum sk_opt opt, int val)
113131
{
114-
return sk_set(fd, name, &val, sizeof(val));
132+
return sk_set(fd, opt, &val, sizeof(val));
115133
}
116134

117135
static int sk_listen (int fd, struct addrinfo *ai)
118136
{
119-
sk_set_int(fd, "SO_REUSEADDR", 1);
137+
sk_set_int(fd, sk_reuseaddr, 1);
120138

121139
int ret = bind(fd, ai->ai_addr, ai->ai_addrlen);
122140

@@ -132,7 +150,7 @@ static int sk_listen (int fd, struct addrinfo *ai)
132150
return -1;
133151
}
134152

135-
sk_set_int(fd, "TCP_DEFER_ACCEPT", GT_TIMEOUT/1000);
153+
sk_set_int(fd, sk_defer_accept, GT_TIMEOUT/1000);
136154

137155
return 0;
138156
}
@@ -722,21 +740,21 @@ int main (int argc, char **argv)
722740

723741
fd_set_nonblock(sock.fd);
724742

725-
sk_set_int(sock.fd, "TCP_NODELAY", !delay);
726-
sk_set_int(sock.fd, "SO_KEEPALIVE", keepalive);
743+
sk_set_int(sock.fd, sk_nodelay, !delay);
744+
sk_set_int(sock.fd, sk_keepalive, keepalive);
727745

728746
if (keepalive) {
729747
if (ka_count>=0 && ka_count<=INT_MAX)
730-
sk_set_int(sock.fd, "TCP_KEEPCNT", ka_count);
748+
sk_set_int(sock.fd, sk_keepcnt, ka_count);
731749

732750
if (ka_idle>=0 && ka_idle<=INT_MAX)
733-
sk_set_int(sock.fd, "TCP_KEEPIDLE", ka_idle);
751+
sk_set_int(sock.fd, sk_keepidle, ka_idle);
734752

735753
if (ka_interval>=0 && ka_interval<=INT_MAX)
736-
sk_set_int(sock.fd, "TCP_KEEPINTVL", ka_interval);
754+
sk_set_int(sock.fd, sk_keepintvl, ka_interval);
737755
}
738756

739-
sk_set(sock.fd, "TCP_CONGESTION", congestion, str_len(congestion));
757+
sk_set(sock.fd, sk_congestion, congestion, str_len(congestion));
740758

741759
switch (gt_setup_crypto(&ctx, sock.fd, listener)) {
742760
case -2: gt_log("%s: key exchange could not be verified!\n", sockname);

0 commit comments

Comments
 (0)