start to use godefs to get C structs.

tags/1.0.0^2
Shirou WAKAYAMA 11 years ago
parent 13cd195a7e
commit 4973aa73f9

1
.gitignore vendored

@ -1,2 +1,3 @@
*~ *~
#* #*
_obj

@ -0,0 +1,37 @@
DIRS="cpu disk docker host load mem net process"
GOOS=`uname | tr '[:upper:]' '[:lower:]'`
ARCH=`uname -m`
case $ARCH in
amd64)
GOARCH="amd64"
;;
x86_64)
GOARCH="amd64"
;;
i386)
GOARCH="386"
;;
i686)
GOARCH="386"
;;
arm)
GOARCH="arm"
;;
*)
echo "unknown arch: $ARCH"
exit 1
esac
for DIR in $DIRS
do
if [ -e ${DIR}/types_${GOOS}.go ]; then
echo "// +build $GOOS" > ${DIR}/${DIR}_${GOOS}_${GOARCH}.go
echo "// +build $GOARCH" >> ${DIR}/${DIR}_${GOOS}_${GOARCH}.go
go tool cgo -godefs ${DIR}/types_${GOOS}.go >> ${DIR}/${DIR}_${GOOS}_${GOARCH}.go
fi
done

@ -13,6 +13,16 @@ import (
net "github.com/shirou/gopsutil/net" net "github.com/shirou/gopsutil/net"
) )
// copied from sys/sysctl.h
const (
CTLKern = 1 // "high kernel": proc, limits
KernProc = 14 // struct: process entries
KernProcPID = 1 // by process id
KernProcProc = 8 // only return procs
KernProcAll = 0 // everything
KernProcPathname = 12 // path to executable
)
// MemoryInfoExStat is different between OSes // MemoryInfoExStat is different between OSes
type MemoryInfoExStat struct { type MemoryInfoExStat struct {
} }
@ -42,7 +52,7 @@ func (p *Process) Ppid() (int32, error) {
return 0, err return 0, err
} }
return k.KiPpid, nil return k.Proc.P_pid, nil
} }
func (p *Process) Name() (string, error) { func (p *Process) Name() (string, error) {
k, err := p.getKProc() k, err := p.getKProc()
@ -50,7 +60,7 @@ func (p *Process) Name() (string, error) {
return "", err return "", err
} }
return string(k.KiComm[:]), nil return common.IntToString(k.Proc.P_comm[:]), nil
} }
func (p *Process) Exe() (string, error) { func (p *Process) Exe() (string, error) {
return "", common.NotImplementedError return "", common.NotImplementedError
@ -73,7 +83,7 @@ func (p *Process) Status() (string, error) {
return "", err return "", err
} }
return string(k.KiStat[:]), nil return string(k.Proc.P_stat), nil // TODO
} }
func (p *Process) Uids() ([]int32, error) { func (p *Process) Uids() ([]int32, error) {
k, err := p.getKProc() k, err := p.getKProc()
@ -83,7 +93,7 @@ func (p *Process) Uids() ([]int32, error) {
uids := make([]int32, 0, 3) uids := make([]int32, 0, 3)
uids = append(uids, int32(k.KiRuid), int32(k.KiUID), int32(k.KiSvuid)) uids = append(uids, int32(k.Eproc.Pcred.P_ruid), int32(k.Eproc.Ucred.Uid), int32(k.Eproc.Pcred.P_svuid))
return uids, nil return uids, nil
} }
@ -94,7 +104,7 @@ func (p *Process) Gids() ([]int32, error) {
} }
gids := make([]int32, 0, 3) gids := make([]int32, 0, 3)
gids = append(gids, int32(k.KiRgid), int32(k.KiNgroups[0]), int32(k.KiSvuid)) gids = append(gids, int32(k.Eproc.Pcred.P_rgid), int32(k.Eproc.Ucred.Ngroups), int32(k.Eproc.Pcred.P_svgid))
return gids, nil return gids, nil
} }
@ -104,7 +114,7 @@ func (p *Process) Terminal() (string, error) {
return "", err return "", err
} }
ttyNr := uint64(k.KiTdev) ttyNr := uint64(k.Eproc.Tdev)
termmap, err := getTerminalMap() termmap, err := getTerminalMap()
if err != nil { if err != nil {
@ -133,12 +143,16 @@ func (p *Process) NumFDs() (int32, error) {
return 0, common.NotImplementedError return 0, common.NotImplementedError
} }
func (p *Process) NumThreads() (int32, error) { func (p *Process) NumThreads() (int32, error) {
k, err := p.getKProc() return 0, common.NotImplementedError
if err != nil {
return 0, err
}
return k.KiNumthreads, nil /*
k, err := p.getKProc()
if err != nil {
return 0, err
}
return k.KiNumthreads, nil
*/
} }
func (p *Process) Threads() (map[string]string, error) { func (p *Process) Threads() (map[string]string, error) {
ret := make(map[string]string, 0) ret := make(map[string]string, 0)
@ -160,8 +174,8 @@ func (p *Process) MemoryInfo() (*MemoryInfoStat, error) {
} }
ret := &MemoryInfoStat{ ret := &MemoryInfoStat{
RSS: uint64(k.KiRssize), RSS: uint64(k.Eproc.Xrssize),
VMS: uint64(k.KiSize), VMS: uint64(k.Eproc.Xsize),
} }
return ret, nil return ret, nil
@ -220,7 +234,7 @@ func processes() ([]Process, error) {
if err != nil { if err != nil {
continue continue
} }
p, err := NewProcess(int32(k.KiPid)) p, err := NewProcess(int32(k.Proc.P_pid))
if err != nil { if err != nil {
continue continue
} }
@ -235,6 +249,7 @@ func processes() ([]Process, error) {
func parseKinfoProc(buf []byte) (KinfoProc, error) { func parseKinfoProc(buf []byte) (KinfoProc, error) {
var k KinfoProc var k KinfoProc
br := bytes.NewReader(buf) br := bytes.NewReader(buf)
err := binary.Read(br, binary.LittleEndian, &k) err := binary.Read(br, binary.LittleEndian, &k)
if err != nil { if err != nil {
return k, err return k, err

@ -1,97 +1,236 @@
// +build darwin // +build darwin
// +build amd64 // +build amd64
// Created by cgo -godefs - DO NOT EDIT
// cgo -godefs process/types_darwin.go
package process package process
// copied from sys/sysctl.h
const ( const (
CTLKern = 1 // "high kernel": proc, limits sizeofPtr = 0x8
KernProc = 14 // struct: process entries sizeofShort = 0x2
KernProcPID = 1 // by process id sizeofInt = 0x4
KernProcProc = 8 // only return procs sizeofLong = 0x8
KernProcAll = 0 // everything sizeofLongLong = 0x8
KernProcPathname = 12 // path to executable
) )
// copied from sys/user.h type (
_C_short int16
_C_int int32
_C_long int64
_C_long_long int64
)
type Timespec struct {
Sec int64
Nsec int64
}
type Timeval struct {
Sec int64
Usec int32
Pad_cgo_0 [4]byte
}
type Rusage struct {
Utime Timeval
Stime Timeval
Maxrss int64
Ixrss int64
Idrss int64
Isrss int64
Minflt int64
Majflt int64
Nswap int64
Inblock int64
Oublock int64
Msgsnd int64
Msgrcv int64
Nsignals int64
Nvcsw int64
Nivcsw int64
}
type Rlimit struct {
Cur uint64
Max uint64
}
type UGid_t uint32
type KinfoProc struct { type KinfoProc struct {
KiStructsize int32 Proc ExternProc
KiLayout int32 Eproc Eproc
KiArgs int64 }
KiPaddr int64
KiAddr int64 type Eproc struct {
KiTracep int64 Paddr *Proc
KiTextvp int64 Sess *Session
KiFd int64 Pcred Upcred
KiVmspace int64 Ucred Uucred
KiWchan int64 Pad_cgo_0 [4]byte
KiPid int32 Vm Vmspace
KiPpid int32 Ppid int32
KiPgid int32 Pgid int32
KiTpgid int32 Jobc int16
KiSid int32 Pad_cgo_1 [2]byte
KiTsid int32 Tdev int32
KiJobc [2]byte Tpgid int32
KiSpareShort1 [2]byte Pad_cgo_2 [4]byte
KiTdev int32 Tsess *Session
KiSiglist [16]byte Wmesg [8]int8
KiSigmask [16]byte Xsize int32
KiSigignore [16]byte Xrssize int16
KiSigcatch [16]byte Xccount int16
KiUID int32 Xswrss int16
KiRuid int32 Pad_cgo_3 [2]byte
KiSvuid int32 Flag int32
KiRgid int32 Login [12]int8
KiSvgid int32 Spare [4]int32
KiNgroups [2]byte Pad_cgo_4 [4]byte
KiSpareShort2 [2]byte }
KiGroups [64]byte
KiSize int64 type Proc struct{}
KiRssize int64
KiSwrss int64 type Session struct{}
KiTsize int64
KiDsize int64 type ucred struct {
KiSsize int64 Link UcredQueue
KiXstat [2]byte Ref uint64
KiAcflag [2]byte Posix Posix_cred
KiPctcpu int32 Label *Label
KiEstcpu int32 Audit Au_session
KiSlptime int32 }
KiSwtime int32
KiCow int32 type Uucred struct {
KiRuntime int64 Ref int32
KiStart [16]byte Uid uint32
KiChildtime [16]byte Ngroups int16
KiFlag int64 Pad_cgo_0 [2]byte
KiKflag int64 Groups [16]uint32
KiTraceflag int32 }
KiStat [1]byte
KiNice [1]byte type Upcred struct {
KiLock [1]byte Pc_lock [72]int8
KiRqindex [1]byte Pc_ucred *ucred
KiOncpu [1]byte P_ruid uint32
KiLastcpu [1]byte P_svuid uint32
KiOcomm [17]byte P_rgid uint32
KiWmesg [9]byte P_svgid uint32
KiLogin [18]byte P_refcnt int32
KiLockname [9]byte Pad_cgo_0 [4]byte
KiComm [20]byte }
KiEmul [17]byte
KiSparestrings [68]byte type Vmspace struct {
KiSpareints [36]byte Dummy int32
KiCrFlags int32 Pad_cgo_0 [4]byte
KiJid int32 Dummy2 *int8
KiNumthreads int32 Dummy3 [5]int32
KiTid int32 Pad_cgo_1 [4]byte
KiPri int32 Dummy4 [3]*int8
KiRusage [144]byte }
KiRusageCh [144]byte
KiPcb int64 type Sigacts struct{}
KiKstack int64
KiUdata int64 type ExternProc struct {
KiTdaddr int64 P_un [16]byte
KiSpareptrs [48]byte P_vmspace *Vmspace
KiSpareint64s [96]byte P_sigacts *Sigacts
KiSflag int64 P_flag int32
KiTdflags int64 P_stat int8
Pad_cgo_0 [3]byte
P_pid int32
P_oppid int32
P_dupfd int32
Pad_cgo_1 [4]byte
User_stack *int8
Exit_thread *byte
P_debugger int32
Sigwait int32
P_estcpu uint32
P_cpticks int32
P_pctcpu uint32
Pad_cgo_2 [4]byte
P_wchan *byte
P_wmesg *int8
P_swtime uint32
P_slptime uint32
P_realtimer Itimerval
P_rtime Timeval
P_uticks uint64
P_sticks uint64
P_iticks uint64
P_traceflag int32
Pad_cgo_3 [4]byte
P_tracep *Vnode
P_siglist int32
Pad_cgo_4 [4]byte
P_textvp *Vnode
P_holdcnt int32
P_sigmask uint32
P_sigignore uint32
P_sigcatch uint32
P_priority uint8
P_usrpri uint8
P_nice int8
P_comm [17]int8
Pad_cgo_5 [4]byte
P_pgrp *Pgrp
P_addr *UserStruct
P_xstat uint16
P_acflag uint16
Pad_cgo_6 [4]byte
P_ru *Rusage
}
type Itimerval struct {
Interval Timeval
Value Timeval
}
type Vnode struct{}
type Pgrp struct{}
type UserStruct struct{}
type Au_session struct {
Aia_p *AuditinfoAddr
Mask AuMask
}
type Posix_cred struct {
Uid uint32
Ruid uint32
Svuid uint32
Ngroups int16
Pad_cgo_0 [2]byte
Groups [16]uint32
Rgid uint32
Svgid uint32
Gmuid uint32
Flags int32
}
type Label struct{}
type AuditinfoAddr struct {
Auid uint32
Mask AuMask
Termid AuTidAddr
Asid int32
Flags uint64
}
type AuMask struct {
Success uint32
Failure uint32
}
type AuTidAddr struct {
Port int32
Type uint32
Addr [4]uint32
}
type UcredQueue struct {
Next *ucred
Prev **ucred
} }

@ -0,0 +1,157 @@
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build ignore
/*
Input to cgo -godefs.
*/
// +godefs map struct_in_addr [4]byte /* in_addr */
// +godefs map struct_in6_addr [16]byte /* in6_addr */
// +godefs map struct_ [16]byte /* in6_addr */
package process
/*
#define __DARWIN_UNIX03 0
#define KERNEL
#define _DARWIN_USE_64_BIT_INODE
#include <dirent.h>
#include <fcntl.h>
#include <signal.h>
#include <termios.h>
#include <unistd.h>
#include <mach/mach.h>
#include <mach/message.h>
#include <sys/event.h>
#include <sys/mman.h>
#include <sys/mount.h>
#include <sys/param.h>
#include <sys/ptrace.h>
#include <sys/resource.h>
#include <sys/select.h>
#include <sys/signal.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/un.h>
#include <net/bpf.h>
#include <net/if_dl.h>
#include <net/if_var.h>
#include <net/route.h>
#include <netinet/in.h>
#include <sys/sysctl.h>
#include <sys/ucred.h>
#include <sys/proc.h>
#include <sys/time.h>
#include <sys/_types/_timeval.h>
#include <sys/appleapiopts.h>
#include <sys/cdefs.h>
#include <sys/param.h>
#include <bsm/audit.h>
#include <sys/queue.h>
enum {
sizeofPtr = sizeof(void*),
};
union sockaddr_all {
struct sockaddr s1; // this one gets used for fields
struct sockaddr_in s2; // these pad it out
struct sockaddr_in6 s3;
struct sockaddr_un s4;
struct sockaddr_dl s5;
};
struct sockaddr_any {
struct sockaddr addr;
char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
};
struct ucred_queue {
struct ucred *tqe_next;
struct ucred **tqe_prev;
TRACEBUF
};
*/
import "C"
// Machine characteristics; for internal use.
const (
sizeofPtr = C.sizeofPtr
sizeofShort = C.sizeof_short
sizeofInt = C.sizeof_int
sizeofLong = C.sizeof_long
sizeofLongLong = C.sizeof_longlong
)
// Basic types
type (
_C_short C.short
_C_int C.int
_C_long C.long
_C_long_long C.longlong
)
// Time
type Timespec C.struct_timespec
type Timeval C.struct_timeval
// Processes
type Rusage C.struct_rusage
type Rlimit C.struct_rlimit
type UGid_t C.gid_t
type KinfoProc C.struct_kinfo_proc
type Eproc C.struct_eproc
type Proc C.struct_proc
type Session C.struct_session
type ucred C.struct_ucred
type Uucred C.struct__ucred
type Upcred C.struct__pcred
type Vmspace C.struct_vmspace
type Sigacts C.struct_sigacts
type ExternProc C.struct_extern_proc
type Itimerval C.struct_itimerval
type Vnode C.struct_vnode
type Pgrp C.struct_pgrp
type UserStruct C.struct_user
type Au_session C.struct_au_session
type Posix_cred C.struct_posix_cred
type Label C.struct_label
type AuditinfoAddr C.struct_auditinfo_addr
type AuMask C.struct_au_mask
type AuTidAddr C.struct_au_tid_addr
// TAILQ(ucred)
type UcredQueue C.struct_ucred_queue
Loading…
Cancel
Save