[PATCH 2/5] ietadm protocol extensions: C_ACCT_LIST and support for rsp data

View: New views
1 Messages — Rating Filter:   Alert me  

[PATCH 2/5] ietadm protocol extensions: C_ACCT_LIST and support for rsp data

by Arne Redlich-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Extend 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
LightInTheBox - Buy quality products at wholesale price