#include <sys/wait.h>
#include "pipex.h"
-// constants
-
-static const unsigned int StringSize = 4096;
-
// prototypes
static void my_close(int fd);
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);
+ }
}
}
}
// 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_time<kill_timeout){
+ ret=waitpid(pipex->pid,&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));
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';
// 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()