aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2024-06-18 13:28:47 +0000
committerWerner Koch <[email protected]>2024-06-18 13:28:47 +0000
commit87f92fe962ae77045d8ddea3ae88d57234c04533 (patch)
treebb6ff70ff1dcec49953e6f50857dec7f16edeb8e
parentSpell fix in gpg-error.m4 from GnuPG. (diff)
downloadlibassuan-87f92fe962ae77045d8ddea3ae88d57234c04533.tar.gz
libassuan-87f92fe962ae77045d8ddea3ae88d57234c04533.zip
Add new socket flags "linger" and "reuseaddr".
* src/assuan-socket.c (_assuan_sock_set_flag): Add new flags. (_assuan_sock_get_flag): Ditto.
-rw-r--r--src/assuan-socket.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/assuan-socket.c b/src/assuan-socket.c
index 8e757b9..d95c2e8 100644
--- a/src/assuan-socket.c
+++ b/src/assuan-socket.c
@@ -587,6 +587,27 @@ _assuan_sock_set_flag (assuan_context_t ctx, assuan_fd_t sockfd,
return -1;
}
}
+ else if (!strcmp (name, "linger"))
+ {
+ struct linger li = { 0 };
+
+ if (value >= 0)
+ {
+ li.l_onoff = 1;
+ li.l_linger = value;
+ }
+
+ if (setsockopt (HANDLE2SOCKET(sockfd), SOL_SOCKET, SO_LINGER,
+ (void *)&li, sizeof li))
+ return -1;
+ }
+ else if (!strcmp (name, "reuseaddr"))
+ {
+ int i = !!value;
+ if (setsockopt (HANDLE2SOCKET(sockfd), SOL_SOCKET, SO_REUSEADDR,
+ (void *)&i, sizeof (i)))
+ return -1;
+ }
else
{
gpg_err_set_errno (EINVAL);
@@ -620,6 +641,39 @@ _assuan_sock_get_flag (assuan_context_t ctx, assuan_fd_t sockfd,
{
*r_value = tor_mode == SOCKS_PORT;
}
+ else if (!strcmp (name, "linger"))
+ {
+ struct linger li = { 0 };
+ socklen_t lilen = sizeof li;
+
+ if (getsockopt (HANDLE2SOCKET(sockfd), SOL_SOCKET, SO_LINGER,
+ (void *)&li, &lilen))
+ return -1;
+ else if (lilen < sizeof li)
+ {
+ gpg_err_set_errno (EINVAL);
+ return -1;
+ }
+ if (li.l_onoff && li.l_linger >= 0)
+ *r_value = li.l_linger;
+ else
+ *r_value = -1;
+ }
+ else if (!strcmp (name, "reuseaddr"))
+ {
+ int i = 0;
+ socklen_t ilen = sizeof i;
+
+ if (getsockopt (HANDLE2SOCKET(sockfd), SOL_SOCKET, SO_REUSEADDR,
+ (void *)&i, &ilen))
+ return -1;
+ else if (ilen < sizeof i)
+ {
+ gpg_err_set_errno (EINVAL);
+ return -1;
+ }
+ *r_value = !!i;
+ }
else
{
gpg_err_set_errno (EINVAL);