Changeset 20513


Ignore:
Timestamp:
2010-03-27T15:31:35+01:00 (8 years ago)
Author:
jow
Message:

[package] uhttpd: block SIGCHLD until it is expected (#6957)

Location:
trunk/package/uhttpd
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/uhttpd/Makefile

    r20501 r20513  
    99 
    1010PKG_NAME:=uhttpd 
    11 PKG_RELEASE:=3 
     11PKG_RELEASE:=4 
    1212 
    1313PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) 
  • trunk/package/uhttpd/src/uhttpd-cgi.c

    r20501 r20513  
    377377 
    378378                                /* wait until we can read or write or both */ 
    379                                 if( select(fd_max, &reader, 
     379                                if( select_intr(fd_max, &reader, 
    380380                                        (content_length > -1) ? &writer : NULL, NULL, 
    381381                                        (header_sent < 1) ? &timeout : NULL) > 0 
  • trunk/package/uhttpd/src/uhttpd-lua.c

    r20501 r20513  
    453453 
    454454                                /* wait until we can read or write or both */ 
    455                                 if( select(fd_max, &reader, 
     455                                if( select_intr(fd_max, &reader, 
    456456                                    (content_length > -1) ? &writer : NULL, NULL, 
    457457                                        (data_sent < 1) ? &timeout : NULL) > 0 
  • trunk/package/uhttpd/src/uhttpd-utils.c

    r20428 r20513  
    8989} 
    9090 
     91/* interruptable select() */ 
     92int select_intr(int n, fd_set *r, fd_set *w, fd_set *e, struct timeval *t) 
     93{ 
     94        int rv; 
     95        sigset_t ssn, sso; 
     96 
     97        /* unblock SIGCHLD */ 
     98        sigemptyset(&ssn); 
     99        sigaddset(&ssn, SIGCHLD); 
     100        sigprocmask(SIG_UNBLOCK, &ssn, &sso); 
     101 
     102        rv = select(n, r, w, e, t); 
     103 
     104        /* restore signal mask */ 
     105        sigprocmask(SIG_SETMASK, &sso, NULL); 
     106 
     107        return rv; 
     108} 
     109 
    91110 
    92111int uh_tcp_send(struct client *cl, const char *buf, int len) 
  • trunk/package/uhttpd/src/uhttpd-utils.h

    r20500 r20513  
    5353char *strfind(char *haystack, int hslen, const char *needle, int ndlen); 
    5454 
     55int select_intr(int n, fd_set *r, fd_set *w, fd_set *e, struct timeval *t); 
     56 
    5557int uh_tcp_send(struct client *cl, const char *buf, int len); 
    5658int uh_tcp_peek(struct client *cl, char *buf, int len); 
  • trunk/package/uhttpd/src/uhttpd.c

    r20500 r20513  
    411411        struct config conf; 
    412412 
     413        /* signal mask */ 
     414        sigset_t ss; 
     415 
    413416        /* maximum file descriptor number */ 
    414417        int new_fd, cur_fd, max_fd = 0; 
     
    433436        FD_ZERO(&read_fds); 
    434437 
    435         /* handle SIGPIPE, SIGCHILD */ 
     438        /* handle SIGPIPE, SIGINT, SIGTERM, SIGCHLD */ 
    436439        sa.sa_flags = 0; 
    437440        sigemptyset(&sa.sa_mask); 
     
    446449        sigaction(SIGINT,  &sa, NULL); 
    447450        sigaction(SIGTERM, &sa, NULL); 
     451 
     452        /* defer SIGCHLD */ 
     453        sigemptyset(&ss); 
     454        sigaddset(&ss, SIGCHLD); 
     455        sigprocmask(SIG_BLOCK, &ss, NULL); 
    448456 
    449457        /* prepare addrinfo hints */ 
Note: See TracChangeset for help on using the changeset viewer.