Commit 62e18552 authored by Garrett Rooney's avatar Garrett Rooney
Browse files

Add support for starting multiple fastcgi processes listening on a

given socket.  This somewhat makes up for our lack of a good way to
manage connections to a given proxy backend.

* support/fcgistarter.c
  (main): Accept a new -N option that controls how many child procs
   we fork off.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/fcgi-proxy-dev@383774 13f79535-47bb-0310-9956-ffa450edef68
parent 79cdf3a4
Loading
Loading
Loading
Loading
+66 −52
Original line number Diff line number Diff line
@@ -29,12 +29,14 @@
#include <unistd.h> /* For execl */
#endif

static const char *usage_message =
    "usage: fcgistarter -c <command> -p <port> [-i <interface> -N <num>]\n"
    "\n"
    "If an interface is not specified, any available will be used.\n";

static void usage()
{
    fprintf(stderr,
            "usage: fcgistarter -c <command> -p <port> [-i <interface>]\n"
            "\n"
            "If an interface is not specified, any available will be used.\n");
    fprintf(stderr, "%s", usage_message);

    exit(EXIT_FAILURE);
}
@@ -64,9 +66,9 @@ int main(int argc, const char *argv[])


    /* Command line arguments */
    int num_to_start = 1, port = 0;
    const char *interface = NULL;
    const char *command = NULL;
    int port = 0;

    apr_initialize();

@@ -83,7 +85,7 @@ int main(int argc, const char *argv[])
        const char *arg;
        char opt;

        rv = apr_getopt(gopt, "c:p:i:", &opt, &arg);
        rv = apr_getopt(gopt, "c:p:i:N:", &opt, &arg);
        if (APR_STATUS_IS_EOF(rv)) {
            break;
        } else if (rv) {
@@ -105,6 +107,13 @@ int main(int argc, const char *argv[])
                interface = arg;
                break;

            case 'N':
                num_to_start = atoi(arg);
                if (! num_to_start) {
                    usage();
                }
                break;

            default:
                break;
            }
@@ -135,6 +144,7 @@ int main(int argc, const char *argv[])
        exit_error(rv, "apr_socket_listen");
    }

    while (--num_to_start >= 0) {
        rv = apr_proc_fork(&proc, pool);
        if (rv == APR_INCHILD) {
            apr_os_file_t oft = 0;
@@ -148,6 +158,7 @@ int main(int argc, const char *argv[])
#if defined(WIN32) || defined(OS2) || defined(NETWARE)
#error "Please implement me."
#else

            /* Ok, so we need a file that has file descriptor 0 (which
             * FastCGI wants), but points to our socket.  This isn't really
             * possible in APR, so we cheat a bit.  I have no idea how to
@@ -189,10 +200,13 @@ int main(int argc, const char *argv[])
            execl(command, NULL);
#endif
        } else if (rv == APR_INPARENT) {
            if (num_to_start == 0) {
                apr_socket_close(skt);
            }
        } else {
            exit_error(rv, "apr_proc_fork");
        }
    }

    return EXIT_SUCCESS;
}