123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- #include <errno.h>
- #include <fcntl.h>
- #include <limits.h>
- #include <pty.h>
- #include <stdlib.h>
- #include <string.h>
- #include <termios.h>
- #include <unistd.h>
- #include <sys/types.h>
- #if 0
- static int
- pts_name (int fd, char **pts, size_t buf_len)
- {
- int rv;
- char *buf = *pts;
- for (;;)
- {
- char *new_buf;
- if (buf_len)
- {
- rv = ptsname_r (fd, buf, buf_len);
- if (rv != 0 || memchr (buf, '\0', buf_len))
-
- break;
-
- buf_len += buf_len;
- }
- else
-
- buf_len = 128;
- if (buf != *pts)
-
- new_buf = realloc (buf, buf_len);
- else
- new_buf = malloc (buf_len);
- if (! new_buf)
- {
- rv = -1;
- __set_errno (ENOMEM);
- break;
- }
- buf = new_buf;
- }
- if (rv == 0)
- *pts = buf;
- else if (buf != *pts)
- free (buf);
- return rv;
- }
- #endif
- int
- openpty (int *amaster, int *aslave, char *name, struct termios *termp,
- struct winsize *winp)
- {
- #if 0
- #ifdef PATH_MAX
- char _buf[PATH_MAX];
- #else
- char _buf[512];
- #endif
- char *buf = _buf;
- #else
- #ifdef PATH_MAX
- char buf[PATH_MAX];
- #else
- char buf[512];
- #endif
- #endif
- int master, slave;
- master = posix_openpt (O_RDWR);
- if (master == -1)
- return -1;
- if (grantpt (master))
- goto fail;
- if (unlockpt (master))
- goto fail;
- #if 0
- if (pts_name (master, &buf, sizeof (_buf)))
- #else
- if (ptsname_r (master, buf, sizeof buf))
- #endif
- goto fail;
- slave = open (buf, O_RDWR | O_NOCTTY);
- if (slave == -1)
- {
- #if 0
- if (buf != _buf)
- free (buf);
- #endif
- goto fail;
- }
-
- if(termp)
- tcsetattr (slave, TCSAFLUSH, termp);
- if (winp)
- ioctl (slave, TIOCSWINSZ, winp);
- *amaster = master;
- *aslave = slave;
- if (name != NULL)
- strcpy (name, buf);
- #if 0
- if (buf != _buf)
- free (buf);
- #endif
- return 0;
- fail:
- close (master);
- return -1;
- }
- libutil_hidden_def(openpty)
|