From patchwork Thu Apr 13 01:54:12 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 750207 X-Patchwork-Delegate: shemminger@vyatta.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3w3P4D105xz9sNl for ; Thu, 13 Apr 2017 11:54:52 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="fSJ3Purd"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755887AbdDMByp (ORCPT ); Wed, 12 Apr 2017 21:54:45 -0400 Received: from mail-pf0-f178.google.com ([209.85.192.178]:34631 "EHLO mail-pf0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755863AbdDMByn (ORCPT ); Wed, 12 Apr 2017 21:54:43 -0400 Received: by mail-pf0-f178.google.com with SMTP id c198so21604360pfc.1 for ; Wed, 12 Apr 2017 18:54:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id; bh=rtrBkebsdtcSRGO3zeLFzwN61ifVDo4DntBFXoDka2E=; b=fSJ3PurdFdlWemFj4PcAqQd1m8ss1U11sFj+WEF1e1le7L+hvr0HCgSRZAsmJ3ma8t eS1ywMokWGeu5rPi35SD3IQ9+avcj+VMebzUyXD5ApW0F6e4O2WVVNrmPV1EbKrAoIZV patpaxJOROPFLyoiWLoPuwNg2TOPOiSyt1M/U= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=rtrBkebsdtcSRGO3zeLFzwN61ifVDo4DntBFXoDka2E=; b=Lqqy3tvGGNBCNrgLJRUxLP22i/5TNmAzWuBx/IqrbtJm+k2nFyPGSd4nvHAlPC9Zpg fwnyvab+wRQTkp52rrijknQBw7CAAzGViSYo3knrkH4dXdEcF25MMU8lQy5PWcaFeDJF pVGNMoLgC6wJRJ6c8V4UI50LZWuHyNUmkHS52cWlaYtZlpXsvFiIKmrGY+dkXZn38Ww7 BzCfZl5UBzEFKmPDcwot0VqfXiJ31wxi/uKmVAnZm2GSFreJ4FRYckewVJFLgIV4StwX G2xILYIO6vnXUBZEil7Rm9ykqeAi6p3WcMCh3J/zIejsMiGzWTcuiy9bU7F0+K/UsfPM X75A== X-Gm-Message-State: AN3rC/5uB7uckgJWIjBBwNyYxksSyzaQUZHsHzUFwVbpixDZQsP2Usvi sixN1IH4h7U5vLCxnHY= X-Received: by 10.99.164.2 with SMTP id c2mr24584pgf.73.1492048482984; Wed, 12 Apr 2017 18:54:42 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. ([216.129.126.126]) by smtp.googlemail.com with ESMTPSA id a184sm27478317pfb.118.2017.04.12.18.54.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 12 Apr 2017 18:54:42 -0700 (PDT) From: David Ahern To: stephen@networkplumber.org, netdev@vger.kernel.org Cc: David Ahern Subject: [PATCH iproute2] ip vrf: Add command name next to pid Date: Wed, 12 Apr 2017 18:54:12 -0700 Message-Id: <1492048452-9052-1-git-send-email-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.1.4 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 'ip vrf pids' is used to list processes bound to a vrf, but it only shows the pid leaving a lot of work for the user. Add the command name to the output. With this patch you get the more user friendly: $ ip vrf pids mgmt 1121 ntpd 1418 gdm-session-wor 1488 gnome-session 1491 dbus-launch 1492 dbus-daemon 1565 sshd ... Signed-off-by: David Ahern --- include/utils.h | 1 + ip/ipvrf.c | 24 ++++++++++++++---------- lib/fs.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 10 deletions(-) diff --git a/include/utils.h b/include/utils.h index 22369e0b4e03..d66784674633 100644 --- a/include/utils.h +++ b/include/utils.h @@ -260,5 +260,6 @@ int get_real_family(int rtm_type, int rtm_family); int cmd_exec(const char *cmd, char **argv, bool do_fork); int make_path(const char *path, mode_t mode); char *find_cgroup2_mount(void); +int get_comm(char *pid, char *comm, int len); #endif /* __UTILS_H__ */ diff --git a/ip/ipvrf.c b/ip/ipvrf.c index 5e204a9ebbb1..6d4bd6206cc8 100644 --- a/ip/ipvrf.c +++ b/ip/ipvrf.c @@ -111,27 +111,31 @@ static void read_cgroup_pids(const char *base_path, char *name) { char path[PATH_MAX]; char buf[4096]; - ssize_t n; - int fd; + FILE *fp; if (snprintf(path, sizeof(path), "%s/vrf/%s%s", base_path, name, CGRP_PROC_FILE) >= sizeof(path)) return; - fd = open(path, O_RDONLY); - if (fd < 0) + fp = fopen(path, "r"); + if (!fp) return; /* no cgroup file, nothing to show */ /* dump contents (pids) of cgroup.procs */ - while (1) { - n = read(fd, buf, sizeof(buf) - 1); - if (n <= 0) - break; + while (fgets(buf, sizeof(buf), fp)) { + char *nl, comm[32]; - printf("%s", buf); + nl = strchr(buf, '\n'); + if (nl) + *nl = '\0'; + + if (get_comm(buf, comm, sizeof(comm))) + strcpy(comm, ""); + + printf("%5s %s\n", buf, comm); } - close(fd); + fclose(fp); } /* recurse path looking for PATH[/NETNS]/vrf/NAME */ diff --git a/lib/fs.c b/lib/fs.c index 12a4657a0bc9..81298f0ad91a 100644 --- a/lib/fs.c +++ b/lib/fs.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -149,3 +150,44 @@ int make_path(const char *path, mode_t mode) return rc; } + +int get_comm(char *pid, char *comm, int len) +{ + char path[PATH_MAX]; + char line[128]; + FILE *fp; + + if (snprintf(path, sizeof(path), + "/proc/%s/status", pid) >= sizeof(path)) { + return -1; + } + + fp = fopen(path, "r"); + if (!fp) + return -1; + + comm[0] = '\0'; + while (fgets(line, sizeof(line), fp)) { + char *nl, *name; + + name = strstr(line, "Name:"); + if (!name) + continue; + + name += 5; + while (isspace(*name)) + name++; + + nl = strchr(name, '\n'); + if (nl) + *nl = '\0'; + + strncpy(comm, name, len - 1); + comm[len - 1] = '\0'; + break; + } + + fclose(fp); + + return 0; +}