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

📄 hr_disk.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
📖 第 1 页 / 共 2 页
字号:
    return LowIndex;}        /*********************	 *	 *  System specific implementation functions	 *	 *********************/u_char         *var_hrdisk(struct variable * vp,           oid * name,           size_t * length,           int exact, size_t * var_len, WriteMethod ** write_method){    int             disk_idx;    disk_idx =        header_hrdisk(vp, name, length, exact, var_len, write_method);    if (disk_idx == MATCH_FAILED)        return NULL;    switch (vp->magic) {    case HRDISK_ACCESS:        long_return = Is_It_Writeable();        return (u_char *) & long_return;    case HRDISK_MEDIA:        long_return = What_Type_Disk();        return (u_char *) & long_return;    case HRDISK_REMOVEABLE:        long_return = Is_It_Removeable();        return (u_char *) & long_return;    case HRDISK_CAPACITY:        long_return = HRD_savedCapacity;        return (u_char *) & long_return;    default:        DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrdisk\n",                    vp->magic));    }    return NULL;}        /*********************	 *	 *  Internal implementation functions	 *	 *********************/#define MAX_NUMBER_DISK_TYPES	16      /* probably should be a variable */#define MAX_DISKS_PER_TYPE	15      /* SCSI disks - not a hard limit */#define	HRDISK_TYPE_SHIFT	4       /* log2 (MAX_DISKS_PER_TYPE+1) */typedef struct {    const char     *disk_devpart_string;        /* printf() format disk part. name */    short           disk_controller;    /* controller id or -1 if NA */    short           disk_device_first;  /* first device id */    short           disk_device_last;   /* last device id */    const char     *disk_devfull_string;        /* printf() format full disk name */    short           disk_partition_first;       /* first partition id */    short           disk_partition_last;        /* last partition id */} HRD_disk_t;static HRD_disk_t disk_devices[MAX_NUMBER_DISK_TYPES];static int      HR_number_disk_types = 0;static voidAdd_HR_Disk_entry(const char *devpart_string,                  int first_ctl,                  int last_ctl,                  int first_dev,                  int last_dev,                  const char *devfull_string,                  int first_partn, int last_partn){    int lodev, hidev, nbr_created = 0;    while (first_ctl <= last_ctl) {      for (lodev = first_dev;           lodev < last_dev && MAX_NUMBER_DISK_TYPES > HR_number_disk_types;           lodev += (1+MAX_DISKS_PER_TYPE), HR_number_disk_types++)      {        nbr_created++;        /*         * Split long runs of disks into separate "types"         */        hidev = lodev + MAX_DISKS_PER_TYPE;        if (last_dev < hidev)            hidev = last_dev;        disk_devices[HR_number_disk_types].disk_devpart_string =            devpart_string;        disk_devices[HR_number_disk_types].disk_controller = first_ctl;        disk_devices[HR_number_disk_types].disk_device_first = lodev;        disk_devices[HR_number_disk_types].disk_device_last = hidev;        disk_devices[HR_number_disk_types].disk_devfull_string =            devfull_string;        disk_devices[HR_number_disk_types].disk_partition_first =            first_partn;        disk_devices[HR_number_disk_types].disk_partition_last =            last_partn;#if DEBUG_TEST        DEBUGMSGTL(("host/hr_disk",                    "Add_HR %02d '%s' first=%d last=%d\n",                    HR_number_disk_types, devpart_string, lodev, hidev));#endif      }      first_ctl++;    }    if (nbr_created == 0 || MAX_NUMBER_DISK_TYPES < HR_number_disk_types) {        HR_number_disk_types = MAX_NUMBER_DISK_TYPES;        DEBUGMSGTL(("host/hr_disk",                    "WARNING! Add_HR_Disk_entry '%s' incomplete, %d created\n",                    devpart_string, nbr_created));    }#if DEBUG_TEST    else        DEBUGMSGTL(("host/hr_disk",                    "Add_HR_Disk_entry '%s' completed, %d created\n",                    devpart_string, nbr_created));#endif}voidInit_HR_Disk(void){    HRD_type_index = 0;    HRD_index = -1;    DEBUGMSGTL(("host/hr_disk", "Init_Disk\n"));}intGet_Next_HR_Disk(void){    char            string[1024];    int             fd, result;    int             iindex;    int             max_disks;    time_t          now;    HRD_index++;    (void *) time(&now);    DEBUGMSGTL(("host/hr_disk", "Next_Disk type %d of %d\n",                HRD_type_index, HR_number_disk_types));    while (HRD_type_index < HR_number_disk_types) {        max_disks = disk_devices[HRD_type_index].disk_device_last -            disk_devices[HRD_type_index].disk_device_first + 1;        DEBUGMSGTL(("host/hr_disk", "Next_Disk max %d of type %d\n",                    max_disks, HRD_type_index));        while (HRD_index < max_disks) {            iindex = (HRD_type_index << HRDISK_TYPE_SHIFT) + HRD_index;            /*             * Check to see whether this device             *   has been probed for 'recently'             *   and skip if so.             * This has a *major* impact on run             *   times (by a factor of 10!)             */            if ((HRD_history[iindex] > 0) &&                ((now - HRD_history[iindex]) < 60)) {                HRD_index++;                continue;            }            /*             * Construct the full device name in "string"              */            if (disk_devices[HRD_type_index].disk_controller != -1) {                snprintf(string, sizeof(string),                        disk_devices[HRD_type_index].disk_devfull_string,                        disk_devices[HRD_type_index].disk_controller,                        disk_devices[HRD_type_index].disk_device_first +                        HRD_index);            } else {                snprintf(string, sizeof(string),                        disk_devices[HRD_type_index].disk_devfull_string,                        disk_devices[HRD_type_index].disk_device_first +                        HRD_index);            }            string[ sizeof(string)-1 ] = 0;            DEBUGMSGTL(("host/hr_disk", "Get_Next_HR_Disk: %s (%d/%d)\n",                        string, HRD_type_index, HRD_index));            if (HRD_history[iindex] == -1) {                /*                 * check whether this device is in the "ignoredisk" list in                 * the config file. if yes this device will be marked as                 * invalid for the future, i.e. it won't ever be checked                 * again.                 */                if (match_disk_config(string)) {                    /*                     * device name matches entry in ignoredisk list                      */                    DEBUGMSGTL(("host/hr_disk",                                "Get_Next_HR_Disk: %s ignored\n", string));                    HRD_history[iindex] = LONG_MAX;                    HRD_index++;                    continue;                }            }            /*             * use O_NDELAY to avoid CDROM spin-up and media detection             * * (too slow) --okir              */            /*             * at least with HP-UX 11.0 this doesn't seem to work properly             * * when accessing an empty CDROM device --jsf              */#ifdef O_NDELAY                 /* I'm sure everything has it, but just in case...  --Wes */            fd = open(string, O_RDONLY | O_NDELAY);#else            fd = open(string, O_RDONLY);#endif            if (fd != -1) {                result = Query_Disk(fd, string);                close(fd);                if (result != -1) {                    HRD_history[iindex] = 0;                    return ((HRDEV_DISK << HRDEV_TYPE_SHIFT) + iindex);                }            }            HRD_history[iindex] = now;            HRD_index++;        }        HRD_type_index++;        HRD_index = 0;    }    HRD_index = -1;    return -1;}intGet_Next_HR_Disk_Partition(char *string, size_t str_len, int HRP_index){    DEBUGMSGTL(("host/hr_disk", "Next_Partition type %d/%d:%d\n",                HRD_type_index, HRD_index, HRP_index));    /*     * no more partition names => return -1      */    if (disk_devices[HRD_type_index].disk_partition_last -        disk_devices[HRD_type_index].disk_partition_first + 1        <= HRP_index) {        return -1;    }    /*     * Construct the partition name in "string"      */    if (disk_devices[HRD_type_index].disk_controller != -1) {        snprintf(string, str_len,                disk_devices[HRD_type_index].disk_devpart_string,                disk_devices[HRD_type_index].disk_controller,                disk_devices[HRD_type_index].disk_device_first + HRD_index,                disk_devices[HRD_type_index].disk_partition_first +                HRP_index);    } else {        snprintf(string, str_len,                disk_devices[HRD_type_index].disk_devpart_string,                disk_devices[HRD_type_index].disk_device_first + HRD_index,                disk_devices[HRD_type_index].disk_partition_first +                HRP_index);    }    string[ str_len-1 ] = 0;    DEBUGMSGTL(("host/hr_disk",                "Get_Next_HR_Disk_Partition: %s (%d/%d:%d)\n", string,                HRD_type_index, HRD_index, HRP_index));    return 0;}static voidSave_HR_Disk_Specific(void){#ifdef DIOC_DESCRIBE    HRD_savedIntf_type = HRD_info.intf_type;    HRD_savedDev_type = HRD_info.dev_type;    HRD_savedFlags = HRD_info.flags;    HRD_savedCapacity = HRD_cap.lba / 2;#endif#ifdef DKIOCINFO    HRD_savedCtrl_type = HRD_info.dki_ctype;    HRD_savedFlags = HRD_info.dki_flags;    HRD_savedCapacity = HRD_cap.dkg_ncyl * HRD_cap.dkg_nhead * HRD_cap.dkg_nsect / 2;   /* ??? */#endif#ifdef HAVE_LINUX_HDREG_H    HRD_savedCapacity = HRD_info.lba_capacity / 2;    HRD_savedFlags = HRD_info.config;#endif#ifdef DIOCGDINFO    HRD_savedCapacity = HRD_info.d_secperunit / 2;#endif}static voidSave_HR_Disk_General(void){#ifdef DIOC_DESCRIBE    strncpy(HRD_savedModel, HRD_info.model_num, sizeof(HRD_savedModel)-1);    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;#endif#ifdef DKIOCINFO    strncpy(HRD_savedModel, HRD_info.dki_dname, sizeof(HRD_savedModel)-1);    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;#endif#ifdef HAVE_LINUX_HDREG_H    strncpy(HRD_savedModel, (const char *) HRD_info.model,                    sizeof(HRD_savedModel)-1);    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;#endif#ifdef DIOCGDINFO    strncpy(HRD_savedModel, dktypenames[HRD_info.d_type],                    sizeof(HRD_savedModel)-1);    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;#endif}static const char *describe_disk(int idx){    if (HRD_savedModel[0] == '\0')        return ("some sort of disk");    else        return (HRD_savedModel);}static intQuery_Disk(int fd, const char *devfull){    int             result = -1;#ifdef DIOC_DESCRIBE    result = ioctl(fd, DIOC_DESCRIBE, &HRD_info);    if (result != -1)        result = ioctl(fd, DIOC_CAPACITY, &HRD_cap);#endif#ifdef DKIOCINFO    result = ioctl(fd, DKIOCINFO, &HRD_info);    if (result != -1)        result = ioctl(fd, DKIOCGGEOM, &HRD_cap);#endif#ifdef HAVE_LINUX_HDREG_H    if (HRD_type_index == 0)    /* IDE hard disk */        result = ioctl(fd, HDIO_GET_IDENTITY, &HRD_info);    else if (HRD_type_index <= 2) {     /* SCSI hard disk and md devices */        long            h;        result = ioctl(fd, BLKGETSIZE, &h);        if (result != -1 && HRD_type_index == 2 && h == 0L)            result = -1;        /* ignore empty md devices */        if (result != -1) {            HRD_info.lba_capacity = h;            if (HRD_type_index == 1)                snprintf( HRD_info.model, sizeof(HRD_info.model)-1,                         "SCSI disk (%s)", devfull);            else                snprintf( HRD_info.model, sizeof(HRD_info.model)-1,                        "RAID disk (%s)", devfull);            HRD_info.model[ sizeof(HRD_info.model)-1 ] = 0;            HRD_info.config = 0;        }    }#endif#ifdef DIOCGDINFO    result = ioctl(fd, DIOCGDINFO, &HRD_info);#endif    return (result);}static intIs_It_Writeable(void){#ifdef DIOC_DESCRIBE    if ((HRD_savedFlags & WRITE_PROTECT_FLAG) ||        (HRD_savedDev_type == CDROM_DEV_TYPE))        return (2);             /* read only */#endif#ifdef DKIOCINFO    if (HRD_savedCtrl_type == DKC_CDROM)        return (2);             /* read only */#endif    return (1);                 /* read-write */}static intWhat_Type_Disk(void){#ifdef DIOC_DESCRIBE    switch (HRD_savedDev_type) {    case DISK_DEV_TYPE:        if (HRD_savedIntf_type == PC_FDC_INTF)            return (4);         /* Floppy Disk */        else            return (3);         /* Hard Disk */        break;    case CDROM_DEV_TYPE:        return (5);             /* Optical RO */        break;    case WORM_DEV_TYPE:        return (6);             /* Optical WORM */        break;    case MO_DEV_TYPE:        return (7);             /* Optical R/W */        break;    default:        return (2);             /* Unknown */        break;    }#endif#ifdef DKIOCINFO    switch (HRD_savedCtrl_type) {    case DKC_WDC2880:    case DKC_DSD5215:#ifdef DKC_XY450    case DKC_XY450:#endif    case DKC_ACB4000:    case DKC_MD21:#ifdef DKC_XD7053    case DKC_XD7053:#endif    case DKC_SCSI_CCS:#ifdef DKC_PANTHER    case DKC_PANTHER:#endif#ifdef DKC_CDC_9057    case DKC_CDC_9057:#endif#ifdef DKC_FJ_M1060    case DKC_FJ_M1060:#endif    case DKC_DIRECT:    case DKC_PCMCIA_ATA:        return (3);             /* Hard Disk */        break;    case DKC_NCRFLOPPY:    case DKC_SMSFLOPPY:    case DKC_INTEL82077:        return (4);             /* Floppy Disk */        break;    case DKC_CDROM:        return (5);             /* Optical RO */        break;    case DKC_PCMCIA_MEM:        return (8);             /* RAM disk */        break;    case DKC_MD:               /* "meta-disk" driver */        return (1);             /* Other */        break;    }#endif    return (2);                 /* Unknown */}static intIs_It_Removeable(void){#ifdef DIOC_DESCRIBE    if ((HRD_savedIntf_type == PC_FDC_INTF) ||        (HRD_savedDev_type == WORM_DEV_TYPE) ||        (HRD_savedDev_type == MO_DEV_TYPE) ||        (HRD_savedDev_type == CDROM_DEV_TYPE))        return (1);             /* true */#endif#ifdef DKIOCINFO    if ((HRD_savedCtrl_type == DKC_CDROM) ||        (HRD_savedCtrl_type == DKC_NCRFLOPPY) ||        (HRD_savedCtrl_type == DKC_SMSFLOPPY) ||        (HRD_savedCtrl_type == DKC_INTEL82077) ||        (HRD_savedCtrl_type == DKC_PCMCIA_MEM) ||        (HRD_savedCtrl_type == DKC_PCMCIA_ATA))        return (1);             /* true */#endif#ifdef HAVE_LINUX_HDREG_H    if (HRD_savedFlags & 0x80)        return (1);             /* true */#endif    return (2);                 /* false */}

⌨️ 快捷键说明

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