#include "datatypes.h"
+#include <termios.h>
+#include <unistd.h>
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
ret = recv(fd, buffer, sizeof(buffer), 0);
if(!ret)
return 1;
+ if(ret < 0)
+ return ret;
+
char* saveptr;
char* tok = strtok_r(buffer, "\n\r", &saveptr);
do {
+ if(!tok)
+ continue;
+
ret = handle_command(tok, fd, cmd_q, client_lst);
if(ret < 0)
return ret;
ret = read(door_fd, buffer, sizeof(buffer));
if(!ret)
return 2;
+ if(ret < 0)
+ return ret;
+
char* saveptr;
char* tok = strtok_r(buffer, "\n\r", &saveptr);
do {
- if(!cmd_q || !(*cmd_q))
- break;
- ret = send_response((*cmd_q)->fd, tok);
- if(ret < 0)
- return ret;
+ if(!tok)
+ continue;
+
+ log_printf(NOTICE, "door-firmware: %s", tok);
+
+ int cmd_fd = -1;
+ if(cmd_q && (*cmd_q)) {
+ cmd_fd = (*cmd_q)->fd;
+ send_response(cmd_fd, tok);
+ }
+
+ if(!strncmp(tok, "Status:", 7)) {
+ client_t* client;
+ for(client = client_lst; client; client = client->next)
+ if(client->status_listener && client->fd != cmd_fd)
+ send_response(client->fd, tok);
+ }
cmd_pop(cmd_q);
} while(tok = strtok_r(NULL, "\n\r", &saveptr));
int main_loop(int door_fd, int cmd_listen_fd)
{
- log_printf(INFO, "entering main loop");
+ log_printf(NOTICE, "entering main loop");
fd_set readfds, tmpfds;
FD_ZERO(&readfds);
return return_value;
}
+int setup_tty(int fd)
+{
+ struct termios tmio;
+
+ int ret = tcgetattr(fd, &tmio);
+ if(ret) {
+ log_printf(ERROR, "Error on tcgetattr(): %s", strerror(errno));
+ return ret;
+ }
+
+ ret = cfsetospeed(&tmio, B9600);
+ if(ret) {
+ log_printf(ERROR, "Error on cfsetospeed(): %s", strerror(errno));
+ return ret;
+ }
+
+ ret = cfsetispeed(&tmio, B9600);
+ if(ret) {
+ log_printf(ERROR, "Error on cfsetispeed(): %s", strerror(errno));
+ return ret;
+ }
+
+ tmio.c_lflag &= ~ECHO;
+
+ ret = tcsetattr(fd, TCSANOW, &tmio);
+ if(ret) {
+ log_printf(ERROR, "Error on tcsetattr(): %s", strerror(errno));
+ return ret;
+ }
+
+ ret = tcflush(fd, TCIFLUSH);
+ if(ret) {
+ log_printf(ERROR, "Error on tcflush(): %s", strerror(errno));
+ return ret;
+ }
+
+ fd_set fds;
+ struct timeval tv;
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+ tv.tv_sec = 0;
+ tv.tv_usec = 50000;
+ for(;;) {
+ ret = select(fd+1, &fds, NULL, NULL, &tv);
+ if(ret > 0) {
+ char buffer[100];
+ ret = read(fd, buffer, sizeof(buffer));
+ }
+ else
+ break;
+ }
+
+ return 0;
+}
+
int main(int argc, char* argv[])
{
log_init();
fclose(pid_file);
}
- int door_fd = open(opt.door_dev_, O_RDWR);
- if(door_fd < 0) {
- log_printf(ERROR, "unable to open %s: %s", opt.door_dev_, strerror(errno));
- options_clear(&opt);
- log_close();
- exit(-1);
- }
-
int cmd_listen_fd = init_command_socket(opt.command_sock_);
if(cmd_listen_fd < 0) {
- close(door_fd);
options_clear(&opt);
log_close();
exit(-1);
}
+
+ int door_fd = 0;
+ for(;;) {
+ door_fd = open(opt.door_dev_, O_RDWR | O_NOCTTY);
+ if(door_fd < 0)
+ ret = 2;
+ else {
+ ret = setup_tty(door_fd);
+ if(ret)
+ ret = 2;
+ else
+ ret = main_loop(door_fd, cmd_listen_fd);
+ }
- ret = main_loop(door_fd, cmd_listen_fd);
+ if(ret == 2) {
+ log_printf(ERROR, "%s error, trying to reopen in 5 seconds..", opt.door_dev_);
+ if(door_fd > 0)
+ close(door_fd);
+ sleep(5);
+ }
+ else
+ break;
+ }
close(cmd_listen_fd);
- close(door_fd);
+ if(door_fd > 0)
+ close(door_fd);
if(!ret)
log_printf(NOTICE, "normal shutdown");
else if(ret < 0)
log_printf(NOTICE, "shutdown after error");
- else if(ret == 2)
- log_printf(ERROR, "shutdown after %s read error", opt.door_dev_);
else
log_printf(NOTICE, "shutdown after signal");