Introduction
Introduction Statistics Contact Development Disclaimer Help
Fix errno handling. - geomyidae - A small C-based gopherd.
git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri…
Log
Files
Refs
Tags
README
LICENSE
---
commit 06e2364496697e53a903409adb3fcf09926adb06
parent 5bd1a482d555bce8593f1d3f6b12cbb27884a7b4
Author: Christoph Lohmann <[email protected]>
Date: Sun, 28 Oct 2018 17:26:27 +0100
Fix errno handling.
We sometimes need to save errno, because *printf functions overwrite it.
Thanks to Stéphane Goujet <[email protected]> for the hint!
Diffstat:
M main.c | 25 +++++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
---
diff --git a/main.c b/main.c
@@ -300,7 +300,7 @@ getlistenfd(struct addrinfo *hints, char *bindip, char *por…
char addstr[INET6_ADDRSTRLEN];
struct addrinfo *ai, *rp;
void *sinaddr;
- int on, reqaf, listfd, aierr;
+ int on, reqaf, listfd, aierr, errno_save;
if ((reqaf = hints->ai_family) == AF_UNSPEC)
hints->ai_family = AF_INET6;
@@ -343,11 +343,15 @@ getlistenfd(struct addrinfo *hints, char *bindip, char *p…
}
break;
}
+
+ /* Save errno, because fprintf in logentry overwrites it. */
+ errno_save = errno;
close(listfd);
if (loglvl & CONN && inet_ntop(rp->ai_family, sinaddr,
addstr, sizeof(addstr))) {
logentry(addstr, port, "-", "could not bind");
}
+ errno = errno_save;
}
freeaddrinfo(ai);
if (rp == NULL)
@@ -372,7 +376,7 @@ main(int argc, char *argv[])
struct addrinfo hints;
struct sockaddr_storage clt;
socklen_t cltlen;
- int sock, dofork, inetf, usechroot, nocgi;
+ int sock, dofork, inetf, usechroot, nocgi, errno_save;
char *port, *base, clienth[NI_MAXHOST], clientp[NI_MAXSERV];
char *user, *group, *bindip, *ohost, *sport, *p;
struct passwd *us;
@@ -462,15 +466,25 @@ main(int argc, char *argv[])
}
if (group != NULL) {
+ errno = 0;
if ((gr = getgrnam(group)) == NULL) {
- perror("no such group");
+ if (errno == 0) {
+ perror("no such group");
+ } else {
+ perror("getgrnam");
+ }
return 1;
}
}
if (user != NULL) {
+ errno = 0;
if ((us = getpwnam(user)) == NULL) {
- perror("no such user");
+ if (errno == 0) {
+ perror("no such user");
+ } else {
+ perror("getpwnam");
+ }
return 1;
}
}
@@ -509,10 +523,13 @@ main(int argc, char *argv[])
hints.ai_family = AF_INET;
listfd = getlistenfd(&hints, bindip, port);
}
+ /* Save errno because of fprintf to stderr. */
+ errno_save = errno;
}
if (listfd < 0) {
fprintf(stderr, "Unable to get a binding socket. "
"Look at bindip and the tcp port.\n");
+ errno = errno_save;
perror("getlistenfd");
return 1;
}
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.