devinteske

dwatch profile for send(2)/recv(2)

Apr 20th, 2018
503
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 6.09 KB | None | 0 0
  1. # -*- tab-width: 4 -*- ;; Emacs
  2. # vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM
  3. ############################################################ IDENT(1)
  4. #
  5. # $Title: dwatch(8) module for send(2)/recv(2) $
  6. # $Copyright: 2014-2018 Devin Teske. All rights reserved. $
  7. # $FrauBSD$
  8. #
  9. ############################################################ DESCRIPTION
  10. #
  11. # Print details from send(2)/recv(2)
  12. #
  13. ############################################################ PROBE
  14.  
  15. case "$PROFILE" in
  16. sendrecv)
  17.     : ${PROBE:=$( echo \
  18.         syscall::recvfrom:return, \
  19.         syscall::recvmsg:return, \
  20.         syscall::sendmsg:entry, \
  21.         syscall::sendto:entry )} ;;
  22. send)
  23.     : ${PROBE:=$( echo \
  24.         syscall::sendmsg:entry, \
  25.         syscall::sendto:entry )} ;;
  26. recv)
  27.     : ${PROBE:=$( echo \
  28.         syscall::recvfrom:return, \
  29.         syscall::recvmsg:return )} ;;
  30. *)
  31.     : ${PROBE:=syscall::$PROFILE}
  32. esac
  33.  
  34. ############################################################ EVENT ACTION
  35.  
  36. #[ "$CUSTOM_TEST" ] || EVENT_TEST="this->from != NULL"
  37.  
  38. ############################################################ ACTIONS
  39.  
  40. exec 9<<EOF
  41. typedef struct sainfo {
  42.     sa_family_t sa_family;
  43.     uint16_t port;
  44.     string addr;
  45.     string family;
  46. } sainfo_t;
  47.  
  48. /*
  49.  * Address families from <sys/socket.h>
  50.  */
  51. #pragma D binding "1.13" address_family_string
  52. inline string address_family_string[sa_family_t af] =
  53.     af == AF_UNSPEC ?       "AF_UNSPEC" :
  54.     af == AF_LOCAL ?        "AF_UNIX" :
  55.     af == AF_UNIX ?         "AF_UNIX" :
  56.     af == AF_INET ?         "AF_INET" :
  57.     af == AF_IMPLINK ?      "AF_IMPLINK" :
  58.     af == AF_PUP ?          "AF_PUP" :
  59.     af == AF_CHAOS ?        "AF_CHAOS" :
  60.     af == AF_NETBIOS ?      "AF_NETBIOS" :
  61.     af == AF_ISO ?          "AF_ISO" :
  62.     af == AF_OSI ?          "AF_ISO" :
  63.     af == AF_ECMA ?         "AF_ECMA" :
  64.     af == AF_DATAKIT ?      "AF_DATAKIT" :
  65.     af == AF_CCITT ?        "AF_CCITT" :
  66.     af == AF_SNA ?          "AF_SNA" :
  67.     af == AF_DECnet ?       "AF_DECnet" :
  68.     af == AF_DLI ?          "AF_DLI" :
  69.     af == AF_LAT ?          "AF_LAT" :
  70.     af == AF_HYLINK ?       "AF_HYLINK" :
  71.     af == AF_APPLETALK ?        "AF_APPLETALK" :
  72.     af == AF_ROUTE ?        "AF_ROUTE" :
  73.     af == AF_LINK ?         "AF_LINK" :
  74.     af == pseudo_AF_XTP ?       "pseudo_AF_XTP" :
  75.     af == AF_COIP ?         "AF_COIP" :
  76.     af == AF_CNT ?          "AF_CNT" :
  77.     af == pseudo_AF_RTIP ?      "pseudo_AF_RTIP" :
  78.     af == AF_IPX ?          "AF_IPX" :
  79.     af == AF_SIP ?          "AF_SIP" :
  80.     af == pseudo_AF_PIP ?       "pseudo_AF_PIP" :
  81.     af == AF_ISDN ?         "AF_ISDN" :
  82.     af == AF_E164 ?         "AF_ISDN" :
  83.     af == pseudo_AF_KEY ?       "pseudo_AF_KEY" :
  84.     af == AF_INET6 ?        "AF_INET6" :
  85.     af == AF_NATM ?         "AF_NATM" :
  86.     af == AF_ATM ?          "AF_ATM" :
  87.     af == pseudo_AF_HDRCMPLT ?  "pseudo_AF_HDRCMPLT" :
  88.     af == AF_NETGRAPH ?     "AF_NETGRAPH" :
  89.     af == AF_SLOW ?         "AF_SLOW" :
  90.     af == AF_SCLUSTER ?     "AF_SCLUSTER" :
  91.     af == AF_ARP ?          "AF_ARP" :
  92.     af == AF_BLUETOOTH ?        "AF_BLUETOOTH" :
  93.     af == AF_IEEE80211 ?        "AF_IEEE80211" :
  94.     af == AF_INET_SDP ?     "AF_INET_SDP" :
  95.     af == AF_INET6_SDP ?        "AF_INET6_SDP" :
  96.     af == AF_MAX ?          "AF_MAX" :
  97.     strjoin("AF_UNKNOWN(", strjoin(lltostr(af), ")"));
  98.  
  99. #pragma D binding "1.13" sa_data_size
  100. inline int sa_data_size = 14;
  101.  
  102. #pragma D binding "1.13" sa_data_addr
  103. inline string sa_data_addr[sa_family_t af, char data[sa_data_size]] =
  104.     af == AF_INET ? strjoin(
  105.         strjoin(strjoin(lltostr(data[2] & 0xFF), "."),
  106.             strjoin(lltostr(data[3] & 0xFF), ".")
  107.         ),
  108.         strjoin(strjoin(lltostr(data[4] & 0xFF), "."),
  109.             lltostr(data[5] & 0xFF))
  110.     ) :
  111.     "";
  112.  
  113. #pragma D binding "1.13" sa_data_port
  114. inline uint16_t sa_data_port[sa_family_t af, char data[sa_data_size]] =
  115.     af == AF_INET ? (data[0] << 8) + data[1] :
  116.     0;
  117.  
  118. #pragma D binding "1.13" translator
  119. translator sainfo_t < struct sockaddr *SA > {
  120.     sa_family = SA->sa_family;
  121.     family = address_family_string[SA->sa_family];
  122.     addr = sa_data_addr[SA->sa_family, SA->sa_data];
  123.     port = sa_data_port[SA->sa_family, SA->sa_data];
  124. };
  125.  
  126. this sainfo_t       sainfo;
  127. this ssize_t        nbytes;
  128. this string     details;
  129. this string     flow;
  130. this struct msghdr *    msghdr;
  131. this struct sockaddr *  sa;
  132.  
  133. inline string probeflow[string func] =
  134.     func == "recvfrom" ?    "<-" :
  135.     func == "recvmsg" ? "<-" :
  136.     func == "recvmmsg" ?    "<-" :
  137.     "->";
  138.  
  139. inline string af_details[sa_family_t af, string addr, uint16_t port] =
  140.     af == AF_INET ? strjoin(addr, strjoin(":", lltostr(port))) :
  141.     "";
  142.  
  143. $PROBE /* probe ID $ID */
  144. {${TRACE:+
  145.     printf("<$ID>");}
  146.     this->details = "";
  147.     this->flow = probeflow[probefunc];
  148. }
  149.  
  150. syscall::recvfrom:entry /* probe ID $(( $ID + 1 )) */
  151. {${TRACE:+
  152.     printf("<$(( $ID + 1 ))>");}
  153.     this->sa = args[4] == NULL ?
  154.         (struct sockaddr *)alloca(sizeof(struct sockaddr)) :
  155.         (struct sockaddr *)copyin(arg4, sizeof(struct sockaddr));
  156.     this->sainfo = xlate <sainfo_t> ((struct sockaddr *)this->sa);
  157. }
  158.  
  159. syscall::recvfrom:return /* probe ID $(( $ID + 2 )) */
  160. {${TRACE:+
  161.     printf("<$(( $ID + 2 ))>");}
  162.     this->nbytes = arg0;
  163.     this->details = strjoin("from ", strjoin(
  164.         strjoin(this->sainfo.family, " "),
  165.         af_details[this->sainfo.sa_family,
  166.             this->sainfo.addr, this->sainfo.port]));
  167. }
  168.  
  169. syscall::recvmsg:return /* probe ID $(( $ID + 3 )) */
  170. {${TRACE:+
  171.     printf("<$(( $ID + 3 ))>");}
  172.     this->nbytes = arg0;
  173. }
  174.  
  175. syscall::sendmsg:entry /* probe ID $(( $ID + 5 )) */
  176. {${TRACE:+
  177.     printf("<$(( $ID + 5 ))>");}
  178.     this->nbytes = arg2;
  179. }
  180.  
  181. syscall::sendto:entry /* probe ID $(( $ID + 4 )) */
  182. {${TRACE:+
  183.     printf("<$(( $ID + 4 ))>");}
  184.     this->nbytes = arg2;
  185.     this->sa = arg4 == NULL ?
  186.         (struct sockaddr *)alloca(sizeof(struct sockaddr)) :
  187.         (struct sockaddr *)copyin(arg4, sizeof(struct sockaddr));
  188.     this->sainfo = xlate <sainfo_t> ((struct sockaddr *)this->sa);
  189.     this->details = strjoin("to ", strjoin(
  190.         strjoin(this->sainfo.family, " "),
  191.         af_details[this->sainfo.sa_family,
  192.             this->sainfo.addr, this->sainfo.port]));
  193. }
  194. EOF
  195. ACTIONS=$( cat <&9 )
  196. ID=$(( $ID + 5 ))
  197.  
  198. ############################################################ EVENT DETAILS
  199.  
  200. exec 9<<EOF
  201.     /*
  202.      * Print socket details
  203.      */
  204.     printf("%s %d byte%s%s%s",
  205.         this->flow,
  206.         this->nbytes,
  207.         this->nbytes != 1 ? "s" : "",
  208.         this->details != "" ? " " : "",
  209.         this->details);
  210. EOF
  211. EVENT_DETAILS=$( cat <&9 )
  212.  
  213. ################################################################################
  214. # END
  215. ################################################################################
Add Comment
Please, Sign In to add comment