If pmount ends up using FUSE to do the actual mounting, the filesystem
driver process inherits the output capture pipe. In this case the write
end of the pipe stays open and read can block indefinitely. Instead of
relying on read to return eof, call waitpid if select indicates no data
available.
char buf[1024];
int pos = 0;
int status;
char buf[1024];
int pos = 0;
int status;
+ fd_set fds;
+ struct timeval timeout;
+ FD_ZERO(&fds);
+ FD_SET(pipe_fd[0], &fds);
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 200000;
+ if(select(pipe_fd[0]+1, &fds, NULL, NULL, &timeout))
+ {
+ int len;
- len = read(pipe_fd[0], buf+pos, sizeof(buf)-pos-1);
- if(len<=0)
+ len = read(pipe_fd[0], buf+pos, sizeof(buf)-pos-1);
+ if(len<=0)
+ break;
+ pos += len;
+ }
+ else if(waitpid(pid, &status, 0))
- waitpid(pid, &status, 0);
if(!WIFEXITED(status) || WEXITSTATUS(status))
{
GtkWidget *dialog;
if(!WIFEXITED(status) || WEXITSTATUS(status))
{
GtkWidget *dialog;