mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-28 00:04:05 +02:00
[package] uhttpd: block SIGCHLD until it is expected (#6957)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@20513 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
f52ddee30b
commit
f5b350a276
@ -8,7 +8,7 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=uhttpd
|
PKG_NAME:=uhttpd
|
||||||
PKG_RELEASE:=3
|
PKG_RELEASE:=4
|
||||||
|
|
||||||
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
||||||
|
|
||||||
|
@ -376,7 +376,7 @@ void uh_cgi_request(struct client *cl, struct http_request *req, struct path_inf
|
|||||||
FD_SET(wfd[1], &writer);
|
FD_SET(wfd[1], &writer);
|
||||||
|
|
||||||
/* wait until we can read or write or both */
|
/* wait until we can read or write or both */
|
||||||
if( select(fd_max, &reader,
|
if( select_intr(fd_max, &reader,
|
||||||
(content_length > -1) ? &writer : NULL, NULL,
|
(content_length > -1) ? &writer : NULL, NULL,
|
||||||
(header_sent < 1) ? &timeout : NULL) > 0
|
(header_sent < 1) ? &timeout : NULL) > 0
|
||||||
) {
|
) {
|
||||||
|
@ -452,7 +452,7 @@ void uh_lua_request(struct client *cl, struct http_request *req, lua_State *L)
|
|||||||
FD_SET(wfd[1], &writer);
|
FD_SET(wfd[1], &writer);
|
||||||
|
|
||||||
/* wait until we can read or write or both */
|
/* wait until we can read or write or both */
|
||||||
if( select(fd_max, &reader,
|
if( select_intr(fd_max, &reader,
|
||||||
(content_length > -1) ? &writer : NULL, NULL,
|
(content_length > -1) ? &writer : NULL, NULL,
|
||||||
(data_sent < 1) ? &timeout : NULL) > 0
|
(data_sent < 1) ? &timeout : NULL) > 0
|
||||||
) {
|
) {
|
||||||
|
@ -88,6 +88,25 @@ char *strfind(char *haystack, int hslen, const char *needle, int ndlen)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* interruptable select() */
|
||||||
|
int select_intr(int n, fd_set *r, fd_set *w, fd_set *e, struct timeval *t)
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
sigset_t ssn, sso;
|
||||||
|
|
||||||
|
/* unblock SIGCHLD */
|
||||||
|
sigemptyset(&ssn);
|
||||||
|
sigaddset(&ssn, SIGCHLD);
|
||||||
|
sigprocmask(SIG_UNBLOCK, &ssn, &sso);
|
||||||
|
|
||||||
|
rv = select(n, r, w, e, t);
|
||||||
|
|
||||||
|
/* restore signal mask */
|
||||||
|
sigprocmask(SIG_SETMASK, &sso, NULL);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int uh_tcp_send(struct client *cl, const char *buf, int len)
|
int uh_tcp_send(struct client *cl, const char *buf, int len)
|
||||||
{
|
{
|
||||||
|
@ -52,6 +52,8 @@ int sa_port(void *sa);
|
|||||||
|
|
||||||
char *strfind(char *haystack, int hslen, const char *needle, int ndlen);
|
char *strfind(char *haystack, int hslen, const char *needle, int ndlen);
|
||||||
|
|
||||||
|
int select_intr(int n, fd_set *r, fd_set *w, fd_set *e, struct timeval *t);
|
||||||
|
|
||||||
int uh_tcp_send(struct client *cl, const char *buf, int len);
|
int uh_tcp_send(struct client *cl, const char *buf, int len);
|
||||||
int uh_tcp_peek(struct client *cl, char *buf, int len);
|
int uh_tcp_peek(struct client *cl, char *buf, int len);
|
||||||
int uh_tcp_recv(struct client *cl, char *buf, int len);
|
int uh_tcp_recv(struct client *cl, char *buf, int len);
|
||||||
|
@ -410,6 +410,9 @@ int main (int argc, char **argv)
|
|||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
struct config conf;
|
struct config conf;
|
||||||
|
|
||||||
|
/* signal mask */
|
||||||
|
sigset_t ss;
|
||||||
|
|
||||||
/* maximum file descriptor number */
|
/* maximum file descriptor number */
|
||||||
int new_fd, cur_fd, max_fd = 0;
|
int new_fd, cur_fd, max_fd = 0;
|
||||||
|
|
||||||
@ -432,7 +435,7 @@ int main (int argc, char **argv)
|
|||||||
FD_ZERO(&serv_fds);
|
FD_ZERO(&serv_fds);
|
||||||
FD_ZERO(&read_fds);
|
FD_ZERO(&read_fds);
|
||||||
|
|
||||||
/* handle SIGPIPE, SIGCHILD */
|
/* handle SIGPIPE, SIGINT, SIGTERM, SIGCHLD */
|
||||||
sa.sa_flags = 0;
|
sa.sa_flags = 0;
|
||||||
sigemptyset(&sa.sa_mask);
|
sigemptyset(&sa.sa_mask);
|
||||||
|
|
||||||
@ -446,6 +449,11 @@ int main (int argc, char **argv)
|
|||||||
sigaction(SIGINT, &sa, NULL);
|
sigaction(SIGINT, &sa, NULL);
|
||||||
sigaction(SIGTERM, &sa, NULL);
|
sigaction(SIGTERM, &sa, NULL);
|
||||||
|
|
||||||
|
/* defer SIGCHLD */
|
||||||
|
sigemptyset(&ss);
|
||||||
|
sigaddset(&ss, SIGCHLD);
|
||||||
|
sigprocmask(SIG_BLOCK, &ss, NULL);
|
||||||
|
|
||||||
/* prepare addrinfo hints */
|
/* prepare addrinfo hints */
|
||||||
memset(&hints, 0, sizeof(hints));
|
memset(&hints, 0, sizeof(hints));
|
||||||
hints.ai_family = AF_UNSPEC;
|
hints.ai_family = AF_UNSPEC;
|
||||||
|
Loading…
Reference in New Issue
Block a user