-void *
-emallocz(unsigned int size) {
- void *res = calloc(1, size);
-
- if(!res)
- eprint("fatal: could not malloc() %u bytes\n", size);
- return res;
-}
-
-void
-eprint(const char *errstr, ...) {
- va_list ap;
-
- va_start(ap, errstr);
- vfprintf(stderr, errstr, ap);
- va_end(ap);
- exit(EXIT_FAILURE);
-}
-
-void
-eprintn(const char *errstr, ...) {
- va_list ap;
-
- va_start(ap, errstr);
- vfprintf(stderr, errstr, ap);
- va_end(ap);
- fprintf(stderr, ": %s\n", strerror(errno));
- exit(EXIT_FAILURE);
-}
-
-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");
+int
+getch() {
+ if(rbuf.i++ >= rbuf.n) {
+ rbuf.n = read(ptm, rbuf.data, LENGTH(rbuf.data));
+ if(rbuf.n == -1)
+ err(EXIT_FAILURE, "cannot read from slave pty");
+ rbuf.i = 0;