From d8367cbb3eed8ee5f5050ed513de1f7c2b2f9057 Mon Sep 17 00:00:00 2001 From: albert <> Date: Sat, 21 Dec 2002 10:34:50 +0000 Subject: [PATCH] still sig11 w/ "ps f" --- proc/escape.c | 97 +++++++++++++++++++++++++++++++++++++++++-------- proc/escape.h | 23 ++++++++++++ proc/readproc.c | 5 +-- ps/common.h | 9 ----- ps/output.c | 1 + 5 files changed, 108 insertions(+), 27 deletions(-) create mode 100644 proc/escape.h diff --git a/proc/escape.c b/proc/escape.c index 424cb38a..86687296 100644 --- a/proc/escape.c +++ b/proc/escape.c @@ -9,9 +9,25 @@ * GNU Library General Public License for more details. */ #include -#include "../proc/procps.h" -#include "common.h" +#include +#include "procps.h" +#include "escape.h" +#include "readproc.h" +// What it would be for a UTF-8 locale: +// "Z-------------------------------" +// "********************************" +// "********************************" +// "*******************************-" +// "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" Trailing UTF-8, and badness in 8-bit. +// "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" Trailing UTF-8, and safe in 8-bit. +// "--222222222222222222222222222222" +// ".333333333333.3.44444444555566--" The '.' means '3', with problem chars. +// +// Problems include non-shortest forms, UTF-16, and non-characters. +// The 4-byte, 5-byte, and 6-byte sequences are full of trouble too. + +#if 0 /* sanitize a string, without the nice BSD library function: */ /* strvis(vis_args, k->ki_args, VIS_TAB | VIS_NL | VIS_NOSLASH) */ int octal_escape_str(char *restrict dst, const char *restrict src, size_t n){ @@ -57,9 +73,10 @@ leave: *(dst++) = '\0'; return i; } +#endif /* sanitize a string via one-way mangle */ -int simple_escape_str(char *restrict dst, const char *restrict src, size_t n){ +int escape_str(char *restrict dst, const char *restrict src, size_t bytes){ unsigned char c; size_t i; const char codes[] = @@ -71,7 +88,8 @@ int simple_escape_str(char *restrict dst, const char *restrict src, size_t n){ "********************************" "********************************" "********************************"; - for(i=0; i 1) && src[1]) dst[i++] = ' '; + +//if(!*src){ just never call this function without checking first +// do something nice +//} + + for(;;){ + i += escape_str(dst+i, *src, bytes-i); + if(bytes-i < 3) break; // need room for space, a character, and the NUL src++; + if(!*src) break; // need something to print + dst[i++] = ' '; } - return i; + return i; // bytes of text, excluding the NUL +} + +/////////////////////////////////////////////////// + +int escape_command(char *restrict const outbuf, const proc_t *restrict const pp, int bytes, int glyphs, unsigned flags){ + int overhead = 1; // the trailing NUL + int end = 0; + + if(bytes > glyphs+1) bytes=glyphs+1; // FIXME: assumes 8-bit locale + + if(flags & ESC_ARGS){ + const char **lc = (const char**)pp->cmdline; + if(lc && *lc) return escape_strlist(outbuf, lc, bytes); + } + if(flags & ESC_BRACKETS){ + overhead += 2; + } + if(flags & ESC_DEFUNCT){ + if(pp->state=='Z') overhead += 10; // chars in " " + else flags &= ~ESC_DEFUNCT; + } + if(overhead >= bytes){ // if no room for even one byte of the command name + // you'd damn well better have _some_ space + outbuf[0] = '-'; + outbuf[1] = '\0'; + return 1; + } + if(flags & ESC_BRACKETS){ + outbuf[end++] = '['; + } + end += escape_str(outbuf+end, pp->cmd, bytes-overhead); + + // Hmmm, do we want "[foo] " or "[foo ]"? + if(flags & ESC_BRACKETS){ + outbuf[end++] = ']'; + } + if(flags & ESC_DEFUNCT){ + memcpy(outbuf+end, " ", 10); + end += 10; + } + + outbuf[end] = '\0'; + return end; // bytes or glyphs, not including the NUL } diff --git a/proc/escape.h b/proc/escape.h new file mode 100644 index 00000000..0df8ed05 --- /dev/null +++ b/proc/escape.h @@ -0,0 +1,23 @@ +#ifndef PROCPS_PROC_ESCAPE_H +#define PROCPS_PROC_ESCAPE_H + +//#include +#include +#include "procps.h" +#include "readproc.h" + +EXTERN_C_BEGIN + +#define ESC_ARGS 0x1 // try to use cmdline instead of cmd +#define ESC_BRACKETS 0x2 // if using cmd, put '[' and ']' around it +#define ESC_DEFUNCT 0x4 // mark zombies with " " + +extern int escape_strlist(char *restrict dst, const char *restrict const *restrict src, size_t n); +extern int escape_str(char *restrict dst, const char *restrict src, size_t n); +extern int octal_escape_str(char *restrict dst, const char *restrict src, size_t n); +extern int simple_escape_str(char *restrict dst, const char *restrict src, size_t n); + +extern int escape_command(char *restrict const outbuf, const proc_t *restrict const pp, int bytes, int glyphs, unsigned flags); + +EXTERN_C_END +#endif diff --git a/proc/readproc.c b/proc/readproc.c index c8adce02..27b8c6ef 100644 --- a/proc/readproc.c +++ b/proc/readproc.c @@ -171,9 +171,8 @@ static void status2proc(const char *S, proc_t *restrict P){ -/* Reads /proc/*/stat files, being careful not to trip over processes with - * names like ":-) 1 2 3 4 5 6". - */ +// Reads /proc/*/stat files, being careful not to trip over processes with +// names like ":-) 1 2 3 4 5 6". static void stat2proc(const char* S, proc_t *restrict P) { unsigned num; char* tmp; diff --git a/ps/common.h b/ps/common.h index b91d3548..6cb6c14e 100644 --- a/ps/common.h +++ b/ps/common.h @@ -215,15 +215,6 @@ typedef struct sf_node { int sf_code; } sf_node; - -/*********************** GENERAL GLOBALS *************************/ - -/* escape.c */ -extern int escape_strlist(char *restrict dst, const char *restrict const *restrict src, size_t n); -extern int escape_str(char *restrict dst, const char *restrict src, size_t n); -extern int octal_escape_str(char *restrict dst, const char *restrict src, size_t n); -extern int simple_escape_str(char *restrict dst, const char *restrict src, size_t n); - /********************* UNDECIDED GLOBALS **************/ /* output.c */ diff --git a/ps/output.c b/ps/output.c index 708fb754..094d1ea3 100644 --- a/ps/output.c +++ b/ps/output.c @@ -65,6 +65,7 @@ #include "../proc/wchan.h" #include "../proc/procps.h" #include "../proc/devname.h" +#include "../proc/escape.h" #include "common.h" #ifdef FLASK_LINUX