* This file is part of door_daemon.
*
* door_daemon is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3 as
- * published by the Free Software Foundation.
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * any later version.
*
* door_daemon is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
#include "client_list.h"
#include "daemon.h"
-#include "sysexec.h"
int init_command_socket(const char* path)
{
int offset = 0;
int ret;
for(;;) {
- ret = write(fd, &response[offset], strlen(response));
+ ret = write(fd, &response[offset], len - offset);
if(ret < 0) {
if(errno != EINTR)
return ret;
else if(!strncmp(cmd, "log", 3))
cmd_id = LOG;
else if(!strncmp(cmd, "listen", 6)) {
- client_t* listener = client_find(client_lst, fd);
- if(listener) {
- log_printf(DEBUG, "adding status listener %d", fd);
- listener->status_listener = 1;
- }
- else
- log_printf(ERROR, "unable to add status listener %d", fd);
-
- return 0;
+ cmd_id = LISTEN;
}
else {
log_printf(WARNING, "unknown command '%s'", cmd);
if(param)
param++;
+ if(cmd_id == OPEN || cmd_id == CLOSE || cmd_id == TOGGLE) {
+ char* resp;
+ asprintf(&resp, "Request: %s", cmd);
+ if(resp) {
+ char* linefeed = strchr(resp, '\n');
+ if(linefeed) linefeed[0] = 0;
+ client_t* client;
+ int listener_cnt = 0;
+ for(client = client_lst; client; client = client->next)
+ if(client->request_listener && client->fd != fd) {
+ send_response(client->fd, resp);
+ listener_cnt++;
+ }
+ free(resp);
+ log_printf(DEBUG, "sent request to %d additional listeners", listener_cnt);
+ }
+// else silently ignore memory alloc error
+ }
+
switch(cmd_id) {
case OPEN:
case CLOSE:
log_printf(DEBUG, "ignoring empty ext log message");
break;
}
+ case LISTEN: {
+ client_t* listener = client_find(client_lst, fd);
+ if(listener) {
+ if(!param) {
+ listener->status_listener = 1;
+ listener->error_listener = 1;
+ listener->request_listener = 1;
+ }
+ else {
+ if(!strncmp(param, "status", 6))
+ listener->status_listener = 1;
+ else if(!strncmp(param, "error", 5))
+ listener->error_listener = 1;
+ else if(!strncmp(param, "request", 7))
+ listener->request_listener = 1;
+ else {
+ log_printf(DEBUG, "unkown listener type '%s'", param);
+ break;
+ }
+ }
+ log_printf(DEBUG, "listener %d requests %s messages", fd, param ? param:"all");
+ }
+ else {
+ log_printf(ERROR, "unable to add listener %d", fd);
+ }
+ break;
+ }
}
return 0;
ret = select(door_fd+1, &fds, NULL, NULL, &tv);
if(!ret)
return 0;
+ else if(ret < 0)
+ return ret;
ret = read(door_fd, &buffer->buf[buffer->offset], 1);
if(!ret)
if(buffer->buf[buffer->offset] == '\n') {
buffer->buf[buffer->offset] = 0;
+ if(buffer->offset > 0 && buffer->buf[buffer->offset-1] == '\r')
+ buffer->buf[buffer->offset-1] = 0;
+
log_printf(NOTICE, "door-firmware: %s", buffer->buf);
int cmd_fd = -1;
if(!strncmp(buffer->buf, "Status:", 7)) {
client_t* client;
+ int listener_cnt = 0;
+ for(client = client_lst; client; client = client->next)
+ if(client->status_listener && client->fd != cmd_fd) {
+ send_response(client->fd, buffer->buf);
+ listener_cnt++;
+ }
+ log_printf(DEBUG, "sent status to %d additional listeners", listener_cnt);
+ }
+
+ if(!strncmp(buffer->buf, "Error:", 6)) {
+ client_t* client;
+ int listener_cnt = 0;
for(client = client_lst; client; client = client->next)
- if(client->status_listener && client->fd != cmd_fd)
+ if(client->error_listener && client->fd != cmd_fd) {
send_response(client->fd, buffer->buf);
+ listener_cnt++;
+ }
+ log_printf(DEBUG, "sent error to %d additional listeners", listener_cnt);
}
cmd_pop(cmd_q);
break;
}
- lst = lst->next;
+ if(lst)
+ lst = lst->next;
}
if(cmd_q && !cmd_q->sent)