RE: [PATCH 1/1] fport_print: handle ttyname ENODEV

Rob Browning <[email protected]>
Newsgroups gmane.lisp.guile.devel
Message-ID <[email protected]>
Maxime Devos <[email protected]> writes:

> It’s simply the case that SCM_SYSCALL is slightly the wrong tool here,
> so a slight variant is needed.

Good point.  How about this:

  SCM
  scm_i_c_ttyname (int fd)
  {
    // Return the string ttyname or the integer errno.  We can remove the
    // + 1 if we become confident POSIX requires TTY_NAME_MAX to include
    // the trailing null.  Assumes TTY_NAME_MAX < SIZE_MAX.
    int err = 0;
    char name[TTY_NAME_MAX + 1];

  #ifdef HAVE_TTYNAME_R
    SCM_SYSCALL (err = ttyname_r (fd, name, TTY_NAME_MAX));
  #else // HAVE_TTYNAME
    char *global_name;
    while(1)
      {
        // ttyname() may use a shared global buffer
        scm_i_pthread_mutex_lock (&scm_i_misc_mutex);
        global_name = ttyname (fd);
        err = errno;
        scm_i_pthread_mutex_unlock (&scm_i_misc_mutex);
        if (global_name || err != EINTR)
          break;
        scm_async_tick ();
      }
    strcpy(name, global_name);
  #endif // HAVE_TTYNAME

    if (err)
      return scm_from_int(err);
    else
      return scm_from_locale_string (name);
  }

Thanks
-- 
Rob Browning
rlb @defaultvalue.org and @debian.org
GPG as of 2011-07-10 E6A9 DA3C C9FD 1FF8 C676 D2C4 C0F0 39E9 ED1B 597A
GPG as of 2002-11-03 14DD 432F AE39 534D B592 F9A0 25C8 D377 8C7E 73A4
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.