Merge pull request #461 from plieven/feat/targetname_redirect

feat: allow targetname redirect
This commit is contained in:
Ronnie Sahlberg
2025-09-12 17:33:42 +10:00
committed by GitHub
2 changed files with 29 additions and 13 deletions

View File

@@ -112,6 +112,7 @@ struct iscsi_context {
char initiator_name[MAX_ISCSI_NAME_SIZE+1]; char initiator_name[MAX_ISCSI_NAME_SIZE+1];
char target_name[MAX_ISCSI_NAME_SIZE+1]; char target_name[MAX_ISCSI_NAME_SIZE+1];
char target_address[MAX_STRING_SIZE+1]; /* If a redirect */ char target_address[MAX_STRING_SIZE+1]; /* If a redirect */
char target_name2[MAX_ISCSI_NAME_SIZE+1]; /* If a redirect */
char connected_portal[MAX_STRING_SIZE+1]; char connected_portal[MAX_STRING_SIZE+1];
char portal[MAX_STRING_SIZE+1]; char portal[MAX_STRING_SIZE+1];
char alias[MAX_STRING_SIZE+1]; char alias[MAX_STRING_SIZE+1];

View File

@@ -117,11 +117,19 @@ iscsi_login_add_targetname(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
return -1; return -1;
} }
if (iscsi->target_address[0] && iscsi->target_name2[0] &&
getenv("LIBISCSI_ALLOW_TARGETNAME_REDIRECT") != NULL) {
if (snprintf(str, MAX_STRING_SIZE, "TargetName=%s", iscsi->target_name2) == -1) {
iscsi_set_error(iscsi, "Out-of-memory: aprintf failed.");
return -1;
}
ISCSI_LOG(iscsi, 2, "rewriting TargetName to %s (non-RFC-compliant!)", iscsi->target_name2);
} else {
if (snprintf(str, MAX_STRING_SIZE, "TargetName=%s", iscsi->target_name) == -1) { if (snprintf(str, MAX_STRING_SIZE, "TargetName=%s", iscsi->target_name) == -1) {
iscsi_set_error(iscsi, "Out-of-memory: aprintf failed."); iscsi_set_error(iscsi, "Out-of-memory: aprintf failed.");
return -1; return -1;
} }
}
if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str)+1) if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str)+1)
!= 0) { != 0) {
iscsi_set_error(iscsi, "Out-of-memory: pdu add data failed."); iscsi_set_error(iscsi, "Out-of-memory: pdu add data failed.");
@@ -1330,6 +1338,10 @@ iscsi_process_login_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
strncpy(iscsi->target_address,ptr+14,MAX_STRING_SIZE); strncpy(iscsi->target_address,ptr+14,MAX_STRING_SIZE);
} }
if (!strncmp(ptr, "TargetName=", 11)) {
strncpy(iscsi->target_name2,ptr+11,MAX_ISCSI_NAME_SIZE);
}
if (!strncmp(ptr, "HeaderDigest=", 13)) { if (!strncmp(ptr, "HeaderDigest=", 13)) {
if (!strcmp(ptr + 13, "CRC32C")) { if (!strcmp(ptr + 13, "CRC32C")) {
iscsi->want_header_digest iscsi->want_header_digest
@@ -1486,7 +1498,10 @@ iscsi_process_login_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
} }
if (status == SCSI_STATUS_REDIRECT && iscsi->target_address[0]) { if (status == SCSI_STATUS_REDIRECT && iscsi->target_address[0]) {
ISCSI_LOG(iscsi, 2, "target requests redirect to %s",iscsi->target_address); ISCSI_LOG(iscsi, 2, "target requests redirect to portal %s",iscsi->target_address);
if (iscsi->target_name2[0] && getenv("LIBISCSI_ALLOW_TARGETNAME_REDIRECT") != NULL) {
ISCSI_LOG(iscsi, 2, "target requests redirect to targetname %s (non-RFC-compliant!)",iscsi->target_name2);
}
if (pdu->callback) { if (pdu->callback) {
pdu->callback(iscsi, SCSI_STATUS_REDIRECT, NULL, pdu->callback(iscsi, SCSI_STATUS_REDIRECT, NULL,
pdu->private_data); pdu->private_data);