host_freebsd.go 1.3 KB
Newer Older
1 2 3 4 5
// +build freebsd

package gopsutil

import (
W
WAKAYAMA shirou 已提交
6 7 8
	"bytes"
	"encoding/binary"
	"io/ioutil"
9 10
	"os"
	"strconv"
W
go fmt  
WAKAYAMA shirou 已提交
11
	"strings"
W
WAKAYAMA shirou 已提交
12
	"unsafe"
13 14 15 16 17 18 19 20 21 22 23 24 25 26
)

func HostInfo() (HostInfoStat, error) {
	ret := HostInfoStat{}

	hostname, err := os.Hostname()
	ret.Hostname = hostname
	if err != nil {
		return ret, err
	}

	return ret, nil
}

W
WAKAYAMA Shirou 已提交
27
func BootTime() (int64, error) {
S
Shirou WAKAYAMA 已提交
28
	values, err := doSysctrl("kern.boottime")
29 30 31 32 33 34 35 36 37 38 39 40 41
	if err != nil {
		return 0, err
	}
	// ex: { sec = 1392261637, usec = 627534 } Thu Feb 13 12:20:37 2014
	v := strings.Replace(values[2], ",", "", 1)

	boottime, err := strconv.ParseInt(v, 10, 64)
	if err != nil {
		return 0, err
	}

	return boottime, nil
}
W
WAKAYAMA shirou 已提交
42 43 44

func Users() ([]UserStat, error) {
	utmpfile := "/var/run/utmp"
S
Shirou WAKAYAMA 已提交
45
	var ret []UserStat
W
WAKAYAMA shirou 已提交
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

	file, err := os.Open(utmpfile)
	if err != nil {
		return ret, err
	}

	buf, err := ioutil.ReadAll(file)
	if err != nil {
		return ret, err
	}

	u := utmp{}
	entrySize := int(unsafe.Sizeof(u))
	count := len(buf) / entrySize

	for i := 0; i < count; i++ {
		b := buf[i*entrySize : i*entrySize+entrySize]

		var u utmp
		br := bytes.NewReader(b)
		err := binary.Read(br, binary.LittleEndian, &u)
		if err != nil {
			continue
		}
		user := UserStat{
			User:     byteToString(u.Ut_name[:]),
			Terminal: byteToString(u.Ut_line[:]),
			Host:     byteToString(u.Ut_host[:]),
			Started:  int(u.Ut_time),
		}
		ret = append(ret, user)
	}

	return ret, nil

}