to github
[svn42.git] / powersensordaemon / powersensordaemon.c
index 8b12743..133533e 100644 (file)
@@ -100,24 +100,26 @@ int send_command(int tty_fd, cmd_t* cmd)
   if(!cmd)
     return -1;
   
-  char c;
+  if(!cmd->param)
+    return 0;
+
+  unsigned int j,cmd_param_len = strnlen(cmd->param,60);
+  char c[cmd_param_len];
   switch(cmd->cmd) {
   case POWER_ON: {
-    if(!cmd->param)
-      return 0;
-    c = toupper(cmd->param[0]);
+    for (j=0; j< cmd_param_len; j++)
+      c[j] = toupper(cmd->param[j]);
     break;
   }
   case POWER_OFF: {
-    if(!cmd->param)
-      return 0;
-    c = tolower(cmd->param[0]);
+    for (j=0; j< cmd_param_len; j++)
+      c[j] = tolower(cmd->param[j]);
     break;
   }
   case SAMPLE: {
-    if(!cmd->param)
-      return 0;
-    c = cmd->param[0];
+    for (j=0; j< cmd_param_len; j++)
+      c[j] = cmd->param[j];
     break;
   }
   default: return 0;
@@ -125,7 +127,7 @@ int send_command(int tty_fd, cmd_t* cmd)
   
   int ret;
   do {
-    ret = write(tty_fd, &c, 1);
+    ret = write(tty_fd, c, cmd_param_len);
   } while(!ret || (ret == -1 && errno == EINTR));
 
   if(ret > 0) {
@@ -211,7 +213,7 @@ int process_cmd(char* cmd, int fd, cmd_t **cmd_q, client_t* client_lst, options_
 
   if(cmd_id == POWER_ON || cmd_id == POWER_OFF) {
     char* orig_param = param;
-    param = key_value_storage_find(&opt->powerids_, param);
+    param = key_value_storage_find(&(opt->powerids_), param);
     if(!param) {
       send_response(fd, "Error: invalid power id");
       log_printf(WARNING, "invalid power id '%s' in command from %d", orig_param, fd);
@@ -220,7 +222,7 @@ int process_cmd(char* cmd, int fd, cmd_t **cmd_q, client_t* client_lst, options_
 
   if(cmd_id == SAMPLE) {
     char* orig_param = param;
-    param = key_value_storage_find(&opt->sampledevs_, param);
+    param = key_value_storage_find(&(opt->sampledevs_), param);
     if(!param) {
       send_response(fd, "Error: invalid sample device");
       log_printf(WARNING, "invalid sample device '%s' in command from %d", orig_param, fd);
@@ -330,8 +332,9 @@ int nonblock_readline(read_buffer_t* buffer, int fd, cmd_t** cmd_q, client_t* cl
   return ret;
 }
 
-int process_tty(read_buffer_t* buffer, int tty_fd, cmd_t **cmd_q, client_t* client_lst)
+int process_tty(read_buffer_t* buffer, int tty_fd, cmd_t **cmd_q, client_t* client_lst, options_t* opt)
 {
+  u_int8_t *response_data;
   int ret = 0;
   struct timeval tv;
   fd_set fds;
@@ -363,28 +366,54 @@ int process_tty(read_buffer_t* buffer, int tty_fd, cmd_t **cmd_q, client_t* clie
 
       log_printf(NOTICE, "firmware: %s", buffer->buf);      
 
+      /* modify response if necessary */
+      response_data = buffer->buf;
+      if(!strncmp(buffer->buf, "Sensor ", 7)) {
+        if (buffer->buf[7] != 0)
+        {
+          char *sampledev_key;
+          if (asprintf(&sampledev_key, "%c",buffer->buf[7]))
+          {
+            char const *sampledev_name = key_value_storage_find_first_stringvalue(&(opt->sampledevs_), sampledev_key);
+            if(sampledev_name)
+            {
+              char *rev_lookuped_output;
+              if (asprintf(&rev_lookuped_output, "%s%s", sampledev_name, &(buffer->buf[8]) ))
+                response_data = rev_lookuped_output;
+            }
+            else
+              log_printf(WARNING, "unknown sample device key '%s' encountered", sampledev_key);
+            free(sampledev_key);
+          }
+        }
+      }
+
       int cmd_fd = -1;
       if(cmd_q && (*cmd_q)) {
         cmd_fd = (*cmd_q)->fd;
-        send_response(cmd_fd, buffer->buf);
+        send_response(cmd_fd, response_data);
       }
       
       if(!strncmp(buffer->buf, "Error:", 6)) {
-        SEND_TO_LISTENER(error_listener, "error", cmd_fd, buffer->buf);
+        SEND_TO_LISTENER(error_listener, "error", cmd_fd, response_data);
       }
       
       if(!strncmp(buffer->buf, "movement", 8)) {
-        SEND_TO_LISTENER(movement_listener, "movement", cmd_fd, buffer->buf);
+        SEND_TO_LISTENER(movement_listener, "movement", cmd_fd, response_data);
       }
 
       if(!strncmp(buffer->buf, "PanicButton", 11)) {
-        SEND_TO_LISTENER(button_listener, "panic button", cmd_fd, buffer->buf);
+        SEND_TO_LISTENER(button_listener, "panic button", cmd_fd, response_data);
       }
 
       if(!strncmp(buffer->buf, "Sensor ", 7)) {
-        SEND_TO_LISTENER(sensor_listener, "", cmd_fd, buffer->buf);
+        SEND_TO_LISTENER(sensor_listener, "sensor data", cmd_fd, response_data);
       }
 
+      /* free allocated buffer if response was modified */
+      if (response_data != buffer->buf)
+        free(response_data);
+
       cmd_pop(cmd_q);
       buffer->offset = 0;
       return 0;
@@ -413,7 +442,7 @@ int main_loop(int tty_fd, int cmd_listen_fd, autosample_process_t* autosample, o
   FD_SET(cmd_listen_fd, &readfds);
   int max_fd = tty_fd > cmd_listen_fd ? tty_fd : cmd_listen_fd;
 
-  int autosample_enabled = 0;
+  u_int8_t autosample_enabled = 0;
   if(autosample->pid_ > 0) {
     clear_fd(autosample->write_fd_);
     FD_SET(autosample->write_fd_, &readfds);
@@ -465,7 +494,7 @@ int main_loop(int tty_fd, int cmd_listen_fd, autosample_process_t* autosample, o
     }
    
     if(FD_ISSET(tty_fd, &tmpfds)) {
-      return_value = process_tty(&tty_buffer, tty_fd, &cmd_q, client_lst);
+      return_value = process_tty(&tty_buffer, tty_fd, &cmd_q, client_lst, opt);
       if(return_value)
         break;
     }
@@ -513,7 +542,8 @@ int main_loop(int tty_fd, int cmd_listen_fd, autosample_process_t* autosample, o
           break;
 
       }
-      lst = lst->next;
+      if(lst)
+        lst = lst->next;
     }
 
     if(cmd_q && !cmd_q->sent)