httpd: get rid of big, useless blocks (deindent,
bring code under 80 columns)
This commit is contained in:
parent
0bb993f39b
commit
a3ee69fa6c
@ -963,212 +963,211 @@ static int sendCgi(const char *url,
|
|||||||
int inFd;
|
int inFd;
|
||||||
int outFd;
|
int outFd;
|
||||||
int firstLine = 1;
|
int firstLine = 1;
|
||||||
|
int status;
|
||||||
|
size_t post_readed_size, post_readed_idx;
|
||||||
|
|
||||||
if (pipe(fromCgi) != 0)
|
if (pipe(fromCgi) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
if (pipe(toCgi) != 0)
|
if (pipe(toCgi) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
pid = fork();
|
pid = fork();
|
||||||
if (pid < 0)
|
if (pid < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (!pid) {
|
||||||
|
/* child process */
|
||||||
|
char *script;
|
||||||
|
char *purl = strdup(url);
|
||||||
|
char realpath_buff[MAXPATHLEN];
|
||||||
|
|
||||||
do {
|
if (purl == NULL)
|
||||||
if (!pid) {
|
_exit(242);
|
||||||
/* child process */
|
|
||||||
char *script;
|
|
||||||
char *purl = strdup(url);
|
|
||||||
char realpath_buff[MAXPATHLEN];
|
|
||||||
|
|
||||||
if (purl == NULL)
|
inFd = toCgi[0];
|
||||||
_exit(242);
|
outFd = fromCgi[1];
|
||||||
|
|
||||||
inFd = toCgi[0];
|
dup2(inFd, 0); // replace stdin with the pipe
|
||||||
outFd = fromCgi[1];
|
dup2(outFd, 1); // replace stdout with the pipe
|
||||||
|
if (!DEBUG)
|
||||||
|
dup2(outFd, 2); // replace stderr with the pipe
|
||||||
|
|
||||||
dup2(inFd, 0); // replace stdin with the pipe
|
close(toCgi[0]);
|
||||||
dup2(outFd, 1); // replace stdout with the pipe
|
close(toCgi[1]);
|
||||||
if (!DEBUG)
|
close(fromCgi[0]);
|
||||||
dup2(outFd, 2); // replace stderr with the pipe
|
close(fromCgi[1]);
|
||||||
|
|
||||||
close(toCgi[0]);
|
close(config->accepted_socket);
|
||||||
close(toCgi[1]);
|
close(config->server_socket);
|
||||||
close(fromCgi[0]);
|
|
||||||
close(fromCgi[1]);
|
|
||||||
|
|
||||||
close(config->accepted_socket);
|
/*
|
||||||
close(config->server_socket);
|
* Find PATH_INFO.
|
||||||
|
*/
|
||||||
|
script = purl;
|
||||||
|
while ((script = strchr(script + 1, '/')) != NULL) {
|
||||||
|
/* have script.cgi/PATH_INFO or dirs/script.cgi[/PATH_INFO] */
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
/*
|
|
||||||
* Find PATH_INFO.
|
|
||||||
*/
|
|
||||||
script = purl;
|
|
||||||
while ((script = strchr(script + 1, '/')) != NULL) {
|
|
||||||
/* have script.cgi/PATH_INFO or dirs/script.cgi[/PATH_INFO] */
|
|
||||||
struct stat sb;
|
|
||||||
|
|
||||||
*script = '\0';
|
|
||||||
if (is_directory(purl + 1, 1, &sb) == 0) {
|
|
||||||
/* not directory, found script.cgi/PATH_INFO */
|
|
||||||
*script = '/';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
*script = '/'; /* is directory, find next '/' */
|
|
||||||
}
|
|
||||||
setenv1("PATH_INFO", script); /* set /PATH_INFO or "" */
|
|
||||||
/* setenv1("PATH", getenv("PATH")); redundant */
|
|
||||||
setenv1("REQUEST_METHOD", request);
|
|
||||||
if (config->query) {
|
|
||||||
char *uri = alloca(strlen(purl) + 2 + strlen(config->query));
|
|
||||||
if (uri)
|
|
||||||
sprintf(uri, "%s?%s", purl, config->query);
|
|
||||||
setenv1("REQUEST_URI", uri);
|
|
||||||
} else {
|
|
||||||
setenv1("REQUEST_URI", purl);
|
|
||||||
}
|
|
||||||
if (script != NULL)
|
|
||||||
*script = '\0'; /* reduce /PATH_INFO */
|
|
||||||
/* SCRIPT_FILENAME required by PHP in CGI mode */
|
|
||||||
if (!realpath(purl + 1, realpath_buff))
|
|
||||||
goto error_execing_cgi;
|
|
||||||
setenv1("SCRIPT_FILENAME", realpath_buff);
|
|
||||||
/* set SCRIPT_NAME as full path: /cgi-bin/dirs/script.cgi */
|
|
||||||
setenv1("SCRIPT_NAME", purl);
|
|
||||||
setenv1("QUERY_STRING", config->query);
|
|
||||||
setenv1("SERVER_SOFTWARE", httpdVersion);
|
|
||||||
putenv("SERVER_PROTOCOL=HTTP/1.0");
|
|
||||||
putenv("GATEWAY_INTERFACE=CGI/1.1");
|
|
||||||
setenv1("REMOTE_ADDR", config->rmt_ip_str);
|
|
||||||
#if ENABLE_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV
|
|
||||||
setenv_long("REMOTE_PORT", config->port);
|
|
||||||
#endif
|
|
||||||
if (bodyLen)
|
|
||||||
setenv_long("CONTENT_LENGTH", bodyLen);
|
|
||||||
if (cookie)
|
|
||||||
setenv1("HTTP_COOKIE", cookie);
|
|
||||||
if (content_type)
|
|
||||||
setenv1("CONTENT_TYPE", content_type);
|
|
||||||
#if ENABLE_FEATURE_HTTPD_BASIC_AUTH
|
|
||||||
if (config->remoteuser) {
|
|
||||||
setenv1("REMOTE_USER", config->remoteuser);
|
|
||||||
putenv("AUTH_TYPE=Basic");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (config->referer)
|
|
||||||
setenv1("HTTP_REFERER", config->referer);
|
|
||||||
|
|
||||||
/* set execve argp[0] without path */
|
|
||||||
argp[0] = strrchr(purl, '/') + 1;
|
|
||||||
/* but script argp[0] must have absolute path and chdiring to this */
|
|
||||||
script = strrchr(realpath_buff, '/');
|
|
||||||
if (!script)
|
|
||||||
goto error_execing_cgi;
|
|
||||||
*script = '\0';
|
*script = '\0';
|
||||||
if (chdir(realpath_buff) == 0) {
|
if (is_directory(purl + 1, 1, &sb) == 0) {
|
||||||
// now run the program. If it fails,
|
/* not directory, found script.cgi/PATH_INFO */
|
||||||
// use _exit() so no destructors
|
*script = '/';
|
||||||
// get called and make a mess.
|
break;
|
||||||
#if ENABLE_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR
|
}
|
||||||
char *interpr = NULL;
|
*script = '/'; /* is directory, find next '/' */
|
||||||
char *suffix = strrchr(purl, '.');
|
}
|
||||||
|
setenv1("PATH_INFO", script); /* set /PATH_INFO or "" */
|
||||||
|
/* setenv1("PATH", getenv("PATH")); redundant */
|
||||||
|
setenv1("REQUEST_METHOD", request);
|
||||||
|
if (config->query) {
|
||||||
|
char *uri = alloca(strlen(purl) + 2 + strlen(config->query));
|
||||||
|
if (uri)
|
||||||
|
sprintf(uri, "%s?%s", purl, config->query);
|
||||||
|
setenv1("REQUEST_URI", uri);
|
||||||
|
} else {
|
||||||
|
setenv1("REQUEST_URI", purl);
|
||||||
|
}
|
||||||
|
if (script != NULL)
|
||||||
|
*script = '\0'; /* reduce /PATH_INFO */
|
||||||
|
/* SCRIPT_FILENAME required by PHP in CGI mode */
|
||||||
|
if (!realpath(purl + 1, realpath_buff))
|
||||||
|
goto error_execing_cgi;
|
||||||
|
setenv1("SCRIPT_FILENAME", realpath_buff);
|
||||||
|
/* set SCRIPT_NAME as full path: /cgi-bin/dirs/script.cgi */
|
||||||
|
setenv1("SCRIPT_NAME", purl);
|
||||||
|
setenv1("QUERY_STRING", config->query);
|
||||||
|
setenv1("SERVER_SOFTWARE", httpdVersion);
|
||||||
|
putenv("SERVER_PROTOCOL=HTTP/1.0");
|
||||||
|
putenv("GATEWAY_INTERFACE=CGI/1.1");
|
||||||
|
setenv1("REMOTE_ADDR", config->rmt_ip_str);
|
||||||
|
#if ENABLE_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV
|
||||||
|
setenv_long("REMOTE_PORT", config->port);
|
||||||
|
#endif
|
||||||
|
if (bodyLen)
|
||||||
|
setenv_long("CONTENT_LENGTH", bodyLen);
|
||||||
|
if (cookie)
|
||||||
|
setenv1("HTTP_COOKIE", cookie);
|
||||||
|
if (content_type)
|
||||||
|
setenv1("CONTENT_TYPE", content_type);
|
||||||
|
#if ENABLE_FEATURE_HTTPD_BASIC_AUTH
|
||||||
|
if (config->remoteuser) {
|
||||||
|
setenv1("REMOTE_USER", config->remoteuser);
|
||||||
|
putenv("AUTH_TYPE=Basic");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (config->referer)
|
||||||
|
setenv1("HTTP_REFERER", config->referer);
|
||||||
|
|
||||||
if (suffix) {
|
/* set execve argp[0] without path */
|
||||||
Htaccess *cur;
|
argp[0] = strrchr(purl, '/') + 1;
|
||||||
for (cur = config->script_i; cur; cur = cur->next) {
|
/* but script argp[0] must have absolute path and chdiring to this */
|
||||||
if (strcmp(cur->before_colon + 1, suffix) == 0) {
|
script = strrchr(realpath_buff, '/');
|
||||||
interpr = cur->after_colon;
|
if (!script)
|
||||||
break;
|
goto error_execing_cgi;
|
||||||
}
|
*script = '\0';
|
||||||
|
if (chdir(realpath_buff) == 0) {
|
||||||
|
// now run the program. If it fails,
|
||||||
|
// use _exit() so no destructors
|
||||||
|
// get called and make a mess.
|
||||||
|
#if ENABLE_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR
|
||||||
|
char *interpr = NULL;
|
||||||
|
char *suffix = strrchr(purl, '.');
|
||||||
|
|
||||||
|
if (suffix) {
|
||||||
|
Htaccess *cur;
|
||||||
|
for (cur = config->script_i; cur; cur = cur->next) {
|
||||||
|
if (strcmp(cur->before_colon + 1, suffix) == 0) {
|
||||||
|
interpr = cur->after_colon;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
*script = '/';
|
*script = '/';
|
||||||
#if ENABLE_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR
|
#if ENABLE_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR
|
||||||
if (interpr)
|
if (interpr)
|
||||||
execv(interpr, argp);
|
execv(interpr, argp);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
execv(realpath_buff, argp);
|
execv(realpath_buff, argp);
|
||||||
}
|
}
|
||||||
error_execing_cgi:
|
error_execing_cgi:
|
||||||
/* send to stdout (even if we are not from inetd) */
|
/* send to stdout (even if we are not from inetd) */
|
||||||
config->accepted_socket = 1;
|
config->accepted_socket = 1;
|
||||||
sendHeaders(HTTP_NOT_FOUND);
|
sendHeaders(HTTP_NOT_FOUND);
|
||||||
_exit(242);
|
_exit(242);
|
||||||
} /* end child */
|
} /* end child */
|
||||||
|
|
||||||
} while (0);
|
/* parent process */
|
||||||
|
|
||||||
if (pid > 0) {
|
post_readed_size = 0;
|
||||||
/* parent process */
|
post_readed_idx = 0;
|
||||||
int status;
|
inFd = fromCgi[0];
|
||||||
size_t post_readed_size = 0, post_readed_idx = 0;
|
outFd = toCgi[1];
|
||||||
|
close(fromCgi[1]);
|
||||||
|
close(toCgi[0]);
|
||||||
|
signal(SIGPIPE, SIG_IGN);
|
||||||
|
|
||||||
inFd = fromCgi[0];
|
while (1) {
|
||||||
outFd = toCgi[1];
|
fd_set readSet;
|
||||||
close(fromCgi[1]);
|
fd_set writeSet;
|
||||||
close(toCgi[0]);
|
char wbuf[128];
|
||||||
signal(SIGPIPE, SIG_IGN);
|
int nfound;
|
||||||
|
int count;
|
||||||
|
|
||||||
while (1) {
|
FD_ZERO(&readSet);
|
||||||
fd_set readSet;
|
FD_ZERO(&writeSet);
|
||||||
fd_set writeSet;
|
FD_SET(inFd, &readSet);
|
||||||
char wbuf[128];
|
if (bodyLen > 0 || post_readed_size > 0) {
|
||||||
int nfound;
|
FD_SET(outFd, &writeSet);
|
||||||
int count;
|
nfound = outFd > inFd ? outFd : inFd;
|
||||||
|
if (post_readed_size == 0) {
|
||||||
|
FD_SET(config->accepted_socket, &readSet);
|
||||||
|
if (nfound < config->accepted_socket)
|
||||||
|
nfound = config->accepted_socket;
|
||||||
|
}
|
||||||
|
/* Now wait on the set of sockets! */
|
||||||
|
nfound = select(nfound + 1, &readSet, &writeSet, 0, NULL);
|
||||||
|
} else {
|
||||||
|
if (!bodyLen) {
|
||||||
|
close(outFd);
|
||||||
|
bodyLen = -1;
|
||||||
|
}
|
||||||
|
nfound = select(inFd + 1, &readSet, 0, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
FD_ZERO(&readSet);
|
if (nfound <= 0) {
|
||||||
FD_ZERO(&writeSet);
|
if (waitpid(pid, &status, WNOHANG) > 0) {
|
||||||
FD_SET(inFd, &readSet);
|
close(inFd);
|
||||||
if (bodyLen > 0 || post_readed_size > 0) {
|
if (DEBUG && WIFEXITED(status))
|
||||||
FD_SET(outFd, &writeSet);
|
bb_error_msg("piped has exited with status=%d", WEXITSTATUS(status));
|
||||||
nfound = outFd > inFd ? outFd : inFd;
|
if (DEBUG && WIFSIGNALED(status))
|
||||||
if (post_readed_size == 0) {
|
bb_error_msg("piped has exited with signal=%d", WTERMSIG(status));
|
||||||
FD_SET(config->accepted_socket, &readSet);
|
break;
|
||||||
if (nfound < config->accepted_socket)
|
}
|
||||||
nfound = config->accepted_socket;
|
} else if (post_readed_size > 0 && FD_ISSET(outFd, &writeSet)) {
|
||||||
}
|
count = full_write(outFd, wbuf + post_readed_idx, post_readed_size);
|
||||||
/* Now wait on the set of sockets! */
|
if (count > 0) {
|
||||||
nfound = select(nfound + 1, &readSet, &writeSet, 0, NULL);
|
post_readed_size -= count;
|
||||||
|
post_readed_idx += count;
|
||||||
|
if (post_readed_size == 0)
|
||||||
|
post_readed_idx = 0;
|
||||||
} else {
|
} else {
|
||||||
if (!bodyLen) {
|
post_readed_size = post_readed_idx = bodyLen = 0; /* broken pipe to CGI */
|
||||||
close(outFd);
|
|
||||||
bodyLen = -1;
|
|
||||||
}
|
|
||||||
nfound = select(inFd + 1, &readSet, 0, 0, NULL);
|
|
||||||
}
|
}
|
||||||
|
} else if (bodyLen > 0 && post_readed_size == 0 && FD_ISSET(config->accepted_socket, &readSet)) {
|
||||||
if (nfound <= 0) {
|
count = bodyLen > (int)sizeof(wbuf) ? (int)sizeof(wbuf) : bodyLen;
|
||||||
if (waitpid(pid, &status, WNOHANG) > 0) {
|
count = safe_read(config->accepted_socket, wbuf, count);
|
||||||
close(inFd);
|
if (count > 0) {
|
||||||
if (DEBUG && WIFEXITED(status))
|
post_readed_size += count;
|
||||||
bb_error_msg("piped has exited with status=%d", WEXITSTATUS(status));
|
bodyLen -= count;
|
||||||
if (DEBUG && WIFSIGNALED(status))
|
} else {
|
||||||
bb_error_msg("piped has exited with signal=%d", WTERMSIG(status));
|
bodyLen = 0; /* closed */
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (post_readed_size > 0 && FD_ISSET(outFd, &writeSet)) {
|
|
||||||
count = full_write(outFd, wbuf + post_readed_idx, post_readed_size);
|
|
||||||
if (count > 0) {
|
|
||||||
post_readed_size -= count;
|
|
||||||
post_readed_idx += count;
|
|
||||||
if (post_readed_size == 0)
|
|
||||||
post_readed_idx = 0;
|
|
||||||
} else {
|
|
||||||
post_readed_size = post_readed_idx = bodyLen = 0; /* broken pipe to CGI */
|
|
||||||
}
|
|
||||||
} else if (bodyLen > 0 && post_readed_size == 0 && FD_ISSET(config->accepted_socket, &readSet)) {
|
|
||||||
count = bodyLen > (int)sizeof(wbuf) ? (int)sizeof(wbuf) : bodyLen;
|
|
||||||
count = safe_read(config->accepted_socket, wbuf, count);
|
|
||||||
if (count > 0) {
|
|
||||||
post_readed_size += count;
|
|
||||||
bodyLen -= count;
|
|
||||||
} else {
|
|
||||||
bodyLen = 0; /* closed */
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (FD_ISSET(inFd, &readSet)) {
|
}
|
||||||
int s = config->accepted_socket;
|
if (FD_ISSET(inFd, &readSet)) {
|
||||||
char *rbuf = config->buf;
|
int s = config->accepted_socket;
|
||||||
|
char *rbuf = config->buf;
|
||||||
|
|
||||||
#ifndef PIPE_BUF
|
#ifndef PIPE_BUF
|
||||||
# define PIPESIZE 4096 /* amount of buffering in a pipe */
|
# define PIPESIZE 4096 /* amount of buffering in a pipe */
|
||||||
@ -1179,28 +1178,27 @@ static int sendCgi(const char *url,
|
|||||||
# error "PIPESIZE >= MAX_MEMORY_BUFF"
|
# error "PIPESIZE >= MAX_MEMORY_BUFF"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// There is something to read
|
// There is something to read
|
||||||
count = safe_read(inFd, rbuf, PIPESIZE);
|
count = safe_read(inFd, rbuf, PIPESIZE);
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
break; /* closed */
|
break; /* closed */
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
if (firstLine) {
|
if (firstLine) {
|
||||||
rbuf[count] = 0;
|
rbuf[count] = 0;
|
||||||
/* check to see if the user script added headers */
|
/* check to see if the user script added headers */
|
||||||
if (strncmp(rbuf, "HTTP/1.0 200 OK\r\n", 4) != 0) {
|
if (strncmp(rbuf, "HTTP/1.0 200 OK\r\n", 4) != 0) {
|
||||||
full_write(s, "HTTP/1.0 200 OK\r\n", 17);
|
full_write(s, "HTTP/1.0 200 OK\r\n", 17);
|
||||||
}
|
|
||||||
if (strstr(rbuf, "ontent-") == 0) {
|
|
||||||
full_write(s, "Content-type: text/plain\r\n\r\n", 28);
|
|
||||||
}
|
|
||||||
firstLine = 0;
|
|
||||||
}
|
}
|
||||||
if (full_write(s, rbuf, count) != count)
|
if (strstr(rbuf, "ontent-") == 0) {
|
||||||
break;
|
full_write(s, "Content-type: text/plain\r\n\r\n", 28);
|
||||||
|
}
|
||||||
if (DEBUG)
|
firstLine = 0;
|
||||||
fprintf(stderr, "cgi read %d bytes\n", count);
|
|
||||||
}
|
}
|
||||||
|
if (full_write(s, rbuf, count) != count)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (DEBUG)
|
||||||
|
fprintf(stderr, "cgi read %d bytes\n", count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user