mirror of https://github.com/containers/podman.git
fix(deps): update module github.com/shirou/gopsutil/v4 to v4.25.2
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This commit is contained in:
parent
2c3615a5ff
commit
d5acda2a37
4
go.mod
4
go.mod
|
@ -63,7 +63,7 @@ require (
|
||||||
github.com/opencontainers/selinux v1.11.1
|
github.com/opencontainers/selinux v1.11.1
|
||||||
github.com/openshift/imagebuilder v1.2.15
|
github.com/openshift/imagebuilder v1.2.15
|
||||||
github.com/rootless-containers/rootlesskit/v2 v2.3.2
|
github.com/rootless-containers/rootlesskit/v2 v2.3.2
|
||||||
github.com/shirou/gopsutil/v4 v4.25.1
|
github.com/shirou/gopsutil/v4 v4.25.2
|
||||||
github.com/sirupsen/logrus v1.9.3
|
github.com/sirupsen/logrus v1.9.3
|
||||||
github.com/spf13/cobra v1.9.1
|
github.com/spf13/cobra v1.9.1
|
||||||
github.com/spf13/pflag v1.0.6
|
github.com/spf13/pflag v1.0.6
|
||||||
|
@ -146,7 +146,7 @@ require (
|
||||||
github.com/gogo/protobuf v1.3.2 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||||
github.com/golang/protobuf v1.5.4 // indirect
|
github.com/golang/protobuf v1.5.4 // indirect
|
||||||
github.com/google/go-cmp v0.6.0 // indirect
|
github.com/google/go-cmp v0.7.0 // indirect
|
||||||
github.com/google/go-containerregistry v0.20.2 // indirect
|
github.com/google/go-containerregistry v0.20.2 // indirect
|
||||||
github.com/google/go-intervals v0.0.2 // indirect
|
github.com/google/go-intervals v0.0.2 // indirect
|
||||||
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect
|
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect
|
||||||
|
|
7
go.sum
7
go.sum
|
@ -245,8 +245,9 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
|
||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
github.com/google/go-containerregistry v0.20.2 h1:B1wPJ1SN/S7pB+ZAimcciVD+r+yV/l/DSArMxlbwseo=
|
github.com/google/go-containerregistry v0.20.2 h1:B1wPJ1SN/S7pB+ZAimcciVD+r+yV/l/DSArMxlbwseo=
|
||||||
github.com/google/go-containerregistry v0.20.2/go.mod h1:z38EKdKh4h7IP2gSfUUqEvalZBqs6AoLeWfUy34nQC8=
|
github.com/google/go-containerregistry v0.20.2/go.mod h1:z38EKdKh4h7IP2gSfUUqEvalZBqs6AoLeWfUy34nQC8=
|
||||||
github.com/google/go-intervals v0.0.2 h1:FGrVEiUnTRKR8yE04qzXYaJMtnIYqobR5QbblK3ixcM=
|
github.com/google/go-intervals v0.0.2 h1:FGrVEiUnTRKR8yE04qzXYaJMtnIYqobR5QbblK3ixcM=
|
||||||
|
@ -453,8 +454,8 @@ github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c
|
||||||
github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE=
|
github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE=
|
||||||
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
|
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
|
||||||
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
|
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
|
||||||
github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs=
|
github.com/shirou/gopsutil/v4 v4.25.2 h1:NMscG3l2CqtWFS86kj3vP7soOczqrQYIEhO/pMvvQkk=
|
||||||
github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI=
|
github.com/shirou/gopsutil/v4 v4.25.2/go.mod h1:34gBYJzyqCDT11b6bMHP0XCvWeU3J61XRT7a2EmCRTA=
|
||||||
github.com/sigstore/fulcio v1.6.4 h1:d86obfxUAG3Y6CYwOx1pdwCZwKmROB6w6927pKOVIRY=
|
github.com/sigstore/fulcio v1.6.4 h1:d86obfxUAG3Y6CYwOx1pdwCZwKmROB6w6927pKOVIRY=
|
||||||
github.com/sigstore/fulcio v1.6.4/go.mod h1:Y6bn3i3KGhXpaHsAtYP3Z4Np0+VzCo1fLv8Ci6mbPDs=
|
github.com/sigstore/fulcio v1.6.4/go.mod h1:Y6bn3i3KGhXpaHsAtYP3Z4Np0+VzCo1fLv8Ci6mbPDs=
|
||||||
github.com/sigstore/rekor v1.3.8 h1:B8kJI8mpSIXova4Jxa6vXdJyysRxFGsEsLKBDl0rRjA=
|
github.com/sigstore/rekor v1.3.8 h1:B8kJI8mpSIXova4Jxa6vXdJyysRxFGsEsLKBDl0rRjA=
|
||||||
|
|
|
@ -19,6 +19,7 @@ const (
|
||||||
|
|
||||||
tbFunc // func(T) bool
|
tbFunc // func(T) bool
|
||||||
ttbFunc // func(T, T) bool
|
ttbFunc // func(T, T) bool
|
||||||
|
ttiFunc // func(T, T) int
|
||||||
trbFunc // func(T, R) bool
|
trbFunc // func(T, R) bool
|
||||||
tibFunc // func(T, I) bool
|
tibFunc // func(T, I) bool
|
||||||
trFunc // func(T) R
|
trFunc // func(T) R
|
||||||
|
@ -28,11 +29,13 @@ const (
|
||||||
Transformer = trFunc // func(T) R
|
Transformer = trFunc // func(T) R
|
||||||
ValueFilter = ttbFunc // func(T, T) bool
|
ValueFilter = ttbFunc // func(T, T) bool
|
||||||
Less = ttbFunc // func(T, T) bool
|
Less = ttbFunc // func(T, T) bool
|
||||||
|
Compare = ttiFunc // func(T, T) int
|
||||||
ValuePredicate = tbFunc // func(T) bool
|
ValuePredicate = tbFunc // func(T) bool
|
||||||
KeyValuePredicate = trbFunc // func(T, R) bool
|
KeyValuePredicate = trbFunc // func(T, R) bool
|
||||||
)
|
)
|
||||||
|
|
||||||
var boolType = reflect.TypeOf(true)
|
var boolType = reflect.TypeOf(true)
|
||||||
|
var intType = reflect.TypeOf(0)
|
||||||
|
|
||||||
// IsType reports whether the reflect.Type is of the specified function type.
|
// IsType reports whether the reflect.Type is of the specified function type.
|
||||||
func IsType(t reflect.Type, ft funcType) bool {
|
func IsType(t reflect.Type, ft funcType) bool {
|
||||||
|
@ -49,6 +52,10 @@ func IsType(t reflect.Type, ft funcType) bool {
|
||||||
if ni == 2 && no == 1 && t.In(0) == t.In(1) && t.Out(0) == boolType {
|
if ni == 2 && no == 1 && t.In(0) == t.In(1) && t.Out(0) == boolType {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
case ttiFunc: // func(T, T) int
|
||||||
|
if ni == 2 && no == 1 && t.In(0) == t.In(1) && t.Out(0) == intType {
|
||||||
|
return true
|
||||||
|
}
|
||||||
case trbFunc: // func(T, R) bool
|
case trbFunc: // func(T, R) bool
|
||||||
if ni == 2 && no == 1 && t.Out(0) == boolType {
|
if ni == 2 && no == 1 && t.Out(0) == boolType {
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -232,7 +232,15 @@ func (validator) apply(s *state, vx, vy reflect.Value) {
|
||||||
if t := s.curPath.Index(-2).Type(); t.Name() != "" {
|
if t := s.curPath.Index(-2).Type(); t.Name() != "" {
|
||||||
// Named type with unexported fields.
|
// Named type with unexported fields.
|
||||||
name = fmt.Sprintf("%q.%v", t.PkgPath(), t.Name()) // e.g., "path/to/package".MyType
|
name = fmt.Sprintf("%q.%v", t.PkgPath(), t.Name()) // e.g., "path/to/package".MyType
|
||||||
if _, ok := reflect.New(t).Interface().(error); ok {
|
isProtoMessage := func(t reflect.Type) bool {
|
||||||
|
m, ok := reflect.PointerTo(t).MethodByName("ProtoReflect")
|
||||||
|
return ok && m.Type.NumIn() == 1 && m.Type.NumOut() == 1 &&
|
||||||
|
m.Type.Out(0).PkgPath() == "google.golang.org/protobuf/reflect/protoreflect" &&
|
||||||
|
m.Type.Out(0).Name() == "Message"
|
||||||
|
}
|
||||||
|
if isProtoMessage(t) {
|
||||||
|
help = `consider using "google.golang.org/protobuf/testing/protocmp".Transform to compare proto.Message types`
|
||||||
|
} else if _, ok := reflect.New(t).Interface().(error); ok {
|
||||||
help = "consider using cmpopts.EquateErrors to compare error values"
|
help = "consider using cmpopts.EquateErrors to compare error values"
|
||||||
} else if t.Comparable() {
|
} else if t.Comparable() {
|
||||||
help = "consider using cmpopts.EquateComparable to compare comparable Go types"
|
help = "consider using cmpopts.EquateComparable to compare comparable Go types"
|
||||||
|
|
|
@ -11,9 +11,10 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/internal/common"
|
|
||||||
"github.com/tklauser/go-sysconf"
|
"github.com/tklauser/go-sysconf"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
|
|
||||||
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -135,7 +136,7 @@ func parseDmesgBoot(fileName string) (InfoStat, error) {
|
||||||
c.VendorID = matches[1]
|
c.VendorID = matches[1]
|
||||||
t, err := strconv.ParseInt(matches[2], 10, 32)
|
t, err := strconv.ParseInt(matches[2], 10, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c, fmt.Errorf("unable to parse DragonflyBSD CPU stepping information from %q: %v", line, err)
|
return c, fmt.Errorf("unable to parse DragonflyBSD CPU stepping information from %q: %w", line, err)
|
||||||
}
|
}
|
||||||
c.Stepping = int32(t)
|
c.Stepping = int32(t)
|
||||||
} else if matches := featuresMatch.FindStringSubmatch(line); matches != nil {
|
} else if matches := featuresMatch.FindStringSubmatch(line); matches != nil {
|
||||||
|
|
|
@ -57,7 +57,7 @@ func TimesWithContext(ctx context.Context, percpu bool) (ret []TimesStat, err er
|
||||||
|
|
||||||
ncpu, err := unix.SysctlUint32("hw.ncpu")
|
ncpu, err := unix.SysctlUint32("hw.ncpu")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return //nolint:nakedret //FIXME
|
||||||
}
|
}
|
||||||
|
|
||||||
var i uint32
|
var i uint32
|
||||||
|
|
|
@ -9,9 +9,10 @@ import (
|
||||||
"runtime"
|
"runtime"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/internal/common"
|
|
||||||
"github.com/tklauser/go-sysconf"
|
"github.com/tklauser/go-sysconf"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
|
|
||||||
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -74,7 +75,7 @@ func TimesWithContext(ctx context.Context, percpu bool) (ret []TimesStat, err er
|
||||||
|
|
||||||
ncpu, err := unix.SysctlUint32("hw.ncpu")
|
ncpu, err := unix.SysctlUint32("hw.ncpu")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return //nolint:nakedret //FIXME
|
||||||
}
|
}
|
||||||
|
|
||||||
var i uint32
|
var i uint32
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
stats "github.com/lufia/plan9stats"
|
stats "github.com/lufia/plan9stats"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/internal/common"
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ var kstatSplit = regexp.MustCompile(`[:\s]+`)
|
||||||
func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) {
|
func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) {
|
||||||
kstatSysOut, err := invoke.CommandWithContext(ctx, "kstat", "-p", "cpu_stat:*:*:/^idle$|^user$|^kernel$|^iowait$|^swap$/")
|
kstatSysOut, err := invoke.CommandWithContext(ctx, "kstat", "-p", "cpu_stat:*:*:/^idle$|^user$|^kernel$|^iowait$|^swap$/")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot execute kstat: %s", err)
|
return nil, fmt.Errorf("cannot execute kstat: %w", err)
|
||||||
}
|
}
|
||||||
cpu := make(map[float64]float64)
|
cpu := make(map[float64]float64)
|
||||||
idle := make(map[float64]float64)
|
idle := make(map[float64]float64)
|
||||||
|
@ -57,29 +57,29 @@ func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) {
|
||||||
}
|
}
|
||||||
cpuNumber, err := strconv.ParseFloat(fields[1], 64)
|
cpuNumber, err := strconv.ParseFloat(fields[1], 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse cpu number: %s", err)
|
return nil, fmt.Errorf("cannot parse cpu number: %w", err)
|
||||||
}
|
}
|
||||||
cpu[cpuNumber] = cpuNumber
|
cpu[cpuNumber] = cpuNumber
|
||||||
switch fields[3] {
|
switch fields[3] {
|
||||||
case "idle":
|
case "idle":
|
||||||
idle[cpuNumber], err = strconv.ParseFloat(fields[4], 64)
|
idle[cpuNumber], err = strconv.ParseFloat(fields[4], 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse idle: %s", err)
|
return nil, fmt.Errorf("cannot parse idle: %w", err)
|
||||||
}
|
}
|
||||||
case "user":
|
case "user":
|
||||||
user[cpuNumber], err = strconv.ParseFloat(fields[4], 64)
|
user[cpuNumber], err = strconv.ParseFloat(fields[4], 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse user: %s", err)
|
return nil, fmt.Errorf("cannot parse user: %w", err)
|
||||||
}
|
}
|
||||||
case "kernel":
|
case "kernel":
|
||||||
kern[cpuNumber], err = strconv.ParseFloat(fields[4], 64)
|
kern[cpuNumber], err = strconv.ParseFloat(fields[4], 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse kernel: %s", err)
|
return nil, fmt.Errorf("cannot parse kernel: %w", err)
|
||||||
}
|
}
|
||||||
case "iowait":
|
case "iowait":
|
||||||
iowt[cpuNumber], err = strconv.ParseFloat(fields[4], 64)
|
iowt[cpuNumber], err = strconv.ParseFloat(fields[4], 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse iowait: %s", err)
|
return nil, fmt.Errorf("cannot parse iowait: %w", err)
|
||||||
}
|
}
|
||||||
//not sure how this translates, don't report, add to kernel, something else?
|
//not sure how this translates, don't report, add to kernel, something else?
|
||||||
/*case "swap":
|
/*case "swap":
|
||||||
|
@ -121,22 +121,22 @@ func Info() ([]InfoStat, error) {
|
||||||
func InfoWithContext(ctx context.Context) ([]InfoStat, error) {
|
func InfoWithContext(ctx context.Context) ([]InfoStat, error) {
|
||||||
psrInfoOut, err := invoke.CommandWithContext(ctx, "psrinfo", "-p", "-v")
|
psrInfoOut, err := invoke.CommandWithContext(ctx, "psrinfo", "-p", "-v")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot execute psrinfo: %s", err)
|
return nil, fmt.Errorf("cannot execute psrinfo: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
procs, err := parseProcessorInfo(string(psrInfoOut))
|
procs, err := parseProcessorInfo(string(psrInfoOut))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error parsing psrinfo output: %s", err)
|
return nil, fmt.Errorf("error parsing psrinfo output: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
isaInfoOut, err := invoke.CommandWithContext(ctx, "isainfo", "-b", "-v")
|
isaInfoOut, err := invoke.CommandWithContext(ctx, "isainfo", "-b", "-v")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot execute isainfo: %s", err)
|
return nil, fmt.Errorf("cannot execute isainfo: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
flags, err := parseISAInfo(string(isaInfoOut))
|
flags, err := parseISAInfo(string(isaInfoOut))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error parsing isainfo output: %s", err)
|
return nil, fmt.Errorf("error parsing isainfo output: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result := make([]InfoStat, 0, len(flags))
|
result := make([]InfoStat, 0, len(flags))
|
||||||
|
@ -160,7 +160,7 @@ func parseISAInfo(cmdOutput string) ([]string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
flags := make([]string, len(words)-4)
|
flags := make([]string, len(words)-4)
|
||||||
for i, val := range words[4:] {
|
for i, val := range words[4:] { //nolint:gosimple //FIXME
|
||||||
flags[i] = val
|
flags[i] = val
|
||||||
}
|
}
|
||||||
sort.Strings(flags)
|
sort.Strings(flags)
|
||||||
|
@ -194,7 +194,7 @@ func parseProcessorInfo(cmdOutput string) ([]InfoStat, error) {
|
||||||
if physicalCPU[psrStepOffset] != "" {
|
if physicalCPU[psrStepOffset] != "" {
|
||||||
stepParsed, err := strconv.ParseInt(physicalCPU[psrStepOffset], 10, 32)
|
stepParsed, err := strconv.ParseInt(physicalCPU[psrStepOffset], 10, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse value %q for step as 32-bit integer: %s", physicalCPU[9], err)
|
return nil, fmt.Errorf("cannot parse value %q for step as 32-bit integer: %w", physicalCPU[9], err)
|
||||||
}
|
}
|
||||||
step = int32(stepParsed)
|
step = int32(stepParsed)
|
||||||
}
|
}
|
||||||
|
@ -202,7 +202,7 @@ func parseProcessorInfo(cmdOutput string) ([]InfoStat, error) {
|
||||||
if physicalCPU[psrClockOffset] != "" {
|
if physicalCPU[psrClockOffset] != "" {
|
||||||
clockParsed, err := strconv.ParseInt(physicalCPU[psrClockOffset], 10, 64)
|
clockParsed, err := strconv.ParseInt(physicalCPU[psrClockOffset], 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse value %q for clock as 32-bit integer: %s", physicalCPU[10], err)
|
return nil, fmt.Errorf("cannot parse value %q for clock as 32-bit integer: %w", physicalCPU[10], err)
|
||||||
}
|
}
|
||||||
clock = float64(clockParsed)
|
clock = float64(clockParsed)
|
||||||
}
|
}
|
||||||
|
@ -214,7 +214,7 @@ func parseProcessorInfo(cmdOutput string) ([]InfoStat, error) {
|
||||||
case physicalCPU[psrNumCoresOffset] != "":
|
case physicalCPU[psrNumCoresOffset] != "":
|
||||||
numCores, err = strconv.ParseInt(physicalCPU[psrNumCoresOffset], 10, 32)
|
numCores, err = strconv.ParseInt(physicalCPU[psrNumCoresOffset], 10, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse value %q for core count as 32-bit integer: %s", physicalCPU[1], err)
|
return nil, fmt.Errorf("cannot parse value %q for core count as 32-bit integer: %w", physicalCPU[1], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < int(numCores); i++ {
|
for i := 0; i < int(numCores); i++ {
|
||||||
|
@ -235,12 +235,12 @@ func parseProcessorInfo(cmdOutput string) ([]InfoStat, error) {
|
||||||
case physicalCPU[psrNumCoresHTOffset] != "":
|
case physicalCPU[psrNumCoresHTOffset] != "":
|
||||||
numCores, err = strconv.ParseInt(physicalCPU[psrNumCoresHTOffset], 10, 32)
|
numCores, err = strconv.ParseInt(physicalCPU[psrNumCoresHTOffset], 10, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse value %q for core count as 32-bit integer: %s", physicalCPU[3], err)
|
return nil, fmt.Errorf("cannot parse value %q for core count as 32-bit integer: %w", physicalCPU[3], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
numHT, err = strconv.ParseInt(physicalCPU[psrNumHTOffset], 10, 32)
|
numHT, err = strconv.ParseInt(physicalCPU[psrNumHTOffset], 10, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse value %q for hyperthread count as 32-bit integer: %s", physicalCPU[4], err)
|
return nil, fmt.Errorf("cannot parse value %q for hyperthread count as 32-bit integer: %w", physicalCPU[4], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < int(numCores); i++ {
|
for i := 0; i < int(numCores); i++ {
|
||||||
|
|
|
@ -6,11 +6,13 @@ package cpu
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/internal/common"
|
|
||||||
"github.com/yusufpapurcu/wmi"
|
"github.com/yusufpapurcu/wmi"
|
||||||
"golang.org/x/sys/windows"
|
"golang.org/x/sys/windows"
|
||||||
|
|
||||||
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
var procGetNativeSystemInfo = common.Modkernel32.NewProc("GetNativeSystemInfo")
|
var procGetNativeSystemInfo = common.Modkernel32.NewProc("GetNativeSystemInfo")
|
||||||
|
@ -110,7 +112,7 @@ func InfoWithContext(ctx context.Context) ([]InfoStat, error) {
|
||||||
|
|
||||||
cpu := InfoStat{
|
cpu := InfoStat{
|
||||||
CPU: int32(i),
|
CPU: int32(i),
|
||||||
Family: fmt.Sprintf("%d", l.Family),
|
Family: strconv.FormatUint(uint64(l.Family), 10),
|
||||||
VendorID: l.Manufacturer,
|
VendorID: l.Manufacturer,
|
||||||
ModelName: l.Name,
|
ModelName: l.Name,
|
||||||
Cores: int32(l.NumberOfLogicalProcessors),
|
Cores: int32(l.NumberOfLogicalProcessors),
|
||||||
|
|
|
@ -137,7 +137,7 @@ func (bigEndian) GoString() string { return "binary.BigEndian" }
|
||||||
// blank (_) field names is skipped; i.e., blank field names
|
// blank (_) field names is skipped; i.e., blank field names
|
||||||
// may be used for padding.
|
// may be used for padding.
|
||||||
// When reading into a struct, all non-blank fields must be exported.
|
// When reading into a struct, all non-blank fields must be exported.
|
||||||
func Read(r io.Reader, order ByteOrder, data interface{}) error {
|
func Read(r io.Reader, order ByteOrder, data any) error {
|
||||||
// Fast path for basic types and slices.
|
// Fast path for basic types and slices.
|
||||||
if n := intDataSize(data); n != 0 {
|
if n := intDataSize(data); n != 0 {
|
||||||
var b [8]byte
|
var b [8]byte
|
||||||
|
@ -229,7 +229,7 @@ func Read(r io.Reader, order ByteOrder, data interface{}) error {
|
||||||
// and read from successive fields of the data.
|
// and read from successive fields of the data.
|
||||||
// When writing structs, zero values are written for fields
|
// When writing structs, zero values are written for fields
|
||||||
// with blank (_) field names.
|
// with blank (_) field names.
|
||||||
func Write(w io.Writer, order ByteOrder, data interface{}) error {
|
func Write(w io.Writer, order ByteOrder, data any) error {
|
||||||
// Fast path for basic types and slices.
|
// Fast path for basic types and slices.
|
||||||
if n := intDataSize(data); n != 0 {
|
if n := intDataSize(data); n != 0 {
|
||||||
var b [8]byte
|
var b [8]byte
|
||||||
|
@ -339,7 +339,7 @@ func Write(w io.Writer, order ByteOrder, data interface{}) error {
|
||||||
// Size returns how many bytes Write would generate to encode the value v, which
|
// Size returns how many bytes Write would generate to encode the value v, which
|
||||||
// must be a fixed-size value or a slice of fixed-size values, or a pointer to such data.
|
// must be a fixed-size value or a slice of fixed-size values, or a pointer to such data.
|
||||||
// If v is neither of these, Size returns -1.
|
// If v is neither of these, Size returns -1.
|
||||||
func Size(v interface{}) int {
|
func Size(v any) int {
|
||||||
return dataSize(reflect.Indirect(reflect.ValueOf(v)))
|
return dataSize(reflect.Indirect(reflect.ValueOf(v)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -607,7 +607,7 @@ func (e *encoder) skip(v reflect.Value) {
|
||||||
|
|
||||||
// intDataSize returns the size of the data required to represent the data when encoded.
|
// intDataSize returns the size of the data required to represent the data when encoded.
|
||||||
// It returns zero if the type cannot be implemented by the fast path in Read or Write.
|
// It returns zero if the type cannot be implemented by the fast path in Read or Write.
|
||||||
func intDataSize(data interface{}) int {
|
func intDataSize(data any) int {
|
||||||
switch data := data.(type) {
|
switch data := data.(type) {
|
||||||
case int8, *int8, *uint8:
|
case int8, *int8, *uint8:
|
||||||
return 1
|
return 1
|
||||||
|
|
|
@ -311,7 +311,7 @@ func IntContains(target []int, src int) bool {
|
||||||
|
|
||||||
// get struct attributes.
|
// get struct attributes.
|
||||||
// This method is used only for debugging platform dependent code.
|
// This method is used only for debugging platform dependent code.
|
||||||
func attributes(m interface{}) map[string]reflect.Type {
|
func attributes(m any) map[string]reflect.Type {
|
||||||
typ := reflect.TypeOf(m)
|
typ := reflect.TypeOf(m)
|
||||||
if typ.Kind() == reflect.Ptr {
|
if typ.Kind() == reflect.Ptr {
|
||||||
typ = typ.Elem()
|
typ = typ.Elem()
|
||||||
|
|
|
@ -5,6 +5,7 @@ package common
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
@ -306,7 +307,7 @@ const (
|
||||||
|
|
||||||
func NewSMC(ioKit *Library) (*SMC, error) {
|
func NewSMC(ioKit *Library) (*SMC, error) {
|
||||||
if ioKit.path != IOKit {
|
if ioKit.path != IOKit {
|
||||||
return nil, fmt.Errorf("library is not IOKit")
|
return nil, errors.New("library is not IOKit")
|
||||||
}
|
}
|
||||||
|
|
||||||
ioServiceGetMatchingService := GetFunc[IOServiceGetMatchingServiceFunc](ioKit, IOServiceGetMatchingServiceSym)
|
ioServiceGetMatchingService := GetFunc[IOServiceGetMatchingServiceFunc](ioKit, IOServiceGetMatchingServiceSym)
|
||||||
|
@ -324,7 +325,7 @@ func NewSMC(ioKit *Library) (*SMC, error) {
|
||||||
|
|
||||||
var conn uint32
|
var conn uint32
|
||||||
if result := ioServiceOpen(service, machTaskSelf(), 0, &conn); result != 0 {
|
if result := ioServiceOpen(service, machTaskSelf(), 0, &conn); result != 0 {
|
||||||
return nil, fmt.Errorf("ERROR: IOServiceOpen failed")
|
return nil, errors.New("ERROR: IOServiceOpen failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
ioObjectRelease(service)
|
ioObjectRelease(service)
|
||||||
|
@ -343,7 +344,7 @@ func (s *SMC) Close() error {
|
||||||
ioServiceClose := GetFunc[IOServiceCloseFunc](s.lib, IOServiceCloseSym)
|
ioServiceClose := GetFunc[IOServiceCloseFunc](s.lib, IOServiceCloseSym)
|
||||||
|
|
||||||
if result := ioServiceClose(s.conn); result != 0 {
|
if result := ioServiceClose(s.conn); result != 0 {
|
||||||
return fmt.Errorf("ERROR: IOServiceClose failed")
|
return errors.New("ERROR: IOServiceClose failed")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -367,8 +368,8 @@ func (s CStr) Ptr() *byte {
|
||||||
return &s[0]
|
return &s[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c CStr) Addr() uintptr {
|
func (s CStr) Addr() uintptr {
|
||||||
return uintptr(unsafe.Pointer(c.Ptr()))
|
return uintptr(unsafe.Pointer(s.Ptr()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s CStr) GoString() string {
|
func (s CStr) GoString() string {
|
||||||
|
|
|
@ -197,7 +197,7 @@ func ProcessorQueueLengthCounter() (*Win32PerformanceCounter, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// WMIQueryWithContext - wraps wmi.Query with a timed-out context to avoid hanging
|
// WMIQueryWithContext - wraps wmi.Query with a timed-out context to avoid hanging
|
||||||
func WMIQueryWithContext(ctx context.Context, query string, dst interface{}, connectServerArgs ...interface{}) error {
|
func WMIQueryWithContext(ctx context.Context, query string, dst any, connectServerArgs ...any) error {
|
||||||
if _, ok := ctx.Deadline(); !ok {
|
if _, ok := ctx.Deadline(); !ok {
|
||||||
ctxTimeout, cancel := context.WithTimeout(ctx, Timeout)
|
ctxTimeout, cancel := context.WithTimeout(ctx, Timeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
@ -273,19 +273,19 @@ type SystemExtendedHandleInformation struct {
|
||||||
// CallWithExpandingBuffer https://github.com/hillu/go-ntdll
|
// CallWithExpandingBuffer https://github.com/hillu/go-ntdll
|
||||||
func CallWithExpandingBuffer(fn func() NtStatus, buf *[]byte, resultLength *uint32) NtStatus {
|
func CallWithExpandingBuffer(fn func() NtStatus, buf *[]byte, resultLength *uint32) NtStatus {
|
||||||
for {
|
for {
|
||||||
if st := fn(); st == STATUS_BUFFER_OVERFLOW || st == STATUS_BUFFER_TOO_SMALL || st == STATUS_INFO_LENGTH_MISMATCH {
|
st := fn()
|
||||||
|
if st == STATUS_BUFFER_OVERFLOW || st == STATUS_BUFFER_TOO_SMALL || st == STATUS_INFO_LENGTH_MISMATCH {
|
||||||
if int(*resultLength) <= cap(*buf) {
|
if int(*resultLength) <= cap(*buf) {
|
||||||
(*reflect.SliceHeader)(unsafe.Pointer(buf)).Len = int(*resultLength)
|
(*reflect.SliceHeader)(unsafe.Pointer(buf)).Len = int(*resultLength)
|
||||||
} else {
|
} else {
|
||||||
*buf = make([]byte, int(*resultLength))
|
*buf = make([]byte, int(*resultLength))
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
} else {
|
|
||||||
if !st.IsError() {
|
|
||||||
*buf = (*buf)[:int(*resultLength)]
|
|
||||||
}
|
|
||||||
return st
|
|
||||||
}
|
}
|
||||||
|
if !st.IsError() {
|
||||||
|
*buf = (*buf)[:int(*resultLength)]
|
||||||
|
}
|
||||||
|
return st
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,9 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/internal/common"
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
|
|
||||||
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetPageSize() (uint64, error) {
|
func GetPageSize() (uint64, error) {
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
stats "github.com/lufia/plan9stats"
|
stats "github.com/lufia/plan9stats"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/internal/common"
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -11,8 +11,9 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/internal/common"
|
|
||||||
"github.com/tklauser/go-sysconf"
|
"github.com/tklauser/go-sysconf"
|
||||||
|
|
||||||
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
// VirtualMemory for Solaris is a minimal implementation which only returns
|
// VirtualMemory for Solaris is a minimal implementation which only returns
|
||||||
|
@ -24,17 +25,17 @@ func VirtualMemory() (*VirtualMemoryStat, error) {
|
||||||
func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) {
|
func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) {
|
||||||
result := &VirtualMemoryStat{}
|
result := &VirtualMemoryStat{}
|
||||||
|
|
||||||
zoneName, err := zoneName()
|
zoneName, err := zoneName() //nolint:contextcheck //FIXME
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if zoneName == "global" {
|
if zoneName == "global" {
|
||||||
cap, err := globalZoneMemoryCapacity()
|
capacity, err := globalZoneMemoryCapacity() //nolint:contextcheck //FIXME
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
result.Total = cap
|
result.Total = capacity
|
||||||
freemem, err := globalZoneFreeMemory(ctx)
|
freemem, err := globalZoneFreeMemory(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -43,11 +44,11 @@ func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) {
|
||||||
result.Free = freemem
|
result.Free = freemem
|
||||||
result.Used = result.Total - result.Free
|
result.Used = result.Total - result.Free
|
||||||
} else {
|
} else {
|
||||||
cap, err := nonGlobalZoneMemoryCapacity()
|
capacity, err := nonGlobalZoneMemoryCapacity() //nolint:contextcheck //FIXME
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
result.Total = cap
|
result.Total = capacity
|
||||||
}
|
}
|
||||||
|
|
||||||
return result, nil
|
return result, nil
|
||||||
|
|
|
@ -9,8 +9,9 @@ import (
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/internal/common"
|
|
||||||
"golang.org/x/sys/windows"
|
"golang.org/x/sys/windows"
|
||||||
|
|
||||||
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
@ -255,7 +255,7 @@ func InterfacesWithContext(ctx context.Context) (InterfaceStatList, error) {
|
||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getIOCountersAll(n []IOCountersStat) ([]IOCountersStat, error) {
|
func getIOCountersAll(n []IOCountersStat) []IOCountersStat {
|
||||||
r := IOCountersStat{
|
r := IOCountersStat{
|
||||||
Name: "all",
|
Name: "all",
|
||||||
}
|
}
|
||||||
|
@ -270,7 +270,7 @@ func getIOCountersAll(n []IOCountersStat) ([]IOCountersStat, error) {
|
||||||
r.Dropout += nic.Dropout
|
r.Dropout += nic.Dropout
|
||||||
}
|
}
|
||||||
|
|
||||||
return []IOCountersStat{r}, nil
|
return []IOCountersStat{r}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetIOCounters returns network I/O statistics for every network
|
// NetIOCounters returns network I/O statistics for every network
|
||||||
|
|
|
@ -30,14 +30,14 @@ func parseNetstatLine(line string) (stat *IOCountersStat, linkID *uint, err erro
|
||||||
|
|
||||||
if columns[0] == "Name" {
|
if columns[0] == "Name" {
|
||||||
err = errNetstatHeader
|
err = errNetstatHeader
|
||||||
return
|
return //nolint:nakedret //FIXME
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to extract the numeric value from <Link#123>
|
// try to extract the numeric value from <Link#123>
|
||||||
if subMatch := netstatLinkRegexp.FindStringSubmatch(columns[2]); len(subMatch) == 2 {
|
if subMatch := netstatLinkRegexp.FindStringSubmatch(columns[2]); len(subMatch) == 2 {
|
||||||
numericValue, err = strconv.ParseUint(subMatch[1], 10, 64)
|
numericValue, err = strconv.ParseUint(subMatch[1], 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return //nolint:nakedret //FIXME
|
||||||
}
|
}
|
||||||
linkIDUint := uint(numericValue)
|
linkIDUint := uint(numericValue)
|
||||||
linkID = &linkIDUint
|
linkID = &linkIDUint
|
||||||
|
@ -51,7 +51,7 @@ func parseNetstatLine(line string) (stat *IOCountersStat, linkID *uint, err erro
|
||||||
}
|
}
|
||||||
if numberColumns < 11 || numberColumns > 13 {
|
if numberColumns < 11 || numberColumns > 13 {
|
||||||
err = fmt.Errorf("Line %q do have an invalid number of columns %d", line, numberColumns)
|
err = fmt.Errorf("Line %q do have an invalid number of columns %d", line, numberColumns)
|
||||||
return
|
return //nolint:nakedret //FIXME
|
||||||
}
|
}
|
||||||
|
|
||||||
parsed := make([]uint64, 0, 7)
|
parsed := make([]uint64, 0, 7)
|
||||||
|
@ -74,7 +74,7 @@ func parseNetstatLine(line string) (stat *IOCountersStat, linkID *uint, err erro
|
||||||
}
|
}
|
||||||
|
|
||||||
if numericValue, err = strconv.ParseUint(target, 10, 64); err != nil {
|
if numericValue, err = strconv.ParseUint(target, 10, 64); err != nil {
|
||||||
return
|
return //nolint:nakedret //FIXME
|
||||||
}
|
}
|
||||||
parsed = append(parsed, numericValue)
|
parsed = append(parsed, numericValue)
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,7 @@ func parseNetstatLine(line string) (stat *IOCountersStat, linkID *uint, err erro
|
||||||
if len(parsed) == 7 {
|
if len(parsed) == 7 {
|
||||||
stat.Dropout = parsed[6]
|
stat.Dropout = parsed[6]
|
||||||
}
|
}
|
||||||
return
|
return //nolint:nakedret //FIXME
|
||||||
}
|
}
|
||||||
|
|
||||||
type netstatInterface struct {
|
type netstatInterface struct {
|
||||||
|
@ -249,7 +249,7 @@ func IOCountersWithContext(ctx context.Context, pernic bool) ([]IOCountersStat,
|
||||||
}
|
}
|
||||||
|
|
||||||
if !pernic {
|
if !pernic {
|
||||||
return getIOCountersAll(ret)
|
return getIOCountersAll(ret), nil
|
||||||
}
|
}
|
||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,7 +85,7 @@ func IOCountersWithContext(ctx context.Context, pernic bool) ([]IOCountersStat,
|
||||||
}
|
}
|
||||||
|
|
||||||
if !pernic {
|
if !pernic {
|
||||||
return getIOCountersAll(ret)
|
return getIOCountersAll(ret), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret, nil
|
return ret, nil
|
||||||
|
|
|
@ -128,7 +128,7 @@ func IOCountersByFileWithContext(ctx context.Context, pernic bool, filename stri
|
||||||
}
|
}
|
||||||
|
|
||||||
if !pernic {
|
if !pernic {
|
||||||
return getIOCountersAll(ret)
|
return getIOCountersAll(ret), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret, nil
|
return ret, nil
|
||||||
|
|
|
@ -150,15 +150,15 @@ func IOCountersWithContext(ctx context.Context, pernic bool) ([]IOCountersStat,
|
||||||
ret = append(ret, ioc)
|
ret = append(ret, ioc)
|
||||||
}
|
}
|
||||||
|
|
||||||
if pernic == false {
|
if !pernic {
|
||||||
return getIOCountersAll(ret)
|
return getIOCountersAll(ret), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func IOCountersByFileWithContext(ctx context.Context, pernic bool, filename string) ([]IOCountersStat, error) {
|
func IOCountersByFileWithContext(ctx context.Context, pernic bool, filename string) ([]IOCountersStat, error) {
|
||||||
return IOCounters(pernic)
|
return IOCounters(pernic) //nolint:contextcheck //FIXME
|
||||||
}
|
}
|
||||||
|
|
||||||
func FilterCountersWithContext(ctx context.Context) ([]FilterStat, error) {
|
func FilterCountersWithContext(ctx context.Context) ([]FilterStat, error) {
|
||||||
|
|
|
@ -5,6 +5,7 @@ package net
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
@ -29,7 +30,7 @@ func IOCountersWithContext(ctx context.Context, pernic bool) ([]IOCountersStat,
|
||||||
|
|
||||||
lines := strings.Split(strings.TrimSpace(string(kstatSysOut)), "\n")
|
lines := strings.Split(strings.TrimSpace(string(kstatSysOut)), "\n")
|
||||||
if len(lines) == 0 {
|
if len(lines) == 0 {
|
||||||
return nil, fmt.Errorf("no interface found")
|
return nil, errors.New("no interface found")
|
||||||
}
|
}
|
||||||
rbytes64arr := make(map[string]uint64)
|
rbytes64arr := make(map[string]uint64)
|
||||||
ipackets64arr := make(map[string]uint64)
|
ipackets64arr := make(map[string]uint64)
|
||||||
|
@ -104,7 +105,7 @@ func IOCountersWithContext(ctx context.Context, pernic bool) ([]IOCountersStat,
|
||||||
}
|
}
|
||||||
|
|
||||||
if !pernic {
|
if !pernic {
|
||||||
return getIOCountersAll(ret)
|
return getIOCountersAll(ret), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret, nil
|
return ret, nil
|
||||||
|
|
|
@ -5,14 +5,16 @@ package net
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/internal/common"
|
|
||||||
"golang.org/x/sys/windows"
|
"golang.org/x/sys/windows"
|
||||||
|
|
||||||
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -191,13 +193,13 @@ func IOCountersWithContext(ctx context.Context, pernic bool) ([]IOCountersStat,
|
||||||
}
|
}
|
||||||
|
|
||||||
if !pernic {
|
if !pernic {
|
||||||
return getIOCountersAll(counters)
|
return getIOCountersAll(counters), nil
|
||||||
}
|
}
|
||||||
return counters, nil
|
return counters, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func IOCountersByFileWithContext(ctx context.Context, pernic bool, filename string) ([]IOCountersStat, error) {
|
func IOCountersByFileWithContext(ctx context.Context, pernic bool, filename string) ([]IOCountersStat, error) {
|
||||||
return IOCounters(pernic)
|
return IOCounters(pernic) //nolint:contextcheck //FIXME
|
||||||
}
|
}
|
||||||
|
|
||||||
func ConnectionsWithContext(ctx context.Context, kind string) ([]ConnectionStat, error) {
|
func ConnectionsWithContext(ctx context.Context, kind string) ([]ConnectionStat, error) {
|
||||||
|
@ -238,7 +240,7 @@ func getProcInet(kinds []netConnectionKindType, pid int32) ([]ConnectionStat, er
|
||||||
|
|
||||||
func getNetStatWithKind(kindType netConnectionKindType) ([]ConnectionStat, error) {
|
func getNetStatWithKind(kindType netConnectionKindType) ([]ConnectionStat, error) {
|
||||||
if kindType.filename == "" {
|
if kindType.filename == "" {
|
||||||
return nil, fmt.Errorf("kind filename must be required")
|
return nil, errors.New("kind filename must be required")
|
||||||
}
|
}
|
||||||
|
|
||||||
switch kindType.filename {
|
switch kindType.filename {
|
||||||
|
@ -326,7 +328,7 @@ func getTableUintptr(family uint32, buf []byte) uintptr {
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
func getTableInfo(filename string, table interface{}) (index, step, length int) {
|
func getTableInfo(filename string, table any) (index, step, length int) {
|
||||||
switch filename {
|
switch filename {
|
||||||
case kindTCP4.filename:
|
case kindTCP4.filename:
|
||||||
index = int(unsafe.Sizeof(table.(pmibTCPTableOwnerPidAll).DwNumEntries))
|
index = int(unsafe.Sizeof(table.(pmibTCPTableOwnerPidAll).DwNumEntries))
|
||||||
|
@ -360,7 +362,7 @@ func getTCPConnections(family uint32) ([]ConnectionStat, error) {
|
||||||
)
|
)
|
||||||
|
|
||||||
if family == 0 {
|
if family == 0 {
|
||||||
return nil, fmt.Errorf("faimly must be required")
|
return nil, errors.New("faimly must be required")
|
||||||
}
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
|
@ -390,7 +392,7 @@ func getTCPConnections(family uint32) ([]ConnectionStat, error) {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if err != windows.ERROR_INSUFFICIENT_BUFFER {
|
if !errors.Is(err, windows.ERROR_INSUFFICIENT_BUFFER) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
buf = make([]byte, size)
|
buf = make([]byte, size)
|
||||||
|
@ -441,7 +443,7 @@ func getUDPConnections(family uint32) ([]ConnectionStat, error) {
|
||||||
)
|
)
|
||||||
|
|
||||||
if family == 0 {
|
if family == 0 {
|
||||||
return nil, fmt.Errorf("faimly must be required")
|
return nil, errors.New("faimly must be required")
|
||||||
}
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
|
@ -473,7 +475,7 @@ func getUDPConnections(family uint32) ([]ConnectionStat, error) {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if err != windows.ERROR_INSUFFICIENT_BUFFER {
|
if !errors.Is(err, windows.ERROR_INSUFFICIENT_BUFFER) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
buf = make([]byte, size)
|
buf = make([]byte, size)
|
||||||
|
|
|
@ -408,6 +408,11 @@ func (p *Process) Cmdline() (string, error) {
|
||||||
|
|
||||||
// CmdlineSlice returns the command line arguments of the process as a slice with each
|
// CmdlineSlice returns the command line arguments of the process as a slice with each
|
||||||
// element being an argument.
|
// element being an argument.
|
||||||
|
//
|
||||||
|
// On Windows, this assumes the command line is encoded according to the convention accepted by
|
||||||
|
// [golang.org/x/sys/windows.CmdlineToArgv] (the most common convention). If this is not suitable,
|
||||||
|
// you should instead use [Process.Cmdline] and parse the command line according to your specific
|
||||||
|
// requirements.
|
||||||
func (p *Process) CmdlineSlice() ([]string, error) {
|
func (p *Process) CmdlineSlice() ([]string, error) {
|
||||||
return p.CmdlineSliceWithContext(context.Background())
|
return p.CmdlineSliceWithContext(context.Background())
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
@ -348,7 +349,7 @@ func (p *Process) CwdWithContext(ctx context.Context) (string, error) {
|
||||||
ret := procPidInfo(p.Pid, common.PROC_PIDVNODEPATHINFO, 0, uintptr(unsafe.Pointer(&vpi)), vpiSize)
|
ret := procPidInfo(p.Pid, common.PROC_PIDVNODEPATHINFO, 0, uintptr(unsafe.Pointer(&vpi)), vpiSize)
|
||||||
errno, _ := lib.Dlsym("errno")
|
errno, _ := lib.Dlsym("errno")
|
||||||
err = *(**unix.Errno)(unsafe.Pointer(&errno))
|
err = *(**unix.Errno)(unsafe.Pointer(&errno))
|
||||||
if err == unix.EPERM {
|
if errors.Is(err, unix.EPERM) {
|
||||||
return "", ErrorNotPermitted
|
return "", ErrorNotPermitted
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -373,11 +374,11 @@ func procArgs(pid int32) ([]byte, int, error) {
|
||||||
return procargs, int(binary.LittleEndian.Uint32(nargs)), nil
|
return procargs, int(binary.LittleEndian.Uint32(nargs)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Process) CmdlineSliceWithContext(ctx context.Context) ([]string, error) {
|
func (p *Process) CmdlineSliceWithContext(_ context.Context) ([]string, error) {
|
||||||
return p.cmdlineSliceWithContext(ctx, true)
|
return p.cmdlineSlice()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Process) cmdlineSliceWithContext(ctx context.Context, fallback bool) ([]string, error) {
|
func (p *Process) cmdlineSlice() ([]string, error) {
|
||||||
pargs, nargs, err := procArgs(p.Pid)
|
pargs, nargs, err := procArgs(p.Pid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -408,8 +409,8 @@ func (p *Process) cmdlineSliceWithContext(ctx context.Context, fallback bool) ([
|
||||||
}
|
}
|
||||||
|
|
||||||
// cmdNameWithContext returns the command name (including spaces) without any arguments
|
// cmdNameWithContext returns the command name (including spaces) without any arguments
|
||||||
func (p *Process) cmdNameWithContext(ctx context.Context) (string, error) {
|
func (p *Process) cmdNameWithContext(_ context.Context) (string, error) {
|
||||||
r, err := p.cmdlineSliceWithContext(ctx, false)
|
r, err := p.cmdlineSlice()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,6 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
"sort"
|
||||||
|
@ -16,11 +15,12 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
cpu "github.com/shirou/gopsutil/v4/cpu"
|
|
||||||
"github.com/shirou/gopsutil/v4/internal/common"
|
|
||||||
mem "github.com/shirou/gopsutil/v4/mem"
|
|
||||||
net "github.com/shirou/gopsutil/v4/net"
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
|
|
||||||
|
"github.com/shirou/gopsutil/v4/cpu"
|
||||||
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||||||
|
"github.com/shirou/gopsutil/v4/mem"
|
||||||
|
"github.com/shirou/gopsutil/v4/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
func pidsWithContext(ctx context.Context) ([]int32, error) {
|
func pidsWithContext(ctx context.Context) ([]int32, error) {
|
||||||
|
@ -130,7 +130,7 @@ func readPtr(r io.Reader) (uintptr, error) {
|
||||||
}
|
}
|
||||||
return uintptr(p), nil
|
return uintptr(p), nil
|
||||||
default:
|
default:
|
||||||
return 0, fmt.Errorf("unsupported pointer size")
|
return 0, errors.New("unsupported pointer size")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -247,10 +247,7 @@ func (p *Process) fillFromCmdlineWithContext(ctx context.Context) (string, error
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
ret := strings.FieldsFunc(string(cmdline), func(r rune) bool {
|
ret := strings.FieldsFunc(string(cmdline), func(r rune) bool {
|
||||||
if r == '\u0000' {
|
return r == '\u0000'
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return strings.Join(ret, " "), nil
|
return strings.Join(ret, " "), nil
|
||||||
|
|
|
@ -12,16 +12,16 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
"unicode/utf16"
|
"unicode/utf16"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/cpu"
|
"github.com/shirou/gopsutil/v4/cpu"
|
||||||
"github.com/shirou/gopsutil/v4/internal/common"
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||||||
"github.com/shirou/gopsutil/v4/net"
|
"github.com/shirou/gopsutil/v4/net"
|
||||||
"golang.org/x/sys/windows"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Signal = syscall.Signal
|
type Signal = syscall.Signal
|
||||||
|
@ -245,7 +245,7 @@ func pidsWithContext(ctx context.Context) ([]int32, error) {
|
||||||
// inspired by https://gist.github.com/henkman/3083408
|
// inspired by https://gist.github.com/henkman/3083408
|
||||||
// and https://github.com/giampaolo/psutil/blob/1c3a15f637521ba5c0031283da39c733fda53e4c/psutil/arch/windows/process_info.c#L315-L329
|
// and https://github.com/giampaolo/psutil/blob/1c3a15f637521ba5c0031283da39c733fda53e4c/psutil/arch/windows/process_info.c#L315-L329
|
||||||
var ret []int32
|
var ret []int32
|
||||||
var read uint32 = 0
|
var read uint32
|
||||||
var psSize uint32 = 1024
|
var psSize uint32 = 1024
|
||||||
const dwordSize uint32 = 4
|
const dwordSize uint32 = 4
|
||||||
|
|
||||||
|
@ -288,10 +288,10 @@ func PidExistsWithContext(ctx context.Context, pid int32) (bool, error) {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
h, err := windows.OpenProcess(windows.SYNCHRONIZE, false, uint32(pid))
|
h, err := windows.OpenProcess(windows.SYNCHRONIZE, false, uint32(pid))
|
||||||
if err == windows.ERROR_ACCESS_DENIED {
|
if errors.Is(err, windows.ERROR_ACCESS_DENIED) {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
if err == windows.ERROR_INVALID_PARAMETER {
|
if errors.Is(err, windows.ERROR_INVALID_PARAMETER) {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -330,7 +330,7 @@ func (p *Process) NameWithContext(ctx context.Context) (string, error) {
|
||||||
|
|
||||||
exe, err := p.ExeWithContext(ctx)
|
exe, err := p.ExeWithContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("could not get Name: %s", err)
|
return "", fmt.Errorf("could not get Name: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return filepath.Base(exe), nil
|
return filepath.Base(exe), nil
|
||||||
|
@ -370,7 +370,7 @@ func (p *Process) ExeWithContext(ctx context.Context) (string, error) {
|
||||||
func (p *Process) CmdlineWithContext(_ context.Context) (string, error) {
|
func (p *Process) CmdlineWithContext(_ context.Context) (string, error) {
|
||||||
cmdline, err := getProcessCommandLine(p.Pid)
|
cmdline, err := getProcessCommandLine(p.Pid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("could not get CommandLine: %s", err)
|
return "", fmt.Errorf("could not get CommandLine: %w", err)
|
||||||
}
|
}
|
||||||
return cmdline, nil
|
return cmdline, nil
|
||||||
}
|
}
|
||||||
|
@ -380,13 +380,33 @@ func (p *Process) CmdlineSliceWithContext(ctx context.Context) ([]string, error)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return strings.Split(cmdline, " "), nil
|
return parseCmdline(cmdline)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseCmdline(cmdline string) ([]string, error) {
|
||||||
|
cmdlineptr, err := windows.UTF16PtrFromString(cmdline)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var argc int32
|
||||||
|
argvptr, err := windows.CommandLineToArgv(cmdlineptr, &argc)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer windows.LocalFree(windows.Handle(uintptr(unsafe.Pointer(argvptr))))
|
||||||
|
|
||||||
|
argv := make([]string, argc)
|
||||||
|
for i, v := range (*argvptr)[:argc] {
|
||||||
|
argv[i] = windows.UTF16ToString((*v)[:])
|
||||||
|
}
|
||||||
|
return argv, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Process) createTimeWithContext(ctx context.Context) (int64, error) {
|
func (p *Process) createTimeWithContext(ctx context.Context) (int64, error) {
|
||||||
ru, err := getRusage(p.Pid)
|
ru, err := getRusage(p.Pid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("could not get CreationDate: %s", err)
|
return 0, fmt.Errorf("could not get CreationDate: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ru.CreationTime.Nanoseconds() / 1000000, nil
|
return ru.CreationTime.Nanoseconds() / 1000000, nil
|
||||||
|
@ -394,7 +414,7 @@ func (p *Process) createTimeWithContext(ctx context.Context) (int64, error) {
|
||||||
|
|
||||||
func (p *Process) CwdWithContext(_ context.Context) (string, error) {
|
func (p *Process) CwdWithContext(_ context.Context) (string, error) {
|
||||||
h, err := windows.OpenProcess(processQueryInformation|windows.PROCESS_VM_READ, false, uint32(p.Pid))
|
h, err := windows.OpenProcess(processQueryInformation|windows.PROCESS_VM_READ, false, uint32(p.Pid))
|
||||||
if err == windows.ERROR_ACCESS_DENIED || err == windows.ERROR_INVALID_PARAMETER {
|
if errors.Is(err, windows.ERROR_ACCESS_DENIED) || errors.Is(err, windows.ERROR_INVALID_PARAMETER) {
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -822,9 +842,9 @@ func (p *Process) KillWithContext(ctx context.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Process) EnvironWithContext(ctx context.Context) ([]string, error) {
|
func (p *Process) EnvironWithContext(ctx context.Context) ([]string, error) {
|
||||||
envVars, err := getProcessEnvironmentVariables(p.Pid, ctx)
|
envVars, err := getProcessEnvironmentVariables(ctx, p.Pid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not get environment variables: %s", err)
|
return nil, fmt.Errorf("could not get environment variables: %w", err)
|
||||||
}
|
}
|
||||||
return envVars, nil
|
return envVars, nil
|
||||||
}
|
}
|
||||||
|
@ -844,7 +864,7 @@ func (p *Process) setPpid(ppid int32) {
|
||||||
p.parent = ppid
|
p.parent = ppid
|
||||||
}
|
}
|
||||||
|
|
||||||
func getFromSnapProcess(pid int32) (int32, int32, string, error) {
|
func getFromSnapProcess(pid int32) (int32, int32, string, error) { //nolint:unparam //FIXME
|
||||||
snap, err := windows.CreateToolhelp32Snapshot(windows.TH32CS_SNAPPROCESS, uint32(pid))
|
snap, err := windows.CreateToolhelp32Snapshot(windows.TH32CS_SNAPPROCESS, uint32(pid))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, 0, "", err
|
return 0, 0, "", err
|
||||||
|
@ -872,7 +892,7 @@ func ProcessesWithContext(ctx context.Context) ([]*Process, error) {
|
||||||
|
|
||||||
pids, err := PidsWithContext(ctx)
|
pids, err := PidsWithContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return out, fmt.Errorf("could not get Processes %s", err)
|
return out, fmt.Errorf("could not get Processes %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, pid := range pids {
|
for _, pid := range pids {
|
||||||
|
@ -963,13 +983,13 @@ func getUserProcessParams32(handle windows.Handle) (rtlUserProcessParameters32,
|
||||||
|
|
||||||
buf := readProcessMemory(syscall.Handle(handle), true, pebAddress, uint(unsafe.Sizeof(processEnvironmentBlock32{})))
|
buf := readProcessMemory(syscall.Handle(handle), true, pebAddress, uint(unsafe.Sizeof(processEnvironmentBlock32{})))
|
||||||
if len(buf) != int(unsafe.Sizeof(processEnvironmentBlock32{})) {
|
if len(buf) != int(unsafe.Sizeof(processEnvironmentBlock32{})) {
|
||||||
return rtlUserProcessParameters32{}, fmt.Errorf("cannot read process PEB")
|
return rtlUserProcessParameters32{}, errors.New("cannot read process PEB")
|
||||||
}
|
}
|
||||||
peb := (*processEnvironmentBlock32)(unsafe.Pointer(&buf[0]))
|
peb := (*processEnvironmentBlock32)(unsafe.Pointer(&buf[0]))
|
||||||
userProcessAddress := uint64(peb.ProcessParameters)
|
userProcessAddress := uint64(peb.ProcessParameters)
|
||||||
buf = readProcessMemory(syscall.Handle(handle), true, userProcessAddress, uint(unsafe.Sizeof(rtlUserProcessParameters32{})))
|
buf = readProcessMemory(syscall.Handle(handle), true, userProcessAddress, uint(unsafe.Sizeof(rtlUserProcessParameters32{})))
|
||||||
if len(buf) != int(unsafe.Sizeof(rtlUserProcessParameters32{})) {
|
if len(buf) != int(unsafe.Sizeof(rtlUserProcessParameters32{})) {
|
||||||
return rtlUserProcessParameters32{}, fmt.Errorf("cannot read user process parameters")
|
return rtlUserProcessParameters32{}, errors.New("cannot read user process parameters")
|
||||||
}
|
}
|
||||||
return *(*rtlUserProcessParameters32)(unsafe.Pointer(&buf[0])), nil
|
return *(*rtlUserProcessParameters32)(unsafe.Pointer(&buf[0])), nil
|
||||||
}
|
}
|
||||||
|
@ -982,13 +1002,13 @@ func getUserProcessParams64(handle windows.Handle) (rtlUserProcessParameters64,
|
||||||
|
|
||||||
buf := readProcessMemory(syscall.Handle(handle), false, pebAddress, uint(unsafe.Sizeof(processEnvironmentBlock64{})))
|
buf := readProcessMemory(syscall.Handle(handle), false, pebAddress, uint(unsafe.Sizeof(processEnvironmentBlock64{})))
|
||||||
if len(buf) != int(unsafe.Sizeof(processEnvironmentBlock64{})) {
|
if len(buf) != int(unsafe.Sizeof(processEnvironmentBlock64{})) {
|
||||||
return rtlUserProcessParameters64{}, fmt.Errorf("cannot read process PEB")
|
return rtlUserProcessParameters64{}, errors.New("cannot read process PEB")
|
||||||
}
|
}
|
||||||
peb := (*processEnvironmentBlock64)(unsafe.Pointer(&buf[0]))
|
peb := (*processEnvironmentBlock64)(unsafe.Pointer(&buf[0]))
|
||||||
userProcessAddress := peb.ProcessParameters
|
userProcessAddress := peb.ProcessParameters
|
||||||
buf = readProcessMemory(syscall.Handle(handle), false, userProcessAddress, uint(unsafe.Sizeof(rtlUserProcessParameters64{})))
|
buf = readProcessMemory(syscall.Handle(handle), false, userProcessAddress, uint(unsafe.Sizeof(rtlUserProcessParameters64{})))
|
||||||
if len(buf) != int(unsafe.Sizeof(rtlUserProcessParameters64{})) {
|
if len(buf) != int(unsafe.Sizeof(rtlUserProcessParameters64{})) {
|
||||||
return rtlUserProcessParameters64{}, fmt.Errorf("cannot read user process parameters")
|
return rtlUserProcessParameters64{}, errors.New("cannot read user process parameters")
|
||||||
}
|
}
|
||||||
return *(*rtlUserProcessParameters64)(unsafe.Pointer(&buf[0])), nil
|
return *(*rtlUserProcessParameters64)(unsafe.Pointer(&buf[0])), nil
|
||||||
}
|
}
|
||||||
|
@ -1038,9 +1058,9 @@ func is32BitProcess(h windows.Handle) bool {
|
||||||
return procIs32Bits
|
return procIs32Bits
|
||||||
}
|
}
|
||||||
|
|
||||||
func getProcessEnvironmentVariables(pid int32, ctx context.Context) ([]string, error) {
|
func getProcessEnvironmentVariables(ctx context.Context, pid int32) ([]string, error) {
|
||||||
h, err := windows.OpenProcess(processQueryInformation|windows.PROCESS_VM_READ, false, uint32(pid))
|
h, err := windows.OpenProcess(processQueryInformation|windows.PROCESS_VM_READ, false, uint32(pid))
|
||||||
if err == windows.ERROR_ACCESS_DENIED || err == windows.ERROR_INVALID_PARAMETER {
|
if errors.Is(err, windows.ERROR_ACCESS_DENIED) || errors.Is(err, windows.ERROR_INVALID_PARAMETER) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1124,7 +1144,7 @@ func (p *processReader) Read(buf []byte) (int, error) {
|
||||||
|
|
||||||
func getProcessCommandLine(pid int32) (string, error) {
|
func getProcessCommandLine(pid int32) (string, error) {
|
||||||
h, err := windows.OpenProcess(processQueryInformation|windows.PROCESS_VM_READ, false, uint32(pid))
|
h, err := windows.OpenProcess(processQueryInformation|windows.PROCESS_VM_READ, false, uint32(pid))
|
||||||
if err == windows.ERROR_ACCESS_DENIED || err == windows.ERROR_INVALID_PARAMETER {
|
if errors.Is(err, windows.ERROR_ACCESS_DENIED) || errors.Is(err, windows.ERROR_INVALID_PARAMETER) {
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -8,8 +8,9 @@ import (
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/internal/common"
|
|
||||||
"golang.org/x/sys/windows"
|
"golang.org/x/sys/windows"
|
||||||
|
|
||||||
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
type PROCESS_MEMORY_COUNTERS struct {
|
type PROCESS_MEMORY_COUNTERS struct {
|
||||||
|
@ -39,30 +40,27 @@ func queryPebAddress(procHandle syscall.Handle, is32BitProcess bool) (uint64, er
|
||||||
)
|
)
|
||||||
if status := windows.NTStatus(ret); status == windows.STATUS_SUCCESS {
|
if status := windows.NTStatus(ret); status == windows.STATUS_SUCCESS {
|
||||||
return uint64(info.PebBaseAddress), nil
|
return uint64(info.PebBaseAddress), nil
|
||||||
} else {
|
|
||||||
return 0, windows.NTStatus(ret)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// we are on a 32-bit process reading an external 64-bit process
|
|
||||||
if common.ProcNtWow64QueryInformationProcess64.Find() == nil { // avoid panic
|
|
||||||
var info processBasicInformation64
|
|
||||||
|
|
||||||
ret, _, _ := common.ProcNtWow64QueryInformationProcess64.Call(
|
|
||||||
uintptr(procHandle),
|
|
||||||
uintptr(common.ProcessBasicInformation),
|
|
||||||
uintptr(unsafe.Pointer(&info)),
|
|
||||||
uintptr(unsafe.Sizeof(info)),
|
|
||||||
uintptr(0),
|
|
||||||
)
|
|
||||||
if status := windows.NTStatus(ret); status == windows.STATUS_SUCCESS {
|
|
||||||
return info.PebBaseAddress, nil
|
|
||||||
} else {
|
|
||||||
return 0, windows.NTStatus(ret)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return 0, errors.New("can't find API to query 64 bit process from 32 bit")
|
|
||||||
}
|
}
|
||||||
|
return 0, windows.NTStatus(ret)
|
||||||
}
|
}
|
||||||
|
// we are on a 32-bit process reading an external 64-bit process
|
||||||
|
if common.ProcNtWow64QueryInformationProcess64.Find() != nil {
|
||||||
|
return 0, errors.New("can't find API to query 64 bit process from 32 bit")
|
||||||
|
}
|
||||||
|
// avoid panic
|
||||||
|
var info processBasicInformation64
|
||||||
|
|
||||||
|
ret, _, _ := common.ProcNtWow64QueryInformationProcess64.Call(
|
||||||
|
uintptr(procHandle),
|
||||||
|
uintptr(common.ProcessBasicInformation),
|
||||||
|
uintptr(unsafe.Pointer(&info)),
|
||||||
|
uintptr(unsafe.Sizeof(info)),
|
||||||
|
uintptr(0),
|
||||||
|
)
|
||||||
|
if status := windows.NTStatus(ret); status == windows.STATUS_SUCCESS {
|
||||||
|
return info.PebBaseAddress, nil
|
||||||
|
}
|
||||||
|
return 0, windows.NTStatus(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
func readProcessMemory(h syscall.Handle, is32BitProcess bool, address uint64, size uint) []byte {
|
func readProcessMemory(h syscall.Handle, is32BitProcess bool, address uint64, size uint) []byte {
|
||||||
|
|
|
@ -7,8 +7,9 @@ import (
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/internal/common"
|
|
||||||
"golang.org/x/sys/windows"
|
"golang.org/x/sys/windows"
|
||||||
|
|
||||||
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
type PROCESS_MEMORY_COUNTERS struct {
|
type PROCESS_MEMORY_COUNTERS struct {
|
||||||
|
@ -38,26 +39,23 @@ func queryPebAddress(procHandle syscall.Handle, is32BitProcess bool) (uint64, er
|
||||||
)
|
)
|
||||||
if status := windows.NTStatus(ret); status == windows.STATUS_SUCCESS {
|
if status := windows.NTStatus(ret); status == windows.STATUS_SUCCESS {
|
||||||
return uint64(wow64), nil
|
return uint64(wow64), nil
|
||||||
} else {
|
|
||||||
return 0, windows.NTStatus(ret)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// we are on a 64-bit process reading an external 64-bit process
|
|
||||||
var info processBasicInformation64
|
|
||||||
|
|
||||||
ret, _, _ := common.ProcNtQueryInformationProcess.Call(
|
|
||||||
uintptr(procHandle),
|
|
||||||
uintptr(common.ProcessBasicInformation),
|
|
||||||
uintptr(unsafe.Pointer(&info)),
|
|
||||||
uintptr(unsafe.Sizeof(info)),
|
|
||||||
uintptr(0),
|
|
||||||
)
|
|
||||||
if status := windows.NTStatus(ret); status == windows.STATUS_SUCCESS {
|
|
||||||
return info.PebBaseAddress, nil
|
|
||||||
} else {
|
|
||||||
return 0, windows.NTStatus(ret)
|
|
||||||
}
|
}
|
||||||
|
return 0, windows.NTStatus(ret)
|
||||||
}
|
}
|
||||||
|
// we are on a 64-bit process reading an external 64-bit process
|
||||||
|
var info processBasicInformation64
|
||||||
|
|
||||||
|
ret, _, _ := common.ProcNtQueryInformationProcess.Call(
|
||||||
|
uintptr(procHandle),
|
||||||
|
uintptr(common.ProcessBasicInformation),
|
||||||
|
uintptr(unsafe.Pointer(&info)),
|
||||||
|
uintptr(unsafe.Sizeof(info)),
|
||||||
|
uintptr(0),
|
||||||
|
)
|
||||||
|
if status := windows.NTStatus(ret); status == windows.STATUS_SUCCESS {
|
||||||
|
return info.PebBaseAddress, nil
|
||||||
|
}
|
||||||
|
return 0, windows.NTStatus(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
func readProcessMemory(procHandle syscall.Handle, _ bool, address uint64, size uint) []byte {
|
func readProcessMemory(procHandle syscall.Handle, _ bool, address uint64, size uint) []byte {
|
||||||
|
|
|
@ -659,8 +659,8 @@ github.com/golang/groupcache/lru
|
||||||
# github.com/golang/protobuf v1.5.4
|
# github.com/golang/protobuf v1.5.4
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
github.com/golang/protobuf/proto
|
github.com/golang/protobuf/proto
|
||||||
# github.com/google/go-cmp v0.6.0
|
# github.com/google/go-cmp v0.7.0
|
||||||
## explicit; go 1.13
|
## explicit; go 1.21
|
||||||
github.com/google/go-cmp/cmp
|
github.com/google/go-cmp/cmp
|
||||||
github.com/google/go-cmp/cmp/internal/diff
|
github.com/google/go-cmp/cmp/internal/diff
|
||||||
github.com/google/go-cmp/cmp/internal/flags
|
github.com/google/go-cmp/cmp/internal/flags
|
||||||
|
@ -998,7 +998,7 @@ github.com/secure-systems-lab/go-securesystemslib/encrypted
|
||||||
# github.com/segmentio/ksuid v1.0.4
|
# github.com/segmentio/ksuid v1.0.4
|
||||||
## explicit; go 1.12
|
## explicit; go 1.12
|
||||||
github.com/segmentio/ksuid
|
github.com/segmentio/ksuid
|
||||||
# github.com/shirou/gopsutil/v4 v4.25.1
|
# github.com/shirou/gopsutil/v4 v4.25.2
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
github.com/shirou/gopsutil/v4/common
|
github.com/shirou/gopsutil/v4/common
|
||||||
github.com/shirou/gopsutil/v4/cpu
|
github.com/shirou/gopsutil/v4/cpu
|
||||||
|
|
Loading…
Reference in New Issue