char c;
switch(cmd->cmd) {
- case POWER: {
- c = 'A'; // get command from powerids[cmd->param]
+ case POWER_ON: {
+ if(!cmd->param)
+ return 0;
+ c = toupper(cmd->param[0]);
+ break;
+ }
+ case POWER_OFF: {
+ if(!cmd->param)
+ return 0;
+ c = tolower(cmd->param[0]);
break;
}
case SAMPLE: {
- c = 'T'; // get command from sampledevs[cmd->param]
+ if(!cmd->param)
+ return 0;
+ c = cmd->param[0];
break;
}
default: return 0;
log_printf(DEBUG, "sent %s to %d additional listeners", TYPE_NAME,listener_cnt);
-int process_cmd(const char* cmd, int fd, cmd_t **cmd_q, client_t* client_lst)
+int process_cmd(char* cmd, int fd, cmd_t **cmd_q, client_t* client_lst, options_t* opt)
{
log_printf(DEBUG, "processing command from %d", fd);
return -1;
cmd_id_t cmd_id;
- if(!strncmp(cmd, "power", 5))
- cmd_id = POWER;
+ if(!strncmp(cmd, "power on", 8)) {
+ cmd_id = POWER_ON;
+ cmd[5] = '_';
+ }
+ else if(!strncmp(cmd, "power off", 9)) {
+ cmd_id = POWER_OFF;
+ cmd[5] = '_';
+ }
else if(!strncmp(cmd, "sample", 6))
cmd_id = SAMPLE;
else if(!strncmp(cmd, "log", 3))
return 0;
}
char* param = strchr(cmd, ' ');
- if(param)
+ if(param)
param++;
- if(cmd_id == POWER || cmd_id == SAMPLE) {
+ if(cmd_id == POWER_ON || cmd_id == POWER_OFF) {
+ char* orig_param = 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);
+ }
+ }
+
+ if(cmd_id == SAMPLE) {
+ char* orig_param = 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);
+ }
+ }
+
+ if(cmd_id == POWER_ON || cmd_id == POWER_OFF || cmd_id == SAMPLE) {
char* resp;
asprintf(&resp, "Request: %s", cmd);
if(resp) {
}
switch(cmd_id) {
- case POWER:
+ case POWER_ON:
+ case POWER_OFF:
case SAMPLE: {
int ret = cmd_push(cmd_q, fd, cmd_id, param);
if(ret)
return 0;
}
-int nonblock_recvline(read_buffer_t* buffer, int fd, cmd_t** cmd_q, client_t* client_lst)
+int nonblock_recvline(read_buffer_t* buffer, int fd, cmd_t** cmd_q, client_t* client_lst, options_t* opt)
{
int ret = 0;
for(;;) {
if(buffer->buf[buffer->offset] == '\n') {
buffer->buf[buffer->offset] = 0;
- ret = process_cmd(buffer->buf, fd, cmd_q, client_lst);
+ ret = process_cmd(buffer->buf, fd, cmd_q, client_lst, opt);
buffer->offset = 0;
break;
}
return ret;
}
-int main_loop(int tty_fd, int cmd_listen_fd)
+int main_loop(int tty_fd, int cmd_listen_fd, options_t* opt)
{
log_printf(NOTICE, "entering main loop");
client_t* lst = client_lst;
while(lst) {
if(FD_ISSET(lst->fd, &tmpfds)) {
- return_value = nonblock_recvline(&(lst->buffer), lst->fd, &cmd_q, client_lst);
+ return_value = nonblock_recvline(&(lst->buffer), lst->fd, &cmd_q, client_lst, opt);
if(return_value == 2) {
log_printf(DEBUG, "removing closed command connection (fd=%d)", lst->fd);
client_t* deletee = lst;
}
}
log_printf(NOTICE, "just started...");
- options_parse_post(&opt);
+ if(options_parse_post(&opt)) {
+ options_clear(&opt);
+ log_close();
+ exit(-1);
+ }
+
+ options_print(&opt);
priv_info_t priv;
if(opt.username_)
if(ret)
ret = 2;
else
- ret = main_loop(tty_fd, cmd_listen_fd);
+ ret = main_loop(tty_fd, cmd_listen_fd, &opt);
}
if(ret == 2) {