From: Thomas Weißschuh Date: Mon, 21 Nov 2022 02:19:16 +0000 (+0100) Subject: dmesg: allow specification of level range X-Git-Tag: v2.39-rc1~404 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=73a96af6ec4256066cb68b0a28f635b441413d3f;p=thirdparty%2Futil-linux.git dmesg: allow specification of level range --- diff --git a/include/strutils.h b/include/strutils.h index 45c8f98241..9cf924d7e3 100644 --- a/include/strutils.h +++ b/include/strutils.h @@ -211,7 +211,8 @@ extern int string_add_to_idarray(const char *list, int ary[], int (name2id)(const char *, size_t)); extern int string_to_bitarray(const char *list, char *ary, - int (*name2bit)(const char *, size_t)); + int (*name2bit)(const char *, size_t), + size_t allow_range); extern int string_to_bitmask(const char *list, unsigned long *mask, diff --git a/lib/strutils.c b/lib/strutils.c index efa2505c07..db73c00fca 100644 --- a/lib/strutils.c +++ b/lib/strutils.c @@ -724,11 +724,16 @@ int string_add_to_idarray(const char *list, int ary[], size_t arysz, * as a position in the 'ary' bit array. It means that the 'id' has to be in * range <0..N> where N < sizeof(ary) * NBBY. * + * If allow_range is enabled: + * An item ending in '+' also sets all bits in <0..N>. + * An item beginning with '+' also sets all bits in . + * * Returns: 0 on success, <0 on error. */ int string_to_bitarray(const char *list, char *ary, - int (*name2bit)(const char *, size_t)) + int (*name2bit)(const char *, size_t), + size_t allow_range) { const char *begin = NULL, *p; @@ -737,7 +742,7 @@ int string_to_bitarray(const char *list, for (p = list; p && *p; p++) { const char *end = NULL; - int bit; + int bit, set_lower = 0, set_higher = 0; if (!begin) begin = p; /* begin of the level name */ @@ -749,11 +754,26 @@ int string_to_bitarray(const char *list, continue; if (end <= begin) return -1; + if (allow_range) { + if (*(end - 1) == '+') { + end--; + set_lower = 1; + } else if (*begin == '+') { + begin++; + set_higher = 1; + } + } bit = name2bit(begin, end - begin); if (bit < 0) return bit; setbit(ary, bit); + if (set_lower) + while (--bit >= 0) + setbit(ary, bit); + else if (set_higher) + while (++bit < (int) allow_range) + setbit(ary, bit); begin = NULL; if (end && !*end) break; diff --git a/sys-utils/dmesg.1.adoc b/sys-utils/dmesg.1.adoc index 9072f224c6..c34127e317 100644 --- a/sys-utils/dmesg.1.adoc +++ b/sys-utils/dmesg.1.adoc @@ -84,6 +84,14 @@ Restrict output to the given (comma-separated) _list_ of levels. For example: *dmesg --level=err,warn* + will print error and warning messages only. For all supported levels see the *--help* output. ++ +Appending a plus *+* to a level name also includes all higher levels. For example: ++ +*dmesg --level=err+* ++ +will print levels *err*, *crit*, *alert* and *emerg*. ++ +Prepending it will include all lower levels. *-n*, *--console-level* _level_:: Set the _level_ at which printing of messages is done to the console. The _level_ is a level number or abbreviation of the level name. For all supported levels see the *--help* output. diff --git a/sys-utils/dmesg.c b/sys-utils/dmesg.c index ee2e2dac5d..42000cb40e 100644 --- a/sys-utils/dmesg.c +++ b/sys-utils/dmesg.c @@ -1475,7 +1475,7 @@ int main(int argc, char *argv[]) case 'f': ctl.fltr_fac = 1; if (string_to_bitarray(optarg, - ctl.facilities, parse_facility) < 0) + ctl.facilities, parse_facility, 0) < 0) return EXIT_FAILURE; break; case 'H': @@ -1499,7 +1499,8 @@ int main(int argc, char *argv[]) case 'l': ctl.fltr_lev= 1; if (string_to_bitarray(optarg, - ctl.levels, parse_level) < 0) + ctl.levels, parse_level, + ARRAY_SIZE(level_names)) < 0) return EXIT_FAILURE; break; case 'n': diff --git a/tests/expected/dmesg/console-levels b/tests/expected/dmesg/console-levels index 48b0a1ddd5..43615f8ba9 100644 --- a/tests/expected/dmesg/console-levels +++ b/tests/expected/dmesg/console-levels @@ -102,3 +102,147 @@ [658503.000000] example[87] [857375.000000] example[95] [1092727.000000] example[103] +[ 0.000000] example[0] +[ 1.000000] example[1] +[ 8.000000] example[2] +[ 27.000000] example[3] +[ 512.000000] example[8] +[ 729.000000] example[9] +[ 1000.000000] example[10] +[ 1331.000000] example[11] +[ 4096.000000] example[16] +[ 4913.000000] example[17] +[ 5832.000000] example[18] +[ 6859.000000] example[19] +[13824.000000] example[24] +[15625.000000] example[25] +[17576.000000] example[26] +[19683.000000] example[27] +[32768.000000] example[32] +[35937.000000] example[33] +[39304.000000] example[34] +[42875.000000] example[35] +[64000.000000] example[40] +[68921.000000] example[41] +[74088.000000] example[42] +[79507.000000] example[43] +[110592.000000] example[48] +[117649.000000] example[49] +[125000.000000] example[50] +[132651.000000] example[51] +[175616.000000] example[56] +[185193.000000] example[57] +[195112.000000] example[58] +[205379.000000] example[59] +[262144.000000] example[64] +[274625.000000] example[65] +[287496.000000] example[66] +[300763.000000] example[67] +[373248.000000] example[72] +[389017.000000] example[73] +[405224.000000] example[74] +[421875.000000] example[75] +[512000.000000] example[80] +[531441.000000] example[81] +[551368.000000] example[82] +[571787.000000] example[83] +[681472.000000] example[88] +[704969.000000] example[89] +[729000.000000] example[90] +[753571.000000] example[91] +[884736.000000] example[96] +[912673.000000] example[97] +[941192.000000] example[98] +[970299.000000] example[99] +[ 0.000000] example[0] +[ 512.000000] example[8] +[ 4096.000000] example[16] +[13824.000000] example[24] +[32768.000000] example[32] +[64000.000000] example[40] +[110592.000000] example[48] +[175616.000000] example[56] +[262144.000000] example[64] +[373248.000000] example[72] +[512000.000000] example[80] +[681472.000000] example[88] +[884736.000000] example[96] +[ 27.000000] example[3] +[ 64.000000] example[4] +[ 125.000000] example[5] +[ 216.000000] example[6] +[ 343.000000] example[7] +[ 1331.000000] example[11] +[ 1728.000000] example[12] +[ 2197.000000] example[13] +[ 2744.000000] example[14] +[ 3375.000000] example[15] +[ 6859.000000] example[19] +[ 8000.000000] example[20] +[ 9261.000000] example[21] +[10648.000000] example[22] +[12167.000000] example[23] +[19683.000000] example[27] +[21952.000000] example[28] +[24389.000000] example[29] +[27000.000000] example[30] +[29791.000000] example[31] +[42875.000000] example[35] +[46656.000000] example[36] +[50653.000000] example[37] +[54872.000000] example[38] +[59319.000000] example[39] +[79507.000000] example[43] +[85184.000000] example[44] +[91125.000000] example[45] +[97336.000000] example[46] +[103823.000000] example[47] +[132651.000000] example[51] +[140608.000000] example[52] +[148877.000000] example[53] +[157464.000000] example[54] +[166375.000000] example[55] +[205379.000000] example[59] +[216000.000000] example[60] +[226981.000000] example[61] +[238328.000000] example[62] +[250047.000000] example[63] +[300763.000000] example[67] +[314432.000000] example[68] +[328509.000000] example[69] +[343000.000000] example[70] +[357911.000000] example[71] +[421875.000000] example[75] +[438976.000000] example[76] +[456533.000000] example[77] +[474552.000000] example[78] +[493039.000000] example[79] +[571787.000000] example[83] +[592704.000000] example[84] +[614125.000000] example[85] +[636056.000000] example[86] +[658503.000000] example[87] +[753571.000000] example[91] +[778688.000000] example[92] +[804357.000000] example[93] +[830584.000000] example[94] +[857375.000000] example[95] +[970299.000000] example[99] +[1000000.000000] example[100] +[1030301.000000] example[101] +[1061208.000000] example[102] +[1092727.000000] example[103] +[ 343.000000] example[7] +[ 3375.000000] example[15] +[12167.000000] example[23] +[29791.000000] example[31] +[59319.000000] example[39] +[103823.000000] example[47] +[166375.000000] example[55] +[250047.000000] example[63] +[357911.000000] example[71] +[493039.000000] example[79] +[658503.000000] example[87] +[857375.000000] example[95] +[1092727.000000] example[103] +test_dmesg: unknown level '+' diff --git a/tests/ts/dmesg/console-levels b/tests/ts/dmesg/console-levels index 10b7a9cf51..fc39cf0d73 100755 --- a/tests/ts/dmesg/console-levels +++ b/tests/ts/dmesg/console-levels @@ -27,4 +27,10 @@ for I in {-1..8}; do $TS_HELPER_DMESG -F $TS_SELF/input -l $I >> $TS_OUTPUT 2>/dev/null done +$TS_HELPER_DMESG -F $TS_SELF/input -l err+ >> $TS_OUTPUT 2>/dev/null +$TS_HELPER_DMESG -F $TS_SELF/input -l emerg+ >> $TS_OUTPUT 2>/dev/null +$TS_HELPER_DMESG -F $TS_SELF/input -l +err >> $TS_OUTPUT 2>/dev/null +$TS_HELPER_DMESG -F $TS_SELF/input -l +debug >> $TS_OUTPUT 2>/dev/null +$TS_HELPER_DMESG -F $TS_SELF/input -l + 2>> $TS_OUTPUT >/dev/null + ts_finalize