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
No related merge requests found
......@@ -37,20 +37,11 @@ tHandler gDoor_Handler = {
Door_CanDispense,
Door_DoDispense
};
char *gsDoor_Password = "";
volatile int giDoor_ChildStatus;
char *gsDoor_SerialPort = "/dev/ttyS3";
// == CODE ===
void Door_SIGCHLDHandler(int signum)
{
signum = 0;
giDoor_ChildStatus ++;
printf("SIGCHLD: giDoor_ChildStatus = %i \n", giDoor_ChildStatus);
}
int Door_InitHandler(void)
{
signal(SIGCHLD, Door_SIGCHLDHandler);
return 0;
}
......@@ -84,15 +75,7 @@ int Door_CanDispense(int User, int Item)
*/
int Door_DoDispense(int User, int Item)
{
FILE *child_stdin;
#if 0
int stdin_pair[2];
int stdout_pair[2];
#else
int child_stdin_fd;
#endif
pid_t childPid;
pid_t parentPid;
int door_serial_handle;
#if DEBUG
printf("Door_DoDispense: (User=%i,Item=%i)\n", User, Item);
......@@ -110,95 +93,29 @@ int Door_DoDispense(int User, int Item)
return 1;
}
giDoor_ChildStatus = 0; // Set child status to zero
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");
door_serial_handle = InitSerial(gsDoor_SerialPort, 9600);
int read_child_output()
{
char buf[1024];
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
if( write(door_serial_handle, "ATH1\n", 5) != 5 ) {
fprintf(stderr, "Unable to open door (sending ATH1)\n");
perror("Sending ATH1");
return -1;
}
fflush(child_stdin);
// Wait before re-locking
sleep(DOOR_UNLOCKED_DELAY);
#if DEBUG
printf("Door_DoDispense: Door re-lock\n");
#endif
// 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");
if( write(door_serial_handle, "ATH0\n", 5) != 5 ) {
fprintf(stderr, "Oh, hell! Door not re-locking, big error (sending ATH0 failed)\n");
perror("Sending ATH0");
return -1;
}
fflush(child_stdin);
fputs("\x1D", child_stdin);
// Wait a little so llogin can send the lock message
sleep(1);
fclose(child_stdin);
close(child_stdin_fd);
close(door_serial_handle);
#if DEBUG
printf("Door_DoDispense: User %i opened door\n", User);
#endif
kill(childPid, SIGKILL);
return 0;
}
......@@ -30,7 +30,7 @@ extern int giServer_Port;
extern char *gsItemListFile;
extern char *gsCoke_SerialPort;
extern char *gsSnack_SerialPort;
extern char *gsDoor_Password;
extern char *gsDoor_SerialPort;
// === PROTOTYPES ===
void *Periodic_Thread(void *Unused);
......@@ -60,10 +60,12 @@ void PrintUsage(const char *progname)
fprintf(stderr, " Set debug level (0 - 2, default 0)\n");
fprintf(stderr, " --cokeport\n");
fprintf(stderr, " Coke machine serial port (Default \"/dev/ttyS0\")\n");
fprintf(stderr, " --doorpass\n");
fprintf(stderr, " Door LAT password file (Default empty password)\n");
fprintf(stderr, " --doorport\n");
fprintf(stderr, " Door modem/relay serial port (Default \"/dev/ttyS3\")\n");
fprintf(stderr, " --cokebank\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[])
......@@ -108,19 +110,9 @@ int main(int argc, char *argv[])
if( i + 1 >= argc ) return -1;
gsSnack_SerialPort = argv[++i];
}
else if( strcmp(arg, "--doorpass") == 0 ) {
FILE *fp;
char buf[30];
else if( strcmp(arg, "--doorport") == 0 ) {
if( i + 1 >= argc ) return -1;
fp = fopen(argv[++i], "r");
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);
gsDoor_SerialPort = argv[++i];
}
else if( strcmp(arg, "--cokebank") == 0 ) {
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