iFix errno handling. - geomyidae - A small C-based gopherd. Err bitreich.org 70 hgit clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ URL:git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ bitreich.org 70 1Log /scm/geomyidae/log.gph bitreich.org 70 1Files /scm/geomyidae/files.gph bitreich.org 70 1Refs /scm/geomyidae/refs.gph bitreich.org 70 1Tags /scm/geomyidae/tag bitreich.org 70 1README /scm/geomyidae/file/README.gph bitreich.org 70 1LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 06e2364496697e53a903409adb3fcf09926adb06 /scm/geomyidae/commit/06e2364496697e53a903409adb3fcf09926adb06.gph bitreich.org 70 1parent 5bd1a482d555bce8593f1d3f6b12cbb27884a7b4 /scm/geomyidae/commit/5bd1a482d555bce8593f1d3f6b12cbb27884a7b4.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Sun, 28 Oct 2018 17:26:27 +0100 Err bitreich.org 70 i Err bitreich.org 70 iFix errno handling. Err bitreich.org 70 i Err bitreich.org 70 iWe sometimes need to save errno, because *printf functions overwrite it. Err bitreich.org 70 i Err bitreich.org 70 iThanks to Stéphane Goujet for the hint! Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M main.c | 25 +++++++++++++++++++++---- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 21 insertions(+), 4 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70 i@@ -300,7 +300,7 @@ getlistenfd(struct addrinfo *hints, char *bindip, char *port) Err bitreich.org 70 i char addstr[INET6_ADDRSTRLEN]; Err bitreich.org 70 i struct addrinfo *ai, *rp; Err bitreich.org 70 i void *sinaddr; Err bitreich.org 70 i- int on, reqaf, listfd, aierr; Err bitreich.org 70 i+ int on, reqaf, listfd, aierr, errno_save; Err bitreich.org 70 i Err bitreich.org 70 i if ((reqaf = hints->ai_family) == AF_UNSPEC) Err bitreich.org 70 i hints->ai_family = AF_INET6; Err bitreich.org 70 i@@ -343,11 +343,15 @@ getlistenfd(struct addrinfo *hints, char *bindip, char *port) Err bitreich.org 70 i } Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Save errno, because fprintf in logentry overwrites it. */ Err bitreich.org 70 i+ errno_save = errno; Err bitreich.org 70 i close(listfd); Err bitreich.org 70 i if (loglvl & CONN && inet_ntop(rp->ai_family, sinaddr, Err bitreich.org 70 i addstr, sizeof(addstr))) { Err bitreich.org 70 i logentry(addstr, port, "-", "could not bind"); Err bitreich.org 70 i } Err bitreich.org 70 i+ errno = errno_save; Err bitreich.org 70 i } Err bitreich.org 70 i freeaddrinfo(ai); Err bitreich.org 70 i if (rp == NULL) Err bitreich.org 70 i@@ -372,7 +376,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i struct addrinfo hints; Err bitreich.org 70 i struct sockaddr_storage clt; Err bitreich.org 70 i socklen_t cltlen; Err bitreich.org 70 i- int sock, dofork, inetf, usechroot, nocgi; Err bitreich.org 70 i+ int sock, dofork, inetf, usechroot, nocgi, errno_save; Err bitreich.org 70 i char *port, *base, clienth[NI_MAXHOST], clientp[NI_MAXSERV]; Err bitreich.org 70 i char *user, *group, *bindip, *ohost, *sport, *p; Err bitreich.org 70 i struct passwd *us; Err bitreich.org 70 i@@ -462,15 +466,25 @@ main(int argc, char *argv[]) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i if (group != NULL) { Err bitreich.org 70 i+ errno = 0; Err bitreich.org 70 i if ((gr = getgrnam(group)) == NULL) { Err bitreich.org 70 i- perror("no such group"); Err bitreich.org 70 i+ if (errno == 0) { Err bitreich.org 70 i+ perror("no such group"); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ perror("getgrnam"); Err bitreich.org 70 i+ } Err bitreich.org 70 i return 1; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i if (user != NULL) { Err bitreich.org 70 i+ errno = 0; Err bitreich.org 70 i if ((us = getpwnam(user)) == NULL) { Err bitreich.org 70 i- perror("no such user"); Err bitreich.org 70 i+ if (errno == 0) { Err bitreich.org 70 i+ perror("no such user"); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ perror("getpwnam"); Err bitreich.org 70 i+ } Err bitreich.org 70 i return 1; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i@@ -509,10 +523,13 @@ main(int argc, char *argv[]) Err bitreich.org 70 i hints.ai_family = AF_INET; Err bitreich.org 70 i listfd = getlistenfd(&hints, bindip, port); Err bitreich.org 70 i } Err bitreich.org 70 i+ /* Save errno because of fprintf to stderr. */ Err bitreich.org 70 i+ errno_save = errno; Err bitreich.org 70 i } Err bitreich.org 70 i if (listfd < 0) { Err bitreich.org 70 i fprintf(stderr, "Unable to get a binding socket. " Err bitreich.org 70 i "Look at bindip and the tcp port.\n"); Err bitreich.org 70 i+ errno = errno_save; Err bitreich.org 70 i perror("getlistenfd"); Err bitreich.org 70 i return 1; Err bitreich.org 70 i } Err bitreich.org 70 .