X-Git-Url: https://git.realraum.at/?p=svn42.git;a=blobdiff_plain;f=door_daemon%2Fdoor_daemon.c;h=bddb28fc371209019d2a80421d47bed46718db1f;hp=f7bb2f834e4f7d8eb44952c71393a689e7fe3e36;hb=4ee2501ff864b8e15202ee814e8bafcc0c2adf6c;hpb=273898a7a155895de69cde048b96f6ffb5f1fc47 diff --git a/door_daemon/door_daemon.c b/door_daemon/door_daemon.c index f7bb2f8..bddb28f 100644 --- a/door_daemon/door_daemon.c +++ b/door_daemon/door_daemon.c @@ -6,8 +6,9 @@ * 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 @@ -38,7 +39,6 @@ #include "client_list.h" #include "daemon.h" -#include "sysexec.h" int init_command_socket(const char* path) { @@ -111,7 +111,7 @@ int send_response(int fd, const char* response) 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; @@ -171,10 +171,14 @@ int process_cmd(const char* cmd, int fd, cmd_t **cmd_q, client_t* client_lst) 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) + 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 } @@ -289,6 +293,9 @@ int process_door(read_buffer_t* buffer, int door_fd, cmd_t **cmd_q, client_t* cl 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; @@ -299,16 +306,24 @@ int process_door(read_buffer_t* buffer, int door_fd, cmd_t **cmd_q, client_t* cl 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) + 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->error_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); @@ -416,7 +431,8 @@ int main_loop(int door_fd, int cmd_listen_fd) break; } - lst = lst->next; + if(lst) + lst = lst->next; } if(cmd_q && !cmd_q->sent)