1 | // RUN: %clangxx -O0 -g %s -lutil -o %t |
---|---|
2 | |
3 | // Ignore leaks as this is not the point of test, but HWASAN repors one here. |
4 | // RUN: %env_tool_opts=detect_leaks=0 %run %t | FileCheck %s |
5 | |
6 | // XFAIL: android && asan |
7 | |
8 | // No libutil. |
9 | // UNSUPPORTED: target={{.*solaris.*}} |
10 | |
11 | #include <assert.h> |
12 | #include <stdio.h> |
13 | #include <string.h> |
14 | #if __linux__ |
15 | # include <pty.h> |
16 | #elif defined(__FreeBSD__) |
17 | # include <libutil.h> |
18 | # include <pwd.h> |
19 | # include <sys/ioctl.h> |
20 | # include <sys/termios.h> |
21 | # include <sys/types.h> |
22 | #elif defined(__sun__) && defined(__svr4__) |
23 | # include <termios.h> |
24 | #else |
25 | # include <util.h> |
26 | #endif |
27 | #include <unistd.h> |
28 | |
29 | int main(int argc, char **argv) { |
30 | int m; |
31 | int pid = forkpty(amaster: &m, NULL, NULL, NULL); |
32 | |
33 | if (pid == -1) { |
34 | fprintf(stderr, format: "forkpty failed\n"); |
35 | return 1; |
36 | } else if (pid > 0) { |
37 | char buf[1024]; |
38 | int res = read(fd: m, buf: buf, nbytes: sizeof(buf)); |
39 | write(fd: 1, buf: buf, n: res); |
40 | write(fd: m, buf: "password\n", n: 9); |
41 | while ((res = read(fd: m, buf: buf, nbytes: sizeof(buf))) > 0) |
42 | write(fd: 1, buf: buf, n: res); |
43 | } else { |
44 | char *s = getpass(prompt: "prompt"); |
45 | assert(strcmp(s, "password") == 0); |
46 | write(fd: 1, buf: "done\n", n: 5); |
47 | } |
48 | return 0; |
49 | } |
50 | |
51 | // CHECK: prompt |
52 | // CHECK: done |
53 |