mirror of https://github.com/ipxe/ipxe.git
Fix root-path parsing.
parent
cc80750694
commit
ef9fd938d0
|
@ -1360,6 +1360,10 @@ static int iscsi_parse_lun ( struct iscsi_session *iscsi,
|
||||||
} lun;
|
} lun;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* Empty LUN; assume LUN 0 */
|
||||||
|
if ( ! *lun_string )
|
||||||
|
return 0;
|
||||||
|
|
||||||
for ( i = 0 ; i < 4 ; i++ ) {
|
for ( i = 0 ; i < 4 ; i++ ) {
|
||||||
lun.u16[i] = strtoul ( p, &p, 16 );
|
lun.u16[i] = strtoul ( p, &p, 16 );
|
||||||
if ( *p != '-' )
|
if ( *p != '-' )
|
||||||
|
@ -1382,49 +1386,44 @@ static int iscsi_parse_lun ( struct iscsi_session *iscsi,
|
||||||
*/
|
*/
|
||||||
static int iscsi_parse_root_path ( struct iscsi_session *iscsi,
|
static int iscsi_parse_root_path ( struct iscsi_session *iscsi,
|
||||||
const char *root_path ) {
|
const char *root_path ) {
|
||||||
const char *p = root_path;
|
char rp_copy[ strlen ( root_path ) + 1 ];
|
||||||
char *fragment;
|
char *rp_comp[NUM_RP_COMPONENTS];
|
||||||
size_t len;
|
char *rp = rp_copy;
|
||||||
enum iscsi_root_path_component i;
|
int i = 0;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
for ( i = 0 ; i < NUM_RP_COMPONENTS ; i++ ) {
|
/* Split root path into component parts */
|
||||||
len = strcspn ( p, ":" );
|
strcpy ( rp_copy, root_path );
|
||||||
fragment = strndup ( p, len );
|
while ( 1 ) {
|
||||||
if ( ! fragment ) {
|
rp_comp[i++] = rp;
|
||||||
DBGC ( iscsi, "iSCSI %p could not duplicate root "
|
if ( i == NUM_RP_COMPONENTS )
|
||||||
"path component at %s\n", iscsi, p );
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
switch ( i ) {
|
|
||||||
case RP_SERVERNAME:
|
|
||||||
iscsi->target_address = fragment;
|
|
||||||
break;
|
break;
|
||||||
case RP_PORT:
|
for ( ; *rp != ':' ; rp++ ) {
|
||||||
iscsi->target_port = strtoul ( fragment, NULL, 10 );
|
if ( ! *rp ) {
|
||||||
if ( ! iscsi->target_port )
|
DBGC ( iscsi, "iSCSI %p root path \"%s\" "
|
||||||
iscsi->target_port = ISCSI_PORT;
|
"too short\n", iscsi, root_path );
|
||||||
free ( fragment );
|
return -EINVAL;
|
||||||
break;
|
|
||||||
case RP_LUN:
|
|
||||||
rc = iscsi_parse_lun ( iscsi, fragment );
|
|
||||||
free ( fragment );
|
|
||||||
if ( rc != 0 ) {
|
|
||||||
DBGC ( iscsi, "iSCSI %p invalid LUN %s\n",
|
|
||||||
iscsi, fragment );
|
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
case RP_TARGETNAME:
|
|
||||||
iscsi->target_iqn = fragment;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
free ( fragment );
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
p += len;
|
*(rp++) = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Use root path components to configure iSCSI session */
|
||||||
|
iscsi->target_address = strdup ( rp_comp[RP_SERVERNAME] );
|
||||||
|
if ( ! iscsi->target_address )
|
||||||
|
return -ENOMEM;
|
||||||
|
iscsi->target_port = strtoul ( rp_comp[RP_PORT], NULL, 10 );
|
||||||
|
if ( ! iscsi->target_port )
|
||||||
|
iscsi->target_port = ISCSI_PORT;
|
||||||
|
if ( ( rc = iscsi_parse_lun ( iscsi, rp_comp[RP_LUN] ) ) != 0 ) {
|
||||||
|
DBGC ( iscsi, "iSCSI %p invalid LUN \"%s\"\n",
|
||||||
|
iscsi, rp_comp[RP_LUN] );
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
iscsi->target_iqn = strdup ( rp_comp[RP_TARGETNAME] );
|
||||||
|
if ( ! iscsi->target_iqn )
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue