+ ret = write(fd, "\n", 1);
+ } while(!ret || (ret == -1 && errno == EINTR));
+
+ if(ret > 0)
+ return 0;
+
+ return ret;
+}
+
+int process_cmd(const char* cmd, int fd, cmd_t **cmd_q, client_t* client_lst)
+{
+ log_printf(DEBUG, "processing command from %d", fd);
+
+ if(!cmd_q || !cmd)
+ return -1;
+
+ cmd_id_t cmd_id;
+ if(!strncmp(cmd, "open", 4))
+ cmd_id = OPEN;
+ else if(!strncmp(cmd, "close", 5))
+ cmd_id = CLOSE;
+ else if(!strncmp(cmd, "toggle", 6))
+ cmd_id = TOGGLE;
+ else if(!strncmp(cmd, "reset", 5))
+ cmd_id = RESET;
+ else if(!strncmp(cmd, "status", 6))
+ cmd_id = STATUS;
+ else if(!strncmp(cmd, "log", 3))
+ cmd_id = LOG;
+ else if(!strncmp(cmd, "listen", 6)) {
+ cmd_id = LISTEN;
+ }
+ else {
+ log_printf(WARNING, "unknown command '%s'", cmd);
+ return 0;
+ }
+ char* param = strchr(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;
+ for(client = client_lst; client; client = client->next)
+ if(client->request_listener && client->fd != fd)
+ send_response(client->fd, resp);
+ free(resp);
+ }
+// else silently ignore memory alloc error
+ }