JustPaste.it

simpleproxy.c listener setup

        /* Listen on IPv6 and IPv4 addresses */

        struct addrinfo *ai, *ai_iter;

        struct addrinfo hints;

 

        memset(&hints, 0, sizeof(hints));

        hints.ai_family = PF_UNSPEC;

        hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG | AI_NUMERICSERV;

        hints.ai_socktype = SOCK_STREAM;

        char portstr[6];

        sprintf(portstr, "%u", lportn);

        logmsg(LOG_DEBUG,"Calling getaddrinfo(NULL,%s)", portstr);

        int e = getaddrinfo(NULL, portstr, &hints, &ai);

        logmsg(LOG_DEBUG,"got %d from getaddrinfo", e);

        if (e)

        {   

            logmsg(LOG_ERR,"Can't getaddrinfo - %s ", gai_strerror(e));

            return -1;

        }

        for (nfds = 0, ai_iter = ai ; ai_iter != NULL && nfds < MAX_SOCKETS; ai_iter = ai_iter->ai_next )

        {   

#if 1

            logmsg(LOG_DEBUG,"getaddrinfo: family %u, next %p", ai_iter->ai_family, ai_iter->ai_next);

            logmsg(LOG_DEBUG,"           : socktype %x, protocol %x, addrlen %u", ai_iter->ai_socktype, ai_iter->ai_protocol, ai_iter->ai_addrlen);

            if (ai_iter->ai_family == AF_INET) {

                struct sockaddr_in *sin = ai_iter->ai_addr;

                logmsg(LOG_DEBUG,"           : addr %s, port %u", inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));

            } else {

                struct sockaddr_in6 *sin6 = ai_iter->ai_addr;

                char localaddr[64];

                inet_ntop(sin6->sin6_family, &sin6->sin6_addr, localaddr, sizeof(localaddr));   

                logmsg(LOG_DEBUG,"           : addr %s, port %u", localaddr, ntohs(sin6->sin6_port));

            }

#endif

            if((SockFDs[nfds].fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0)

            {   

                logmsg(LOG_ERR,"Error creating socket.");

                fatal();

            }

            logmsg(LOG_DEBUG,"Created socket[%d], fd is %d", nfds, SockFDs[nfds].fd);

 

            if (setsockopt(SockFDs[nfds].fd, SOL_SOCKET, SO_REUSEADDR, (void*)&one, sizeof(one)))

                logmsg(LOG_ERR,"Error setting socket options");

 

            void *aptr;

            if (ai_iter->ai_family == AF_INET6)

                aptr = &(((struct sockaddr_in6 *)ai_iter->ai_addr)->sin6_addr);

            else

            {   

                aptr = &(((struct sockaddr_in *)ai_iter->ai_addr)->sin_addr);

            }

            logmsg(LOG_DEBUG,"Going to bind socket #%d (fd %d): addr %s (len %d)",nfds, SockFDs[nfds].fd, inet_ntop(ai_iter->ai_family, aptr, hbuf, sizeof(hbuf)), ai_iter->ai_addrlen);

            if (bind(SockFDs[nfds].fd, ai_iter->ai_addr, ai_iter->ai_addrlen) < 0)

            {   

                logmsg(LOG_ERR,"Error binding socket (%d): %s", nfds, strerror(errno));

                fatal();

            }

            else

            {   

                logmsg(LOG_INFO,"Waiting for connections (%d).", nfds);

 

                if (listen(SockFDs[nfds].fd,5) < 0)

                {   

                    logmsg(LOG_ERR,"Error listening socket: %s", strerror(errno));

                    fatal();

                }

                ++nfds;

            }

            freeaddrinfo(ai);

        }