aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/strtok.c4
-rw-r--r--sysdeps/posix/ttyname.c39
-rw-r--r--sysdeps/unix/sysv/linux/ttyname.c51
3 files changed, 60 insertions, 34 deletions
diff --git a/sysdeps/generic/strtok.c b/sysdeps/generic/strtok.c
index 6aeeb5a..b6f9523 100644
--- a/sysdeps/generic/strtok.c
+++ b/sysdeps/generic/strtok.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1996, 1997, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -19,7 +19,7 @@
#include <string.h>
-static char *olds = NULL;
+static char *olds;
#undef strtok
diff --git a/sysdeps/posix/ttyname.c b/sysdeps/posix/ttyname.c
index a865ded..fe132a3 100644
--- a/sysdeps/posix/ttyname.c
+++ b/sysdeps/posix/ttyname.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 93, 96, 97, 98 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 96, 97, 98, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -26,10 +26,13 @@
#include <string.h>
#include <stdlib.h>
-char *__ttyname = NULL;
+char *__ttyname;
-static char * getttyname __P ((int fd, dev_t mydev, ino_t myino,
- int save, int *dostat)) internal_function;
+static char *getttyname (int fd, dev_t mydev, ino_t myino,
+ int save, int *dostat) internal_function;
+
+
+static char *getttyname_name;
static char *
internal_function
@@ -41,8 +44,7 @@ getttyname (fd, mydev, myino, save, dostat)
int *dostat;
{
static const char dev[] = "/dev";
- static char *name;
- static size_t namelen = 0;
+ static size_t namelen;
struct stat st;
DIR *dirstream;
struct dirent *d;
@@ -63,20 +65,21 @@ getttyname (fd, mydev, myino, save, dostat)
size_t dlen = _D_ALLOC_NAMLEN (d);
if (sizeof (dev) + dlen > namelen)
{
- free (name);
+ free (getttyname_name);
namelen = 2 * (sizeof (dev) + dlen); /* Big enough. */
- name = malloc (namelen);
- if (! name)
+ getttyname_name = malloc (namelen);
+ if (! getttyname_name)
{
*dostat = -1;
/* Perhaps it helps to free the directory stream buffer. */
(void) __closedir (dirstream);
return NULL;
}
- *((char *) __mempcpy (name, dev, sizeof (dev) - 1)) = '/';
+ *((char *) __mempcpy (getttyname_name, dev, sizeof (dev) - 1))
+ = '/';
}
- (void) __mempcpy (&name[sizeof (dev)], d->d_name, dlen);
- if (stat (name, &st) == 0
+ (void) __mempcpy (&getttyname_name[sizeof (dev)], d->d_name, dlen);
+ if (stat (getttyname_name, &st) == 0
#ifdef _STATBUF_ST_RDEV
&& S_ISCHR (st.st_mode) && st.st_rdev == mydev
#else
@@ -85,9 +88,9 @@ getttyname (fd, mydev, myino, save, dostat)
)
{
(void) __closedir (dirstream);
- __ttyname = name;
+ __ttyname = getttyname_name;
__set_errno (save);
- return name;
+ return getttyname_name;
}
}
@@ -131,3 +134,11 @@ ttyname (fd)
return name;
}
+
+
+static void
+free_mem (void)
+{
+ free (getttyname_name);
+}
+text_set_element (__libc_subfreeres, free_mem);
diff --git a/sysdeps/unix/sysv/linux/ttyname.c b/sysdeps/unix/sysv/linux/ttyname.c
index 33587a3..0973925 100644
--- a/sysdeps/unix/sysv/linux/ttyname.c
+++ b/sysdeps/unix/sysv/linux/ttyname.c
@@ -30,15 +30,17 @@
char *__ttyname;
-static char * getttyname (const char *dev, dev_t mydev,
- ino_t myino, int save, int *dostat)
+static char *getttyname (const char *dev, dev_t mydev,
+ ino_t myino, int save, int *dostat)
internal_function;
+
+static char *getttyname_name;
+
static char *
internal_function
getttyname (const char *dev, dev_t mydev, ino_t myino, int save, int *dostat)
{
- static char *name;
static size_t namelen;
struct stat st;
DIR *dirstream;
@@ -61,20 +63,20 @@ getttyname (const char *dev, dev_t mydev, ino_t myino, int save, int *dostat)
size_t dlen = _D_ALLOC_NAMLEN (d);
if (devlen + dlen > namelen)
{
- free (name);
+ free (getttyname_name);
namelen = 2 * (devlen + dlen); /* Big enough. */
- name = malloc (namelen);
- if (! name)
+ getttyname_name = malloc (namelen);
+ if (! getttyname_name)
{
*dostat = -1;
/* Perhaps it helps to free the directory stream buffer. */
(void) __closedir (dirstream);
return NULL;
}
- *((char *) __mempcpy (name, dev, devlen - 1)) = '/';
+ *((char *) __mempcpy (getttyname_name, dev, devlen - 1)) = '/';
}
- memcpy (&name[devlen], d->d_name, dlen);
- if (__xstat (_STAT_VER, name, &st) == 0
+ memcpy (&getttyname_name[devlen], d->d_name, dlen);
+ if (__xstat (_STAT_VER, getttyname_name, &st) == 0
#ifdef _STATBUF_ST_RDEV
&& S_ISCHR (st.st_mode) && st.st_rdev == mydev
#else
@@ -83,9 +85,9 @@ getttyname (const char *dev, dev_t mydev, ino_t myino, int save, int *dostat)
)
{
(void) __closedir (dirstream);
- __ttyname = name;
+ __ttyname = getttyname_name;
__set_errno (save);
- return name;
+ return getttyname_name;
}
}
@@ -94,12 +96,16 @@ getttyname (const char *dev, dev_t mydev, ino_t myino, int save, int *dostat)
return NULL;
}
+
+/* Static buffer in `ttyname'. */
+static char *ttyname_buf;
+
+
/* Return the pathname of the terminal FD is open on, or NULL on errors.
The returned storage is good only until the next call to this function. */
char *
ttyname (int fd)
{
- static char *buf;
static size_t buflen;
char procname[30];
struct stat st, st1;
@@ -117,24 +123,24 @@ ttyname (int fd)
if (buflen == 0)
{
buflen = 4095;
- buf = (char *) malloc (buflen + 1);
- if (buf == NULL)
+ ttyname_buf = (char *) malloc (buflen + 1);
+ if (ttyname_buf == NULL)
{
buflen = 0;
return NULL;
}
}
- len = __readlink (procname, buf, buflen);
+ len = __readlink (procname, ttyname_buf, buflen);
if (len != -1
/* This is for Linux 2.0. */
- && buf[0] != '[')
+ && ttyname_buf[0] != '[')
{
if (len >= buflen)
return NULL;
/* readlink need not terminate the string. */
- buf[len] = '\0';
- return buf;
+ ttyname_buf[len] = '\0';
+ return ttyname_buf;
}
if (__fxstat (_STAT_VER, fd, &st) < 0)
@@ -175,3 +181,12 @@ ttyname (int fd)
return name;
}
+
+
+static void
+free_mem (void)
+{
+ free (ttyname_buf);
+ free (getttyname_name);
+}
+text_set_element (__libc_subfreeres, free_mem);