16d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// RUN: %clangxx -O0 -g %s -lutil -o %t && %run %t | FileCheck %s
2799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// REQUIRES: stable-runtime
36d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include <assert.h>
46d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include <stdio.h>
56d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include <unistd.h>
66d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include <string.h>
7c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#if __linux__
86d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include <pty.h>
9c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#else
10c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <util.h>
11c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#endif
126d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
136d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesint
146d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesmain (int argc, char** argv)
156d1862363c88c183b0ed7740fca876342cf0474bStephen Hines{
166d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    int master;
176d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    int pid = forkpty(&master, NULL, NULL, NULL);
186d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
196d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    if(pid == -1) {
206d1862363c88c183b0ed7740fca876342cf0474bStephen Hines      fprintf(stderr, "forkpty failed\n");
216d1862363c88c183b0ed7740fca876342cf0474bStephen Hines      return 1;
226d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    } else if (pid > 0) {
236d1862363c88c183b0ed7740fca876342cf0474bStephen Hines      char buf[1024];
246d1862363c88c183b0ed7740fca876342cf0474bStephen Hines      int res = read(master, buf, sizeof(buf));
256d1862363c88c183b0ed7740fca876342cf0474bStephen Hines      write(1, buf, res);
266d1862363c88c183b0ed7740fca876342cf0474bStephen Hines      write(master, "password\n", 9);
276d1862363c88c183b0ed7740fca876342cf0474bStephen Hines      while ((res = read(master, buf, sizeof(buf))) > 0) write(1, buf, res);
286d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    } else {
296d1862363c88c183b0ed7740fca876342cf0474bStephen Hines      char *s = getpass("prompt");
306d1862363c88c183b0ed7740fca876342cf0474bStephen Hines      assert(strcmp(s, "password") == 0);
316d1862363c88c183b0ed7740fca876342cf0474bStephen Hines      write(1, "done\n", 5);
326d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    }
336d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    return 0;
346d1862363c88c183b0ed7740fca876342cf0474bStephen Hines}
356d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
366d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// CHECK: prompt
376d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// CHECK: done
38