autosample sends actual command now
[svn42.git] / powersensordaemon / autosample.c
index 63dd5c8..b79e1b9 100644 (file)
@@ -24,6 +24,8 @@
 #include "options.h"
 #include "log.h"
 
+#include <stdlib.h>
+#include <stdio.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 
 #include "autosample.h"
  
+int send_sample_cmd(int fd, const char* device_name)
+{
+  if(!device_name)
+    return -1;
+
+  char* buf;
+  int len = asprintf(&buf, "sample %s\n", device_name);
+  if(len <= 0)
+    return len;
+  int offset = 0;
+  int ret;
+  for(;;) {
+    ret = write(fd, &buf[offset], len - offset);
+    if(ret < 0) {
+      if(errno != EINTR) {
+        free(buf);
+        return ret;
+      }
+
+      ret = 0;
+    }
+
+    offset += ret;
+    if(offset+1 >= len)
+      break;
+  }
+  free(buf);
+
+  if(ret > 0)
+    return 0;
+
+  return ret;
+}
+
 int start_autosample_process(options_t* opt)
 {
   int pipefd[2];
@@ -51,18 +87,41 @@ int start_autosample_process(options_t* opt)
   }
   
   if (cpid == 0) {
-    close(pipefd[1]);
-    return autosample_process(opt, pipefd[0]);
+    close(pipefd[0]);
+    return autosample_process(opt, pipefd[1]);
   }
 
-  close(pipefd[0]);
-  return pipefd[1];
+  close(pipefd[1]);
+  return pipefd[0];
 }
 
 int autosample_process(options_t *opt, int pipefd)
 {
   log_printf(NOTICE, "autosample process just started");
 
+  int device_num = key_value_storage_length(&opt->autosampledevs_);
+  if(device_num <= 0) {
+    log_printf(WARNING, "autosample no devices to sample, exiting");
+    return 0;
+  }
+
+  autosample_device_t* devices = malloc(sizeof(autosample_device_t)*device_num);
+  if(!devices) {
+    log_printf(WARNING, "autosample memory error, exiting");
+    return -3;
+  }
+
+  int i = 0;
+  string_list_element_t* k = opt->autosampledevs_.keys_.first_;
+  string_list_element_t* v = opt->autosampledevs_.values_.first_;
+  while(k && v) {
+    devices[i].delay_ = atoi(v->string_);
+    devices[i].cnt_ = 0;
+    devices[i].device_name_ = k->string_;
+    k = k->next_;
+    v = v->next_;
+  }
+
   int sig_fd = signal_init();
   if(sig_fd < 0)
     return -3;
@@ -82,9 +141,17 @@ int autosample_process(options_t *opt, int pipefd)
     }
     if(ret == -1)
       continue;
-//    if(!ret) {
-          // timout has expired...
-//    }
+    if(!ret) {
+      int i;
+      for(i = 0; i < device_num; i++) {
+        devices[i].cnt_++;
+        if(devices[i].cnt_ >= devices[i].delay_) {
+          log_printf(DEBUG, "autosample send sample command for '%s'", devices[i].device_name_);
+          send_sample_cmd(pipefd, devices[i].device_name_);
+          devices[i].cnt_ = 0;
+        }
+      }
+    }
 
     if(FD_ISSET(sig_fd, &readfds)) {
       if(signal_handle()) {
@@ -95,6 +162,7 @@ int autosample_process(options_t *opt, int pipefd)
   }
 
   signal_stop();
+  free(devices);
   return return_value;
 }