X-Git-Url: https://git.realraum.at/?p=svn42.git;a=blobdiff_plain;f=powersensordaemon%2Fpowersensordaemon.c;h=133533e2391085edd816e5a805d76d67eb1cad09;hp=0a9467690845db54094eae666e200cca816c8037;hb=a34e51d757fe52cb19de2937ae1b211894167524;hpb=9db6a57b5f7aec4f91dda128f092d05d574ae358 diff --git a/powersensordaemon/powersensordaemon.c b/powersensordaemon/powersensordaemon.c index 0a94676..133533e 100644 --- a/powersensordaemon/powersensordaemon.c +++ b/powersensordaemon/powersensordaemon.c @@ -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); @@ -263,16 +265,14 @@ int process_cmd(char* cmd, int fd, cmd_t **cmd_q, client_t* client_lst, options_ if(!param || !strncmp(param, "all", 3)) { listener->request_listener = 1; listener->error_listener = 1; - listener->temp_listener = 1; - listener->photo_listener = 1; + listener->sensor_listener = 1; listener->movement_listener = 1; listener->button_listener = 1; } else if(!strncmp(param, "none", 4)) { listener->request_listener = 0; listener->error_listener = 0; - listener->temp_listener = 0; - listener->photo_listener = 0; + listener->sensor_listener = 0; listener->movement_listener = 0; listener->button_listener = 0; } @@ -280,10 +280,8 @@ int process_cmd(char* cmd, int fd, cmd_t **cmd_q, client_t* client_lst, options_ listener->request_listener = 1; else if(!strncmp(param, "error", 5)) listener->error_listener = 1; - else if(!strncmp(param, "temp", 4)) - listener->temp_listener = 1; - else if(!strncmp(param, "photo", 5)) - listener->photo_listener = 1; + else if(!strncmp(param, "sensor", 6)) + listener->sensor_listener = 1; else if(!strncmp(param, "movement", 8)) listener->movement_listener = 1; else if(!strncmp(param, "button", 6)) @@ -334,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; @@ -367,31 +366,53 @@ 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, "Temp ", 5)) { - SEND_TO_LISTENER(temp_listener, "", cmd_fd, buffer->buf); + if(!strncmp(buffer->buf, "Sensor ", 7)) { + SEND_TO_LISTENER(sensor_listener, "sensor data", cmd_fd, response_data); } - if(!strncmp(buffer->buf, "Photo: ", 5)) { - SEND_TO_LISTENER(photo_listener, "", cmd_fd, buffer->buf); - } + /* free allocated buffer if response was modified */ + if (response_data != buffer->buf) + free(response_data); cmd_pop(cmd_q); buffer->offset = 0; @@ -421,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); @@ -473,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; } @@ -521,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) @@ -531,7 +553,7 @@ int main_loop(int tty_fd, int cmd_listen_fd, autosample_process_t* autosample, o lst = client_lst; int listener_cnt = 0; while(lst) { - if(lst->temp_listener || lst->photo_listener) + if(lst->sensor_listener) listener_cnt++; lst = lst->next; }