|
View:
New views
1 Messages
—
Rating Filter:
Alert me
|
|
|
[PATCH 2/5] ietadm protocol extensions: C_ACCT_LIST and support for rsp dataExtend the ietadm protocol
- to support returning additional rsp data - prepare C_ACCT_LIST to retrieve a list of accounts. To maintain backward compatibility, the allocation length, count and overflow fields were added to the modified msg_acnt request and not to the generic ietadm request header. --- usr/ietadm.c | 40 +++++++++++++++++++++++++++------------- usr/ietadm.h | 15 +++++++++++++-- usr/message.c | 26 +++++++++++++++++++------- 3 files changed, 59 insertions(+), 22 deletions(-) diff --git a/usr/ietadm.c b/usr/ietadm.c index ccc6684..c0fa4dd 100644 --- a/usr/ietadm.c +++ b/usr/ietadm.c @@ -144,7 +144,8 @@ static int ietd_request_send(int fd, struct ietadm_req *req) return err; } -static int ietd_response_recv(int fd, struct ietadm_req *req) +static int ietd_response_recv(int fd, struct ietadm_req *req, void *rsp_data, + size_t rsp_data_sz) { int err, ret; struct iovec iov[2]; @@ -163,6 +164,15 @@ static int ietd_response_recv(int fd, struct ietadm_req *req) } else err = rsp.err; + if (!err && rsp_data_sz && rsp_data) { + ret = read(fd, rsp_data, rsp_data_sz); + if (ret != rsp_data_sz) { + err = (ret < 0) ? -errno : -EIO; + fprintf(stderr, "%s %d %d %d\n", __FUNCTION__, + __LINE__, ret, err); + } + } + return err; } @@ -185,7 +195,8 @@ static int ietd_connect(void) return fd; } -static int ietd_request(struct ietadm_req *req) +static int ietd_request(struct ietadm_req *req, void *rsp_data, + size_t rsp_data_sz) { int fd = -1, err = -EIO; @@ -197,7 +208,7 @@ static int ietd_request(struct ietadm_req *req) if ((err = ietd_request_send(fd, req)) < 0) goto out; - err = ietd_response_recv(fd, req); + err = ietd_response_recv(fd, req, rsp_data, rsp_data_sz); out: if (fd > 0) @@ -320,7 +331,7 @@ static int trgt_handle(int op, u32 set, u32 tid, char *params) break; } - err = ietd_request(&req); + err = ietd_request(&req, NULL, 0); if (!err && req.rcmnd == C_TRGT_SHOW) show_iscsi_param(key_target, req.u.trgt.target_param); @@ -359,7 +370,7 @@ static int lunit_handle(int op, u32 set, u32 tid, u32 lun, char *params) break; } - err = ietd_request(&req); + err = ietd_request(&req, NULL, 0); out: return err; } @@ -387,7 +398,7 @@ static int sess_handle(int op, u32 set, u32 tid, u64 sid, char *params) break; case OP_SHOW: req.rcmnd = C_SESS_SHOW; - err = ietd_request(&req); + err = ietd_request(&req, NULL, 0); if (!err) show_iscsi_param(key_session, req.u.trgt.session_param); break; @@ -448,10 +459,12 @@ static int user_handle_new(struct ietadm_req *req, char *user, char *pass) req->rcmnd = C_ACCT_NEW; - strncpy(req->u.acnt.user, user, sizeof(req->u.acnt.user) - 1); - strncpy(req->u.acnt.pass, pass, sizeof(req->u.acnt.pass) - 1); + strncpy(req->u.acnt.u.user.name, user, + sizeof(req->u.acnt.u.user.name) - 1); + strncpy(req->u.acnt.u.user.pass, pass, + sizeof(req->u.acnt.u.user.pass) - 1); - return ietd_request(req); + return ietd_request(req, NULL, 0); } static int user_handle_del(struct ietadm_req *req, char *user, char *pass) @@ -465,9 +478,10 @@ static int user_handle_del(struct ietadm_req *req, char *user, char *pass) req->rcmnd = C_ACCT_DEL; - strncpy(req->u.acnt.user, user, sizeof(req->u.acnt.user) - 1); + strncpy(req->u.acnt.u.user.name, user, + sizeof(req->u.acnt.u.user.name) - 1); - return ietd_request(req); + return ietd_request(req, NULL, 0); } static int user_handle(int op, u32 set, u32 tid, char *params) @@ -531,7 +545,7 @@ static int conn_handle(int op, u32 set, u32 tid, u64 sid, u32 cid, char *params) break; } - err = ietd_request(&req); + err = ietd_request(&req, NULL, 0); out: return err; } @@ -555,7 +569,7 @@ static int sys_handle(int op, u32 set, char *params) break; } - err = ietd_request(&req); + err = ietd_request(&req, NULL, 0); return err; } diff --git a/usr/ietadm.h b/usr/ietadm.h index 6493843..1f0ba33 100644 --- a/usr/ietadm.h +++ b/usr/ietadm.h @@ -16,8 +16,17 @@ struct msg_trgt { struct msg_acnt { u32 auth_dir; - char user[ISCSI_NAME_LEN]; - char pass[ISCSI_NAME_LEN]; + union { + struct { + char name[ISCSI_NAME_LEN]; + char pass[ISCSI_NAME_LEN]; + } user; + struct { + u32 alloc_len; + u32 count; + u32 overflow; + } list; + } u; }; struct msg_lunit { @@ -54,6 +63,8 @@ enum ietadm_cmnd { C_SYS_DEL, C_SYS_UPDATE, C_SYS_SHOW, + + C_ACCT_LIST, }; struct ietadm_req { diff --git a/usr/message.c b/usr/message.c index 0c9be88..15c3f51 100644 --- a/usr/message.c +++ b/usr/message.c @@ -6,6 +6,7 @@ #include <errno.h> #include <stdio.h> +#include <stdlib.h> #include <unistd.h> #include <sys/socket.h> @@ -37,7 +38,8 @@ int ietadm_request_listen(void) return fd; } -static void ietadm_request_exec(struct ietadm_req *req, struct ietadm_rsp *rsp) +static void ietadm_request_exec(struct ietadm_req *req, struct ietadm_rsp *rsp, + void **rsp_data, size_t *rsp_data_sz) { int err = 0; @@ -99,12 +101,15 @@ static void ietadm_request_exec(struct ietadm_req *req, struct ietadm_rsp *rsp) break; case C_ACCT_NEW: - err = cops->account_add(req->tid, req->u.acnt.auth_dir, req->u.acnt.user, - req->u.acnt.pass); + err = cops->account_add(req->tid, req->u.acnt.auth_dir, + req->u.acnt.u.user.name, + req->u.acnt.u.user.pass); break; case C_ACCT_DEL: - err = cops->account_del(req->tid, req->u.acnt.auth_dir, req->u.acnt.user); + err = cops->account_del(req->tid, req->u.acnt.auth_dir, + req->u.acnt.u.user.name); break; + case C_ACCT_LIST: case C_ACCT_UPDATE: case C_ACCT_SHOW: break; @@ -132,7 +137,9 @@ int ietadm_request_handle(int accept_fd) socklen_t len; struct ietadm_req req; struct ietadm_rsp rsp; - struct iovec iov[2]; + struct iovec iov[3]; + void *rsp_data = NULL; + size_t rsp_data_sz; memset(&rsp, 0, sizeof(rsp)); len = sizeof(addr); @@ -162,17 +169,22 @@ int ietadm_request_handle(int accept_fd) goto out; } - ietadm_request_exec(&req, &rsp); + ietadm_request_exec(&req, &rsp, &rsp_data, &rsp_data_sz); send: iov[0].iov_base = &req; iov[0].iov_len = sizeof(req); iov[1].iov_base = &rsp; iov[1].iov_len = sizeof(rsp); + iov[2].iov_base = rsp.err ? NULL : rsp_data; + iov[2].iov_len = iov[2].iov_base ? rsp_data_sz : 0; - err = writev(fd, iov, 2); + err = writev(fd, iov, 2 + !!iov[2].iov_len); out: if (fd > 0) close(fd); + if (rsp_data) + free(rsp_data); + return err; } -- 1.5.4.3 ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://sourceforge.net/services/buy/index.php _______________________________________________ Iscsitarget-devel mailing list Iscsitarget-devel@... https://lists.sourceforge.net/lists/listinfo/iscsitarget-devel |
| Free Forum Powered by Nabble | Forum Help |