diff options
author | Matthias-Christian Ott <ott@enolink.de> | 2008-06-10 17:30:15 +0200 |
---|---|---|
committer | Matthias-Christian Ott <ott@enolink.de> | 2008-06-10 17:30:15 +0200 |
commit | 47d8633f157156ef4701ce71ed7eff766206c107 (patch) | |
tree | 78190354f0b6784063f5434821b40bbe0ebd8d1e /pty.c | |
parent | 0dedee5de8e35f4bab3d707d63be31943715264e (diff) | |
download | st-47d8633f157156ef4701ce71ed7eff766206c107.tar.gz st-47d8633f157156ef4701ce71ed7eff766206c107.tar.bz2 |
source getpty() out to pty.c
Diffstat (limited to 'pty.c')
-rw-r--r-- | pty.c | 41 |
1 files changed, 41 insertions, 0 deletions
@@ -0,0 +1,41 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <stdlib.h> +#if !(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) +#include <pty.h> +#endif + +extern int ptm, pts; + +void +getpty(void) { + char *ptsdev; + +#if defined(_GNU_SOURCE) + ptm = getpt(); +#elif _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 + ptm = posix_openpt(O_RDWR); +#else + ptm = open("/dev/ptmx", O_RDWR); + if(ptm == -1) + if(openpty(&ptm, &pts, NULL, NULL, NULL) == -1) + eprintn("error, cannot open pty"); +#endif +#if defined(_XOPEN_SOURCE) + if(ptm != -1) { + if(grantpt(ptm) == -1) + eprintn("error, cannot grant access to pty"); + if(unlockpt(ptm) == -1) + eprintn("error, cannot unlock pty"); + ptsdev = ptsname(ptm); + if(!ptsdev) + eprintn("error, slave pty name undefined"); + pts = open(ptsdev, O_RDWR); + if(pts == -1) + eprintn("error, cannot open slave pty"); + } + else + eprintn("error, cannot open pty"); +#endif +} |