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.197 second using v1.01-cache-2.11-cpan-ceb78f64989 )