From 3742765f0bf30142c8f7d1510a86b0babe80e6e6 Mon Sep 17 00:00:00 2001 From: http://ftp.de.debian.org/debian/pool/main/p/procps/procps_3.2.8-8.debian.tar.gz Date: Fri, 19 Mar 2010 21:58:46 +0100 Subject: [PATCH 62/70] top_numeric_args --- top.c | 48 ++++++++++++++++++++++++++++++++++++------------ 1 files changed, 36 insertions(+), 12 deletions(-) diff --git a/top.c b/top.c index ea33989..e194244 100644 --- a/top.c +++ b/top.c @@ -32,6 +32,7 @@ #include #include #include +#include #include // Foul POS defines all sorts of stuff... @@ -1825,8 +1826,12 @@ static void parse_args (char **args) while (*args) { const char *cp = *(args++); + if (*cp!='-') { + std_err(fmtmk("unknown argument '%c'\nusage:\t%s%s" , *cp, Myname, usage)); + } - while (*cp) { + for(++cp; *cp; cp++) { + char *end; switch (*cp) { case '\0': case '-': @@ -1842,8 +1847,15 @@ static void parse_args (char **args) else if (*args) cp = *args++; else std_err("-d requires argument"); /* a negative delay will be dealt with shortly... */ - if (sscanf(cp, "%f", &tmp_delay) != 1) - std_err(fmtmk("bad delay '%s'", cp)); + errno=0; + if (( (fabs(tmp_delay=strtod(cp, &end))==HUGE_VAL && + errno==ERANGE) || + (tmp_delay==0 && errno!=0) || + end==cp || + end!=cp+strlen(cp))) { + std_err(fmtmk("bad delay '%s'", cp)); + } + cp=-1+end; break; case 'H': TOGw(Curwin, Show_THREADS); @@ -1859,8 +1871,15 @@ static void parse_args (char **args) if (cp[1]) cp++; else if (*args) cp = *args++; else std_err("-n requires argument"); - if (sscanf(cp, "%d", &Loops) != 1 || Loops < 1) - std_err(fmtmk("bad iterations arg '%s'", cp)); + errno=0; + if ((((Loops=strtol(cp, &end, 0))==LONG_MIN || + Loops==LONG_MAX) && + errno==ERANGE) || + end==cp || + end!=cp+strlen(cp) || Loops<1) { + std_err(fmtmk("bad iterations arg '%s'", cp)); + } + cp=-1+end; break; case 'p': do { @@ -1868,11 +1887,19 @@ static void parse_args (char **args) selection_type = 'p'; if (cp[1]) cp++; else if (*args) cp = *args++; - else std_err("-p argument missing"); + else std_err("-p requires argument"); if (Monpidsidx >= MONPIDMAX) std_err(fmtmk("pid limit (%d) exceeded", MONPIDMAX)); - if (sscanf(cp, "%d", &Monpids[Monpidsidx]) != 1 || Monpids[Monpidsidx] < 0) - std_err(fmtmk("bad pid '%s'", cp)); + errno=0; + if ((((Monpids[Monpidsidx]=strtol(cp, &end, 0))==LONG_MIN || + Monpids[Monpidsidx]==LONG_MAX) && + errno==ERANGE) || + end==cp || + Monpids[Monpidsidx]<1) { + std_err(fmtmk("bad pid '%s'", cp)); + } + cp=-1+end; + if (!Monpids[Monpidsidx]) Monpids[Monpidsidx] = getpid(); Monpidsidx++; @@ -1918,10 +1945,7 @@ static void parse_args (char **args) , *cp, Myname, usage)); } /* end: switch (*cp) */ - - /* advance cp and jump over any numerical args used above */ - if (*cp) cp += strspn(&cp[1], "- ,.1234567890") + 1; - } /* end: while (*cp) */ + } /* end: for (; *cp) */ } /* end: while (*args) */ /* fixup delay time, maybe... */ -- 1.7.0