From 592c1cfbd0285d0240c310d825e2ffa9d73bbf1c Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 26 Sep 2011 12:44:15 +0200 Subject: [PATCH] Added full IPv4 support --- util/http_parser.cpp | 6 +++--- util/socket.cpp | 42 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/util/http_parser.cpp b/util/http_parser.cpp index 9a81c404..274cb3c3 100644 --- a/util/http_parser.cpp +++ b/util/http_parser.cpp @@ -196,10 +196,10 @@ bool HTTP::Parser::parse(){ std::string varval; while (tmppost.find('=') != std::string::npos){ size_t found = tmppost.find('='); - varname = urlunescape(tmppost.substr(0, found).c_str()); + varname = urlunescape((char*)tmppost.substr(0, found).c_str()); tmppost.erase(0, found+1); - size_t found = tmppost.find('&'); - varval = urlunescape(tmppost.substr(0, found).c_str()); + found = tmppost.find('&'); + varval = urlunescape((char*)tmppost.substr(0, found).c_str()); SetVar(varname, varval); if (found == std::string::npos){ tmppost.clear(); diff --git a/util/socket.cpp b/util/socket.cpp index b0046d02..c585f7be 100644 --- a/util/socket.cpp +++ b/util/socket.cpp @@ -374,7 +374,47 @@ Socket::Server::Server(int port, std::string hostname, bool nonblock){ } }else{ #if DEBUG >= 1 - fprintf(stderr, "Binding failed! Error: %s\n", strerror(errno)); + fprintf(stderr, "Binding failed, retrying as IPv4... (%s)\n", strerror(errno)); + #endif + close(); + } + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0){ + #if DEBUG >= 1 + fprintf(stderr, "Could not create socket! Error: %s\n", strerror(errno)); + #endif + return; + } + on = 1; + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); + if (nonblock){ + int flags = fcntl(sock, F_GETFL, 0); + flags |= O_NONBLOCK; + fcntl(sock, F_SETFL, flags); + } + struct sockaddr_in addr4; + addr4.sin_family = AF_INET; + addr4.sin_port = htons(port);//set port + if (hostname == "0.0.0.0"){ + addr4.sin_addr.s_addr = INADDR_ANY; + }else{ + inet_pton(AF_INET, hostname.c_str(), &addr4.sin_addr);//set interface, 0.0.0.0 (default) is all + } + ret = bind(sock, (sockaddr*)&addr4, sizeof(addr4));//do the actual bind + if (ret == 0){ + ret = listen(sock, 100);//start listening, backlog of 100 allowed + if (ret == 0){ + return; + }else{ + #if DEBUG >= 1 + fprintf(stderr, "Listen failed! Error: %s\n", strerror(errno)); + #endif + close(); + return; + } + }else{ + #if DEBUG >= 1 + fprintf(stderr, "IPv4 binding also failed, giving up. (%s)\n", strerror(errno)); #endif close(); return;