⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 raid.c

📁 读取磁盘RAID信息的源代码,适用于DELL硬盘等型号的硬盘
💻 C
字号:
/*! raid.c  dell硬盘检测入口*/#include <sys/ioctl.h>#include <sys/param.h>#include <sys/queue.h>#include <limits.h>#include <err.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <ctype.h>#include "raid.h"#include <sys/stat.h>#include "Attr_API.h"struct locator {	int channel;	int target;	int lun;};/* RAID IOCTL Operation Definition */struct raid_ioctl_operations {	int	(*raid_ioctl_init)();	int	(*raid_ioctl_end)();	int 	(*raid_ioctl_sel_adapt)(unsigned char adapt_no);	int 	(*raid_ioctl)(unsigned int cmd, char *addr);	char	raid_card_name[DEV_NAME_LEN];};/*获取raid状态的api, raid_ioctl_ops[0]用于sas  perc5接口的硬盘	raid_ioctl_ops[1]用于scsi perc4硬盘*/static struct raid_ioctl_operations raid_ioctl_ops[] = {	{		.raid_ioctl_init = megasas_ioctl_init, 	.raid_ioctl_end = megasas_ioctl_end, 	.raid_ioctl_sel_adapt = megasas_ioctl_sel_adapt,	.raid_ioctl = megasas_ioctl, 	"PERC5"	}, 	{		.raid_ioctl_init = megascsi_ioctl_init, 	.raid_ioctl_end = megascsi_ioctl_end, 	.raid_ioctl_sel_adapt = megascsi_ioctl_sel_adapt,	.raid_ioctl = megascsi_ioctl, 	"PERCSCSI"	}};//全局api 函数指针int	(*raid_ioctl_init)();int	(*raid_ioctl_end)();int 	(*raid_ioctl_sel_adapt)(unsigned char adapt_no);int	(*raid_ioctl)(unsigned int cmd, char *addr);char	raid_card_name[DEV_NAME_LEN];void mio_inq(char *);struct mio_locate bl;/* 功能:创建设备文件并获取设备raid信息	返回:卷数目*/int  QueryRaidStatus(int *raidLevel, struct raid_ioctl_operations* poperation);/*功能:获取raid状态   参数:devnum 设备号,praidinfo存储探测结果  返回: 0 获取失败                其他  ,返回volume数量*/int  GetRaidStatus(int devnum, int *raidLevel){	char sCommand[1024]={0};	int num=0;	system("rm /dev/megadev0");	snprintf(sCommand, sizeof(sCommand),"mknod  /dev/megadev0 c %d 0",devnum);	system(sCommand);	if((num=QueryRaidStatus(raidLevel, &raid_ioctl_ops[0]) )>0)		return num;	if((num=QueryRaidStatus(raidLevel, &raid_ioctl_ops[1]) )>0)		return num;	return 0;}  int mio_inq_2(char *name, int *raidLevel);/*	功能:根据指定的api,获取接口信息	参数:praidinfo 保存探测的设备状态		     poperation  api指针集	返回:<=0获取状态失败			>0 获取的volume数目*/int  QueryRaidStatus(int *raidLevel, struct raid_ioctl_operations* poperation){	int numv=0;	raid_ioctl_init = poperation->raid_ioctl_init;	raid_ioctl_end = poperation->raid_ioctl_end;	raid_ioctl_sel_adapt = poperation->raid_ioctl_sel_adapt;	raid_ioctl = poperation->raid_ioctl;	strcpy(raid_card_name, poperation->raid_card_name);	if (raid_ioctl_init()) {		//printf("MEGA SAS IOCTL initialization failed\n");		return -1;	}		raid_ioctl_sel_adapt(0);	numv=mio_inq_2(raid_card_name, raidLevel);	raid_ioctl_end();	return numv;}/*	功能:DELL硬盘检测入口函数,该函数完成检测功能	*/int ReadDellRaidInfo(){	FILE* fp=NULL;	char cCommand[1024]={0};	char devinfo[300]={0};    int raidLevel = -1;	int retflag=0;		snprintf(cCommand,sizeof(cCommand),"cat /proc/devices |grep mega");	fp=popen(cCommand,"r");	if(NULL==fp)	{		//printf("there's no mega device\n");		return raidLevel;	}		while(!feof(fp))	{		int len=0;		int devno=0;		memset(devinfo,0,sizeof(devinfo));		fgets(devinfo,sizeof(devinfo),fp);		devinfo[sizeof(devinfo)-1]='\0';		//printf("%s\n",devinfo);		len=strlen(devinfo);		if(0==len)		{			//printf("this line is empty\n");			//fprintf(g_outfd,"this line is empty\n");			continue;		}		devinfo[len-1]='\0';		//printf("Dell_Raid_Chek:%s\n",devinfo);		//fprintf(g_outfd,"Dell_Raid_Chek:%s\n",devinfo);		devno=atoi(devinfo);		retflag=GetRaidStatus(devno, &raidLevel);		if(retflag<=0)		{			continue;		}		else		{		    break;		}		//printf("vnum:%d\n",tmpraiddeisinfo._volumenum);		//fprintf(g_outfd,"vnum:%d\n",tmpraiddeisinfo._volumenum);			}	pclose(fp);    return raidLevel;}/*	功能:获取raid状态,结果保存在praidinfo中	参数: name 接口名			*/int mio_inq_2(char *name, int *raidLevel){	int rv, i;	struct mioc_inq bi;	struct mioc_vol bv;    (void)name;		memset(&bi, 0, sizeof(bi));	bi.bi_cookie = bl.bl_cookie;	rv = raid_ioctl(MIOC_INQ, (char *)&bi);	if (rv == -1) {		warn("MIOC_INQ");		return -1;	}	for (i = 0; i < bi.bi_novol; i++) 	{		memset(&bv, 0, sizeof(bv));		bv.bv_cookie = bl.bl_cookie;		bv.bv_volid = i;		rv = raid_ioctl(MIOC_VOL, (char *)&bv);		if (rv == -1) 		{			warn("MIOC_VOL");			return -1;		}		/*		if (name && strcmp(name, bv.bv_dev) != 0)		{			continue;		}*/		if ((bv.bv_level == -1) && (bv.bv_nodisk == 1))		{			continue;		}		else if ((bv.bv_level == -2) && (bv.bv_nodisk == 1))		{			continue;		}		else 		{            *raidLevel = bv.bv_level;			//printf("the raid level is RAID%u\n", *raidLevel);		}	}	return bi.bi_novol;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -