summaryrefslogtreecommitdiff
path: root/libgfortran/io/intrinsics.c
diff options
context:
space:
mode:
authorJanne Blomqvist <jb@gcc.gnu.org>2011-01-27 22:05:45 +0200
committerJanne Blomqvist <jb@gcc.gnu.org>2011-01-27 22:05:45 +0200
commit6a0f6e7799c988524d32767047ca64d05a93adaf (patch)
tree5391b3d170af8323dd4003f8bd688be43384821f /libgfortran/io/intrinsics.c
parent5f02b9dbcd0669d7c13999a89694520113c2cc12 (diff)
downloadgcc-6a0f6e7799c988524d32767047ca64d05a93adaf.tar.gz
PR 47432 Use ttyname_r() if available
From-SVN: r169337
Diffstat (limited to 'libgfortran/io/intrinsics.c')
-rw-r--r--libgfortran/io/intrinsics.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/libgfortran/io/intrinsics.c b/libgfortran/io/intrinsics.c
index f2f532b9291..f48bd777456 100644
--- a/libgfortran/io/intrinsics.c
+++ b/libgfortran/io/intrinsics.c
@@ -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);
}