From f888a30d2365b2b4f90af125e8b6c4bde8cc4993 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Sun, 3 Jul 2016 10:08:18 +1000 Subject: [PATCH] library: find tty device name of process quicker The procps library attempts to work out the tty of a process through several methods. For things like /dev/tty123 or /dev/foo it works fine. For tty devices that put the minor number in a directory of the major name this fails. So then we have to fallback to stating things like the processes STDERR and try again. Considering a lot of processes sit on ttys such as /dev/pts/3 this is a lot of wasted time. At the point of entering driver_name we know "/dev/pts" and we know "3" we just didn't join them up the right way as this is old code. This change now looks for /dev/pts/3 as well. It does it after looking for /dev/pts3 so the behaviour is the same. References: https://bugs.debian.org/770215 Signed-off-by: Craig Small --- NEWS | 3 ++- proc/devname.c | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index c884b15f..c160a4a7 100644 --- a/NEWS +++ b/NEWS @@ -5,8 +5,9 @@ procps-ng-NEXT * ps: Fallback to attr/current for context Debian #786956 * tests: Conditionally add prctl Debian #816237 * pidof: check cmd if space in argv0. GitLab #4 - * kill: report error if cannot kill process #733172 + * kill: report error if cannot kill process Debian #733172 * watch: Add hostname to header + * library: Find tty quicker Debian #770215 procps-ng-3.3.11 ---------------- diff --git a/proc/devname.c b/proc/devname.c index e6d0b554..10b7845d 100644 --- a/proc/devname.c +++ b/proc/devname.c @@ -132,9 +132,12 @@ static int driver_name(char *restrict const buf, unsigned maj, unsigned min){ } sprintf(buf, "/dev/%s%d", tmn->name, min); /* like "/dev/ttyZZ255" */ if(stat(buf, &sbuf) < 0){ - if(tmn->devfs_type) return 0; - sprintf(buf, "/dev/%s", tmn->name); /* like "/dev/ttyZZ255" */ - if(stat(buf, &sbuf) < 0) return 0; + sprintf(buf, "/dev/%s/%d", tmn->name, min); /* like "/dev/pts/255" */ + if(stat(buf, &sbuf) < 0){ + if(tmn->devfs_type) return 0; + sprintf(buf, "/dev/%s", tmn->name); /* like "/dev/ttyZZ255" */ + if(stat(buf, &sbuf) < 0) return 0; + } } if(min != MINOR_OF(sbuf.st_rdev)) return 0; if(maj != MAJOR_OF(sbuf.st_rdev)) return 0;