| 317 | } |
| 318 | |
| 319 | func (this *Arg_RawSockaddrUnix) Format() string { |
| 320 | var fields []string |
| 321 | if this.Family == syscall.AF_FILE { |
| 322 | fields = append(fields, "family=AF_FILE") |
| 323 | fields = append(fields, fmt.Sprintf("path=%s", util.B2S(this.Path[:]))) |
| 324 | } else if this.Family == syscall.AF_INET { |
| 325 | fields = append(fields, "family=AF_INET") |
| 326 | sockaddr := (*syscall.RawSockaddrInet4)(unsafe.Pointer(&this.RawSockaddrUnix)) |
| 327 | fields = append(fields, fmt.Sprintf("port=%d", sockaddr.Port)) |
| 328 | fields = append(fields, fmt.Sprintf("addr=%s", net.IP(sockaddr.Addr[:]).String())) |
| 329 | // fields = append(fields, fmt.Sprintf("zero=%x", sockaddr.Zero)) |
| 330 | } else if this.Family == syscall.AF_INET6 { |
| 331 | fields = append(fields, "family=AF_INET6") |
| 332 | buf := &bytes.Buffer{} |
| 333 | err := binary.Write(buf, binary.BigEndian, this.RawSockaddrUnix) |
| 334 | if err != nil { |
| 335 | panic(err) |
| 336 | } |
| 337 | var sockaddr6 syscall.RawSockaddrInet6 |
| 338 | err = binary.Read(buf, binary.LittleEndian, &sockaddr6.Family) |
| 339 | if err != nil { |
| 340 | panic(err) |
| 341 | } |
| 342 | err = binary.Read(buf, binary.BigEndian, &sockaddr6.Port) |
| 343 | if err != nil { |
| 344 | panic(err) |
| 345 | } |
| 346 | err = binary.Read(buf, binary.BigEndian, &sockaddr6.Flowinfo) |
| 347 | if err != nil { |
| 348 | panic(err) |
| 349 | } |
| 350 | err = binary.Read(buf, binary.LittleEndian, &sockaddr6.Addr) |
| 351 | if err != nil { |
| 352 | panic(err) |
| 353 | } |
| 354 | err = binary.Read(buf, binary.LittleEndian, &sockaddr6.Scope_id) |
| 355 | if err != nil { |
| 356 | panic(err) |
| 357 | } |
| 358 | fields = append(fields, fmt.Sprintf("port=%d", sockaddr6.Port)) |
| 359 | fields = append(fields, fmt.Sprintf("flowinfo=%d", sockaddr6.Flowinfo)) |
| 360 | // 好像还是会解析成ipv4 |
| 361 | fields = append(fields, fmt.Sprintf("addr=%s", net.IP(sockaddr6.Addr[:]).String())) |
| 362 | fields = append(fields, fmt.Sprintf("scope_id=%d", sockaddr6.Scope_id)) |
| 363 | } else if this.Family == syscall.AF_UNSPEC { |
| 364 | // 暂时不知道这个怎么解析比较好 |
| 365 | fields = append(fields, "family=AF_UNSPEC") |
| 366 | fields = append(fields, fmt.Sprintf("path=\n%s", util.HexDump(util.I2B(this.Path[:]), util.COLORGREEN))) |
| 367 | } else { |
| 368 | fields = append(fields, fmt.Sprintf("family=0x%x", this.Family)) |
| 369 | fields = append(fields, fmt.Sprintf("path=\n%s", util.HexDump(util.I2B(this.Path[:]), util.COLORGREEN))) |
| 370 | } |
| 371 | return fmt.Sprintf("(%s)", strings.Join(fields, ", ")) |
| 372 | } |
| 373 | |
| 374 | type Arg_Iovec struct { |
| 375 | Index uint8 |