> From: Zubin Mithra <[email protected]> > > * defs.h: Add Add header files netinet/in.h, sys/socket.h, > arpa/inet.h, linux/netlink.h and linux/inet_diag.h. > Change type of show_fd_path to unsigned int. > Add macros SOCK_DIAG_BY_FAMILY, SOCKET_BUFFER_SIZE. > Add structs sock_diag_req, inet_diag_req_v2. > * strace.c (init): Change usage of show_fd_path. > * util.c (parse_response): New function to parse and > print ip, port from a message response. > (send_query): New function. > (receive_responses): New function. > (printsockdetails): New function. > (printfd): Modified to use printsockdetails.
Wow! The feature looks important. People including I may want extend to handle more families and get information. It is nice if you prepare a test case, too. See code/tests/. On Thu, 7 Aug 2014 18:17:12 +0530, [email protected] wrote: > + if (diag_msg->idiag_family == AF_INET) > + inet_ntop(AF_INET, (struct in_addr*) &(diag_msg->id.idiag_dst), > + remote_addr_buf, INET_ADDRSTRLEN); > + else if (diag_msg->idiag_family == AF_INET6) > + inet_ntop(AF_INET6, (struct in_addr6*) > &(diag_msg->id.idiag_dst), > + remote_addr_buf, INET6_ADDRSTRLEN); > + else > + return -1; To make adding more families a bit easier how do you think use switch/case instead of if/else? Like: switch (diag_msg->idiag_family) { case AF_INET: ... case AF_INET6: ... } On Thu, 7 Aug 2014 18:17:12 +0530, [email protected] wrote: > +/* Given an inode number of a socket, print out the details > + * of the remote ip address and remote port */ > +int > +printsockdetails(int inodenr) > +{ > + int sockfd; > + int i, j; > + int protocols[] = {IPPROTO_TCP, IPPROTO_UDP}; > + int families[] = {AF_INET, AF_INET6}; > + > + //Create the monitoring socket > + if((sockfd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_INET_DIAG)) == -1) > + return -1; Do we have to create a netlink socket each time printsockdetails is inovked? How do you think cache the response from the netlink socket? System calls that adding and removing a socket from fd table of process are enumerable. So you can cache the response from the netlink socket safely if the target program is not multi-threaded. * adding + socket + accept + passing * removing + close + shutdown? Could the technique I used in commit 1d78d22058da04eac7bf726c059d5c3fb193da08 help you? > + > + for (i = 0; i < 2; i++) { "2" is hardcoded here. sizeof(families)/sizeof(families[0]) may be better because it makes adding more families a bit easier. On Thu, 7 Aug 2014 18:17:12 +0530, [email protected] wrote: > void > printfd(struct tcb *tcp, int fd) > { > char path[PATH_MAX + 1]; > > - if (show_fd_path && getfdpath(tcp, fd, path, sizeof(path)) >= 0) > + if (show_fd_path == 1 && getfdpath(tcp, fd, path, sizeof(path)) >= 0) > tprintf("%d<%s>", fd, path); > + else if (show_fd_path > 1 && getfdpath(tcp, fd, path, sizeof(path)) >= > 0) { > + char *ptr = NULL; > + int inodenr; > + ptr = strstr(path, "socket:["); > + if (ptr != path) { > + tprintf("%d<%s>", fd, path); > + } > + else { > + int retval; > + ptr = path + 8; > + path[strlen(path)-1] = '\0'; > + inodenr = strtol(ptr, NULL, 10); > + tprintf("%d<", fd); > + retval = printsockdetails(inodenr); > + if (retval == -1) tprintf("socket:[%d]",inodenr); > + tprints(">"); > + } > + } > else > tprintf("%d", fd); I cannot show even pseudo code but if possible, could you consider adding code to handle other fd type like pipe, device? Masatake YAMATO ------------------------------------------------------------------------------ Infragistics Professional Build stunning WinForms apps today! Reboot your WinForms applications with our WinForms controls. Build a bridge from your legacy apps to the future. http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk _______________________________________________ Strace-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/strace-devel
