$NetBSD: patch-af,v 1.7 2020/10/06 00:19:05 mcf Exp $ Need limits.h for PATH_MAX Fix sscanf usage bug on musl libc and uclibc (upstream commit https://gitlab.com/psmisc/psmisc/-/commit/ca2b176889729a7347bd95b832b9a5bb39fec229) --- src/pstree.c.orig 2000-12-18 05:59:23.000000000 +0000 +++ src/pstree.c @@ -15,19 +15,22 @@ #include #include #include +#include #include +#ifdef HAVE_TERMCAP_H #include +#endif #include #include #include #include "comm.h" +#include "procfs.h" #ifndef MAX_DEPTH #define MAX_DEPTH 100 #endif -#define PROC_BASE "/proc" /* UTF-8 defines by Johan Myreen */ #define UTF_V "\342\224\202\277" /* Vertical line drawing char */ @@ -303,6 +306,7 @@ dump_tree (PROC * current, int level, in const struct passwd *pw; int lvl, i, add, offset, len, swapped, info, count, comm_len, first; const char *tmp, *here; + char tbuf[1024], *pbuf; char comm_tmp[5]; if (!current) @@ -327,7 +331,8 @@ dump_tree (PROC * current, int level, in add = out_int (rep) + 2; out_string ("*["); } - if (current->highlight && (tmp = tgetstr ("md", NULL))) + pbuf = tbuf; + if (current->highlight && (tmp = tgetstr ("md", &pbuf))) tputs (tmp, 1, putchar); if ((swapped = print_args) && current->argc < 0) out_char ('('); @@ -366,7 +371,8 @@ dump_tree (PROC * current, int level, in } if (info || swapped) out_char (')'); - if (current->highlight && (tmp = tgetstr ("me", NULL))) + pbuf = tbuf; + if (current->highlight && (tmp = tgetstr ("me", &pbuf))) tputs (tmp, 1, putchar); if (print_args) { @@ -504,7 +510,7 @@ read_proc (void) while ((de = readdir (dir)) != NULL) if ((pid = atoi (de->d_name)) != 0) { - sprintf (path, "%s/%d/stat", PROC_BASE, pid); + sprintf (path, "%s/%d/%s", PROC_BASE, pid, STATUS_FILE); if ((file = fopen (path, "r")) != NULL) { empty = 0; @@ -513,16 +519,19 @@ read_proc (void) perror (path); exit (1); } +#ifdef BSD_44_PROCFS + if (fscanf(file, "%s %*d %d", comm, &ppid) == 2) + { { { +#else fread(readbuf, BUFSIZ, 1, file) ; if (ferror(file) == 0) { memset(comm, '\0', COMM_LEN+1); tmpptr = strrchr(readbuf, ')'); /* find last ) */ - *tmpptr = '\0'; /* We now have readbuf with pid and cmd, and tmpptr+2 * with the rest */ /*printf("readbuf: %s\n", readbuf);*/ - if (sscanf(readbuf, "%*d (%15c", comm) == 1) + if (sscanf(readbuf, "%*d (%15[^)]", comm) == 1) { /*printf("tmpptr: %s\n", tmpptr+2);*/ if (sscanf(tmpptr+2, "%*c %d", &ppid) == 1) @@ -532,11 +541,12 @@ read_proc (void) (file, "%d (%s) %c %d", &dummy, comm, (char *) &dummy, &ppid) == 4) */ +#endif if (!print_args) add_proc (comm, pid, ppid, st.st_uid, NULL, 0); else { - sprintf (path, "%s/%d/cmdline", PROC_BASE, pid); + sprintf (path, "%s/%d/%s", PROC_BASE, pid, CMDLINE_FILE); if ((fd = open (path, O_RDONLY)) < 0) { perror (path); @@ -641,7 +651,11 @@ main (int argc, char **argv) switch (c) { case 'a': +#if defined(BSD_44_PROCFS) && !defined(BSD_PROCFS_CMDLINE) + print_args = 0; +#else print_args = 1; +#endif break; case 'c': compact = 0;