Introduction
Introduction Statistics Contact Development Disclaimer Help
Refurbishing the getaddrinfo stuff and signals. - geomyidae - A small C-based g…
git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri…
Log
Files
Refs
Tags
README
LICENSE
---
commit cd5884a78c51da927a0cbf302989b21a055b770a
parent f470bb28b01e20414e34e074a17447c556884095
Author: Christoph Lohmann <[email protected]>
Date: Tue, 1 Mar 2011 06:54:34 +0100
Refurbishing the getaddrinfo stuff and signals.
Diffstat:
M main.c | 32 +++++++++++++++++------------…
1 file changed, 18 insertions(+), 14 deletions(-)
---
diff --git a/main.c b/main.c
@@ -16,6 +16,8 @@
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
+#include <string.h>
+#include <strings.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
@@ -212,7 +214,7 @@ sighandler(int sig)
case SIGTERM:
if(logfile != nil)
stoplogging(glfd);
- running = 0;
+ exit(EXIT_SUCCESS);
break;
default:
break;
@@ -245,7 +247,7 @@ usage(void)
int
main(int argc, char *argv[])
{
- struct addrinfo hints, *ai;
+ struct addrinfo hints, *ai, *rp;
struct sockaddr_storage clt;
socklen_t cltlen;
int sock, list, opt, dofork;
@@ -325,8 +327,8 @@ main(int argc, char *argv[])
}
}
- memset(&hints, 0, sizeof(hints));
- hints.ai_flags |= AI_PASSIVE;
+ bzero(&hints, sizeof(hints));
+ hints.ai_flags = AI_PASSIVE;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_family = AF_INET;
@@ -339,11 +341,20 @@ main(int argc, char *argv[])
return 1;
}
- list = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
- if(list < 0) {
- perror("socket");
+ for(rp = ai; rp != nil; rp = rp->ai_next) {
+ list = socket(rp->ai_family, rp->ai_socktype,
+ rp->ai_protocol);
+ if(list < 0)
+ continue;
+ if(bind(list, rp->ai_addr, rp->ai_addrlen) == 0)
+ break;
+ close(list);
+ }
+ if(rp == nil) {
+ perror("Could not find any suitable bindable address.");
return 1;
}
+ freeaddrinfo(ai);
opt = 1;
if(setsockopt(list, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
@@ -351,18 +362,11 @@ main(int argc, char *argv[])
return 1;
}
- if(bind(list, ai->ai_addr, ai->ai_addrlen)) {
- perror("bind");
- return 1;
- }
-
if(listen(list, 255)) {
perror("listen");
return 1;
}
- freeaddrinfo(ai);
-
if(dropprivileges(gr, us) < 0) {
perror("cannot drop privileges");
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.