This file is indexed.

/usr/share/gocode/src/github.com/shirou/gopsutil/disk/disk_darwin_cgo.go is in golang-github-shirou-gopsutil-dev 2.17.08-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// +build darwin
// +build cgo

package disk

/*
#cgo LDFLAGS: -lobjc -framework Foundation -framework IOKit
#include <stdint.h>

// ### enough?
const int MAX_DISK_NAME = 100;

typedef struct
{
    char DiskName[MAX_DISK_NAME];
    int64_t Reads;
    int64_t Writes;
    int64_t ReadBytes;
    int64_t WriteBytes;
    int64_t ReadTime;
    int64_t WriteTime;
} DiskInfo;

#include "disk_darwin.h"
*/
import "C"

import (
	"errors"
	"strings"
	"unsafe"

	"github.com/shirou/gopsutil/internal/common"
)

func IOCounters(names ...string) (map[string]IOCountersStat, error) {
	if C.StartIOCounterFetch() == 0 {
		return nil, errors.New("Unable to fetch disk list")
	}

	// Clean up when we are done.
	defer C.EndIOCounterFetch()
	ret := make(map[string]IOCountersStat, 0)

	for {
		res := C.FetchNextDisk()
		if res == -1 {
			return nil, errors.New("Unable to fetch disk information")
		} else if res == 0 {
			break // done
		}

		di := C.DiskInfo{}
		if C.ReadDiskInfo((*C.DiskInfo)(unsafe.Pointer(&di))) == -1 {
			return nil, errors.New("Unable to fetch disk properties")
		}

		// Used to only get the necessary part of the C string.
		isRuneNull := func(r rune) bool {
			return r == '\u0000'
		}

		// Map from the darwin-specific C struct to the Go type
		//
		// ### missing: IopsInProgress, WeightedIO, MergedReadCount,
		// MergedWriteCount, SerialNumber
		// IOKit can give us at least the serial number I think...
		d := IOCountersStat{
			// Note: The Go type wants unsigned values, but CFNumberGetValue
			// doesn't appear to be able to give us unsigned values. So, we
			// cast, and hope for the best.
			ReadBytes:  uint64(di.ReadBytes),
			WriteBytes: uint64(di.WriteBytes),
			ReadCount:  uint64(di.Reads),
			WriteCount: uint64(di.Writes),
			ReadTime:   uint64(di.ReadTime),
			WriteTime:  uint64(di.WriteTime),
			IoTime:     uint64(di.ReadTime + di.WriteTime),
			Name:       strings.TrimFunc(C.GoStringN(&di.DiskName[0], C.MAX_DISK_NAME), isRuneNull),
		}

		if len(names) > 0 && !common.StringsHas(names, d.Name) {
			continue
		}

		ret[d.Name] = d
	}

	return ret, nil
}