]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR 47432 Use ttyname_r() if available
authorJanne Blomqvist <jb@gcc.gnu.org>
Thu, 27 Jan 2011 20:05:45 +0000 (22:05 +0200)
committerJanne Blomqvist <jb@gcc.gnu.org>
Thu, 27 Jan 2011 20:05:45 +0000 (22:05 +0200)
From-SVN: r169337

libgfortran/ChangeLog
libgfortran/config.h.in
libgfortran/configure
libgfortran/configure.ac
libgfortran/io/inquire.c
libgfortran/io/intrinsics.c
libgfortran/io/unix.c
libgfortran/io/unix.h

index 3608e14e67b67e10207238aa04a2d2010d219ffe..c096acfbb00c091a84fd2bb724f3bd6fed03aa4a 100644 (file)
@@ -1,3 +1,16 @@
+2011-01-27  Janne Blomqvist  <jb@gcc.gnu.org>
+
+       PR libfortran/47432
+       * config.h.in: Regenerated.
+       * configure: Regenerated.
+       * configure.ac: Add check for ttyname_r.
+       * io/unix.h: Add TTY_NAME_MAX, change stream_ttyname prototype.
+       * io/unix.c (stream_ttyname): Use ttyname_r if available, conform
+       to new prototype.
+       * io/inquire.c (inquire_via_unit): Use changed stream_ttyname.
+       * io/intrinsics.c (ttynam_sub): Likewise.
+       (ttynam): Likewise.
+
 2011-01-27  Janne Blomqvist  <jb@gcc.gnu.org>
 
        PR libfortran/47491
index 8340e3b59bc8e84aeafa96727d349c93373c2b61..65414c75fc693676efa382dadb9b593a43bedf71 100644 (file)
 /* Define to 1 if you have the `ttyname' function. */
 #undef HAVE_TTYNAME
 
+/* Define to 1 if you have the `ttyname_r' function. */
+#undef HAVE_TTYNAME_R
+
 /* Define to 1 if the system has the type `uintptr_t'. */
 #undef HAVE_UINTPTR_T
 
index 067c8ce8e4500ae09d66f67dc6df7384724aef5c..836dfdc05e3efca2569c745fb3e4cc6381decdde 100755 (executable)
@@ -16367,7 +16367,7 @@ _ACEOF
 fi
 done
 
-for ac_func in localtime_r gmtime_r strerror_r getpwuid_r
+for ac_func in localtime_r gmtime_r strerror_r getpwuid_r ttyname_r
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
index dfbb37a5d94fb0723f82d85a8cbfe571d0fd14e4..87d2340ab6cbcd130196ea6ac0a7e7aab2195132 100644 (file)
@@ -251,7 +251,7 @@ AC_CHECK_FUNCS(chdir strerror getlogin gethostname kill link symlink perror)
 AC_CHECK_FUNCS(sleep time ttyname signal alarm ctime clock access fork execl)
 AC_CHECK_FUNCS(wait setmode execvp pipe dup2 close fdopen strcasestr getrlimit)
 AC_CHECK_FUNCS(gettimeofday stat fstat lstat getpwuid vsnprintf dup getcwd)
-AC_CHECK_FUNCS(localtime_r gmtime_r strerror_r getpwuid_r)
+AC_CHECK_FUNCS(localtime_r gmtime_r strerror_r getpwuid_r ttyname_r)
 
 # Check for glibc backtrace functions
 AC_CHECK_FUNCS(backtrace backtrace_symbols)
index 24481ccccbe7773df290068420cd7752eb934e32..252f29f0aef211703253f3c6dab1355a5bf95e7e 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (C) 2002, 2003, 2005, 2007, 2009, 2010
+/* Copyright (C) 2002, 2003, 2005, 2007, 2009, 2010, 2011
    Free Software Foundation, Inc.
    Contributed by Andy Vaught
 
-This file is part of the GNU Fortran 95 runtime library (libgfortran).
+This file is part of the GNU Fortran runtime library (libgfortran).
 
 Libgfortran is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -68,16 +68,17 @@ inquire_via_unit (st_parameter_inquire *iqp, gfc_unit * u)
   if ((cf & IOPARM_INQUIRE_HAS_NAME) != 0
       && u != NULL && u->flags.status != STATUS_SCRATCH)
     {
-#ifdef HAVE_TTYNAME
+#if defined(HAVE_TTYNAME_R) || defined(HAVE_TTYNAME)
       if (u->unit_number == options.stdin_unit
          || u->unit_number == options.stdout_unit
          || u->unit_number == options.stderr_unit)
        {
-         char * tmp = stream_ttyname (u->s);
-         if (tmp != NULL)
+         int err = stream_ttyname (u->s, iqp->name, iqp->name_len);
+         if (err == 0)
            {
-             int tmplen = strlen (tmp);
-             fstrcpy (iqp->name, iqp->name_len, tmp, tmplen);
+             gfc_charlen_type tmplen = strlen (iqp->name);
+             if (iqp->name_len > tmplen)
+               memset (&iqp->name[tmplen], ' ', iqp->name_len - tmplen);
            }
          else /* If ttyname does not work, go with the default.  */
            fstrcpy (iqp->name, iqp->name_len, u->file, u->file_len);
index f2f532b92918d8ea597f0c798abd4d3e8240d66a..f48bd777456d60ba16bb2d7d21612a8034082476 100644 (file)
@@ -1,6 +1,7 @@
 /* Implementation of the FGET, FGETC, FPUT, FPUTC, FLUSH 
    FTELL, TTYNAM and ISATTY intrinsics.
-   Copyright (C) 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2007, 2009, 2010, 2011 Free Software
+   Foundation, Inc.
 
 This file is part of the GNU Fortran runtime library (libgfortran).
 
@@ -351,22 +352,23 @@ void
 ttynam_sub (int *unit, char * name, gfc_charlen_type name_len)
 {
   gfc_unit *u;
-  char * n;
-  int i;
+  int nlen;
+  int err = 1;
 
-  memset (name, ' ', name_len);
   u = find_unit (*unit);
   if (u != NULL)
     {
-      n = stream_ttyname (u->s);
-      if (n != NULL)
+      err = stream_ttyname (u->s, name, name_len);
+      if (err == 0)
        {
-         i = 0;
-         while (*n && i < name_len)
-           name[i++] = *(n++);
+         nlen = strlen (name);
+         memset (&name[nlen], ' ', name_len - nlen);
        }
+
       unlock_unit (u);
     }
+  if (err != 0)
+    memset (name, ' ', name_len);
 }
 
 
@@ -381,14 +383,15 @@ ttynam (char ** name, gfc_charlen_type * name_len, int unit)
   u = find_unit (unit);
   if (u != NULL)
     {
-      *name = stream_ttyname (u->s);
-      if (*name != NULL)
+      *name = get_mem (TTY_NAME_MAX);
+      int err = stream_ttyname (u->s, *name, TTY_NAME_MAX);
+      if (err == 0)
        {
          *name_len = strlen (*name);
-         *name = strdup (*name);
          unlock_unit (u);
          return;
        }
+      free (*name);
       unlock_unit (u);
     }
 
index 950b7a25b1faf23a416a913185104af9f5a2493a..004e8606c0a064163d16518d196e4f7d49e9f053 100644 (file)
@@ -1811,18 +1811,29 @@ stream_isatty (stream *s)
   return isatty (((unix_stream *) s)->fd);
 }
 
-char *
-#ifdef HAVE_TTYNAME
-stream_ttyname (stream *s)
-{
-  return ttyname (((unix_stream *) s)->fd);
-}
+int
+stream_ttyname (stream *s  __attribute__ ((unused)),
+               char * buf  __attribute__ ((unused)),
+               size_t buflen  __attribute__ ((unused)))
+{
+#ifdef HAVE_TTYNAME_R
+  return ttyname_r (((unix_stream *) s)->fd, buf, buflen);
+#elif defined HAVE_TTYNAME
+  char *p;
+  size_t plen;
+  p = ttyname (((unix_stream *) s)->fd);
+  if (!p)
+    return errno;
+  plen = strlen (p);
+  if (buflen < plen)
+    plen = buflen;
+  memcpy (buf, p, plen);
+  return 0;
 #else
-stream_ttyname (stream *s __attribute__ ((unused)))
-{
-  return NULL;
-}
+  return ENOSYS;
 #endif
+}
+
 
 
 
index 0e147aab565c2aa3bae795f3969a2e65ff9ca013..f7d6f08643eb6d4f8cb36c078a4b11ff4098fa17 100644 (file)
@@ -170,7 +170,16 @@ internal_proto(flush_if_preconnected);
 extern int stream_isatty (stream *);
 internal_proto(stream_isatty);
 
-extern char * stream_ttyname (stream *);
+#ifndef TTY_NAME_MAX
+#ifdef _POSIX_TTY_NAME_MAX
+#define TTY_NAME_MAX _POSIX_TTY_NAME_MAX
+#else
+/* sysconf(_SC_TTY_NAME_MAX) = 32 which should be enough.  */
+#define TTY_NAME_MAX 32
+#endif
+#endif
+
+extern int stream_ttyname (stream *, char *, size_t);
 internal_proto(stream_ttyname);
 
 extern int unpack_filename (char *, const char *, int);