CGI-SpeedyCGI

 view release on metacpan or  search on metacpan

src/speedy_frontend.c  view on Meta::CPAN

}

static void alloc_buf(SpeedyBuf *b, int bytes) {
    b->len = 0;
    b->alloced = bytes;
    if (bytes)
	speedy_new(b->buf, bytes, char);
    else
	b->buf = NULL;
}

/* Add a string to the buffer */
static void add_string(SpeedyBuf *b, const char *s, int l) {
    ADD_STRING(b, s, l);
}

/* Copy a block of strings into the buffer,  */
/* Profiling shows this is the top function for cpu time */
static void add_strings(register SpeedyBuf *b, register const char * const * p)
{
    int l;
    register const char *s;

    /* Add strings in p array */
    for (; (s = *p); ++p) {
	if ((l = strlen(s))) {
	    ADD_STRING(b, s, l);
	}
    }

    /* Terminate with zero-length string */
    ADDCHAR(b, 0);
}

void speedy_frontend_mkenv(
    const char * const * envp, const char * const * scr_argv, int min_alloc,
    SpeedyBuf *sb, int script_has_cwd
)
{
    struct stat dir_stat;
    const char *script_fname = speedy_opt_script_fname();

    if (!script_fname)
	speedy_script_missing();

    /* Create buffer */
#ifdef SPEEDY_EFENCE
    alloc_buf(sb, min_alloc);
#else
    alloc_buf(sb, max(512, min_alloc));
#endif

    /* Add env and argv */
    add_strings(sb, envp);
    add_strings(sb, scr_argv+1);

    /* Put script filename into buffer */
    add_string(sb, script_fname, strlen(script_fname));

    /* Put script device/inode into buffer */
    ADD_DEVINO(sb, speedy_script_getstat());

    /* Handle passing over cwd */
    if (script_has_cwd) {
	ADDCHAR(sb, SPEEDY_CWD_IN_SCRIPT);
    }
    else if (stat(".", &dir_stat) != -1) {
	ADDCHAR(sb, SPEEDY_CWD_DEVINO);
	ADD_DEVINO(sb, &dir_stat);
    } else {
	ADDCHAR(sb, SPEEDY_CWD_UNKNOWN);
    }
}

void speedy_frontend_proto2(int err_sock, int first_byte) {
    int n, cwd_len, buflen;
    char *bp, *cwd;
    PollInfo pi;
    SpeedyBuf b;

    if (!first_byte)
	return;

    /* Get current directory */
    cwd = speedy_util_getcwd();
    cwd_len = cwd ? strlen(cwd) : 0;

    /* Create buffer for the string */
    alloc_buf(&b, STR_BUFSIZE(cwd_len));

    /* Put cwd into the buffer */
    if (cwd) {
	add_string(&b, cwd, cwd_len);
	speedy_free(cwd);
    } else {
	add_string(&b, "", 0);
    }

    /* Send it over */
    speedy_poll_init(&pi, err_sock);
    bp = b.buf;
    buflen = b.len;
    while (1) {

	/* TEST - send over one byte at a time to test the poll */
	/* n = write(err_sock, bp, 1); */

	n = write(err_sock, bp, buflen);
	if (n == -1 && SP_NOTREADY(errno))
	    n = 0;
	if (n == -1)
	    break;

	if (!(buflen -= n))
	    break;
	bp += n;

	/* Do this instead of bothering to change socket to non-blocking */
	speedy_poll_quickwait(&pi, err_sock, SPEEDY_POLLOUT, 1000);
    }
    speedy_poll_free(&pi);
    speedy_free(b.buf);

    shutdown(err_sock, 1);
}

#endif /* SPEEDY_FRONTEND */



( run in 1.302 second using v1.01-cache-2.11-cpan-ceb78f64989 )