X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=pipex_posix.c;h=9ce06f3533adba85c80c5bf5cf248cdbf0a8d530;hb=e794ad1f0877daf0e93c15f46cf6aa3494e9e8cc;hp=f53d74f7a8eacace0b4af8670a5074dc1088a331;hpb=60900035e6d0309705f2326ee50edc52386305e9;p=polyglot.git diff --git a/pipex_posix.c b/pipex_posix.c index f53d74f..9ce06f3 100644 --- a/pipex_posix.c +++ b/pipex_posix.c @@ -9,10 +9,6 @@ #include #include "pipex.h" -// constants - -static const unsigned int StringSize = 4096; - // prototypes static void my_close(int fd); @@ -198,7 +194,9 @@ void pipex_wait_event(pipex_t *pipex[]){ q=pipex; if (val > 0) { while((p=*(q++))!=NULL){ - if (FD_ISSET(p->io->in_fd,set)) io_get_update(p->io); + if (FD_ISSET(p->io->in_fd,set) /*&& !io_line_ready(p->io)*/){ + io_get_update(p->io); + } } } } @@ -238,10 +236,40 @@ void pipex_send_eof(pipex_t *pipex){ // pipex_exit() -void pipex_exit(pipex_t *pipex){ +/* This routine waits for kill_timeout milliseconds for + * the process to exit by itself. If that doesn't + * happen it will kill the process. + */ + + + +void pipex_exit(pipex_t *pipex, int kill_timeout){ int status; + int elapsed_time; + bool exited; + int ret; + my_log("POLYGLOT Waiting for child process to exit.\n"); - waitpid(pipex->pid,&status,0); + + elapsed_time=0; + exited=FALSE; + ret=0; + while(elapsed_timepid,&status,WNOHANG); + if(ret==0){ + my_log("POLYGLOT Child has not exited yet. Sleeping %dms.\n", WAIT_GRANULARITY); + my_sleep(WAIT_GRANULARITY); + elapsed_time+=WAIT_GRANULARITY; + }else{ + exited=TRUE; + break; + } + } + if(!exited){ + my_log("POLYGLOT Child wouldn't exit by itself. Terminating it.\n"); + kill(pipex->pid,SIGKILL); + waitpid(pipex->pid,&status,0); + } if(WIFEXITED(status)){ if(pipex->quit_pending){ my_log("POLYGLOT Child exited with status %d.\n",WEXITSTATUS(status)); @@ -262,11 +290,17 @@ void pipex_exit(pipex_t *pipex){ return; } +// pipex_get_buffer() + +char * pipex_get_buffer(pipex_t *pipex){ + return pipex->io->in_buffer; +} + // pipex_readln() bool pipex_readln(pipex_t *pipex, char *string){ while (!io_line_ready(pipex->io)) { - io_get_update(pipex->io); + io_get_update(pipex->io); } if (!io_get_line(pipex->io,string,StringSize)) { // EOF string[0]='\0'; @@ -283,12 +317,21 @@ bool pipex_readln(pipex_t *pipex, char *string){ // pipex_readln_nb() bool pipex_readln_nb(pipex_t *pipex, char *string){ - if(io_line_ready(pipex->io)){ - return pipex_readln(pipex,string); - }else{ - string[0]='\0'; - return FALSE; - } + + while(!pipex->io->in_eof && !io_line_ready(pipex->io) && io_peek(pipex->io)){ + io_get_update(pipex->io); + } + + if(io_line_ready(pipex->io)){ + return pipex_readln(pipex,string); + }else if(pipex->io->in_eof){ + string[0]='\0'; + pipex->state|=PIPEX_EOF; + return FALSE; + }else { + string[0]='\0'; + return FALSE; + } } // pipex_write()