On Wed, Dec 10, 2014 at 12:55:07PM +0900, Masatake YAMATO wrote:
> This patch extends -yy option; the peer address of a unix socket can be
> printed like an inet socket.

It works perfectly well, but there are several minor issues with the patch
I'd like to have fixed before applying.

[...]
> --- /dev/null
> +++ b/linux/unix_diag.h
> @@ -0,0 +1,25 @@
> +struct unix_diag_req {
> +     __u8    sdiag_family;
> +     __u8    sdiag_protocol;
> +     __u16   pad;
> +     __u32   udiag_states;
> +     __u32   udiag_ino;
> +     __u32   udiag_show;
> +     __u32   udiag_cookie[2];
> +};

Let's use uint8_t, uint16_t, and uint32_t instead.

[...]
> --- a/socketutils.c
> +++ b/socketutils.c
> @@ -5,9 +5,12 @@
>  #include <linux/netlink.h>
>  #include <linux/sock_diag.h>
>  #include <linux/inet_diag.h>
> +#include <linux/unix_diag.h>
> +#include <linux/rtnetlink.h> /* rtattr */

This header file is needed not just for rtattr but also for RTA_* macros,
let's omit this comment.

> +#include <linux/un.h>                /* For UNIX_PATH_MAX */

Couldn't we include <sys/un.h> and use sizeof(struct sockaddr_un) instead?

[...]
> +             .udr = {
> +                     .sdiag_family = AF_UNIX,
> +                     .sdiag_protocol = 0,

All omitted fields are initialized with zero anyway, so
I suppose you can omit this .sdiag_protocol initialization.

> +                     .udiag_ino = inode,
> +                     .udiag_states = -1,
> +                     .udiag_show = UDIAG_SHOW_NAME|UDIAG_SHOW_PEER,

Please put spaces around "|".

[...]
> +static bool
> +unix_parse_response(const void *data, int data_len, const unsigned long 
> inode)
> +{
> +     const struct unix_diag_msg *diag_msg = data;
> +     int rtalen = data_len - NLMSG_LENGTH(sizeof(*diag_msg));

Also a style issue: "rtalen" and "data_len" do not look quite nice when
used together.  Let's rename "rtalen" to "rta_len".

> +     struct rtattr *attr;
> +     bool r, found_path;
> +     char path[UNIX_PATH_MAX + 1];
> +     uint32_t peer = 0;

This function returns "true" when it succeeds to obtain and print at least
one of attributes.  That is, if we tested these attributes instead,
"bool r" would be redundant.

> +     if (diag_msg->udiag_ino != inode)
> +             return false;
> +     if (diag_msg->udiag_family != AF_UNIX)
> +             return false;
> +     if (rtalen <= 0)
> +             return false;

RTA_OK checks the length anyway, so there is no need to do it manually.

> +     attr = (struct rtattr*) (diag_msg +1);
> +     r = false;
> +     found_path = false;
> +     while(RTA_OK(attr, rtalen))
> +     {
> +             switch (attr->rta_type)
> +             {

We put braces on line after if, while, switch, etc.

> +             case UNIX_DIAG_NAME:
> +                     if (rtalen > 0)
> +                     {

The length has been checked by RTA_OK already, no need to do it here.

> +                             size_t l = RTA_PAYLOAD(attr);

Please avoid naming variables with a single letter "l".
A name like path_len would suit it better.
BTW, you can use this path_len instead of found_path as an indicator of
successfully obtained path.

> +                             l = (l < UNIX_PATH_MAX)? l: UNIX_PATH_MAX;

Wouldn't simple "if" statement look clearer?

> +                             memcpy(path, RTA_DATA(attr), l);
> +                             /* convert to C string */
> +                             path[l] = '\0';
> +                             /* make abstract socket printable with adding 
> prefix @*/
> +                             if (path[0] == '\0')
> +                                     path[0] = '@';

If we just prefix path with "@" symbol, how can we distinguish an abstract
socket from a regular socket with a path name starting with this "@" symbol?
See how AF_UNIX sockets are decoded by printsock().

> +                             found_path = true;
> +                             r = true;
> +                     }
> +                     break;
> +             case UNIX_DIAG_PEER:
> +                     if (RTA_PAYLOAD(attr) >= 4)
> +                     {
> +                             peer = *(uint32_t *)RTA_DATA(attr);
> +                             r = true;
> +                     }
> +                     break;
> +             }
> +             attr = RTA_NEXT(attr, rtalen);
> +     }
> +
> +     /* prints the getting information with following format:
> +        "UNIX:[" SELF_INODE [ "->" PEER_INODE ][ "," SOCKET_FILE ] "]" */

Let it be a regular boxed comment:

        /*
         * text
         */


-- 
ldv

Attachment: pgpNHDwvPyX40.pgp
Description: PGP signature

------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to