- giDoor_ChildStatus = 0; // Set child status to zero
- parentPid = getpid();
- #if 0
- // Create stdin/stdout
- if( pipe(stdin_pair) || pipe(stdout_pair) )
- {
- perror("pipe");
- return -1;
- }
-
- childPid = fork();
- #else
- childPid = forkpty(&child_stdin_fd, NULL, NULL, NULL);
- #endif
-
- if( childPid < 0 )
- {
- perror("fork");
- return -1;
- }
-
- // Child process
- if( childPid == 0 )
- {
- #if 0
- // Close write end of stdin, and set it to #0
- close(stdin_pair[1]); dup2(stdin_pair[0], 0);
- // Close read end of stdout, and set it to #1
- close(stdout_pair[0]); dup2(stdout_pair[1], 1);
- #endif
-
- //execl("/bin/sh", "sh", "-c", "llogin door -w-", NULL);
- execl("/usr/bin/llogin", "llogin", "door", "-w-", NULL);
- perror("execl");
- exit(-1);
- }
-
- #if 0
- child_stdin = fdopen(stdin_pair[1], "w");
- close(stdin_pair[0]); // child stdin read
- close(stdout_pair[1]); // child stdout write
- #else
- child_stdin = fdopen(child_stdin_fd, "w");
- #endif
-
- {
- char buf[1024];
- int len;
- #if 0
- if( giDoor_ChildStatus || (len = read(stdout_pair[0], buf, sizeof buf)) < 0)
- #else
- if( giDoor_ChildStatus || (len = read(child_stdin_fd, buf, sizeof buf)) < 0)
- #endif
- {
- #if DEBUG
- int child_exit;
- waitpid(childPid, &child_exit, 0);
- printf("Door_DoDispense: fread fail (child status %i)\n", child_exit);
- #endif
- return -1;
- }
- buf[len] = '\0';
-
- #if DEBUG
- printf("Door_DoDispense: buf = %i '%s'\n", len, buf);
- #endif
- }
-
- // Send password
- if( giDoor_ChildStatus || fputs(gsDoor_Password, child_stdin) <= 0 ) {
- #if DEBUG
- int child_exit;
- waitpid(childPid, &child_exit, 0);
- printf("Door_DoDispense: fputs password fail (child status %i)\n", child_exit);
- #endif
- return -1;
- }
- fputs("\n", child_stdin);
-
-
- #if DEBUG
- printf("Door_DoDispense: Door unlock\n");
- #endif
-
- // ATH1 - Unlock door
- if( giDoor_ChildStatus || fputs("ATH1\n", child_stdin) <= 0) {
- #if DEBUG
- printf("Door_DoDispense: fputs unlock\n");
- #endif