Skip to content
Snippets Groups Projects
Commit ff5f048b authored by John Hodge's avatar John Hodge
Browse files

Door handling fixed (for now)

parent 277a060a
No related merge requests found
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <pty.h> #include <pty.h>
#define DOOR_UNLOCKED_DELAY 10 // 10 seconds before it re-locks #define DOOR_UNLOCKED_DELAY 5 // Time in seconds before the door re-locks
// === IMPORTS === // === IMPORTS ===
...@@ -112,18 +112,7 @@ int Door_DoDispense(int User, int Item) ...@@ -112,18 +112,7 @@ int Door_DoDispense(int User, int Item)
giDoor_ChildStatus = 0; // Set child status to zero giDoor_ChildStatus = 0; // Set child status to zero
parentPid = getpid(); 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); childPid = forkpty(&child_stdin_fd, NULL, NULL, NULL);
#endif
if( childPid < 0 ) if( childPid < 0 )
{ {
...@@ -134,97 +123,75 @@ int Door_DoDispense(int User, int Item) ...@@ -134,97 +123,75 @@ int Door_DoDispense(int User, int Item)
// Child process // Child process
if( childPid == 0 ) 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); execl("/usr/bin/llogin", "llogin", "door", "-w-", NULL);
perror("execl"); perror("execl");
exit(-1); 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"); child_stdin = fdopen(child_stdin_fd, "w");
#endif
int read_child_output()
{ {
char buf[1024]; char buf[1024];
int len; 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) if( giDoor_ChildStatus || (len = read(child_stdin_fd, buf, sizeof buf)) < 0)
#endif
{ {
#if DEBUG #if DEBUG
int child_exit; printf("Door_DoDispense: fread fail\n");
waitpid(childPid, &child_exit, 0);
printf("Door_DoDispense: fread fail (child status %i)\n", child_exit);
#endif #endif
return -1; return -1;
} }
buf[len] = '\0'; buf[len] = '\0';
#if DEBUG #if DEBUG > 1
printf("Door_DoDispense: buf = %i '%s'\n", len, buf); printf("Door_DoDispense: buf = %i '%s'\n", len, buf);
#endif #endif
return 0;
} }
if( read_child_output() ) return -1;
// Send password // Send password
if( giDoor_ChildStatus || fputs(gsDoor_Password, child_stdin) <= 0 ) { if( giDoor_ChildStatus || fputs(gsDoor_Password, child_stdin) <= 0 ) {
#if DEBUG printf("Door_DoDispense: fputs password fail\n");
int child_exit;
waitpid(childPid, &child_exit, 0);
printf("Door_DoDispense: fputs password fail (child status %i)\n", child_exit);
#endif
return -1; return -1;
} }
fputs("\n", child_stdin); fputs("\n", child_stdin);
fflush(child_stdin);
if( read_child_output() ) return -1;
#if DEBUG #if DEBUG
printf("Door_DoDispense: Door unlock\n"); printf("Door_DoDispense: Door unlock\n");
#endif #endif
// ATH1 - Unlock door // ATH1 - Unlock door
if( giDoor_ChildStatus || fputs("ATH1\n", child_stdin) <= 0) { if( giDoor_ChildStatus || fputs("ATH1\n", child_stdin) == 0) {
#if DEBUG #if DEBUG
printf("Door_DoDispense: fputs unlock\n"); printf("Door_DoDispense: fputs unlock failed (or child terminated)\n");
#endif #endif
return -1; return -1;
} }
fflush(child_stdin);
// Wait before re-locking // Wait before re-locking
sleep(DOOR_UNLOCKED_DELAY); sleep(DOOR_UNLOCKED_DELAY);
#if DEBUG #if DEBUG
printf("Door_DoDispense: Door re-lock\n"); printf("Door_DoDispense: Door re-lock\n");
#endif #endif
// Re-lock the door (and quit llogin) // Re-lock the door (and quit llogin)
if( giDoor_ChildStatus || fputs("ATH0\n\x1D", child_stdin) == 0 ) { if( giDoor_ChildStatus || fputs("ATH0\n", child_stdin) == 0 ) {
#if DEBUG fprintf(stderr, "Oh F**k, the door may be stuck unlocked, someone use llogin!\n");
printf("Door_DoDispense: fputs lock\n");
#endif
return -1; return -1;
} }
fflush(child_stdin);
fputs("\x1D", child_stdin);
// Wait a little so llogin can send the lock message
sleep(1);
fclose(child_stdin); fclose(child_stdin);
#if 0
close(stdin_pair[1]); // child stdin write
close(stdout_pair[0]); // child stdout read
#else
close(child_stdin_fd); close(child_stdin_fd);
#endif
#if DEBUG #if DEBUG
printf("Door_DoDispense: User %i opened door\n", User); printf("Door_DoDispense: User %i opened door\n", User);
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment