Guest User

Untitled

a guest
Aug 20th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. #!/usr/sbin/dtrace -s
  2.  
  3. #pragma D option quiet
  4. #pragma D option switchrate=10hz
  5.  
  6. inline int af_inet = 2; /* AF_INET defined in bsd/sys/socket.h */
  7. inline int af_inet6 = 30; /* AF_INET6 defined in bsd/sys/socket.h */
  8.  
  9. dtrace:::BEGIN
  10. {
  11. /* Add translations as desired from /usr/include/sys/errno.h */
  12. err[0] = "Success";
  13. err[EINTR] = "Interrupted syscall";
  14. err[EIO] = "I/O error";
  15. err[EACCES] = "Permission denied";
  16. err[ENETDOWN] = "Network is down";
  17. err[ENETUNREACH] = "Network unreachable";
  18. err[ECONNRESET] = "Connection reset";
  19. err[ECONNREFUSED] = "Connection refused";
  20. err[ETIMEDOUT] = "Timed out";
  21. err[EHOSTDOWN] = "Host down";
  22. err[EHOSTUNREACH] = "No route to host";
  23. err[EINPROGRESS] = "In progress";
  24.  
  25. printf("%-6s %-16s %-3s %-16s %-5s %8s %s\n", "PID", "PROCESS", "FAM",
  26. "ADDRESS", "PORT", "LAT(us)", "RESULT");
  27. }
  28.  
  29. syscall::connect*:entry
  30. {
  31. /* assume this is sockaddr_in until we can examine family */
  32. this->s = (struct sockaddr_in *)copyin(arg1, sizeof (struct sockaddr));
  33. this->f = this->s->sin_family;
  34. }
  35.  
  36. syscall::connect*:entry
  37. /this->f == af_inet/
  38. {
  39. self->family = this->f;
  40.  
  41. /* Convert port to host byte order without ntohs() being available. */
  42. self->port = (this->s->sin_port & 0xFF00) >> 8;
  43. self->port |= (this->s->sin_port & 0xFF) << 8;
  44.  
  45. /*
  46. * Convert an IPv4 address into a dotted quad decimal string.
  47. * Until the inet_ntoa() functions are available from DTrace, this is
  48. * converted using the existing strjoin() and lltostr(). It's done in
  49. * two parts to avoid exhausting DTrace registers in one line of code.
  50. */
  51. this->a = (uint8_t *)&this->s->sin_addr;
  52. this->addr1 = strjoin(lltostr(this->a[0] + 0ULL), strjoin(".",
  53. strjoin(lltostr(this->a[1] + 0ULL), ".")));
  54. this->addr2 = strjoin(lltostr(this->a[2] + 0ULL), strjoin(".",
  55. lltostr(this->a[3] + 0ULL)));
  56. self->address = strjoin(this->addr1, this->addr2);
  57.  
  58. self->start = timestamp;
  59. }
  60.  
  61. syscall::connect*:return
  62. /self->start/
  63. {
  64. this->delta = (timestamp - self->start) / 1000;
  65. this->errstr = err[errno] != NULL ? err[errno] : lltostr(errno);
  66. printf("%-6d %-16s %-3d %-16s %-5d %8d %s\n", pid, execname,
  67. self->family, self->address, self->port, this->delta, this->errstr);
  68. self->family = 0;
  69. self->address = 0;
  70. self->port = 0;
  71. self->start = 0;
  72. }
Add Comment
Please, Sign In to add comment