811
static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen)
812
{
813
struct child_process cld = CHILD_PROCESS_INIT;
814
- char addrbuf[300] = "REMOTE_ADDR=", portbuf[300];
815
- char *env[] = { addrbuf, portbuf, NULL };
814
815
if (max_connections && live_children >= max_connections) {
816
kill_some_child();
824
}
825
826
if (addr->sa_family == AF_INET) {
827
+ char buf[128] = "";
828
struct sockaddr_in *sin_addr = (void *) addr;
830
- inet_ntop(addr->sa_family, &sin_addr->sin_addr, addrbuf + 12,
831
- sizeof(addrbuf) - 12);
832
- snprintf(portbuf, sizeof(portbuf), "REMOTE_PORT=%d",
833
- ntohs(sin_addr->sin_port));
829
+ inet_ntop(addr->sa_family, &sin_addr->sin_addr, buf, sizeof(buf));
830
+ argv_array_pushf(&cld.env_array, "REMOTE_ADDR=%s", buf);
831
+ argv_array_pushf(&cld.env_array, "REMOTE_PORT=%d",
832
+ ntohs(sin_addr->sin_port));
833
#ifndef NO_IPV6
834
} else if (addr->sa_family == AF_INET6) {
835
+ char buf[128] = "";
836
struct sockaddr_in6 *sin6_addr = (void *) addr;
837
-
838
- char *buf = addrbuf + 12;
839
- *buf++ = '['; *buf = '\0'; /* stpcpy() is cool */
840
- inet_ntop(AF_INET6, &sin6_addr->sin6_addr, buf,
841
- sizeof(addrbuf) - 13);
842
- strcat(buf, "]");
843
-
844
- snprintf(portbuf, sizeof(portbuf), "REMOTE_PORT=%d",
845
- ntohs(sin6_addr->sin6_port));
837
+ inet_ntop(AF_INET6, &sin6_addr->sin6_addr, buf, sizeof(buf));
838
+ argv_array_pushf(&cld.env_array, "REMOTE_ADDR=[%s]", buf);
839
+ argv_array_pushf(&cld.env_array, "REMOTE_PORT=%d",
840
+ ntohs(sin6_addr->sin6_port));
841
#endif
842
}
843
849
- cld.env = (const char **)env;
844
cld.argv = (const char **)cld_argv;
845
cld.in = incoming;
846
cld.out = dup(incoming);