Beispiel #1
0
void fpm_request_info()
{
	TSRMLS_FETCH();
	struct fpm_shm_slot_s *slot;
	char *request_method = fpm_php_request_method(TSRMLS_C);
	char *script_filename = fpm_php_script_filename(TSRMLS_C);

	slot = fpm_shm_slots_acquire(0, 0);

	slot->request_stage = FPM_REQUEST_INFO;

	fpm_clock_get(&slot->tv);

	if (request_method) {
		cpystrn(slot->request_method, request_method, sizeof(slot->request_method));
	}

	slot->content_length = fpm_php_content_length(TSRMLS_C);

	/* if cgi.fix_pathinfo is set to "1" and script cannot be found (404)
		the sapi_globals.request_info.path_translated is set to NULL */
	if (script_filename) {
		cpystrn(slot->script_filename, script_filename, sizeof(slot->script_filename));
	}

	fpm_shm_slots_release(slot);
}
Beispiel #2
0
static int fpm_socket_af_unix_listening_socket(struct fpm_worker_pool_s *wp) /* {{{ */
{
	struct sockaddr_un sa_un;

	memset(&sa_un, 0, sizeof(sa_un));
	cpystrn(sa_un.sun_path, wp->config->listen_address, sizeof(sa_un.sun_path));
	sa_un.sun_family = AF_UNIX;
	return fpm_sockets_get_listening_socket(wp, (struct sockaddr *) &sa_un, sizeof(struct sockaddr_un));
}
Beispiel #3
0
static int tokenize_to_argv(const char *arg_str, 
	char ***argv_out)
{
    const char *cp;
    const char *ct;
    char *cleaned, *dirty;
    int escaped;
    int isquoted, numargs = 0, argnum;

#define SKIP_WHITESPACE(cp) \
    for ( ; *cp == ' ' || *cp == '\t'; ) { \
	cp++; \
    };

#define CHECK_QUOTATION(cp,isquoted) \
    isquoted = 0; \
    if (*cp == '"') { \
	isquoted = 1; \
	cp++; \
    } \
    else if (*cp == '\'') { \
	isquoted = 2; \
	cp++; \
    }

    /* DETERMINE_NEXTSTRING:
     * At exit, cp will point to one of the following:  NULL, SPACE, TAB or QUOTE.
     * NULL implies the argument string has been fully traversed.
     */
#define DETERMINE_NEXTSTRING(cp,isquoted) \
    for ( ; *cp != '\0'; cp++) { \
	if (   (*cp == '\\' && (*(cp+1) == ' ' || *(cp+1) == '\t' || \
			*(cp+1) == '"' || *(cp+1) == '\''))) { \
	    cp++; \
	    continue; \
	} \
	if (   (!isquoted && (*cp == ' ' || *cp == '\t')) \
		|| (isquoted == 1 && *cp == '"') \
		|| (isquoted == 2 && *cp == '\'')                 ) { \
	    break; \
	} \
    }

    /* REMOVE_ESCAPE_CHARS:
     * Compresses the arg string to remove all of the '\' escape chars.
     * The final argv strings should not have any extra escape chars in it.
     */
#define REMOVE_ESCAPE_CHARS(cleaned, dirty, escaped) \
    escaped = 0; \
    while(*dirty) { \
	if (!escaped && *dirty == '\\') { \
	    escaped = 1; \
	} \
	else { \
	    escaped = 0; \
	    *cleaned++ = *dirty; \
	} \
	++dirty; \
    } \
    *cleaned = 0;        /* last line of macro... */

    cp = arg_str;
    SKIP_WHITESPACE(cp);
    ct = cp;

    /* This is ugly and expensive, but if anyone wants to figure a
     * way to support any number of args without counting and 
     * allocating, please go ahead and change the code.
     *
     * Must account for the trailing NULL arg.
     */
    numargs = 1;
    while (*ct != '\0') {
	CHECK_QUOTATION(ct, isquoted);
	DETERMINE_NEXTSTRING(ct, isquoted);
	if (*ct != '\0') {
	    ct++;
	}
	numargs++;
	SKIP_WHITESPACE(ct);
    }
    *argv_out = (char **)calloc(sizeof(char*),numargs);

    /*  determine first argument */
    for (argnum = 0; argnum < (numargs-1); argnum++) {
	SKIP_WHITESPACE(cp);
	CHECK_QUOTATION(cp, isquoted);
	ct = cp;
	DETERMINE_NEXTSTRING(cp, isquoted);
	cp++;
	(*argv_out)[argnum] = (char *)malloc(cp - ct);
	cpystrn((*argv_out)[argnum], ct, cp - ct);
	cleaned = dirty = (*argv_out)[argnum];
	REMOVE_ESCAPE_CHARS(cleaned, dirty, escaped);
    }
    (*argv_out)[argnum] = NULL;

    return 0;
}