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

Changed door code to use direct serial instead of llogin

- The DECServer gave up the magic smoke on the weekend
parent 9c3a79bd
Branches
No related merge requests found
...@@ -37,20 +37,11 @@ tHandler gDoor_Handler = { ...@@ -37,20 +37,11 @@ tHandler gDoor_Handler = {
Door_CanDispense, Door_CanDispense,
Door_DoDispense Door_DoDispense
}; };
char *gsDoor_Password = ""; char *gsDoor_SerialPort = "/dev/ttyS3";
volatile int giDoor_ChildStatus;
// == CODE === // == CODE ===
void Door_SIGCHLDHandler(int signum)
{
signum = 0;
giDoor_ChildStatus ++;
printf("SIGCHLD: giDoor_ChildStatus = %i \n", giDoor_ChildStatus);
}
int Door_InitHandler(void) int Door_InitHandler(void)
{ {
signal(SIGCHLD, Door_SIGCHLDHandler);
return 0; return 0;
} }
...@@ -84,15 +75,7 @@ int Door_CanDispense(int User, int Item) ...@@ -84,15 +75,7 @@ int Door_CanDispense(int User, int Item)
*/ */
int Door_DoDispense(int User, int Item) int Door_DoDispense(int User, int Item)
{ {
FILE *child_stdin; int door_serial_handle;
#if 0
int stdin_pair[2];
int stdout_pair[2];
#else
int child_stdin_fd;
#endif
pid_t childPid;
pid_t parentPid;
#if DEBUG #if DEBUG
printf("Door_DoDispense: (User=%i,Item=%i)\n", User, Item); printf("Door_DoDispense: (User=%i,Item=%i)\n", User, Item);
...@@ -110,95 +93,29 @@ int Door_DoDispense(int User, int Item) ...@@ -110,95 +93,29 @@ int Door_DoDispense(int User, int Item)
return 1; return 1;
} }
giDoor_ChildStatus = 0; // Set child status to zero door_serial_handle = InitSerial(gsDoor_SerialPort, 9600);
parentPid = getpid();
childPid = forkpty(&child_stdin_fd, NULL, NULL, NULL);
if( childPid < 0 )
{
perror("fork");
return -1;
}
// Child process
if( childPid == 0 )
{
execl("/usr/bin/llogin", "llogin", "door", "-w-", NULL);
perror("execl");
exit(-1);
}
child_stdin = fdopen(child_stdin_fd, "w");
int read_child_output() if( write(door_serial_handle, "ATH1\n", 5) != 5 ) {
{ fprintf(stderr, "Unable to open door (sending ATH1)\n");
char buf[1024]; perror("Sending ATH1");
int len;
if( giDoor_ChildStatus || (len = read(child_stdin_fd, buf, sizeof buf)) < 0)
{
#if DEBUG
printf("Door_DoDispense: fread fail\n");
#endif
return -1;
}
buf[len] = '\0';
#if DEBUG > 1
printf("Door_DoDispense: buf = %i '%s'\n", len, buf);
#endif
return 0;
}
if( read_child_output() ) return -1;
// Send password
if( giDoor_ChildStatus || fputs(gsDoor_Password, child_stdin) <= 0 ) {
printf("Door_DoDispense: fputs password fail\n");
return -1;
}
fputs("\n", child_stdin);
fflush(child_stdin);
if( read_child_output() ) return -1;
#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 failed (or child terminated)\n");
#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( write(door_serial_handle, "ATH0\n", 5) != 5 ) {
printf("Door_DoDispense: Door re-lock\n"); fprintf(stderr, "Oh, hell! Door not re-locking, big error (sending ATH0 failed)\n");
#endif perror("Sending ATH0");
// Re-lock the door (and quit llogin)
if( giDoor_ChildStatus || fputs("ATH0\n", child_stdin) == 0 ) {
fprintf(stderr, "Oh F**k, the door may be stuck unlocked, someone use llogin!\n");
return -1; return -1;
} }
fflush(child_stdin);
fputs("\x1D", child_stdin);
// Wait a little so llogin can send the lock message close(door_serial_handle);
sleep(1);
fclose(child_stdin);
close(child_stdin_fd);
#if DEBUG #if DEBUG
printf("Door_DoDispense: User %i opened door\n", User); printf("Door_DoDispense: User %i opened door\n", User);
#endif #endif
kill(childPid, SIGKILL);
return 0; return 0;
} }
...@@ -30,7 +30,7 @@ extern int giServer_Port; ...@@ -30,7 +30,7 @@ extern int giServer_Port;
extern char *gsItemListFile; extern char *gsItemListFile;
extern char *gsCoke_SerialPort; extern char *gsCoke_SerialPort;
extern char *gsSnack_SerialPort; extern char *gsSnack_SerialPort;
extern char *gsDoor_Password; extern char *gsDoor_SerialPort;
// === PROTOTYPES === // === PROTOTYPES ===
void *Periodic_Thread(void *Unused); void *Periodic_Thread(void *Unused);
...@@ -60,10 +60,12 @@ void PrintUsage(const char *progname) ...@@ -60,10 +60,12 @@ void PrintUsage(const char *progname)
fprintf(stderr, " Set debug level (0 - 2, default 0)\n"); fprintf(stderr, " Set debug level (0 - 2, default 0)\n");
fprintf(stderr, " --cokeport\n"); fprintf(stderr, " --cokeport\n");
fprintf(stderr, " Coke machine serial port (Default \"/dev/ttyS0\")\n"); fprintf(stderr, " Coke machine serial port (Default \"/dev/ttyS0\")\n");
fprintf(stderr, " --doorpass\n"); fprintf(stderr, " --doorport\n");
fprintf(stderr, " Door LAT password file (Default empty password)\n"); fprintf(stderr, " Door modem/relay serial port (Default \"/dev/ttyS3\")\n");
fprintf(stderr, " --cokebank\n"); fprintf(stderr, " --cokebank\n");
fprintf(stderr, " Coke bank database file (Default \"cokebank.db\")\n"); fprintf(stderr, " Coke bank database file (Default \"cokebank.db\")\n");
fprintf(stderr, " --[dont-]daemonise\n");
fprintf(stderr, " Run (or explicitly don't) the server disconnected from the terminal\n");
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
...@@ -108,19 +110,9 @@ int main(int argc, char *argv[]) ...@@ -108,19 +110,9 @@ int main(int argc, char *argv[])
if( i + 1 >= argc ) return -1; if( i + 1 >= argc ) return -1;
gsSnack_SerialPort = argv[++i]; gsSnack_SerialPort = argv[++i];
} }
else if( strcmp(arg, "--doorpass") == 0 ) { else if( strcmp(arg, "--doorport") == 0 ) {
FILE *fp;
char buf[30];
if( i + 1 >= argc ) return -1; if( i + 1 >= argc ) return -1;
fp = fopen(argv[++i], "r"); gsDoor_SerialPort = argv[++i];
if( !fp ) {
fprintf(stderr, "ERROR: Unable to read password file\n");
perror("reading LAT password");
return -1;
}
fgets(buf, sizeof buf, fp);
fclose(fp);
gsDoor_Password = strdup(buf);
} }
else if( strcmp(arg, "--cokebank") == 0 ) { else if( strcmp(arg, "--cokebank") == 0 ) {
if( i + 1 >= argc ) return -1; if( i + 1 >= argc ) return -1;
......
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