cleaned up mifare-read
[svn42.git] / door_daemon / door_daemon.c
index 0f64580..cf12668 100644 (file)
@@ -84,8 +84,7 @@ int send_command(int door_fd, cmd_t* cmd)
   int ret;
   do {
     ret = write(door_fd, &c, 1);
-  }
-  while(!ret);
+  } while(!ret || (ret == -1 && errno == EINTR));
 
   if(ret > 0) {
     cmd->sent = 1;
@@ -95,6 +94,37 @@ int send_command(int door_fd, cmd_t* cmd)
   return ret;
 }
 
+int send_response(int fd, const char* response)
+{
+  if(!response)
+    return -1;
+
+  int len = strlen(response);
+  int offset = 0;
+  int ret;
+  for(;;) {
+    ret = write(fd, &response[offset], strlen(response));
+    if(ret < 0) {
+      if(errno != EINTR)
+        return ret;
+
+      ret = 0;
+    }
+
+    offset += ret;
+    if(offset+1 >= len)
+      break;
+  }
+  do {
+    ret = write(fd, "\n", 1);
+  } while(!ret || (ret == -1 && errno == EINTR));
+
+  if(ret > 0)
+    return 0;
+
+  return ret;
+}
+
 int handle_command(const char* cmd, int fd, cmd_t** cmd_q)
 {
   if(!cmd_q || !cmd)
@@ -150,7 +180,7 @@ int process_cmd(int fd, cmd_t **cmd_q)
 {
   static char buffer[100];
   int ret = 0;
-  do {
+  do { // TODO: replace this whith a actually working readline
     memset(buffer, 0, 100);
     ret = recv(fd, buffer, sizeof(buffer), 0);
     if(!ret)
@@ -173,14 +203,25 @@ int process_door(int door_fd, cmd_t **cmd_q)
 {
   static char buffer[100];
   int ret = 0;
-  do {
+  do { // TODO: replace this whith a actually working readline
     memset(buffer, 0, 100);
     ret = read(door_fd, buffer, sizeof(buffer));
     if(!ret) 
       return 2;
+    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;
+
+      cmd_pop(cmd_q);
+    } while(tok = strtok_r(NULL, "\n\r", &saveptr));
   } while (ret == -1 && errno == EINTR);
 
-  log_printf(INFO, "processing data from door (fd=%d)", door_fd);
+  log_printf(DEBUG, "processing data from door (fd=%d)", door_fd);
 
   return 0;
 }
@@ -197,7 +238,12 @@ int main_loop(int door_fd, int cmd_listen_fd)
   int max_fd = door_fd > cmd_listen_fd ? door_fd : cmd_listen_fd;
   cmd_t* cmd_q = NULL;
 
-  signal_init();
+  int sig_fd = signal_init();
+  if(sig_fd < 0)
+    return -1;
+  FD_SET(sig_fd, &readfds);
+  max_fd = (max_fd < sig_fd) ? sig_fd : max_fd;
+
   int return_value = 0;
   while(!return_value) {
     memcpy(&tmpfds, &readfds, sizeof(tmpfds));
@@ -208,13 +254,14 @@ int main_loop(int door_fd, int cmd_listen_fd)
       return_value = -1;
       break;
     }
-    if(!ret)
+    if(!ret || ret == -1)
       continue;
 
-    if(signal_exit) {
+    if(signal_handle()) {
       return_value = 1;
       break;
     }
+    FD_CLR(sig_fd, &tmpfds);
 
     if(FD_ISSET(door_fd, &tmpfds)) {
       return_value = process_door(door_fd, &cmd_q);
@@ -249,14 +296,15 @@ int main_loop(int door_fd, int cmd_listen_fd)
         }
         if(return_value)
           break;
-
-        if(cmd_q && !cmd_q->sent)
-          send_command(door_fd, cmd_q);
       }
     }
+
+    if(cmd_q && !cmd_q->sent)
+      send_command(door_fd, cmd_q);
   }
 
   cmd_clear(&cmd_q);
+  signal_stop();
   return return_value;
 }