root/maint/gnulib/lib/posix_openpt.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. posix_openpt

   1 /* Open the master side of a pseudo-terminal.
   2    Copyright (C) 2010-2021 Free Software Foundation, Inc.
   3 
   4    This file is free software: you can redistribute it and/or modify
   5    it under the terms of the GNU Lesser General Public License as
   6    published by the Free Software Foundation; either version 2.1 of the
   7    License, or (at your option) any later version.
   8 
   9    This file is distributed in the hope that it will be useful,
  10    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12    GNU Lesser General Public License for more details.
  13 
  14    You should have received a copy of the GNU Lesser General Public License
  15    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  16 
  17 #include <config.h>
  18 
  19 /* Specification.  */
  20 #include <stdlib.h>
  21 
  22 #include <errno.h>
  23 #include <fcntl.h>
  24 #if defined __OpenBSD__
  25 # include <sys/ioctl.h>
  26 # include <sys/tty.h>
  27 #endif
  28 
  29 /* posix_openpt() is already provided on
  30      glibc >= 2.2.1 (but is a stub on GNU/Hurd),
  31      Mac OS X >= 10.4,
  32      FreeBSD >= 5.1 (lived in src/lib/libc/stdlib/grantpt.c before 8.0),
  33      NetBSD >= 3.0,
  34      AIX >= 5.2, HP-UX >= 11.31, Solaris >= 10, Cygwin >= 1.7.
  35    Thus, this replacement function is compiled on
  36      Mac OS X 10.3, OpenBSD 4.9, Minix 3.1.8,
  37      AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9,
  38      Cygwin 1.5.x, mingw, MSVC 9, Interix 3.5, BeOS.
  39    Among these:
  40      - AIX has /dev/ptc.
  41      - HP-UX 10..11, IRIX 6.5, OSF/1 5.1, Solaris 2.6..9, Cygwin 1.5
  42        have /dev/ptmx.
  43      - HP-UX 10..11 also has /dev/ptym/clone, but this should not be needed.
  44      - OpenBSD 4.9 has /dev/ptm and the PTMGET ioctl.
  45      - Minix 3.1.8 have a list of pseudo-terminal devices in /dev.
  46      - On native Windows, there are no ttys at all.  */
  47 
  48 int
  49 posix_openpt (int flags)
     /* [previous][next][first][last][top][bottom][index][help] */
  50 {
  51   int master;
  52 
  53 #ifdef _AIX /* AIX */
  54 
  55   master = open ("/dev/ptc", flags);
  56 
  57 #elif defined _WIN32 && !defined __CYGWIN__ /* mingw */
  58 
  59   /* Mingw lacks pseudo-terminals altogether.  */
  60   master = -1;
  61   errno = ENOSYS;
  62 
  63 #elif defined __OpenBSD__
  64 
  65   /* On OpenBSD, master and slave of a pseudo-terminal are allocated together,
  66      by opening /dev/ptm and applying the PTMGET ioctl to it.  */
  67   int fd;
  68   struct ptmget data;
  69 
  70   fd = open (PATH_PTMDEV, O_RDWR);
  71   if (fd >= 0)
  72     {
  73       if (ioctl (fd, PTMGET, &data) >= 0)
  74         {
  75           master = data.cfd;
  76           close (data.sfd);
  77           close (fd);
  78         }
  79       else
  80         {
  81           int saved_errno = errno;
  82           close (fd);
  83           errno = saved_errno;
  84           master = -1;
  85         }
  86     }
  87   else
  88     master = -1;
  89 
  90 #else /* Mac OS X, Minix, HP-UX, IRIX, OSF/1, Solaris 9, Cygwin 1.5 */
  91 
  92   /* Most systems that lack posix_openpt() have /dev/ptmx.  */
  93   master = open ("/dev/ptmx", flags);
  94 
  95   /* If all this does not work, we could try to open, one by one:
  96      - On Mac OS X: /dev/pty[p-w][0-9a-f]
  97      - On *BSD:     /dev/pty[p-sP-S][0-9a-v]
  98      - On Minix:    /dev/pty[p-q][0-9a-f]
  99      - On AIX:      /dev/ptyp[0-9a-f]
 100      - On HP-UX:    /dev/pty[p-r][0-9a-f]
 101      - On OSF/1:    /dev/pty[p-q][0-9a-f]
 102      - On Solaris:  /dev/pty[p-r][0-9a-f]
 103    */
 104 
 105 #endif
 106 
 107   return master;
 108 }

/* [previous][next][first][last][top][bottom][index][help] */