summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--switchctl.c177
1 files changed, 99 insertions, 78 deletions
diff --git a/switchctl.c b/switchctl.c
index 83ea464..b293015 100644
--- a/switchctl.c
+++ b/switchctl.c
@@ -76,6 +76,100 @@ int send_response(int fd, const char* response)
return ret;
}
+int process_cmd_request(const char* cmd, cmd_id_t cmd_id, const char* param, int fd, cmd_t **cmd_q, client_t* client_lst, options_t* opt)
+{
+ char* tmp = key_value_storage_find(&opt->alias_table_, param);
+ int ret = cmd_push(cmd_q, fd, cmd_id, tmp != NULL ? tmp : param);
+ if(ret)
+ return ret;
+
+ if(cmd_id == STATUS) {
+ char buf[30];
+ snprintf(buf, 30, "Current Mode: %s", opt->mode_ == MODE_MASTER ? "Master" : "Standby");
+ send_response(fd, buf);
+ client_t* client;
+ int listener_cnt = 0;
+ for(client = client_lst; client; client = client->next)
+ if(client->status_listener && client->fd != fd) {
+ send_response(client->fd, buf);
+ listener_cnt++;
+ }
+ log_printf(DEBUG, "sent status to %d additional listeners", listener_cnt);
+ }
+
+ log_printf(NOTICE, "command: %s", cmd);
+
+ return 0;
+}
+
+void process_cmd_type(const char* param, int fd, client_t* client_lst)
+{
+ if(param) {
+ client_t* client = client_find(client_lst, fd);
+ if(client) {
+ if(!strncmp(param, "master", 6))
+ client->type = MASTER;
+ else if(!strncmp(param, "standby", 7))
+ client->type = STANDBY;
+ else if(!strncmp(param, "heartbeat", 9))
+ client->type = HEARTBEAT;
+ else {
+ log_printf(DEBUG, "unkown client type '%s'", param);
+ return;
+ }
+ log_printf(DEBUG, "client %d type set to %s", fd, param);
+ }
+ else
+ log_printf(ERROR, "unable to set client type for %d: client not found", fd);
+ }
+ else
+ log_printf(ERROR, "unable to set client type for %d: empty parameter", fd);
+}
+
+
+void process_cmd_mode(const char* param, options_t* opt)
+{
+ if(param) {
+ if(!strncmp(param, "master", 6))
+ opt->mode_ = MODE_MASTER;
+ else if(!strncmp(param, "standby", 7))
+ opt->mode_ = MODE_STANDBY;
+ else {
+ log_printf(DEBUG, "unkown mode '%s'", param);
+ return;
+ }
+ }
+ else
+ log_printf(ERROR, "unable to set mode: empty parameter");
+}
+
+void process_cmd_listen(const char* param, int fd, client_t* client_lst)
+{
+ 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);
+ return;
+ }
+ }
+ log_printf(DEBUG, "listener %d requests %s messages", fd, param ? param:"all");
+ }
+ else
+ log_printf(ERROR, "unable to add listener %d", fd);
+}
+
int process_cmd(const char* cmd, int fd, cmd_t **cmd_q, client_t* client_lst, options_t* opt)
{
log_printf(DEBUG, "processing command from %d", fd);
@@ -105,7 +199,7 @@ int process_cmd(const char* cmd, int fd, cmd_t **cmd_q, client_t* client_lst, op
if(param)
param++;
- if(cmd_id == SWITCH) {
+ if(cmd_id == SWITCH || cmd_id == MODE) {
char* resp;
asprintf(&resp, "Request: %s", cmd);
if(resp) {
@@ -127,60 +221,13 @@ int process_cmd(const char* cmd, int fd, cmd_t **cmd_q, client_t* client_lst, op
switch(cmd_id) {
case SWITCH:
case STATUS: {
- char* tmp = key_value_storage_find(&opt->alias_table_, param);
- int ret = cmd_push(cmd_q, fd, cmd_id, tmp != NULL ? tmp : param);
+ int ret = process_cmd_request(cmd, cmd_id, param, fd, cmd_q, client_lst, opt);
if(ret)
return ret;
-
- if(cmd_id == STATUS) {
- char buf[30];
- snprintf(buf, 30, "Current Mode: %s", opt->mode_ == MODE_MASTER ? "Master" : "Standby");
- send_response(fd, buf);
- }
-
- log_printf(NOTICE, "command: %s", cmd);
- break;
- }
- case TYPE: {
- if(param) {
- client_t* client = client_find(client_lst, fd);
- if(client) {
- if(!strncmp(param, "master", 6))
- client->type = MASTER;
- else if(!strncmp(param, "standby", 7))
- client->type = STANDBY;
- else if(!strncmp(param, "heartbeat", 9))
- client->type = HEARTBEAT;
- else {
- log_printf(DEBUG, "unkown client type '%s'", param);
- break;
- }
- log_printf(DEBUG, "client %d type set to %s", fd, param);
- }
- else
- log_printf(ERROR, "unable to set client type for %d: client not found", fd);
- }
- else
- log_printf(ERROR, "unable to set client type for %d: empty parameter", fd);
-
- break;
- }
- case MODE: {
- if(param) {
- if(!strncmp(param, "master", 6))
- opt->mode_ = MODE_MASTER;
- else if(!strncmp(param, "standby", 7))
- opt->mode_ = MODE_STANDBY;
- else {
- log_printf(DEBUG, "unkown mode '%s'", param);
- break;
- }
- }
- else
- log_printf(ERROR, "unable to set mode: empty parameter", fd);
-
break;
}
+ case TYPE: process_cmd_type(param, fd, client_lst); break;
+ case MODE: process_cmd_mode(param, opt); break;
case LOG: {
if(param && param[0])
log_printf(NOTICE, "ext msg: %s", param);
@@ -188,33 +235,7 @@ int process_cmd(const char* cmd, int fd, cmd_t **cmd_q, client_t* client_lst, op
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;
- }
+ case LISTEN: process_cmd_listen(param, fd, client_lst); break;
}
return 0;