Example #1
0
/**
 *  Main function.
 */
int main(int argc, char *argv[])
{
   char *fileName;
   const char fileMode[] = "r+";
   unsigned int baud;
   int fd;

   fileName = getDeviceFileName(argc, argv);
   fd = openDeviceFile(fileName, fileMode);
   baud = getBaudRate(argc, argv);
   setAttr(fd, baud);
   displayResult(fd);
   sendCommand(fd, "?");
   displayResult(fd);
   sound(fd*10);
   printf("\n");
   nosound();
   close(fd);
   return EXIT_SUCCESS;
}
MP_STATUS
MP_GetMPLogicalUnitProperties(MP_OID oid,
				MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES *pProps)
{
	mp_iocdata_t		mp_ioctl;
	mp_logical_unit_prop_t	luInfo;

	MP_OID overridePathOID;

	int ioctlStatus = 0;

	int vendorLength   = 0;
	int productLength  = 0;
	int revisionLength = 0;

	char *deviceFileName = NULL;


	MP_STATUS mpStatus = MP_STATUS_SUCCESS;


	log(LOG_INFO, "MP_GetMPLogicalUnitProperties()", " - enter");


	log(LOG_INFO, "MP_GetMPLogicalUnitProperties()",
	    "oid.objectSequenceNumber = %llx",
	    oid.objectSequenceNumber);

	if (g_scsi_vhci_fd < 0) {
		log(LOG_INFO, "MP_GetMPLogicalUnitProperties()",
		    "invalid driver file handle");
		log(LOG_INFO, "MP_GetMPLogicalUnitProperties()",
		    " - error exit");
		return (MP_STATUS_FAILED);
	}

	(void) memset(&mp_ioctl, 0, sizeof (mp_iocdata_t));
	(void) memset(&luInfo,   0, sizeof (mp_logical_unit_prop_t));

	mp_ioctl.mp_cmd  = MP_GET_LU_PROP;
	mp_ioctl.mp_ibuf = (caddr_t)&oid.objectSequenceNumber;
	mp_ioctl.mp_ilen = sizeof (oid.objectSequenceNumber);
	mp_ioctl.mp_obuf = (caddr_t)&luInfo;
	mp_ioctl.mp_olen = sizeof (mp_logical_unit_prop_t);
	mp_ioctl.mp_xfer = MP_XFER_READ;

	ioctlStatus = ioctl(g_scsi_vhci_fd, MP_CMD, &mp_ioctl);

	log(LOG_INFO, "MP_GetMPLogicalUnitProperties()",
	    " IOCTL call returned: %d", ioctlStatus);

	if (ioctlStatus < 0) {
		ioctlStatus = errno;
	}

	if (ioctlStatus != 0) {
		log(LOG_INFO, "MP_GetMPLogicalUnitProperties()",
		    "IOCTL call failed.  IOCTL error is: %d",
		    ioctlStatus);
		log(LOG_INFO, "MP_GetMPLogicalUnitProperties()",
		    "IOCTL call failed.  IOCTL error is: %s",
		    strerror(ioctlStatus));
		log(LOG_INFO, "MP_GetMPLogicalUnitProperties()",
		    "IOCTL call failed.  mp_ioctl.mp_errno: %x",
		    mp_ioctl.mp_errno);

		if (ENOTSUP == ioctlStatus) {
			mpStatus = MP_STATUS_UNSUPPORTED;
		} else if (0 == mp_ioctl.mp_errno) {
			mpStatus = MP_STATUS_FAILED;
		} else {
			mpStatus = getStatus4ErrorCode(mp_ioctl.mp_errno);
		}

		log(LOG_INFO, "MP_GetMPLogicalUnitProperties()",
		    " - error exit");

		return (mpStatus);
	}

	(void) memset(pProps, 0, sizeof (MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES));

	pProps->asymmetric = luInfo.asymmetric;
	pProps->autoFailbackEnabled = luInfo.autoFailbackEnabled;
	pProps->autoProbingEnabled = luInfo.autoProbingEnabled;
	pProps->currentFailbackPollingRate = luInfo.currentFailBackPollingRate;
	pProps->currentLoadBalanceType = luInfo.currentLoadBalanceType;
	pProps->currentProbingPollingRate = luInfo.currentProbingPollingRate;


	deviceFileName = getDeviceFileName(oid.objectSequenceNumber);

	if (NULL != deviceFileName) {

		log(LOG_INFO, "MP_GetMPLogicalUnitProperties()",
		    "deviceFileName: %s",
		    deviceFileName);

		(void) strncpy(pProps->deviceFileName,
		    deviceFileName,
		    sizeof (pProps->deviceFileName) - 1);

		free(deviceFileName);
	}

	pProps->failbackPollingRateMax = luInfo.failbackPollingRateMax;
	pProps->logicalUnitGroupID = luInfo.luGroupID;

	(void) strncpy(pProps->name, luInfo.name, sizeof (pProps->name) - 1);

	pProps->nameType = luInfo.nameType;

	overridePathOID.objectSequenceNumber = luInfo.overridePathID;
	overridePathOID.objectType = MP_OBJECT_TYPE_PATH_LU;
	overridePathOID.ownerId = g_pluginOwnerID;
	(void) memcpy(&pProps->overridePath, &overridePathOID, sizeof (MP_OID));

	pProps->probingPollingRateMax = luInfo.probingPollingRateMax;


	vendorLength   = sizeof (pProps->vendor);
	productLength  = sizeof (pProps->product);
	revisionLength = sizeof (pProps->revision);

	(void) strncpy(pProps->vendor,
	    luInfo.prodInfo.vendor,
	    vendorLength);

	(void) strncpy(pProps->product,
	    luInfo.prodInfo.product,
	    productLength);

	(void) strncpy(pProps->revision,
	    luInfo.prodInfo.revision,
	    revisionLength);

	log(LOG_INFO, "MP_GetMPLogicalUnitProperties()", " - exit");

	return (MP_STATUS_SUCCESS);
}