1 | // Copyright 2018 The Prometheus Authors
|
---|
2 | // Licensed under the Apache License, Version 2.0 (the "License");
|
---|
3 | // you may not use this file except in compliance with the License.
|
---|
4 | // You may obtain a copy of the License at
|
---|
5 | //
|
---|
6 | // http://www.apache.org/licenses/LICENSE-2.0
|
---|
7 | //
|
---|
8 | // Unless required by applicable law or agreed to in writing, software
|
---|
9 | // distributed under the License is distributed on an "AS IS" BASIS,
|
---|
10 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
---|
11 | // See the License for the specific language governing permissions and
|
---|
12 | // limitations under the License.
|
---|
13 |
|
---|
14 | //go:build (linux || darwin) && !appengine
|
---|
15 | // +build linux darwin
|
---|
16 | // +build !appengine
|
---|
17 |
|
---|
18 | package util
|
---|
19 |
|
---|
20 | import (
|
---|
21 | "bytes"
|
---|
22 | "os"
|
---|
23 | "syscall"
|
---|
24 | )
|
---|
25 |
|
---|
26 | // SysReadFile is a simplified os.ReadFile that invokes syscall.Read directly.
|
---|
27 | // https://github.com/prometheus/node_exporter/pull/728/files
|
---|
28 | //
|
---|
29 | // Note that this function will not read files larger than 128 bytes.
|
---|
30 | func SysReadFile(file string) (string, error) {
|
---|
31 | f, err := os.Open(file)
|
---|
32 | if err != nil {
|
---|
33 | return "", err
|
---|
34 | }
|
---|
35 | defer f.Close()
|
---|
36 |
|
---|
37 | // On some machines, hwmon drivers are broken and return EAGAIN. This causes
|
---|
38 | // Go's os.ReadFile implementation to poll forever.
|
---|
39 | //
|
---|
40 | // Since we either want to read data or bail immediately, do the simplest
|
---|
41 | // possible read using syscall directly.
|
---|
42 | const sysFileBufferSize = 128
|
---|
43 | b := make([]byte, sysFileBufferSize)
|
---|
44 | n, err := syscall.Read(int(f.Fd()), b)
|
---|
45 | if err != nil {
|
---|
46 | return "", err
|
---|
47 | }
|
---|
48 |
|
---|
49 | return string(bytes.TrimSpace(b[:n])), nil
|
---|
50 | }
|
---|