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 | 3f14681cd64948d08b8320b7a95879ee4f9d1ee5 (patch) | |
tree | 78190354f0b6784063f5434821b40bbe0ebd8d1e /pty.c | |
parent | 9995f245eea61fce3861b0dfa4edb5607d716f07 (diff) | |
download | st-3f14681cd64948d08b8320b7a95879ee4f9d1ee5.tar.gz st-3f14681cd64948d08b8320b7a95879ee4f9d1ee5.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 +} |