diff options
author | okir@lst.de <okir@lst.de> | 2007-06-18 18:46:11 -0500 |
---|---|---|
committer | Mike Christie <michaelc@cs.wisc.edu> | 2007-06-18 18:46:11 -0500 |
commit | 11ac2bc37c0cd86364294079d2867aabef62f7d7 (patch) | |
tree | 9a04370da6c163a214e8ecec9ba01ae72387b75e /usr/mgmt_ipc.c | |
parent | 5426940c8c6e51260c0204e144cdafcde7868338 (diff) | |
download | open-iscsi-11ac2bc37c0cd86364294079d2867aabef62f7d7.tar.gz |
Introduce array of MGMT IPC handler functions
With all MGMT_IPC handlers now following a common API,
we can replace the switch() statement with an array
of function pointers.
Signed-off-by: olaf.kirch@oracle.com
Diffstat (limited to 'usr/mgmt_ipc.c')
-rw-r--r-- | usr/mgmt_ipc.c | 83 |
1 files changed, 32 insertions, 51 deletions
diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c index 0ba4a55..310706f 100644 --- a/usr/mgmt_ipc.c +++ b/usr/mgmt_ipc.c @@ -361,13 +361,32 @@ mgmt_ipc_write_rsp(queue_task_t *qtask, mgmt_ipc_err_e err) free(qtask); } +static mgmt_ipc_fn_t * mgmt_ipc_functions[__MGMT_IPC_MAX_COMMAND] = { +[MGMT_IPC_SESSION_LOGIN] = mgmt_ipc_session_login, +[MGMT_IPC_SESSION_LOGOUT] = mgmt_ipc_session_logout, +[MGMT_IPC_SESSION_SYNC] = mgmt_ipc_session_sync, +[MGMT_IPC_SESSION_STATS] = mgmt_ipc_session_getstats, +[MGMT_IPC_SEND_TARGETS] = mgmt_ipc_send_targets, +[MGMT_IPC_SESSION_INFO] = mgmt_ipc_session_info, +[MGMT_IPC_CONN_ADD] = mgmt_ipc_conn_add, +[MGMT_IPC_CONN_REMOVE] = mgmt_ipc_conn_remove, +[MGMT_IPC_CONFIG_INAME] = mgmt_ipc_cfg_initiatorname, +[MGMT_IPC_CONFIG_IALIAS] = mgmt_ipc_cfg_initiatoralias, +[MGMT_IPC_CONFIG_FILE] = mgmt_ipc_cfg_filename, +[MGMT_IPC_IMMEDIATE_STOP] = mgmt_ipc_immediate_stop, +[MGMT_IPC_ISNS_DEV_ATTR_QUERY] = mgmt_ipc_isns_dev_attr_query, +[MGMT_IPC_SET_HOST_PARAM] = mgmt_ipc_host_set_param, +}; + static void mgmt_ipc_handle(int accept_fd) { struct sockaddr addr; + unsigned int command; int fd, err; iscsiadm_req_t *req; queue_task_t *qtask = NULL; + mgmt_ipc_fn_t *handler = NULL; char user[PEERUSER_MAX]; socklen_t len; @@ -396,61 +415,23 @@ mgmt_ipc_handle(int accept_fd) return; } - qtask->rsp.command = req->command; - - switch(req->command) { - case MGMT_IPC_SESSION_LOGIN: - err = mgmt_ipc_session_login(qtask); - break; - case MGMT_IPC_SESSION_LOGOUT: - err = mgmt_ipc_session_logout(qtask); - break; - case MGMT_IPC_SESSION_SYNC: - err = mgmt_ipc_session_sync(qtask); - break; - case MGMT_IPC_SESSION_STATS: - err = mgmt_ipc_session_getstats(qtask); - break; - case MGMT_IPC_SEND_TARGETS: - err = mgmt_ipc_send_targets(qtask); - break; - case MGMT_IPC_SESSION_INFO: - err = mgmt_ipc_session_info(qtask); - break; - case MGMT_IPC_CONN_ADD: - err = mgmt_ipc_conn_add(qtask); - break; - case MGMT_IPC_CONN_REMOVE: - err = mgmt_ipc_conn_remove(qtask); - break; - case MGMT_IPC_CONFIG_INAME: - err = mgmt_ipc_cfg_initiatorname(qtask); - break; - case MGMT_IPC_CONFIG_IALIAS: - err = mgmt_ipc_cfg_initiatoralias(qtask); - break; - case MGMT_IPC_CONFIG_FILE: - err = mgmt_ipc_cfg_filename(qtask); - break; - case MGMT_IPC_IMMEDIATE_STOP: - err = mgmt_ipc_immediate_stop(qtask); - break; - case MGMT_IPC_ISNS_DEV_ATTR_QUERY: - err = mgmt_ipc_isns_dev_attr_query(qtask); - break; - case MGMT_IPC_SET_HOST_PARAM: - err = mgmt_ipc_host_set_param(qtask); - break; - default: + command = qtask->req.command; + qtask->rsp.command = command; + + if (0 <= command && command < __MGMT_IPC_MAX_COMMAND) + handler = mgmt_ipc_functions[command]; + if (handler != NULL) { + /* If the handler returns OK, this means it + * already sent the reply. */ + err = handler(qtask); + if (err == MGMT_IPC_OK) + return; + } else { log_error("unknown request: %s(%d) %u", - __FUNCTION__, __LINE__, req->command); + __FUNCTION__, __LINE__, command); err = MGMT_IPC_ERR_INVALID_REQ; - break; } - if (err == MGMT_IPC_OK) - return; - err: /* This will send the response, close the * connection and free the qtask */ |