URL PARSER
Add a function to parse a common iscsi://... URL so we dont have to re implement the same code in every application
This commit is contained in:
@@ -18,6 +18,15 @@
|
|||||||
struct iscsi_context;
|
struct iscsi_context;
|
||||||
struct sockaddr;
|
struct sockaddr;
|
||||||
|
|
||||||
|
struct iscsi_url {
|
||||||
|
const char *portal;
|
||||||
|
const char *target;
|
||||||
|
int lun;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iscsi_url *iscsi_parse_full_url(struct iscsi_context *iscsi, const char *url);
|
||||||
|
void iscsi_destroy_url(struct iscsi_url *iscsi_url);
|
||||||
|
|
||||||
|
|
||||||
const char *iscsi_get_error(struct iscsi_context *iscsi);
|
const char *iscsi_get_error(struct iscsi_context *iscsi);
|
||||||
|
|
||||||
|
|||||||
75
lib/init.c
75
lib/init.c
@@ -206,4 +206,79 @@ iscsi_is_logged_in(struct iscsi_context *iscsi)
|
|||||||
return iscsi->is_loggedin;
|
return iscsi->is_loggedin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct iscsi_url *
|
||||||
|
iscsi_parse_full_url(struct iscsi_context *iscsi, const char *url)
|
||||||
|
{
|
||||||
|
struct iscsi_url *iscsi_url;
|
||||||
|
char *portal;
|
||||||
|
char *target;
|
||||||
|
char *lun;
|
||||||
|
|
||||||
|
if (strncmp(url, "iscsi://", 8)) {
|
||||||
|
iscsi_set_error(iscsi, "Invalid URL %s\niSCSI URL must be of the form \"iscsi://<host>[:<port>]/<target-iqn>/<lun>\"\n", url);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
portal = strdup(url + 8);
|
||||||
|
if (portal == NULL) {
|
||||||
|
iscsi_set_error(iscsi, "Out-of-memory: Failed to strdup url %s\n", url);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
target = index(portal, '/');
|
||||||
|
if (target == NULL) {
|
||||||
|
iscsi_set_error(iscsi, "Invalid URL %s\niSCSI URL must be of the form \"iscsi://<host>[:<port>]/<target-iqn>/<lun>\"\n", url);
|
||||||
|
free(portal);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
*target++ = 0;
|
||||||
|
|
||||||
|
lun = index(target, '/');
|
||||||
|
if (lun == NULL) {
|
||||||
|
iscsi_set_error(iscsi, "Invalid URL %s\niSCSI URL must be of the form \"iscsi://<host>[:<port>]/<target-iqn>/<lun>\"\n", url);
|
||||||
|
free(portal);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
*lun++ = 0;
|
||||||
|
|
||||||
|
|
||||||
|
iscsi_url = malloc(sizeof(struct iscsi_url));
|
||||||
|
if (iscsi_url == NULL) {
|
||||||
|
iscsi_set_error(iscsi, "Out-of-memory: Failed to allocate iscsi_url structure\n");
|
||||||
|
free(portal);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memset(iscsi_url, 0, sizeof(struct iscsi_url));
|
||||||
|
|
||||||
|
iscsi_url->portal = strdup(portal);
|
||||||
|
if (iscsi_url->portal == NULL) {
|
||||||
|
iscsi_set_error(iscsi, "Out-of-memory: Failed to strdup portal string\n");
|
||||||
|
iscsi_destroy_url(iscsi_url);
|
||||||
|
free(portal);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
iscsi_url->target = strdup(target);
|
||||||
|
if (iscsi_url->target == NULL) {
|
||||||
|
iscsi_set_error(iscsi, "Out-of-memory: Failed to strdup target string\n");
|
||||||
|
iscsi_destroy_url(iscsi_url);
|
||||||
|
free(portal);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
iscsi_url->lun = atoi(lun);
|
||||||
|
free(portal);
|
||||||
|
return iscsi_url;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
iscsi_destroy_url(struct iscsi_url *iscsi_url)
|
||||||
|
{
|
||||||
|
if (iscsi_url == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(discard_const(iscsi_url->portal));
|
||||||
|
free(discard_const(iscsi_url->target));
|
||||||
|
free(iscsi_url);
|
||||||
|
}
|
||||||
|
|||||||
@@ -157,9 +157,8 @@ int main(int argc, const char *argv[])
|
|||||||
struct iscsi_context *iscsi;
|
struct iscsi_context *iscsi;
|
||||||
const char **extra_argv;
|
const char **extra_argv;
|
||||||
int extra_argc = 0;
|
int extra_argc = 0;
|
||||||
char *portal = NULL;
|
const char *url = NULL;
|
||||||
char *target = NULL;
|
struct iscsi_url *iscsi_url = NULL;
|
||||||
char *lun = NULL;
|
|
||||||
int evpd = 0, pagecode = 0;
|
int evpd = 0, pagecode = 0;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
@@ -179,7 +178,7 @@ int main(int argc, const char *argv[])
|
|||||||
}
|
}
|
||||||
extra_argv = poptGetArgs(pc);
|
extra_argv = poptGetArgs(pc);
|
||||||
if (extra_argv) {
|
if (extra_argv) {
|
||||||
portal = strdup(*extra_argv);
|
url = *extra_argv;
|
||||||
extra_argv++;
|
extra_argv++;
|
||||||
while (extra_argv[extra_argc]) {
|
while (extra_argv[extra_argc]) {
|
||||||
extra_argc++;
|
extra_argc++;
|
||||||
@@ -187,50 +186,31 @@ int main(int argc, const char *argv[])
|
|||||||
}
|
}
|
||||||
poptFreeContext(pc);
|
poptFreeContext(pc);
|
||||||
|
|
||||||
if (portal == NULL) {
|
|
||||||
fprintf(stderr, "You must specify target portal\n");
|
|
||||||
fprintf(stderr, "%s [options] iscsi://<host>[:<port>]/<target-iqn>/<lun>\n", argv[0]);
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
if (strncmp(portal, "iscsi://", 8)) {
|
|
||||||
fprintf(stderr, "Incorrect portal specified\n");
|
|
||||||
fprintf(stderr, "Portal is specified as \"iscsi://<host>[:<port>]/<target-iqn>/<lun>\"\n");
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
portal += 8;
|
|
||||||
|
|
||||||
target = index(portal, '/');
|
|
||||||
if (target == NULL) {
|
|
||||||
fprintf(stderr, "You must specify target-iqn name\n");
|
|
||||||
fprintf(stderr, "Portal is specified as \"iscsi://<host>[:<port>]/<target-iqn>/<lun>\"\n");
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
*target++ = 0;
|
|
||||||
|
|
||||||
lun = index(target, '/');
|
|
||||||
if (lun == NULL) {
|
|
||||||
fprintf(stderr, "You must specify target-iqn name\n");
|
|
||||||
fprintf(stderr, "Portal is specified as \"iscsi://<host>[:<port>]/<target-iqn>/<lun>\"\n");
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
*lun++ = 0;
|
|
||||||
|
|
||||||
iscsi = iscsi_create_context(initiator);
|
iscsi = iscsi_create_context(initiator);
|
||||||
if (iscsi == NULL) {
|
if (iscsi == NULL) {
|
||||||
fprintf(stderr, "Failed to create context\n");
|
fprintf(stderr, "Failed to create context\n");
|
||||||
exit(10);
|
exit(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
iscsi_set_targetname(iscsi, target);
|
iscsi_url = iscsi_parse_full_url(iscsi, url);
|
||||||
iscsi_set_session_type(iscsi, ISCSI_SESSION_NORMAL);
|
if (iscsi_url == NULL) {
|
||||||
iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
|
fprintf(stderr, "Failed to parse URL : %s\n", url);
|
||||||
|
|
||||||
if (iscsi_full_connect_sync(iscsi, portal, atoi(lun)) != 0) {
|
|
||||||
fprintf(stderr, "Failed to log in to target %s\n", iscsi_get_error(iscsi));
|
|
||||||
exit(10);
|
exit(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
do_inquiry(iscsi, atoi(lun), evpd, pagecode);
|
iscsi_set_targetname(iscsi, iscsi_url->target);
|
||||||
|
iscsi_set_session_type(iscsi, ISCSI_SESSION_NORMAL);
|
||||||
|
iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
|
||||||
|
|
||||||
|
if (iscsi_full_connect_sync(iscsi, iscsi_url->portal, iscsi_url->lun) != 0) {
|
||||||
|
fprintf(stderr, "Failed to log in to target %s\n", iscsi_get_error(iscsi));
|
||||||
|
iscsi_destroy_url(iscsi_url);
|
||||||
|
iscsi_destroy_context(iscsi);
|
||||||
|
exit(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
do_inquiry(iscsi, iscsi_url->lun, evpd, pagecode);
|
||||||
|
iscsi_destroy_url(iscsi_url);
|
||||||
|
|
||||||
iscsi_logout_sync(iscsi);
|
iscsi_logout_sync(iscsi);
|
||||||
iscsi_destroy_context(iscsi);
|
iscsi_destroy_context(iscsi);
|
||||||
|
|||||||
Reference in New Issue
Block a user