diff --git a/disk_freebsd.go b/disk_freebsd.go index e05e36d..34514da 100644 --- a/disk_freebsd.go +++ b/disk_freebsd.go @@ -3,9 +3,9 @@ package gopsutil import ( - "errors" "syscall" "unsafe" + "errors" ) func DiskPartitions(all bool) ([]DiskPartitionStat, error) { @@ -83,8 +83,33 @@ func DiskPartitions(all bool) ([]DiskPartitionStat, error) { } func DiskIOCounters() (map[string]DiskIOCountersStat, error) { + return nil, errors.New("not implemented yet") + + // statinfo->devinfo->devstat + // /usr/include/devinfo.h + + // get length + count, err := Getfsstat(nil, MNT_WAIT) + if err != nil { + return nil, err + } + + fs := make([]Statfs, count) + _, err = Getfsstat(fs, MNT_WAIT) + ret := make(map[string]DiskIOCountersStat, 0) - return ret, errors.New("not implemented yet") + for _, stat := range fs { + name := byteToString(stat.FMntonname[:]) + d := DiskIOCountersStat{ + Name: name, + ReadCount: stat.FSyncwrites + stat.FAsyncwrites, + WriteCount: stat.FSyncreads + stat.FAsyncreads, + } + + ret[name] = d + } + + return ret, nil } // Getfsstat is borrowed from pkg/syscall/syscall_freebsd.go diff --git a/disk_freebsd_amd64.go b/disk_freebsd_amd64.go index 43496c2..8dc0cd6 100644 --- a/disk_freebsd_amd64.go +++ b/disk_freebsd_amd64.go @@ -53,3 +53,54 @@ type Statfs struct { FMntfromname [MNAMELEN]byte /* mounted filesystem */ FMntonname [MNAMELEN]byte /* directory on which mounted */ } + + +// /usr/include/devstat.h +// devstat_getdevs() +// kern.devstat.all -> devstats list struct + +// struct devinfo { +// struct devstat *devices; +// u_int8_t *mem_ptr; +// long generation; +// int numdevs; +// }; +// +// struct statinfo { +// long cp_time[CPUSTATES]; +// long tk_nin; +// long tk_nout; +// struct devinfo *dinfo; +// long double snap_time; +// }; + + +// /usr/include/devinfo.h + +// struct devinfo_dev { +// devinfo_handle_t dd_handle; /* device handle */ +// devinfo_handle_t dd_parent; /* parent handle */ +// char *dd_name; /* name of device */ +// char *dd_desc; /* device description */ +// char *dd_drivername; /* name of attached driver */ +// char *dd_pnpinfo; /* pnp info from parent bus */ +// char *dd_location; /* Where bus thinks dev at */ +// uint32_t dd_devflags; /* API flags */ +// uint16_t dd_flags; /* internal dev flags */ +// device_state_t dd_state; /* attachment state of dev */ +// }; +// +// struct devinfo_rman { +// devinfo_handle_t dm_handle; /* resource manager handle */ +// u_long dm_start; /* resource start */ +// u_long dm_size; /* resource size */ +// char *dm_desc; /* resource description */ +// }; +// +// struct devinfo_res { +// devinfo_handle_t dr_handle; /* resource handle */ +// devinfo_handle_t dr_rman; /* resource manager handle */ +// devinfo_handle_t dr_device; /* owning device */ +// u_long dr_start; /* region start */ +// u_long dr_size; /* region size */ +// };