[net]linux: fix valious bugs in NetConnections.

pull/169/head
Shirou WAKAYAMA 9 years ago
parent e4ddff09d5
commit 31439aa6b5

@ -303,6 +303,7 @@ func NetConnectionsPid(kind string, pid int32) ([]NetConnectionStat, error) {
return nil, fmt.Errorf("cound not get pid(s), %d", pid) return nil, fmt.Errorf("cound not get pid(s), %d", pid)
} }
dupCheckMap := make(map[string]bool)
var ret []NetConnectionStat var ret []NetConnectionStat
for _, t := range tmap { for _, t := range tmap {
@ -323,8 +324,8 @@ func NetConnectionsPid(kind string, pid int32) ([]NetConnectionStat, error) {
for _, c := range ls { for _, c := range ls {
conn := NetConnectionStat{ conn := NetConnectionStat{
Fd: c.fd, Fd: c.fd,
Family: t.family, Family: c.family,
Type: t.sockType, Type: c.sockType,
Laddr: c.laddr, Laddr: c.laddr,
Raddr: c.raddr, Raddr: c.raddr,
Status: c.status, Status: c.status,
@ -335,7 +336,13 @@ func NetConnectionsPid(kind string, pid int32) ([]NetConnectionStat, error) {
} else { } else {
conn.Pid = c.pid conn.Pid = c.pid
} }
ret = append(ret, conn) // check duplicate using JSON format
json := conn.String()
_, exists := dupCheckMap[json]
if !exists {
ret = append(ret, conn)
dupCheckMap[json] = true
}
} }
} }
@ -359,12 +366,12 @@ func getProcInodes(root string, pid int32) (map[string][]inodeMap, error) {
if err != nil { if err != nil {
continue continue
} }
if strings.HasPrefix(inode, "socket:[") { if !strings.HasPrefix(inode, "socket:[") {
// the process is using a socket continue
l := len(inode)
inode = inode[8 : l-1]
} }
// the process is using a socket
l := len(inode)
inode = inode[8 : l-1]
_, ok := ret[inode] _, ok := ret[inode]
if !ok { if !ok {
ret[inode] = make([]inodeMap, 0) ret[inode] = make([]inodeMap, 0)
@ -380,7 +387,6 @@ func getProcInodes(root string, pid int32) (map[string][]inodeMap, error) {
} }
ret[inode] = append(ret[inode], i) ret[inode] = append(ret[inode], i)
} }
return ret, nil return ret, nil
} }
@ -559,12 +565,12 @@ func processUnix(file string, kind netConnectionKindType, inodes map[string][]in
// skip first line // skip first line
for _, line := range lines[1:] { for _, line := range lines[1:] {
tokens := strings.Fields(line) tokens := strings.Fields(line)
if len(tokens) < 7 { if len(tokens) < 6 {
continue continue
} }
st, err := strconv.Atoi(tokens[4]) st, err := strconv.Atoi(tokens[4])
if err != nil { if err != nil {
continue return nil, err
} }
inode := tokens[6] inode := tokens[6]
@ -572,7 +578,9 @@ func processUnix(file string, kind netConnectionKindType, inodes map[string][]in
var pairs []inodeMap var pairs []inodeMap
pairs, exists := inodes[inode] pairs, exists := inodes[inode]
if !exists { if !exists {
pairs = []inodeMap{} pairs = []inodeMap{
inodeMap{},
}
} }
for _, pair := range pairs { for _, pair := range pairs {
if filterPid > 0 && filterPid != pair.pid { if filterPid > 0 && filterPid != pair.pid {
@ -582,19 +590,21 @@ func processUnix(file string, kind netConnectionKindType, inodes map[string][]in
if len(tokens) == 8 { if len(tokens) == 8 {
path = tokens[len(tokens)-1] path = tokens[len(tokens)-1]
} }
ret = append(ret, connTmp{ ret = append(ret, connTmp{
fd: pair.fd,
family: kind.family, family: kind.family,
sockType: uint32(st), sockType: uint32(st),
raddr: Addr{}, laddr: Addr{
pid: pair.pid, IP: path,
status: "NONE", },
path: path, pid: pair.pid,
status: "NONE",
path: path,
}) })
} }
} }
return []connTmp{}, nil return ret, nil
} }
func updateMap(src map[string][]inodeMap, add map[string][]inodeMap) map[string][]inodeMap { func updateMap(src map[string][]inodeMap, add map[string][]inodeMap) map[string][]inodeMap {

Loading…
Cancel
Save