+char *getpass(const char *prompt)
+{
+ static char passbuf[PASS_MAX+1];
+ struct ptymode oldmode, mode;
+ _SysIOCtl(STDIN_FILENO, PTY_IOCTL_GETMODE, &oldmode);
+ mode.InputMode = PTYIMODE_CANON;
+ mode.OutputMode = 0;
+ _SysIOCtl(STDIN_FILENO, PTY_IOCTL_SETMODE, &mode);
+ fprintf(stderr, "%s", prompt);
+ fgets(passbuf, PASS_MAX+1, stdin);
+ fprintf(stderr, "\n");
+ for( int i = strlen(passbuf); i > 0 && (passbuf[i-1] == '\r' || passbuf[i-1] == '\n'); i -- )
+ passbuf[i-1] = 0;
+
+ _SysIOCtl(STDIN_FILENO, PTY_IOCTL_SETMODE, &oldmode);
+
+ return passbuf;
+}
+
+char *ttyname(int fd)
+{
+ static char ttyname_buf[32];
+ errno = ttyname_r(fd, ttyname_buf, sizeof(ttyname_buf));
+ if(errno) return NULL;
+
+ return ttyname_buf;
+}
+int ttyname_r(int fd, char *buf, size_t buflen)
+{
+ int type = _SysIOCtl(fd, DRV_IOCTL_TYPE, NULL);
+ if( type == -1 )
+ return errno;
+ if( type != DRV_TYPE_TERMINAL )
+ return ENOTTY;
+
+ _SysIOCtl(fd, PTY_IOCTL_GETID, NULL);
+
+ return ENOTIMPL;
+}