int main(int argc, const char * argv[]) { iSCSIInitialize(CFRunLoopGetCurrent()); // Test commands here enum iSCSILoginStatusCode statusCode; iSCSISessionConfigRef sessCfg = iSCSISessionConfigCreateMutable(); iSCSIConnectionConfigRef connCfg = iSCSIConnectionConfigCreateMutable(); CID connectionId; SID sessionId; iSCSITargetRef target = iSCSITargetCreateMutable(); iSCSITargetSetName(target,CFSTR("iqn.2012-06.com.example:target0")); iSCSISetInitiatiorName(CFSTR("iqn.2015-01.com.test")); iSCSISetInitiatorAlias(CFSTR("default")); iSCSIPortalRef portal = iSCSIPortalCreateMutable(); iSCSIPortalSetAddress(portal,CFSTR("192.168.56.2")); iSCSIPortalSetHostInterface(portal,kiSCSIDefaultHostInterface); iSCSIPortalSetPort(portal,CFSTR("32")); iSCSIConnectionConfigSetHeaderDigest(connCfg, false); iSCSIConnectionConfigSetDataDigest(connCfg, false); // errno_t error = iSCSILoginSession(target,portal,iSCSIAuthCreateCHAP(CFSTR("user"),CFSTR("passwordpassword"),NULL,NULL),sessCfg,connCfg,&sessionId,&connectionId,&statusCode); // enum iSCSILogoutStatusCode sc; // iSCSILogoutSession(0,&sc); iSCSIDiscoveryRecRef discRec; // errno_t error = iSCSIQueryPortalForTargets(portal,iSCSIAuthCreateNone(),&discRec,&statusCode); iSCSICreateCFPropertiesForSession(target); iSCSICleanup(); return 0; }
/*! Retrieves a list of targets available from a give portal. * @param handle a handle to a daemon connection. * @param portal the iSCSI portal to look for targets. * @param authMethod the preferred authentication method. * @param statusCode iSCSI response code indicating operation status. * @return an error code indicating whether the operation was successful. */ errno_t iSCSIDaemonQueryTargetForAuthMethod(iSCSIDaemonHandle handle, iSCSIPortalRef portal, CFStringRef targetIQN, enum iSCSIAuthMethods * authMethod, enum iSCSILoginStatusCode * statusCode) { // Validate inputs if(handle < 0 || !portal || !targetIQN || !authMethod || !statusCode) return EINVAL; // Setup a target object with the target name iSCSIMutableTargetRef target = iSCSITargetCreateMutable(); iSCSITargetSetIQN(target,targetIQN); // Generate data to transmit (no longer need target object after this) CFDataRef targetData = iSCSITargetCreateData(target); iSCSITargetRelease(target); CFDataRef portalData = iSCSIPortalCreateData(portal); // Create command header to transmit iSCSIDMsgQueryTargetForAuthMethodCmd cmd = iSCSIDMsgQueryTargetForAuthMethodCmdInit; cmd.portalLength = (UInt32)CFDataGetLength(portalData); cmd.targetLength = (UInt32)CFDataGetLength(targetData); if(iSCSIDaemonSendMsg(handle,(iSCSIDMsgGeneric *)&cmd,targetData,portalData,NULL)) { CFRelease(portalData); CFRelease(targetData); return EIO; } CFRelease(portalData); CFRelease(targetData); iSCSIDMsgQueryTargetForAuthMethodRsp rsp; if(recv(handle,&rsp,sizeof(rsp),0) != sizeof(rsp)) return EIO; *authMethod = rsp.authMethod; *statusCode = rsp.statusCode; return rsp.errorCode; }