PERFORCE change 81342 for review

Victor Cruceru soc-victor at FreeBSD.org
Tue Aug 2 17:37:54 GMT 2005


http://perforce.freebsd.org/chv.cgi?CH=81342

Change 81342 by soc-victor at soc-victor_82.76.158.176 on 2005/08/02 17:36:56

	Made hrDiskStorageTable to build and run for 6-CURRENT
	(related to ATA API and md(4) API changes ).  For now keep the 5.4 version
	in case someone will need it. 

Affected files ...

.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_diskstorage_tbl.c#4 edit

Differences ...

==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_diskstorage_tbl.c#4 (text+ko) ====

@@ -28,8 +28,8 @@
  *
  * Host Resources MIB for SNMPd. Implementation for the hrDiskStorageTable
  */
- 
- 
+
+
 #include "hostres_snmp.h"
 #include "hostres_oid.h"
 #include "hostres_tree.h"
@@ -40,7 +40,7 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <libdisk.h>
-#include <assert.h>	
+#include <assert.h>
 #include <err.h>
 #include <sys/sysctl.h>
 #include <sys/ata.h>
@@ -59,36 +59,36 @@
 
 
 static
-struct hrDiskStorageTblEntry* 
+struct hrDiskStorageTblEntry*
 hrDiskStorageEntry_create( const struct hrDeviceTblEntry* devEntry) {
-	struct 
-	hrDiskStorageTblEntry	*entry = NULL;
+       struct
+       hrDiskStorageTblEntry   *entry = NULL;
+
+       assert(devEntry != NULL);
+       if (devEntry == NULL) {
+               return NULL;
+       }
 
-	assert(devEntry != NULL);
-	if (devEntry == NULL) {
-		return NULL;
-	}
-	
-	if ((entry = malloc(sizeof(*entry))) == NULL) {
-		syslog(LOG_WARNING, "hrDiskStorageTable: %s: %m", __func__);
-		return (NULL);
-	}
-	memset(entry, 0, sizeof(*entry));
-	entry->index = devEntry->index;
-	INSERT_OBJECT_INT(entry, &hrState_g.hr_disk_storage_tbl);
-	return entry;
+       if ((entry = malloc(sizeof(*entry))) == NULL) {
+               syslog(LOG_WARNING, "hrDiskStorageTable: %s: %m", __func__);
+               return (NULL);
+       }
+       memset(entry, 0, sizeof(*entry));
+       entry->index = devEntry->index;
+       INSERT_OBJECT_INT(entry, &hrState_g.hr_disk_storage_tbl);
+       return entry;
 
 }
 
 static
 void
 hrDiskStorageEntry_delete_v( struct hrDiskStorageTblEntry* entry ) {
-	assert(entry != NULL);
-	if (entry == NULL) {
-		return;
-	}
-	TAILQ_REMOVE(&hrState_g.hr_disk_storage_tbl, entry, link);	
-	free(entry);
+       assert(entry != NULL);
+       if (entry == NULL) {
+               return;
+       }
+       TAILQ_REMOVE(&hrState_g.hr_disk_storage_tbl, entry, link);
+       free(entry);
 }
 
 
@@ -96,603 +96,723 @@
 struct hrDiskStorageTblEntry *
 hrDiskStorageTblEntry_find_by_index(int32_t idx) {
 
-	struct hrDiskStorageTblEntry *entry;
+       struct hrDiskStorageTblEntry *entry;
 
-	TAILQ_FOREACH(entry, &hrState_g.hr_disk_storage_tbl, link)
-		if (entry->index == idx)
-			return (entry);
-	return (NULL);
+       TAILQ_FOREACH(entry, &hrState_g.hr_disk_storage_tbl, link)
+               if (entry->index == idx)
+                       return (entry);
+       return (NULL);
 }
 
 
 static
-struct hrDeviceTblEntry* 
+struct hrDeviceTblEntry*
 hrDeviceTblEntry_create( const char* dev_name) {
-	struct 
-	hrDeviceTblEntry	*entry;
-	struct 
-	deviceNameMapEntry 	*map = NULL;
+       struct
+       hrDeviceTblEntry        *entry;
+       struct
+       deviceNameMapEntry      *map = NULL;
+
+
+       assert(dev_name != NULL);
+
+       if (dev_name == NULL) {
+               return (NULL);
+       }
+
+       if (dev_name[0] == '\0') {
+               return (NULL);
+       }
+
+       if ((entry = malloc(sizeof(*entry))) == NULL) {
+               syslog(LOG_WARNING, "hrDiskStorageTable: %s: %m", __func__);
+               return (NULL);
+       }
+       memset(entry, 0, sizeof(*entry));
+
+
+       STAILQ_FOREACH(map, &hrState_g.device_name_map, link)
+               if (strcmp(map->name_key, dev_name) == 0) {
+                       entry->index = map->hrIndex;
+                       map->entry_p = entry;
+                       break;
+               }
+
+       if (map == NULL) {
+               /* new object - get a new index */
+               if (hrState_g.next_hrDevice_index > INT_MAX) {
+                       syslog(LOG_ERR, "%s: hrDeviceTable index wrap", __func__ );
+                       errx(1, "hrDeviceTable index wrap");
+               }
+
+               if ((map = malloc(sizeof(*map))) == NULL) {
+                       syslog(LOG_ERR, "hrStorageTable: %s: %m", __func__ );
+                       free(entry);
+                       return (NULL);
+               }
+               map->hrIndex = hrState_g.next_hrDevice_index ++;
+
+               memset(&map->name_key[0], 0, sizeof(map->name_key));
+               strncpy(map->name_key, dev_name, sizeof(map->name_key) - 1);
+
+               memset(&map->location_key[0], 0, sizeof(map->location_key));
+               snprintf(map->location_key, sizeof(map->location_key) - 1, "/dev/%s", dev_name);
+
 
-	
-	assert(dev_name != NULL);
+               map->entry_p = entry;
+               STAILQ_INSERT_TAIL(&hrState_g.device_name_map, map, link);
+               HR_DPRINTF((stderr, "%s at %s  added into hrDeviceMap at index=%d\n ",
+                               dev_name,
+                               dev_name, map->hrIndex));
+       } else {
+               HR_DPRINTF((stderr, "%s at %s  exists in hrDeviceMap index=%d\n ",
+                               dev_name,
+                               dev_name, map->hrIndex));
 
-	if (dev_name == NULL) {
-		return (NULL);
-	}
-	
-	if (dev_name[0] == '\0') {
-		return (NULL);	
-	}
-	
-	if ((entry = malloc(sizeof(*entry))) == NULL) {
-		syslog(LOG_WARNING, "hrDiskStorageTable: %s: %m", __func__);
-		return (NULL);
-	}
-	memset(entry, 0, sizeof(*entry));
-	
+       }
 
-	STAILQ_FOREACH(map, &hrState_g.device_name_map, link)
-		if (strcmp(map->name_key, dev_name) == 0) {
-			entry->index = map->hrIndex;
-			map->entry_p = entry;
-			break;
-		}
-	
-	if (map == NULL) {
-		/* new object - get a new index */
-		if (hrState_g.next_hrDevice_index > INT_MAX) {
-		        syslog(LOG_ERR, "%s: hrDeviceTable index wrap", __func__ );
-			errx(1, "hrDeviceTable index wrap");
-		}	
+       entry->index = map->hrIndex;
+       memset(&entry->name[0], 0, sizeof(entry->name));
+       strncpy(entry->name, dev_name, sizeof(entry->name) - 1);
 
-		if ((map = malloc(sizeof(*map))) == NULL) {
-			syslog(LOG_ERR, "hrStorageTable: %s: %m", __func__ );
-			free(entry);
-			return (NULL);
-		}
-		map->hrIndex = hrState_g.next_hrDevice_index ++;
-		
-		memset(&map->name_key[0], 0, sizeof(map->name_key));
-		strncpy(map->name_key, dev_name, sizeof(map->name_key) - 1);
-		
-		memset(&map->location_key[0], 0, sizeof(map->location_key));
-		snprintf(map->location_key, sizeof(map->location_key) - 1, "/dev/%s", dev_name);
+       memset(&entry->location[0], 0, sizeof(entry->location));
+       snprintf(entry->location, sizeof(entry->location) - 1, "/dev/%s", dev_name);
 
+       INSERT_OBJECT_INT(entry, &hrState_g.hr_device_tbl);
 
-		map->entry_p = entry;
-		STAILQ_INSERT_TAIL(&hrState_g.device_name_map, map, link);
-		HR_DPRINTF((stderr, "%s at %s  added into hrDeviceMap at index=%d\n ",
-				dev_name, 
-				dev_name, map->hrIndex));
-	} else {
-		HR_DPRINTF((stderr, "%s at %s  exists in hrDeviceMap index=%d\n ",
-				dev_name, 
-				dev_name, map->hrIndex));
+       return entry;
 
-	}
-	
-	entry->index = map->hrIndex;
-	memset(&entry->name[0], 0, sizeof(entry->name));
-	strncpy(entry->name, dev_name, sizeof(entry->name) - 1);
-		
-	memset(&entry->location[0], 0, sizeof(entry->location));
-	snprintf(entry->location, sizeof(entry->location) - 1, "/dev/%s", dev_name);
-					
-	INSERT_OBJECT_INT(entry, &hrState_g.hr_device_tbl);
-	
-	return entry;
-	
 }
 
- 
+
 static
 struct hrDeviceTblEntry*
 hrDeviceTblEntry_find_by_name(const char *dev_name) {
-	struct deviceNameMapEntry  *map;
-	assert(dev_name != NULL);
-		
+       struct deviceNameMapEntry  *map;
+       assert(dev_name != NULL);
+
 
-	STAILQ_FOREACH(map, &hrState_g.device_name_map, link)
-		if (strcmp(map->name_key, dev_name) == 0 ) {
-		    	return (map->entry_p);
-		}
-	return (NULL);
+       STAILQ_FOREACH(map, &hrState_g.device_name_map, link)
+               if (strcmp(map->name_key, dev_name) == 0 ) {
+                       return (map->entry_p);
+               }
+       return (NULL);
 }
 
 
-static 
+static
 void hrDiskStorage_queryDisk(struct hrDiskStorageTblEntry *entry){
-	char dev_path[128] = "";
-	int fd = -1;
-	if (entry == NULL) {
-		return;
-	}
-	if( entry->dev_name[0] == '\0' ) {
-		return;
-	}
-	snprintf(dev_path, sizeof(dev_path) - 1, "/dev/%s", entry->dev_name);
-	entry->capacity = 0;
-	HR_DPRINTF((stderr,"OPENING device %s\n",dev_path));
-	fd = open(dev_path, O_RDONLY|O_NONBLOCK);
-	if ( fd < 0 ) {
-		HR_DPRINTF((stderr,"OPEN device %s failed: %d (%s)\n",
-			dev_path, 
-			errno, 
-			strerror(errno)));
-		goto QUERY_DONE;
-	} else {
-		off_t	mediasize = 0;
-		if (ioctl(fd, DIOCGMEDIASIZE, &mediasize) < 0) {
-			HR_DPRINTF((stderr,"DIOCGMEDIASIZE for device %s failed: %d (%s)\n",
-				dev_path, 
-				errno, 
-				strerror(errno)));
-			goto QUERY_DONE;
-		}
-		mediasize = mediasize / 1024;
-		entry->capacity = (mediasize > (off_t)INT_MAX ? INT_MAX : mediasize);
-	}
+       char dev_path[128] = "";
+       int fd = -1;
+       if (entry == NULL) {
+               return;
+       }
+       if( entry->dev_name[0] == '\0' ) {
+               return;
+       }
+       snprintf(dev_path, sizeof(dev_path) - 1, "/dev/%s", entry->dev_name);
+       entry->capacity = 0;
+       HR_DPRINTF((stderr,"OPENING device %s\n",dev_path));
+       fd = open(dev_path, O_RDONLY|O_NONBLOCK);
+       if ( fd < 0 ) {
+               HR_DPRINTF((stderr,"OPEN device %s failed: %d (%s)\n",
+                       dev_path,
+                       errno,
+                       strerror(errno)));
+               goto QUERY_DONE;
+       } else {
+               off_t   mediasize = 0;
+               if (ioctl(fd, DIOCGMEDIASIZE, &mediasize) < 0) {
+                       HR_DPRINTF((stderr,"DIOCGMEDIASIZE for device %s failed: %d (%s)\n",
+                               dev_path,
+                               errno,
+                               strerror(errno)));
+                       goto QUERY_DONE;
+               }
+               mediasize = mediasize / 1024;
+               entry->capacity = (mediasize > (off_t)INT_MAX ? INT_MAX : mediasize);
+       }
 QUERY_DONE:
-	if (fd > 0) {
-		close(fd);
-	}		
-	
+       if (fd > 0) {
+               close(fd);
+       }
+
 }
-static 
-void 
+static
+void
 hrDiskStorage_OS_get_ATA_disks_v(void) {
-	struct hrDeviceTblEntry *entry = NULL;
-	struct hrDiskStorageTblEntry *disk_entry = NULL;
+       struct hrDeviceTblEntry *entry = NULL;
+       struct hrDiskStorageTblEntry *disk_entry = NULL;
+
+/*
+ * Remove the pre 6 vesrion if not needed
+ */
+#if __FreeBSD_version < 600000
+
+       struct ata_cmd iocmd;
+       int  maxunit, unit, i;
+       if ( hrState_g.ata_fd < 0 ){
+               return;
+       }
+
+       iocmd.cmd = ATAGMAXCHANNEL;
+       if (ioctl(hrState_g.ata_fd, IOCATA, &iocmd) < 0) {
+               syslog(LOG_ERR, "ioctl(ATAGMAXCHANNEL) failed: %m");
+               goto ATA_DONE;
+       }
+       maxunit = iocmd.u.maxchan;
+       for (unit = 0; unit < maxunit; unit++) {
+               struct ata_cmd u_iocmd;
+
+               memset(&u_iocmd, 0, sizeof(struct ata_cmd));
+               u_iocmd.channel = unit;
+               u_iocmd.device = -1;
+               u_iocmd.cmd = ATAGPARM;
+               if (ioctl(hrState_g.ata_fd, IOCATA, &u_iocmd) < 0) {
+                       syslog(LOG_ERR, "ioctl(IOCATA) failed: %m");
+                       continue;
+               }
+
+               for(i=0; i<=1; i++) {
+                       if (!u_iocmd.u.param.type[i]) {
+                               continue;
+                       }
+                       /*first check if this disk is in hrDeiveTable*/
+                       entry = hrDeviceTblEntry_find_by_name(u_iocmd.u.param.name[i]);
+                       if (entry == NULL) {
+                               HR_DPRINTF((stderr,
+                               "hrDiskStorageTable: ATA disk %s not in hrDeviceTable\n",
+                               u_iocmd.u.param.name[i] ));
+                               entry =  hrDeviceTblEntry_create(u_iocmd.u.param.name[i]);
+                               assert(entry != NULL);
+                               if (entry == NULL) {
+                                       continue;
+                               }
+
+                               entry->type = (struct asn_oid)OIDX_hrDeviceDiskStorage;
+                               entry->id = oid_zeroDotZero; /*unknown id - FIX ME*/
+                               entry->status = DR_RUNNING;
+                               entry->errors = 0; /*FIX ME*/
+                               snprintf(entry->descr, sizeof(entry->descr) - 1,
+                                       "%s: <%s, ser. %s> ",
+                                       u_iocmd.u.param.name[i],
+                                       u_iocmd.u.param.params[i].model,
+                                       u_iocmd.u.param.params[i].serial);
+
+                       }else{
+                               HR_DPRINTF((stderr,
+                               "hrDiskStorageTable; ATA disk %s already in hrDeviceTable\n",
+                               u_iocmd.u.param.name[i] ));
+                       }
+                       entry->flags |= HR_DEVICE_IMMUTABLE;
+                       entry->flags |= HR_DEVICE_FOUND;
+
+                       /*Then check hrDiskStorage table for this device*/
+                       disk_entry = hrDiskStorageTblEntry_find_by_index(entry->index);
+                       if (disk_entry == NULL) {
+                               disk_entry = hrDiskStorageEntry_create(entry);
+                               assert(disk_entry != NULL);
+                               if (disk_entry == NULL) {
+                                       continue;
+                               }
+                               disk_entry->access = DS_READ_WRITE;
+                               memset(&disk_entry->dev_name[0], 0, sizeof(disk_entry->dev_name));
+                               strncpy(disk_entry->dev_name, u_iocmd.u.param.name[i], sizeof(disk_entry->dev_name)-1);
+
+                               if (strncmp(disk_entry->dev_name, "ad", strlen("ad")) == 0) {
+                                       disk_entry->media = DSM_HARDDISK;
+                                       disk_entry->removable = SNMP_FALSE;
+                               } else if (strncmp(disk_entry->dev_name, "ar", strlen("ar")) == 0) {
+                                       disk_entry->media = DSM_OTHER;
+                                       disk_entry->removable = SNMP_FALSE;
+                               } else if (strncmp(disk_entry->dev_name, "acd", strlen("acd")) == 0) {
+                                       disk_entry->media = DSM_OPTICALDISKROM;
+                                       disk_entry->removable = SNMP_TRUE;
+                               } else if (strncmp(disk_entry->dev_name, "afd", strlen("afd")) == 0) {
+                                       disk_entry->media = DSM_FLOPPYDISK;
+                                       disk_entry->removable = SNMP_TRUE;
+                               } else if (strncmp(disk_entry->dev_name, "ast", strlen("ast")) == 0) {
+                                       disk_entry->media = DSM_OTHER;
+                                       disk_entry->removable = SNMP_TRUE;
+                               } else {
+                                       disk_entry->media = DSM_UNKNOWN;
+                                       disk_entry->removable = SNMP_FALSE;
+                               }
+
+                       }
+                       disk_entry->flags |= HR_DISKSTORAGE_FOUND;
+                       disk_entry->flags |= HR_DISKSTORAGE_ATA;
+
+                       hrDiskStorage_queryDisk(disk_entry);
+                       disk_entry->r_tick = this_tick;
+               }
+       }
+ATA_DONE:
+       return;
+#else
+/*
+ * This the post 6 version: it is here to stay
+ */
+
+       int  maxunit, unit, i;
+       if ( hrState_g.ata_fd < 0 ){
+               return;
+       }
+
+
+       if (ioctl(hrState_g.ata_fd, IOCATAGMAXCHANNEL, &maxunit) < 0) {
+               syslog(LOG_ERR, "ioctl(IOCATAGMAXCHANNEL) failed: %m");
+               goto ATA_DONE;
+       }
+
+       for (unit = 0; unit < maxunit; unit++) {
+               struct ata_ioc_devices devices;
+               memset(&devices, 0, sizeof(devices));
+
+               devices.channel = unit;
+
+
+               if (ioctl(hrState_g.ata_fd, IOCATADEVICES, &devices) < 0) {
+                       HR_DPRINTF((stderr, "ioctl(IOCATADEVICES) failed: %s\n", strerror(errno)));
+                       continue;
+               }
+
+               for(i=0; i<=1; i++) {
+                       if (*devices.name[i] == 0) {
+                               continue;
+                       }
+                       /*first check if this disk is in hrDeiveTable*/
+                       entry = hrDeviceTblEntry_find_by_name(devices.name[i]);
+                       if (entry == NULL) {
+                               HR_DPRINTF((stderr,
+                               "hrDiskStorageTable: ATA disk %s not in hrDeviceTable\n",
+                               devices.name[i] ));
+                               entry =  hrDeviceTblEntry_create(devices.name[i]);
+                               assert(entry != NULL);
+                               if (entry == NULL) {
+                                       continue;
+                               }
+
+                               entry->type = (struct asn_oid)OIDX_hrDeviceDiskStorage;
+                               entry->id = oid_zeroDotZero; /*unknown id - FIX ME*/
+                               entry->status = DR_RUNNING;
+                               entry->errors = 0; /*FIX ME*/
+                               snprintf(entry->descr, sizeof(entry->descr) - 1,
+                                       "%s: <%s, ser. %s> ",
+                                       devices.name[i],
+                                       devices.params[i].model,
+                                       devices.params[i].serial);
+
+                       }else{
+                               HR_DPRINTF((stderr,
+                               "hrDiskStorageTable; ATA disk %s already in hrDeviceTable\n",
+                               devices.name[i] ));
+                       }
+                       entry->flags |= HR_DEVICE_IMMUTABLE;
+                       entry->flags |= HR_DEVICE_FOUND;
 
-	struct ata_cmd iocmd;
-	int  maxunit, unit, i;
-	if ( hrState_g.ata_fd < 0 ){
-		return;
-	}
-	
-	iocmd.cmd = ATAGMAXCHANNEL;
-	if (ioctl(hrState_g.ata_fd, IOCATA, &iocmd) < 0) {
-		syslog(LOG_ERR, "ioctl(ATAGMAXCHANNEL) failed: %m");
-		goto ATA_DONE;
-	}		
-	maxunit = iocmd.u.maxchan;
-	for (unit = 0; unit < maxunit; unit++) {
-		struct ata_cmd u_iocmd;
+                       /*Then check hrDiskStorage table for this device*/
+                       disk_entry = hrDiskStorageTblEntry_find_by_index(entry->index);
+                       if (disk_entry == NULL) {
+                               disk_entry = hrDiskStorageEntry_create(entry);
+                               assert(disk_entry != NULL);
+                               if (disk_entry == NULL) {
+                                       continue;
+                               }
+                               disk_entry->access = DS_READ_WRITE;
+                               memset(&disk_entry->dev_name[0], 0,
+                                       sizeof(disk_entry->dev_name));
+                               strncpy(disk_entry->dev_name,
+                                       devices.name[i],
+                                       sizeof(disk_entry->dev_name)-1);
 
-		memset(&u_iocmd, 0, sizeof(struct ata_cmd));
-		u_iocmd.channel = unit;
-		u_iocmd.device = -1;
-		u_iocmd.cmd = ATAGPARM;
-		if (ioctl(hrState_g.ata_fd, IOCATA, &u_iocmd) < 0) {
-			syslog(LOG_ERR, "ioctl(IOCATA) failed: %m");
-			continue;
-		}	
+                               if (strncmp(disk_entry->dev_name, "ad", strlen("ad")) == 0) {
+                                       disk_entry->media = DSM_HARDDISK;
+                                       disk_entry->removable = SNMP_FALSE;
+                               } else if (strncmp(disk_entry->dev_name, "ar", strlen("ar")) == 0) {
+                                       disk_entry->media = DSM_OTHER;
+                                       disk_entry->removable = SNMP_FALSE;
+                               } else if (strncmp(disk_entry->dev_name, "acd", strlen("acd")) == 0) {
+                                       disk_entry->media = DSM_OPTICALDISKROM;
+                                       disk_entry->removable = SNMP_TRUE;
+                               } else if (strncmp(disk_entry->dev_name, "afd", strlen("afd")) == 0) {
+                                       disk_entry->media = DSM_FLOPPYDISK;
+                                       disk_entry->removable = SNMP_TRUE;
+                               } else if (strncmp(disk_entry->dev_name, "ast", strlen("ast")) == 0) {
+                                       disk_entry->media = DSM_OTHER;
+                                       disk_entry->removable = SNMP_TRUE;
+                               } else {
+                                       disk_entry->media = DSM_UNKNOWN;
+                                       disk_entry->removable = SNMP_FALSE;
+                               }
 
-		for(i=0; i<=1; i++) {
-		        if (!u_iocmd.u.param.type[i]) {
-				continue;
-			}
-			/*first check if this disk is in hrDeiveTable*/
-			entry = hrDeviceTblEntry_find_by_name(u_iocmd.u.param.name[i]);
-			if (entry == NULL) {
-				HR_DPRINTF((stderr,
-				"hrDiskStorageTable: ATA disk %s not in hrDeviceTable\n",
-				u_iocmd.u.param.name[i] ));
-				entry =  hrDeviceTblEntry_create(u_iocmd.u.param.name[i]);
-				assert(entry != NULL);
-				if (entry == NULL) {
-					continue;
-				}	
+                       }
+                       disk_entry->flags |= HR_DISKSTORAGE_FOUND;
+                       disk_entry->flags |= HR_DISKSTORAGE_ATA;
 
-				entry->type = (struct asn_oid)OIDX_hrDeviceDiskStorage;
-				entry->id = oid_zeroDotZero; /*unknown id - FIX ME*/
-				entry->status = DR_RUNNING;
-				entry->errors = 0; /*FIX ME*/
-				snprintf(entry->descr, sizeof(entry->descr) - 1, 
-					"%s: <%s, ser. %s> ",
-					u_iocmd.u.param.name[i],
-					u_iocmd.u.param.params[i].model,
-					u_iocmd.u.param.params[i].serial);
-				
-			}else{
-				HR_DPRINTF((stderr,
-				"hrDiskStorageTable; ATA disk %s already in hrDeviceTable\n",
-				u_iocmd.u.param.name[i] ));
-			}
-			entry->flags |= HR_DEVICE_IMMUTABLE;
-			entry->flags |= HR_DEVICE_FOUND;
-						
-			/*Then check hrDiskStorage table for this device*/
-			disk_entry = hrDiskStorageTblEntry_find_by_index(entry->index);
-			if (disk_entry == NULL) {
-				disk_entry = hrDiskStorageEntry_create(entry);
-				assert(disk_entry != NULL);
-				if (disk_entry == NULL) {
-					continue;
-				}
-				disk_entry->access = DS_READ_WRITE;
-				memset(&disk_entry->dev_name[0], 0, sizeof(disk_entry->dev_name));
-				strncpy(disk_entry->dev_name, u_iocmd.u.param.name[i], sizeof(disk_entry->dev_name)-1);
-			
-				if (strncmp(disk_entry->dev_name, "ad", strlen("ad")) == 0) {
-					disk_entry->media = DSM_HARDDISK;
-					disk_entry->removable = SNMP_FALSE;
-				} else if (strncmp(disk_entry->dev_name, "ar", strlen("ar")) == 0) {
-					disk_entry->media = DSM_OTHER;
-					disk_entry->removable = SNMP_FALSE;
-				} else if (strncmp(disk_entry->dev_name, "acd", strlen("acd")) == 0) {
-					disk_entry->media = DSM_OPTICALDISKROM;
-					disk_entry->removable = SNMP_TRUE;
-				} else if (strncmp(disk_entry->dev_name, "afd", strlen("afd")) == 0) {
-					disk_entry->media = DSM_FLOPPYDISK;
-					disk_entry->removable = SNMP_TRUE;
-				} else if (strncmp(disk_entry->dev_name, "ast", strlen("ast")) == 0) {
-					disk_entry->media = DSM_OTHER;
-					disk_entry->removable = SNMP_TRUE;
-				} else {
-					disk_entry->media = DSM_UNKNOWN;
-					disk_entry->removable = SNMP_FALSE;
-				}
-				
-			}
-			disk_entry->flags |= HR_DISKSTORAGE_FOUND; 
-			disk_entry->flags |= HR_DISKSTORAGE_ATA;
-			
-			hrDiskStorage_queryDisk(disk_entry);
-			disk_entry->r_tick = this_tick;
-		}
-	}				
+                       hrDiskStorage_queryDisk(disk_entry);
+                       disk_entry->r_tick = this_tick;
+               }
+       }
 ATA_DONE:
-	return;
-}	
+       return;
+
+#endif /* __FreeBSD_version < 600000 */
+}
 
-static 
-void 
+static
+void
 hrDiskStorage_OS_get_MD_disks_v(void) {
-	struct hrDeviceTblEntry *entry = NULL;
-	struct hrDiskStorageTblEntry *disk_entry = NULL;
+       struct hrDeviceTblEntry *entry = NULL;
+       struct hrDiskStorageTblEntry *disk_entry = NULL;
+
+       struct md_ioctl mdio;
+       int  unit = 0;
+
+
+       if ( hrState_g.md_fd < 0 ){
+               return;
+       }
+       memset(&mdio, 0, sizeof(mdio));
+       mdio.md_version = MDIOVERSION;
+       mdio.md_options = MD_AUTOUNIT;
+
+       if (ioctl( hrState_g.md_fd, MDIOCLIST, &mdio) < 0) {
+               syslog(LOG_ERR, "ioctl(/dev/%s) failed: %m", MDCTL_NAME);
+               return;
+       }
+       for (unit = 0; unit < mdio.md_pad[0] && unit < MDNPAD - 1; unit++) {
+               char mddev[64] = "";
+               snprintf(mddev, sizeof(mddev) - 1, "%s%d", MD_NAME, mdio.md_pad[unit + 1]);
+               struct md_ioctl u_mdio;
+
+               memset(&u_mdio, 0, sizeof(u_mdio));
+               u_mdio.md_version = MDIOVERSION;
+               u_mdio.md_unit = mdio.md_pad[unit + 1];
+
+               if (ioctl( hrState_g.md_fd, MDIOCQUERY, &u_mdio) < 0) {
+                       syslog(LOG_ERR, "ioctl(/dev/%s, MDIOCQUERY) [%s] failed: %m", MDCTL_NAME, mddev);
+                       continue;
+               }
+
 
-	struct md_ioctl mdio;
-	int  unit = 0;
+               /*first check if this disk is in hrDeiveTable*/
+               entry = hrDeviceTblEntry_find_by_name(mddev);
+               if (entry == NULL) {
+                       HR_DPRINTF((stderr,
+                        "hrDiskStorageTable; MD %s not in hrDeviceTable\n",
+                         mddev ));
+                       entry =  hrDeviceTblEntry_create(mddev);
+                       assert(entry != NULL);
+                       if (entry == NULL) {
+                               continue;
+                       }
 
-	
-	if ( hrState_g.md_fd < 0 ){
-		return;
-	}
-	memset(&mdio, 0, sizeof(mdio));
-	mdio.md_version = MDIOVERSION;
-	mdio.md_options = MD_AUTOUNIT;
-	
-	if (ioctl( hrState_g.md_fd, MDIOCLIST, &mdio) < 0) {
-		syslog(LOG_ERR, "ioctl(/dev/%s) failed: %m", MDCTL_NAME);
-		return;
-	}	
-	for (unit = 0; unit < mdio.md_pad[0] && unit < MDNPAD - 1; unit++) {
-		char mddev[64] = "";
-		snprintf(mddev, sizeof(mddev) - 1, "%s%d", MD_NAME, mdio.md_pad[unit + 1]);
-		struct md_ioctl u_mdio;
+                       entry->type = (struct asn_oid)OIDX_hrDeviceDiskStorage;
+                       entry->id = oid_zeroDotZero; /*unknown id - FIX ME*/
+                       entry->status = DR_RUNNING;
+                       entry->errors = 0; /*FIX ME*/
+                       snprintf(entry->descr, sizeof(entry->descr) - 1,
+                               "%s: Memory Disk ",
+                                mddev);
 
-		memset(&u_mdio, 0, sizeof(u_mdio));
-		u_mdio.md_version = MDIOVERSION;
-		u_mdio.md_unit = mdio.md_pad[unit + 1];
+               }else{
+                       HR_DPRINTF((stderr,
+                       "hrDiskStorageTable; MD %s already in hrDeviceTable\n",
+                       mddev ));
+               }
+               entry->flags |= HR_DEVICE_IMMUTABLE;
+               entry->flags |= HR_DEVICE_FOUND;
 
-		if (ioctl( hrState_g.md_fd, MDIOCQUERY, &u_mdio) < 0) {
-			syslog(LOG_ERR, "ioctl(/dev/%s, MDIOCQUERY) [%s] failed: %m", MDCTL_NAME, mddev);
-			continue;
-		}
+               /*Then check hrDiskStorage table for this device*/
+               disk_entry = hrDiskStorageTblEntry_find_by_index(entry->index);
+               if (disk_entry == NULL) {
+                       disk_entry = hrDiskStorageEntry_create(entry);
+                       assert(disk_entry != NULL);
+                       if (disk_entry == NULL) {
+                               continue;
+                       }
+                       if ((u_mdio.md_options & MD_READONLY) == MD_READONLY) {
+                               disk_entry->access = DS_READ_ONLY;
+                       } else {
+                               disk_entry->access = DS_READ_WRITE;
+                       }
+                       memset(&disk_entry->dev_name[0], 0, sizeof(disk_entry->dev_name));
+                       strncpy(disk_entry->dev_name, mddev, sizeof(disk_entry->dev_name)-1);
 
+                       disk_entry->media = DSM_RAMDISK;
+                       disk_entry->removable = SNMP_FALSE;
 
-		/*first check if this disk is in hrDeiveTable*/
-		entry = hrDeviceTblEntry_find_by_name(mddev);
-		if (entry == NULL) {
-			HR_DPRINTF((stderr,
-			 "hrDiskStorageTable; MD %s not in hrDeviceTable\n",
-			  mddev ));
-			entry =  hrDeviceTblEntry_create(mddev);
-			assert(entry != NULL);
-			if (entry == NULL) {
-				continue;
-			}	
 
-			entry->type = (struct asn_oid)OIDX_hrDeviceDiskStorage;
-			entry->id = oid_zeroDotZero; /*unknown id - FIX ME*/
-			entry->status = DR_RUNNING;
-			entry->errors = 0; /*FIX ME*/
-			snprintf(entry->descr, sizeof(entry->descr) - 1, 
-				"%s: Memory Disk ",
-				 mddev);
-			
-		}else{
-			HR_DPRINTF((stderr,
-			"hrDiskStorageTable; MD %s already in hrDeviceTable\n",
-			mddev ));
-		}
-		entry->flags |= HR_DEVICE_IMMUTABLE;
-		entry->flags |= HR_DEVICE_FOUND;
-					
-		/*Then check hrDiskStorage table for this device*/
-		disk_entry = hrDiskStorageTblEntry_find_by_index(entry->index);
-		if (disk_entry == NULL) {
-			disk_entry = hrDiskStorageEntry_create(entry);
-			assert(disk_entry != NULL);
-			if (disk_entry == NULL) {
-				continue;
-			}
-			if ((u_mdio.md_options & MD_READONLY) == MD_READONLY) {
-				disk_entry->access = DS_READ_ONLY;
-			} else {
-				disk_entry->access = DS_READ_WRITE;
-			}
-			memset(&disk_entry->dev_name[0], 0, sizeof(disk_entry->dev_name));
-			strncpy(disk_entry->dev_name, mddev, sizeof(disk_entry->dev_name)-1);
+               }
+               disk_entry->flags |= HR_DISKSTORAGE_FOUND;
+               disk_entry->flags |= HR_DISKSTORAGE_MD;
+/*
+ * Remove the pre 6 vesrion if not needed
+ */
+#if __FreeBSD_version < 600000
+               disk_entry->capacity = u_mdio.md_size / 2;
+#else
+               disk_entry->capacity = u_mdio.md_mediasize / 1024;
+#endif /*__FreeBSD_version < 600000 */
+               disk_entry->r_tick = this_tick;
 
-			disk_entry->media = DSM_RAMDISK;
-			disk_entry->removable = SNMP_FALSE;
-		
-			
-		}
-		disk_entry->flags |= HR_DISKSTORAGE_FOUND; 
-		disk_entry->flags |= HR_DISKSTORAGE_MD;
-		disk_entry->capacity = u_mdio.md_size / 2;
+       }
+}
 
-		disk_entry->r_tick = this_tick;
-		
-	}				
-}	
 
-				
 static
 void
 hrDiskStorage_OS_get_disks_v(void) {
-	size_t disk_cnt = 0;
-	struct hrDeviceTblEntry *entry = NULL;
-	struct hrDiskStorageTblEntry *disk_entry = NULL;
+       size_t disk_cnt = 0;
+       struct hrDeviceTblEntry *entry = NULL;
+       struct hrDiskStorageTblEntry *disk_entry = NULL;
+
+       size_t disk_list_len = 0;
+
+       if (sysctlbyname("kern.disks", NULL, &disk_list_len, NULL, 0) < 0) {
+               syslog(LOG_ERR, "hrDiskStorageTable:sysctl #1 kern.disks failed: %m");
+               return;
+       }
+
+       if (disk_list_len == 0)
+               return;
+
+       if (hrState_g.disk_list_len != disk_list_len + 1 || hrState_g.disk_list ==  NULL) {
+               hrState_g.disk_list_len = disk_list_len + 1;
+               hrState_g.disk_list =
+                (char *)reallocf(hrState_g.disk_list, hrState_g.disk_list_len);
+       }
+       if (hrState_g.disk_list == NULL) {
+               syslog(LOG_ERR, "hrDiskStorageTable: reallocf failed: %m");
+               hrState_g.disk_list_len = 0;
+               return;
+       }
+
+       memset(hrState_g.disk_list, 0, hrState_g.disk_list_len);
+
+       if (sysctlbyname("kern.disks", hrState_g.disk_list, &disk_list_len, NULL, 0) < 0
+           ||  hrState_g.disk_list[0] == 0) {
+               syslog(LOG_ERR, "hrDiskStorageTable: sysctl #2 kern.disks failed: %m");
+               return;
+       }
+
+       for (disk_cnt = 0; disk_cnt < disk_list_len; disk_cnt++) {
+               char* disk = NULL;
+               char disk_device[128] = "";
+               disk = strsep(&hrState_g.disk_list, " ");
+               if (disk == NULL)
+                       break;
+               snprintf(disk_device, sizeof(disk_device) - 1, "/dev/%s", disk);
+               /*
+               First check if the disk is in the hrDeviceTable.
+               If not,add it.
+               NOTE; most disk devices (ATA, removable)  are not detected by libdevice API
+               */
+               entry = hrDeviceTblEntry_find_by_name(disk);
+               if (entry == NULL) {
+                       HR_DPRINTF((stderr,
+                        "hrDiskStorageTable; disk %s not in hrDeviceTable\n",
+                        disk_device ));
+                       entry =  hrDeviceTblEntry_create(disk);
+                       entry->flags |= HR_DEVICE_IMMUTABLE;
+                       entry->type = (struct asn_oid)OIDX_hrDeviceDiskStorage;
+                       entry->id = oid_zeroDotZero; /*unknown id - FIX ME*/
+                       entry->status = DR_RUNNING;
+                       entry->errors = 0; /*FIX ME*/
+                       snprintf(entry->descr, sizeof(entry->descr) - 1,
+                               "%s: Disk Storage",
+                               disk);
+               }else{
+                       HR_DPRINTF((stderr,
+                        "hrDiskStorageTable; disk %s already in hrDeviceTable\n",
+                        disk_device ));
+                       entry->type = (struct asn_oid)OIDX_hrDeviceDiskStorage;
+                       entry->flags |= HR_DEVICE_IMMUTABLE;
+               }
+               /*Then check hrDiskStorage table for this device*/
+               disk_entry = hrDiskStorageTblEntry_find_by_index(entry->index);
+               if (disk_entry == NULL) {
+                       disk_entry = hrDiskStorageEntry_create(entry);
+               }
+               assert(disk_entry != NULL);
+               disk_entry->flags |= HR_DISKSTORAGE_FOUND;
+
+               if ((disk_entry->flags & HR_DISKSTORAGE_ATA) == HR_DISKSTORAGE_ATA ||
+                   (disk_entry->flags & HR_DISKSTORAGE_MD) == HR_DISKSTORAGE_MD) {
+                       /*ATA detection is running before this one, so don't waste the time here */
+                       continue;
+               }
+
+               disk_entry->access = DS_READ_WRITE;
+               disk_entry->media = DSM_UNKNOWN;
+               disk_entry->removable = SNMP_FALSE;
 
-	size_t disk_list_len = 0;
 
-	if (sysctlbyname("kern.disks", NULL, &disk_list_len, NULL, 0) < 0) {
-		syslog(LOG_ERR, "hrDiskStorageTable:sysctl #1 kern.disks failed: %m");
-		return;
-	}
+               if (strncmp(disk_entry->dev_name, "da", strlen("da")) == 0) {
+                       disk_entry->media = DSM_HARDDISK;
+                       disk_entry->removable = SNMP_FALSE;
+               } else  if (strncmp(disk_entry->dev_name, "cd", strlen("cd")) == 0) {
+                       disk_entry->media = DSM_OPTICALDISKROM;
+                       disk_entry->removable = SNMP_TRUE;
+               } else {
+                       disk_entry->media = DSM_UNKNOWN;
+                       disk_entry->removable = SNMP_FALSE;
+               }
 
-	if (disk_list_len == 0)
-		return;
+               memset(&disk_entry->dev_name[0], 0, sizeof(disk_entry->dev_name));
+               strncpy(disk_entry->dev_name, disk, sizeof(disk_entry->dev_name)-1);
 
-	if (hrState_g.disk_list_len != disk_list_len + 1 || hrState_g.disk_list ==  NULL) {
-		hrState_g.disk_list_len = disk_list_len + 1;
-		hrState_g.disk_list = 
-		 (char *)reallocf(hrState_g.disk_list, hrState_g.disk_list_len);
-	}
-	if (hrState_g.disk_list == NULL) {
-		syslog(LOG_ERR, "hrDiskStorageTable: reallocf failed: %m");	
-		hrState_g.disk_list_len = 0;
-		return;
-	}
-	
-	memset(hrState_g.disk_list, 0, hrState_g.disk_list_len);
+               hrDiskStorage_queryDisk(disk_entry);
+               disk_entry->r_tick = this_tick;
 
-	if (sysctlbyname("kern.disks", hrState_g.disk_list, &disk_list_len, NULL, 0) < 0  
-	    ||  hrState_g.disk_list[0] == 0) {
-		syslog(LOG_ERR, "hrDiskStorageTable: sysctl #2 kern.disks failed: %m");
-		return;
-	}
-	
-	for (disk_cnt = 0; disk_cnt < disk_list_len; disk_cnt++) {
-		char* disk = NULL;
-		char disk_device[128] = "";

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list