Add sys/loadavg.h
[kopensolaris-gnu/glibc.git] / sysdeps / unix / grantpt.c
index 76bda07..bdedbac 100644 (file)
@@ -1,21 +1,21 @@
-/* Copyright (C) 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1998.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
 
 #include <assert.h>
 #include <errno.h>
@@ -48,11 +48,20 @@ pts_name (int fd, char **pts, size_t buf_len)
 
       if (buf_len)
        {
-         rv = ptsname_r (fd, buf, buf_len);
-
-         if (rv != 0 || memchr (buf, '\0', buf_len))
-           /* We either got an error, or we succeeded and the
-              returned name fit in the buffer.  */
+         rv = __ptsname_r (fd, buf, buf_len);
+         if (rv != 0)
+           {
+             if (rv == ENOTTY)
+               /* ptsname_r returns with ENOTTY to indicate
+                  a descriptor not referring to a pty master.
+                  For this condition, grantpt must return EINVAL.  */
+               rv = EINVAL;
+             errno = rv;       /* Not necessarily set by __ptsname_r.  */
+             break;
+           }
+
+         if (memchr (buf, '\0', buf_len))
+           /* We succeeded and the returned name fit in the buffer.  */
            break;
 
          /* Try again with a longer buffer.  */
@@ -64,9 +73,9 @@ pts_name (int fd, char **pts, size_t buf_len)
 
       if (buf != *pts)
        /* We've already malloced another buffer at least once.  */
-       new_buf = realloc (buf, buf_len);
+       new_buf = (char *) realloc (buf, buf_len);
       else
-       new_buf = malloc (buf_len);
+       new_buf = (char *) malloc (buf_len);
       if (! new_buf)
        {
          rv = -1;
@@ -97,7 +106,7 @@ grantpt (int fd)
   char _buf[512];
 #endif
   char *buf = _buf;
-  struct stat st;
+  struct stat64 st;
   char *grtmpbuf;
   struct group grbuf;
   size_t grbuflen = __sysconf (_SC_GETGR_R_SIZE_MAX);
@@ -109,7 +118,7 @@ grantpt (int fd)
   if (pts_name (fd, &buf, sizeof (_buf)))
     return -1;
 
-  if (__stat (buf, &st) < 0)
+  if (__xstat64 (_STAT_VER, buf, &st) < 0)
     goto cleanup;
 
   /* Make sure that we own the device.  */
@@ -121,12 +130,12 @@ grantpt (int fd)
     }
 
   /* Get the group ID of the special `tty' group.  */
-  if (grbuflen == -1)
+  if (grbuflen == (size_t) -1L)
     /* `sysconf' does not support _SC_GETGR_R_SIZE_MAX.
        Try a moderate value.  */
     grbuflen = 1024;
   grtmpbuf = (char *) __alloca (grbuflen);
-  getgrnam_r (TTY_GROUP, &grbuf, grtmpbuf, grbuflen, &p);
+  __getgrnam_r (TTY_GROUP, &grbuf, grtmpbuf, grbuflen, &p);
   gid = p ? p->gr_gid : __getgid ();
 
   /* Make sure the group of the device is that special group.  */
@@ -157,9 +166,9 @@ grantpt (int fd)
     {
       /* Disable core dumps.  */
       struct rlimit rl = { 0, 0 };
-      setrlimit (RLIMIT_CORE, &rl);
+      __setrlimit (RLIMIT_CORE, &rl);
 
-      /* We pase the master pseudo terminal as file descriptor PTY_FILENO.  */
+      /* We pass the master pseudo terminal as file descriptor PTY_FILENO.  */
       if (fd != PTY_FILENO)
        if (__dup2 (fd, PTY_FILENO) < 0)
          _exit (FAIL_EBADF);