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.

Reply via email to