Hi Nicholas, Thanks a lot for the patch. But it's not just STDIN. setting to blocking. Even STDOUT and STDERR also going back to blocking state. Do I need to add similar code for other fds?
BTW: Your question on why reinitialize back, I am running with a real time system and I run my application multiple instances under tmux and sometimes simultaneously. So I don't want this to be done from my application rather from tmux itself. Thanks a lot for your help Regards, Prabhu On Nov 16, 2016 5:17 AM, "Nicholas Marriott" <[email protected]> wrote: > You could try this: > > Index: client.c > =================================================================== > RCS file: /cvs/src/usr.bin/tmux/client.c,v > retrieving revision 1.114 > diff -u -p -r1.114 client.c > --- client.c 3 Oct 2016 22:52:11 -0000 1.114 > +++ client.c 15 Nov 2016 23:47:22 -0000 > @@ -38,6 +38,7 @@ static struct tmuxproc *client_proc; > static struct tmuxpeer *client_peer; > static int client_flags; > static struct event client_stdin; > +static int client_stdin_blocking; > static enum { > CLIENT_EXIT_NONE, > CLIENT_EXIT_DETACHED, > @@ -306,10 +307,12 @@ client_main(struct event_base *base, int > options_free(global_w_options); > environ_free(global_environ); > > - /* Create stdin handler. */ > - setblocking(STDIN_FILENO, 0); > + /* Create stdin event. */ > event_set(&client_stdin, STDIN_FILENO, EV_READ|EV_PERSIST, > client_stdin_callback, NULL); > + client_stdin_blocking = getblocking(STDIN_FILENO); > + > + /* Configure terminal for control mode. */ > if (client_flags & CLIENT_CONTROLCONTROL) { > if (tcgetattr(STDIN_FILENO, &saved_tio) != 0) > fatal("tcgetattr failed"); > @@ -375,7 +378,7 @@ client_main(struct event_base *base, int > tcsetattr(STDOUT_FILENO, TCSAFLUSH, &saved_tio); > } else if (client_exitreason != CLIENT_EXIT_NONE) > fprintf(stderr, "%s\n", client_exit_message()); > - setblocking(STDIN_FILENO, 1); > + setblocking(STDIN_FILENO, client_stdin_blocking); > return (client_exitval); > } > > @@ -585,6 +588,7 @@ client_dispatch_wait(struct imsg *imsg, > if (datalen != 0) > fatalx("bad MSG_STDIN size"); > > + setblocking(STDIN_FILENO, 0); > event_add(&client_stdin, NULL); > break; > case MSG_STDOUT: > Index: tmux.c > =================================================================== > RCS file: /cvs/src/usr.bin/tmux/tmux.c,v > retrieving revision 1.172 > diff -u -p -r1.172 tmux.c > --- tmux.c 11 Oct 2016 13:21:59 -0000 1.172 > +++ tmux.c 15 Nov 2016 23:47:22 -0000 > @@ -150,18 +150,31 @@ fail: > return (NULL); > } > > +int > +getblocking(int fd) > +{ > + int mode; > + > + if ((mode = fcntl(fd, F_GETFL)) == -1) > + return (-1); > + if (mode & O_NONBLOCK) > + return (0); > + return (1); > +} > + > void > setblocking(int fd, int state) > { > - int mode; > + int mode, new_mode; > > - if ((mode = fcntl(fd, F_GETFL)) != -1) { > - if (!state) > - mode |= O_NONBLOCK; > - else > - mode &= ~O_NONBLOCK; > + if (state == -1 || (mode = fcntl(fd, F_GETFL)) == -1) > + return; > + if (state) > + new_mode = (mode | O_NONBLOCK); > + else > + new_mode = (mode & ~O_NONBLOCK); > + if (new_mode != mode) > fcntl(fd, F_SETFL, mode); > - } > } > > const char * > Index: tmux.h > =================================================================== > RCS file: /cvs/src/usr.bin/tmux/tmux.h,v > retrieving revision 1.677 > diff -u -p -r1.677 tmux.h > --- tmux.h 15 Nov 2016 15:17:28 -0000 1.677 > +++ tmux.h 15 Nov 2016 23:47:23 -0000 > @@ -1105,6 +1105,7 @@ struct tty { > struct tty_term *term; > > int fd; > + int blocking; > struct bufferevent *event; > > struct termios tio; > @@ -1512,6 +1513,7 @@ extern struct environ *global_environ; > extern struct timeval start_time; > extern const char *socket_path; > int areshell(const char *); > +int getblocking(int); > void setblocking(int, int); > const char *find_home(void); > > Index: tty.c > =================================================================== > RCS file: /cvs/src/usr.bin/tmux/tty.c,v > retrieving revision 1.214 > diff -u -p -r1.214 tty.c > --- tty.c 15 Nov 2016 15:17:28 -0000 1.214 > +++ tty.c 15 Nov 2016 23:47:23 -0000 > @@ -237,6 +237,7 @@ tty_init_termios(int fd, struct termios > void > tty_start_tty(struct tty *tty) > { > + tty->blocking = getblocking(tty->fd); > tty_init_termios(tty->fd, &tty->tio, tty->event); > > tty_putcode(tty, TTYC_SMCUP); > @@ -330,7 +331,7 @@ tty_stop_tty(struct tty *tty) > tty_raw(tty, "\033[?69l"); /* DECLRMM */ > tty_raw(tty, tty_term_string(tty->term, TTYC_RMCUP)); > > - setblocking(tty->fd, 1); > + setblocking(tty->fd, tty->blocking); > } > > void > > > On Tue, Nov 15, 2016 at 11:33:02PM +0000, Nicholas Marriott wrote: > > tmux sets stdin nonblocking then sets it blocking again on exit, we > > could probably not do that unless we are going to use it, and restore > > it only if it wasn't already nonblocking. But TBH does it matter that > > much? Why not just set it nonblocking yourself after you run tmux? > > > > > > On Tue, Nov 15, 2016 at 11:01:54PM +0530, Prabhuram K wrote: > > > Hi, > > > I have an application and run it under tmux. > > > The application sets** STDIN_FILENO, STDOUT_FILENO and > STDERR_FILENO to > > > nonblocking using fcntl calls. > > > The application internally loads the tmux configuration file using > system > > > command (tmux source-file xxx). Soon after this is executed inside > from my > > > application, all the STDIN/STDOUT/STDERR fds sets back to blocking > state. > > > Not sure what is the problem here. Why tmux always sets the fds to > > > blocking state. Is there a way to always set to non-blocking. > > > Any help is highly appreciated. > > > > > > Thanks, > > > Prabhu > > > > > > -- > > > You received this message because you are subscribed to the Google > Groups > > > "tmux-users" group. > > > To unsubscribe from this group and stop receiving emails from it, > send an > > > email to [1][email protected]. > > > To post to this group, send email to [2][email protected] > . > > > For more options, visit [3]https://groups.google.com/d/optout. > > > > > > References > > > > > > Visible links > > > 1. mailto:[email protected] > > > 2. mailto:[email protected] > > > 3. https://groups.google.com/d/optout > -- You received this message because you are subscribed to the Google Groups "tmux-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
