Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0cb7af91b9 | |||
| 68a7b57e82 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
||||
SOURCES/procps-ng-3.3.15.tar.xz
|
||||
procps-ng-4.0.4.tar.xz
|
||||
|
||||
@ -1 +0,0 @@
|
||||
2929bc64f0cf7b2db997eef79b7187658e47230d SOURCES/procps-ng-3.3.15.tar.xz
|
||||
@ -1,52 +0,0 @@
|
||||
[](https://gitlab.com/ci/projects/2142?ref=master)
|
||||
procps
|
||||
======
|
||||
|
||||
procps is a set of command line and full-screen utilities that provide
|
||||
information out of the pseudo-filesystem most commonly located at /proc.
|
||||
This filesystem provides a simple interface to the kernel data structures.
|
||||
The programs of procps generally concentrate on the structures that describe
|
||||
the processess running on the system.
|
||||
|
||||
The following programs are found in procps:
|
||||
* *free* - Report the amount of free and used memory in the system
|
||||
* *kill* - Send a signal to a process based on PID
|
||||
* *pgrep* - List processes based on name or other attributes
|
||||
* *pkill* - Send a signal to a process based on name or other attributes
|
||||
* *pmap* - Report memory map of a process
|
||||
* *ps* - Report information of processes
|
||||
* *pwdx* - Report current directory of a process
|
||||
* *skill* - Obsolete version of pgrep/pkill
|
||||
* *slabtop* - Display kernel slab cache information in real time
|
||||
* *snice* - Renice a process
|
||||
* *sysctl* - Read or Write kernel parameters at run-time
|
||||
* *tload* - Graphical representation of system load average
|
||||
* *top* - Dynamic real-time view of running processes
|
||||
* *uptime* - Display how long the system has been running
|
||||
* *vmstat* - Report virtual memory statistics
|
||||
* *w* - Report logged in users and what they are doing
|
||||
* *watch* - Execute a program periodically, showing output fullscreen
|
||||
|
||||
## Reporting Bugs
|
||||
There are a few ways of reporting bugs or feature requests:
|
||||
|
||||
1. Your distributions bug reporter. If you are using a distribution your first
|
||||
port of call is their bug tracker. This is because each distribution has their
|
||||
own patches and way of dealing with bugs. Also bug reporting often does not need
|
||||
any subscription to websites.
|
||||
2. GitLab Issues - To the left of this page is the issue tracker. You can report
|
||||
bugs here.
|
||||
3. Email list - We have an email list (see below) where you can report bugs.
|
||||
The problem with this method is bug reports often get lost and cannot be
|
||||
tracked. This is especially a big problem when its something that will take
|
||||
time to resolve.
|
||||
|
||||
If you need to report bugs, there is more details on the
|
||||
[Bug Reporting](https://gitlab.com/procps-ng/procps/blob/master/Documentation/bugs.md)
|
||||
page.
|
||||
|
||||
## Email List
|
||||
The email list for the developers and users of procps is found at
|
||||
http://www.freelists.org/archive/procps/
|
||||
This email list discusses the development of procps and is used by distributions
|
||||
to also forward or discuss bugs.
|
||||
@ -1,377 +0,0 @@
|
||||
This file summarizes changes to the top program and supporting documentation
|
||||
introduced on March 31, 2011.
|
||||
|
||||
Contents:
|
||||
DOCUMENT Changes
|
||||
INTERNAL Improvements
|
||||
EXTERNAL Improvements
|
||||
BUGS Previously Fixed and Preserved
|
||||
BUGS Newly/Nearly Fixed
|
||||
BUGS/WISH-LISTS That Should Go Bye-bye
|
||||
BUGS FIXED You Didn't Know You Had
|
||||
OTHER Changes, Hopefully They Won't Bite You
|
||||
BENCHMARKS
|
||||
|
||||
|
||||
DOCUMENT Changes =========================================================
|
||||
. The entire file was cleaned up, standardized and expanded to include:
|
||||
- a new section "2. SUMMARY Display" added for symmetry with Fields
|
||||
- nine new fields were added to section "3a. DESCRIPTIONS of Fields"
|
||||
- a new section "3b. MANAGING Fields" replaced the obsolete section
|
||||
"2b. SELECTING and ORDERING Columns"
|
||||
- section "5c. SCROLLING a Window" was added for that new feature
|
||||
|
||||
. I don't know when the explanations for CODE and DATA were changed to
|
||||
show 'virtual' memory, but I think there's a reason their alternate
|
||||
names contain the word 'resident'. Thus they were changed back to
|
||||
say 'physical memory'.
|
||||
|
||||
. And as I indicated in a previous email, the former string identifier
|
||||
'ME' was restored as were the 'h' key/command conventions (vs. <h>).
|
||||
|
||||
Oops, the 'h' key/command conventions remain restored, but subsequent
|
||||
testing revealed problems with the .ME string identifier. Thus, it was
|
||||
changed to .WE (along with the companion .Me/.We id).
|
||||
|
||||
. Also previously mentioned, the 'man2html' program translates top.1 to
|
||||
HTML with near perfect fidelity. I take that to mean there should be
|
||||
no problems with the top.1 source on most other platforms.
|
||||
|
||||
To further improve translation to HTML, several .Bd and .Ed macros
|
||||
were added to preserve literal (fixed width) spacing.
|
||||
|
||||
|
||||
INTERNAL Improvements ====================================================
|
||||
. The old restriction of 26 fields has been lifted. With this new-top
|
||||
100+ fields are now possible. It currently supports up to 55, of
|
||||
which 35 are in use. Adding a new field is almost too easy.
|
||||
|
||||
. Task row construction has been considerably improved -- both from
|
||||
a programming perspective and a performance perspective.
|
||||
|
||||
. The column highlighting costs for sort field visibility were
|
||||
virtually eliminated.
|
||||
|
||||
An optional define (USE_X_COLHDR) can be enabled to completely
|
||||
eliminate any costs associated with the 'x' command toggle.
|
||||
|
||||
. The management of the HST_t structures, used for %cpu calculations,
|
||||
was optimized with a hashing scheme. Thus the need for a qsort then
|
||||
a binary search in each frame was completely eliminated.
|
||||
|
||||
An optional define can restore the former qsort/bsearch approach but
|
||||
with an internal inlined binary search function offering substantially
|
||||
better performance than the old top.
|
||||
|
||||
. This far more capable new-top executable is no larger than old top.
|
||||
|
||||
. The above combine to produce substantially improved performance
|
||||
whose details are documented below under BENCHMARKS.
|
||||
|
||||
|
||||
EXTERNAL Improvements ====================================================
|
||||
. Field management has been completely redesigned. It's now embodied
|
||||
on a single screen where display-ability, position and sort selection
|
||||
can be handled in one place -- for all windows at one time!
|
||||
|
||||
This function is dependent on cursor motion keys and should a device
|
||||
not have the customary arrow keys, alternatives are provided and
|
||||
documented under "Operation" near the beginning of the man page.
|
||||
|
||||
. The following new fields have been added:
|
||||
Group Id
|
||||
Minor Page Faults
|
||||
Number of Threads
|
||||
Process Group Id
|
||||
Real User Id
|
||||
Saved User Id
|
||||
Saved User Name
|
||||
Session Id
|
||||
Tty Process Group Id
|
||||
|
||||
. Scrolling keys now allow one to move the view of any window vertically
|
||||
or horizontally to reveal any desired task or column. Previously, only
|
||||
some tasks were viewable even with reversible, selectable sort columns.
|
||||
|
||||
Each of the four windows is capable of maintaining its own scrolled
|
||||
coordinates and an optional toggle ('C') displays a message aiding
|
||||
navigation within the available tasks and displayable fields.
|
||||
|
||||
. User interactive line oriented input now provides for true line
|
||||
editing supported by these new keys:
|
||||
Left/Right arrow keys, Delete key, Backspace and
|
||||
Home/End keys (likely limited to xterm, not terminal)
|
||||
|
||||
. User filtering via the -u | -U interactive commands is now window
|
||||
based which means that different windows could be used to filter
|
||||
different users.
|
||||
|
||||
. Signal handling has been normalized and is now consistent regardless
|
||||
of the particular top screen a user may have been using.
|
||||
|
||||
. The 'i' toggle now shows any task that has used *some* cpu since the
|
||||
last screen update. It's no longer limited to just running tasks.
|
||||
|
||||
. The summary area 'task states' line now reflects either 'Threads'
|
||||
or 'Tasks' depending on the -H toggle.
|
||||
|
||||
|
||||
BUGS Previously Fixed and Preserved ======================================
|
||||
( but not necessarily literally)
|
||||
. 228822, suspending top leaves xterm in slightly messed-up state
|
||||
. 256376, segfaults, if the xterm is to small
|
||||
. 320289, segv on sigwinch
|
||||
. 351065, wrong highlight 1st column (escape characters displayed)
|
||||
. 358724, accepts extra numeric args
|
||||
. 378695, seg fault if "/proc" is not mounted
|
||||
. 426782, UID field is too narrow
|
||||
. 458986, should check xterm for EOF/EIO
|
||||
. 459890, Irix mode should use %#4.1f when threads shown
|
||||
|
||||
|
||||
BUGS Newly/Nearly Fixed ==================================================
|
||||
. 225542, 'Unknown command' message blocks further commands
|
||||
The message is now displayed using usleep for 1.25 seconds, instead
|
||||
of the former full 2 seconds. And while it still blocks further
|
||||
commands, the delay is much more tolerable.
|
||||
|
||||
Can we consider this bug 'nearly' fixed?
|
||||
|
||||
. 410292, interface error when using backspace
|
||||
Full line editing was added but could be disabled via a #define.
|
||||
And via that define, even under basic termios support, the backspace
|
||||
problem was cured.
|
||||
|
||||
. 567509, top idle command ('i') not working for threaded programs
|
||||
Since the 'i' command now reflects tasks that have used *some* cpu,
|
||||
and is no longer dependent on an 'R' state, I *believe/hope* this
|
||||
bug has been swatted.
|
||||
|
||||
|
||||
BUGS/WISH-LISTS That Should Go Bye-bye ===================================
|
||||
. 340751, wish for hostname to benefit multiple top sessions
|
||||
Craig's suggestion regarding symlinks is the perfect solution.
|
||||
How dare Craig say that the solution was "not ideal" !
|
||||
|
||||
. 586497, wish for graceful degradation on small screen sizes
|
||||
This objective could be accomplished by setting up 2 symlinks for
|
||||
top, personalizing them for the 2 tiny phone displays, then writing
|
||||
the respective configuration files.
|
||||
|
||||
I shudder at the programming effort suggested by Paul. And when it
|
||||
was done you'd find everybody else would have different criteria.
|
||||
|
||||
|
||||
BUGS FIXED You Didn't Know You Had =======================================
|
||||
. Without amplifying the dirty details, the long standing occasionally
|
||||
reported display corruption, and an unreported source of performance
|
||||
degradation, has been eliminated. The cure is in the elimination of
|
||||
the Pseudo_cols variable and the improved PUFF macro.
|
||||
|
||||
. Line oriented input was not sensitive to screen width. Thus a user
|
||||
could hold down any key and ultimately line wrap, overwriting the
|
||||
columns header and the entire screen. New top prevents this.
|
||||
|
||||
. User filtering (-u|-U) via a user ID (not name) now validates that
|
||||
number. The old-top just made sure it was numeric, then blindly
|
||||
displayed no matching users (i.e. an empty window).
|
||||
|
||||
. The threads toggle ('H') is no longer window based but more properly
|
||||
applies to all windows. The previous implementation produced the
|
||||
following aberration if multiple windows were being shown:
|
||||
. -H would be acknowledged and applied to all visible windows
|
||||
. keying 'a' or 'w' would silently turn it off
|
||||
. then keying -H would turn it back on, but the user expected off
|
||||
|
||||
. If you hit ^Z on any help or fields screen to suspend old-top, after
|
||||
issuing 'fg' you would then be left with a seemingly hung application
|
||||
inviting ^C. In truth, one could recover with the space bar, but that
|
||||
was far from intuitive.
|
||||
|
||||
. The old-top consistently writes 1 extra byte for each task row or 1
|
||||
byte too few for columns headers, depending on your perspective.
|
||||
The new top writes the same number of bytes for each.
|
||||
|
||||
. By failing to clear to eol, old top left the display in a terrible
|
||||
state after exiting a 'fields' screen when only a few columns were
|
||||
being displayed.
|
||||
|
||||
. The old-top used a zero value for the L_NONE library flag which could
|
||||
cause repeated rebuilding of columns headers with each frame. In truth,
|
||||
this was not likely to happen in real life since only two fields actually
|
||||
used that flag. However, if it did happen, performance could be degraded
|
||||
by 800%.
|
||||
|
||||
|
||||
OTHER Changes, Hopefully They Won't Bite You =============================
|
||||
. The undocumented TOPRC environment variable is no longer supported.
|
||||
Any similar need can be met through a symlink alias.
|
||||
|
||||
. The use of environment variables to override terminal size is now
|
||||
off by default but could be enabled through '#define TTYGETENVYES'.
|
||||
|
||||
. The global 'bold enable' toggle is active by default and thus agrees
|
||||
with the documentation. It's been wrong ever since Al's wholesale
|
||||
'cosmetic' changes in procps-3.2.2.
|
||||
|
||||
. Task defaults now show bold (not reverse) and row highlighting.
|
||||
This agrees with what was always stated in the documentation.
|
||||
|
||||
. The 'H' toggle (thread mode) is not persistent. Persistence can be
|
||||
achieved with a simple shell script employing the -H switch.
|
||||
|
||||
. Then 'g' and 'G' commands were reversed to reflect their likely use.
|
||||
|
||||
|
||||
BENCHMARKS ===============================================================
|
||||
Tested as root with nice -10 and using only common fields
|
||||
( on a pretty old, slow laptop under Debian Lenny )
|
||||
but rcfiles specified identical sort fields and identical
|
||||
settings for the 'B', 'b', 'x' and 'y' toggles (even though
|
||||
the defaults are not necessarily identical).
|
||||
|
||||
In every case new-top outperforms old-top, but I've shown %
|
||||
improvements for only the most significant. Those cases mostly
|
||||
involve colors with both row & column highlighting. I suggested
|
||||
above that the highlighting cost was virtually eliminated in
|
||||
new-top, and these tests bare that out.
|
||||
|
||||
Note the much smaller differences for new-top between the 24x80
|
||||
window results and full screen (but don't mix apples_terminal
|
||||
with oranges_xterm). This is a reflection of the simplification
|
||||
of task row construction, also mentioned above.
|
||||
|
||||
It's always been the case that any top in an xterm outperforms
|
||||
that top under the terminal application, even when the xterm
|
||||
provides additional rows and columns. It's true below with
|
||||
Gnome and it was true nine years ago under KDE.
|
||||
|
||||
----------------------------------------------------------
|
||||
The following comparisons were run with:
|
||||
100 tasks & 160 threads
|
||||
-d0 -n5000
|
||||
new-top old-top
|
||||
xterm 24x80
|
||||
a 1 win, lflgs_none 11.2 secs 51.8 secs + 462.6%
|
||||
1 win, default 61.0 secs 66.8 secs
|
||||
1 win, colors w/ x+y 61.3 secs 83.0 secs + 135.4%
|
||||
1 win, thread mode 88.3 secs 94.2 secs
|
||||
b 1 win, every field on 99.7 secs 106.0 secs
|
||||
1 win, cmdline 71.2 secs 76.6 secs
|
||||
4 wins, defaults 101.3 secs 107.2 secs
|
||||
4 wins, colors w/ x+y 101.5 secs 122.8 secs + 121.0%
|
||||
|
||||
xterm, full screen (53x170)
|
||||
a 1 win, lflgs_none 15.9 secs 54.2 secs + 340.9%
|
||||
1 win, default 70.0 secs 73.2 secs
|
||||
1 win, colors w/ x+y 69.4 secs 131.3 secs + 189.2%
|
||||
1 win, thread mode 97.6 secs 102.6 secs
|
||||
c 1 win, every field on 122.1 secs 128.1 secs
|
||||
1 win, cmdline 80.8 secs 83.7 secs
|
||||
4 wins, defaults 111.4 secs 115.8 secs
|
||||
4 wins, colors w/ x+y 112.0 secs 172.9 secs + 154.4%
|
||||
|
||||
terminal 24x80
|
||||
a 1 win, lflgs_none 8.9 secs 58.6 secs + 658.4%
|
||||
1 win, default 70.1 secs 80.3 secs
|
||||
1 win, colors w/ x+y 70.6 secs 157.3 secs + 222.8%
|
||||
1 win, thread mode 104.7 secs 120.5 secs
|
||||
b 1 win, every field on 111.2 secs 134.5 secs
|
||||
1 win, cmdline 83.8 secs 94.5 secs
|
||||
4 wins, defaults 125.6 secs 146.7 secs
|
||||
4 wins, colors w/ x+y 125.6 secs 206.9 secs + 176.7%
|
||||
|
||||
terminal, full screen (39x125)
|
||||
a 1 win, lflgs_none 9.1 secs 60.6 secs + 665.9%
|
||||
1 win, default 74.3 secs 88.0 secs
|
||||
1 win, colors w/ x+y 73.9 secs 314.5 secs + 425.6%
|
||||
1 win, thread mode 113.0 secs 140.9 secs
|
||||
b 1 win, every field on 117.7 secs 154.9 secs
|
||||
1 win, cmdline 87.4 secs 107.2 secs
|
||||
4 wins, defaults 139.1 secs 166.7 secs
|
||||
4 wins, colors w/ x+y 157.3 secs 423.2 secs + 269.0%
|
||||
|
||||
----------------------------------------------------------
|
||||
The following comarisons were run with:
|
||||
300 tasks & 360 threads
|
||||
-d0 -n3000
|
||||
new-top old-top
|
||||
xterm, full screen (53x170)
|
||||
a 1 win, lflgs_none 14.3 secs 79.0 secs + 552.4%
|
||||
1 win, default 101.1 secs 104.5 secs
|
||||
1 win, colors w/ x+y 101.3 secs 140.0 secs + 138.2%
|
||||
1 win, thread mode 120.1 secs 123.1 secs
|
||||
c 1 win, every field on 179.8 secs 185.6 secs
|
||||
1 win, cmdline 124.9 secs 132.8 secs
|
||||
4 wins, defaults 174.8 secs 179.2 secs
|
||||
4 wins, colors w/ x+y 175.0 secs 215.2 secs + 123.0%
|
||||
|
||||
terminal, full screen (39x125)
|
||||
a 1 win, lflgs_none 12.3 secs 98.5 secs + 800.8%
|
||||
1 win, default 117.4 secs 134.0 secs
|
||||
1 win, colors w/ x+y 111.6 secs 296.1 secs + 265.3%
|
||||
1 win, thread mode 141.3 secs 155.3 secs
|
||||
b 1 win, every field on 197.7 secs 204.8 secs
|
||||
1 win, cmdline 143.9 secs 157.3 secs
|
||||
4 wins, defaults 204.0 secs 226.2 secs
|
||||
4 wins, colors w/ x+y 216.9 secs 434.5 secs + 200.3%
|
||||
|
||||
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||||
|
||||
notes:
|
||||
a these results represent the library flags L_NONE zero value and
|
||||
thus the hidden cost of rebuilding column headers w/ every frame
|
||||
b while every common field was turned on, not all fields could be
|
||||
displayed due to limited screen width
|
||||
c only in a full screen xterm window could all common fields
|
||||
actually be displayed
|
||||
|
||||
|
||||
BENCHMARKS, Redux (for NLS) ==============================================
|
||||
December, 2011 benchmarks produced on a much more modern
|
||||
platform containing:
|
||||
Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz
|
||||
SMP with 4 cpus
|
||||
reflected in the substantially reduced elapsed times.
|
||||
|
||||
Tested as root with nice -10 and using only common fields
|
||||
but rcfiles specified identical sort fields and identical
|
||||
settings for the 'B', 'b', 'x' and 'y' toggles (even though
|
||||
the defaults are not necessarily identical).
|
||||
|
||||
Each test was run outside of X-windows at a linux console
|
||||
offering 48 rows and 170 columns. This was done to reduce
|
||||
contention which sometimes made comparisons problematic.
|
||||
|
||||
old-top = procps-3.2.8 (debian patched and memory leaking)
|
||||
new-top = procps-ng-3.3.2 with NLS support
|
||||
|
||||
----------------------------------------------------------
|
||||
The following comparisons were run with
|
||||
-d0 -n5000
|
||||
140 tasks & 275 threads
|
||||
|
||||
linux console (48x170) new-top old-top
|
||||
d 1 win, lflgs_none 2.6 secs 15.0 secs + 577.0%
|
||||
1 win, default 16.1 secs 19.3 secs
|
||||
1 win, colors w/ x+y 16.6 secs 35.0 secs + 210.8%
|
||||
e 1 win, show cpus 16.2 secs 20.1 secs + 124.1%
|
||||
1 win, thread mode 31.8 secs 34.1 secs
|
||||
f 1 win, every field on 30.5 secs 34.0 secs
|
||||
1 win, cmdline 19.9 secs 23.1 secs
|
||||
4 wins, default 31.9 secs 35.2 secs
|
||||
4 wins, colors w/ x+y 29.2 secs 47.4 secs + 162.3%
|
||||
g 1 win, b&w w/ bold x 30.0 secs 33.2 secs
|
||||
h 1 win, scroll msg on 31.1 secs 33.9 secs
|
||||
|
||||
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||||
|
||||
notes:
|
||||
d these represent the same anamoly as the original 'a' footnote
|
||||
e these represent the '1' toggle, where each of 4 cpus was shown
|
||||
(not possible on the original uniprocessor)
|
||||
f every common field was turned on and all fields were visible
|
||||
g on a black and white display, sort column was shown in bold
|
||||
(further proof of column highlighting improvements)
|
||||
h similar to 'g', but new top was showing scroll msg
|
||||
(old top has no such provision)
|
||||
@ -1,60 +0,0 @@
|
||||
diff --git a/ps/parser.c b/ps/parser.c
|
||||
index 4263a1f..b33f319 100644
|
||||
--- a/ps/parser.c
|
||||
+++ b/ps/parser.c
|
||||
@@ -31,7 +31,7 @@
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
-#include "../proc/alloc.h"
|
||||
+#include "xalloc.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "c.h"
|
||||
@@ -184,8 +184,8 @@ static const char *parse_list(const char *arg, const char *(*parse_fn)(char *, s
|
||||
const char *err; /* error code that could or did happen */
|
||||
/*** prepare to operate ***/
|
||||
node = malloc(sizeof(selection_node));
|
||||
- node->u = malloc(strlen(arg)*sizeof(sel_union)); /* waste is insignificant */
|
||||
node->n = 0;
|
||||
+ node->u = NULL;
|
||||
buf = strdup(arg);
|
||||
/*** sanity check and count items ***/
|
||||
need_item = 1; /* true */
|
||||
@@ -199,12 +199,13 @@ static const char *parse_list(const char *arg, const char *(*parse_fn)(char *, s
|
||||
need_item=1;
|
||||
break;
|
||||
default:
|
||||
- if(need_item) items++;
|
||||
+ if(need_item && items<INT_MAX) items++;
|
||||
need_item=0;
|
||||
}
|
||||
} while (*++walk);
|
||||
if(need_item) goto parse_error;
|
||||
node->n = items;
|
||||
+ node->u = xcalloc(items, sizeof(sel_union));
|
||||
/*** actually parse the list ***/
|
||||
walk = buf;
|
||||
while(items--){
|
||||
@@ -1031,15 +1032,15 @@ static const char *parse_trailing_pids(void){
|
||||
thisarg = ps_argc - 1; /* we must be at the end now */
|
||||
|
||||
pidnode = malloc(sizeof(selection_node));
|
||||
- pidnode->u = malloc(i*sizeof(sel_union)); /* waste is insignificant */
|
||||
+ pidnode->u = xcalloc(i, sizeof(sel_union)); /* waste is insignificant */
|
||||
pidnode->n = 0;
|
||||
|
||||
grpnode = malloc(sizeof(selection_node));
|
||||
- grpnode->u = malloc(i*sizeof(sel_union)); /* waste is insignificant */
|
||||
+ grpnode->u = xcalloc(i, sizeof(sel_union)); /* waste is insignificant */
|
||||
grpnode->n = 0;
|
||||
|
||||
sidnode = malloc(sizeof(selection_node));
|
||||
- sidnode->u = malloc(i*sizeof(sel_union)); /* waste is insignificant */
|
||||
+ sidnode->u = xcalloc(i, sizeof(sel_union)); /* waste is insignificant */
|
||||
sidnode->n = 0;
|
||||
|
||||
while(i--){
|
||||
--
|
||||
2.40.1
|
||||
|
||||
@ -1,43 +0,0 @@
|
||||
diff -up ./ps/display.c.ori ./ps/display.c
|
||||
--- ./ps/display.c.ori 2018-05-18 23:32:21.998979977 +0200
|
||||
+++ ./ps/display.c 2022-11-24 15:11:26.678314866 +0100
|
||||
@@ -44,26 +44,31 @@
|
||||
#define SIGCHLD SIGCLD
|
||||
#endif
|
||||
|
||||
+#define SIG_IS_TERM_OR_HUP(signo) (((signo) == SIGTERM) || (signo) == SIGHUP)
|
||||
+
|
||||
char *myname;
|
||||
|
||||
/* just reports a crash */
|
||||
static void signal_handler(int signo){
|
||||
if(signo==SIGPIPE) _exit(0); /* "ps | head" will cause this */
|
||||
/* fprintf() is not reentrant, but we _exit() anyway */
|
||||
- fprintf(stderr,
|
||||
- _("Signal %d (%s) caught by %s (%s).\n"),
|
||||
- signo,
|
||||
- signal_number_to_name(signo),
|
||||
- myname,
|
||||
- PACKAGE_VERSION
|
||||
- );
|
||||
+ if (!SIG_IS_TERM_OR_HUP(signo)) {
|
||||
+ fprintf(stderr,
|
||||
+ _("Signal %d (%s) caught by %s (%s).\n"),
|
||||
+ signo,
|
||||
+ signal_number_to_name(signo),
|
||||
+ myname,
|
||||
+ PACKAGE_VERSION
|
||||
+ );
|
||||
+ }
|
||||
switch (signo) {
|
||||
case SIGHUP:
|
||||
case SIGUSR1:
|
||||
case SIGUSR2:
|
||||
exit(EXIT_FAILURE);
|
||||
default:
|
||||
- error_at_line(0, 0, __FILE__, __LINE__, "%s", _("please report this bug"));
|
||||
+ if (!SIG_IS_TERM_OR_HUP(signo))
|
||||
+ error_at_line(0, 0, __FILE__, __LINE__, "%s", _("please report this bug"));
|
||||
signal(signo, SIG_DFL); /* allow core file creation */
|
||||
kill(getpid(), signo);
|
||||
_exit(EXIT_FAILURE);
|
||||
@ -1,28 +0,0 @@
|
||||
commit c833a6241893c7e566a5eed762661942e4cd90d3
|
||||
Author: Todd Lewis <utoddl@gmail.com>
|
||||
Date: Mon Oct 29 18:33:48 2018 +0000
|
||||
|
||||
Fix user and group name to number conversion for uid/gid above 2^31.
|
||||
|
||||
diff --git a/pgrep.c b/pgrep.c
|
||||
index bde7448..8b82a54 100644
|
||||
--- a/pgrep.c
|
||||
+++ b/pgrep.c
|
||||
@@ -280,7 +280,7 @@ static int conv_uid (const char *restrict name, struct el *restrict e)
|
||||
xwarnx(_("invalid user name: %s"), name);
|
||||
return 0;
|
||||
}
|
||||
- e->num = pwd->pw_uid;
|
||||
+ e->num = (int) pwd->pw_uid;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -297,7 +297,7 @@ static int conv_gid (const char *restrict name, struct el *restrict e)
|
||||
xwarnx(_("invalid group name: %s"), name);
|
||||
return 0;
|
||||
}
|
||||
- e->num = grp->gr_gid;
|
||||
+ e->num = (int) grp->gr_gid;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -1,57 +0,0 @@
|
||||
diff -up ./pgrep.c.ori ./pgrep.c
|
||||
--- ./pgrep.c.ori 2022-08-17 15:38:29.655530551 +0200
|
||||
+++ ./pgrep.c 2022-08-17 15:38:53.702661752 +0200
|
||||
@@ -204,8 +204,12 @@ static int strict_atol (const char *rest
|
||||
|
||||
for ( ; *str; ++str) {
|
||||
if (! isdigit (*str))
|
||||
- return (0);
|
||||
+ return 0;
|
||||
+ if (res >= LONG_MAX / 10)
|
||||
+ return 0;
|
||||
res *= 10;
|
||||
+ if (res >= LONG_MAX - (*str - '0'))
|
||||
+ return 0;
|
||||
res += *str - '0';
|
||||
}
|
||||
*value = sign * res;
|
||||
@@ -280,7 +284,7 @@ static int conv_uid (const char *restric
|
||||
xwarnx(_("invalid user name: %s"), name);
|
||||
return 0;
|
||||
}
|
||||
- e->num = (int) pwd->pw_uid;
|
||||
+ e->num = pwd->pw_uid;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -297,7 +301,7 @@ static int conv_gid (const char *restric
|
||||
xwarnx(_("invalid group name: %s"), name);
|
||||
return 0;
|
||||
}
|
||||
- e->num = (int) grp->gr_gid;
|
||||
+ e->num = grp->gr_gid;
|
||||
return 1;
|
||||
}
|
||||
|
||||
diff -up ./proc/readproc.h.ori ./proc/readproc.h
|
||||
--- ./proc/readproc.h.ori 2018-05-19 00:04:15.218532055 +0200
|
||||
+++ ./proc/readproc.h 2022-08-17 15:38:53.702661752 +0200
|
||||
@@ -159,12 +159,12 @@ typedef struct proc_t {
|
||||
session, // stat session id
|
||||
nlwp, // stat,status number of threads, or 0 if no clue
|
||||
tgid, // (special) thread group ID, the POSIX PID (see also: tid)
|
||||
- tty, // stat full device number of controlling terminal
|
||||
- /* FIXME: int uids & gids should be uid_t or gid_t from pwd.h */
|
||||
- euid, egid, // stat(),status effective
|
||||
- ruid, rgid, // status real
|
||||
- suid, sgid, // status saved
|
||||
- fuid, fgid, // status fs (used for file access only)
|
||||
+ tty; // stat full device number of controlling terminal
|
||||
+ uid_t euid; gid_t egid; // stat(),status effective
|
||||
+ uid_t ruid; gid_t rgid; // status real
|
||||
+ uid_t suid; gid_t sgid; // status saved
|
||||
+ uid_t fuid; gid_t fgid; // status fs (used for file access only)
|
||||
+ int
|
||||
tpgid, // stat terminal process group id
|
||||
exit_signal, // stat might not be SIGCHLD
|
||||
processor; // stat current (or most recent?) CPU
|
||||
@ -1,112 +0,0 @@
|
||||
From d9b3415d2a761cb7669a67f5309665335d5eb4c4 Mon Sep 17 00:00:00 2001
|
||||
From: rpm-build <rpm-build>
|
||||
Date: Mon, 9 Nov 2020 16:10:22 +0100
|
||||
Subject: [PATCH] New '-w' option for kernel workers.
|
||||
|
||||
---
|
||||
pidof.1 | 3 +++
|
||||
pidof.c | 17 ++++++++++++-----
|
||||
2 files changed, 15 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/pidof.1 b/pidof.1
|
||||
index 1368704..c85c088 100644
|
||||
--- a/pidof.1
|
||||
+++ b/pidof.1
|
||||
@@ -45,6 +45,9 @@ the current root directory of processes they do not own.
|
||||
.IP \-x
|
||||
Scripts too - this causes the program to also return process id's of
|
||||
shells running the named scripts.
|
||||
+.IP \-w
|
||||
+Show also processes that do not have visible command line (e.g. kernel
|
||||
+worker threads).
|
||||
.IP "-o \fIomitpid\fP"
|
||||
Tells \fIpidof\fP to omit processes with that process id. The special
|
||||
pid \fB%PPID\fP can be used to name the parent process of the \fIpidof\fP
|
||||
diff --git a/pidof.c b/pidof.c
|
||||
index 94e19bb..7fdf27a 100644
|
||||
--- a/pidof.c
|
||||
+++ b/pidof.c
|
||||
@@ -55,6 +55,8 @@ static char *program = NULL;
|
||||
static int opt_single_shot = 0; /* -s */
|
||||
static int opt_scripts_too = 0; /* -x */
|
||||
static int opt_rootdir_check = 0; /* -c */
|
||||
+static int opt_with_workers = 0; /* -w */
|
||||
+
|
||||
|
||||
static char *pidof_root = NULL;
|
||||
|
||||
@@ -69,6 +71,7 @@ static int __attribute__ ((__noreturn__)) usage(int opt)
|
||||
fputs(_(" -s, --single-shot return one PID only\n"), fp);
|
||||
fputs(_(" -c, --check-root omit processes with different root\n"), fp);
|
||||
fputs(_(" -x also find shells running the named scripts\n"), fp);
|
||||
+ fputs(_(" -w, --with-workers show kernel workers too\n"), fp);
|
||||
fputs(_(" -o, --omit-pid <PID,...> omit processes with PID\n"), fp);
|
||||
fputs(_(" -S, --separator SEP use SEP as separator put between PIDs"), fp);
|
||||
fputs(USAGE_SEPARATOR, fp);
|
||||
@@ -142,7 +145,6 @@ static void select_procs (void)
|
||||
static int size = 0;
|
||||
char *cmd_arg0, *cmd_arg0base;
|
||||
char *cmd_arg1, *cmd_arg1base;
|
||||
- char *stat_cmd;
|
||||
char *program_base;
|
||||
char *root_link;
|
||||
char *exe_link;
|
||||
@@ -168,10 +170,9 @@ static void select_procs (void)
|
||||
}
|
||||
}
|
||||
|
||||
- if (!is_omitted(task.XXXID)) {
|
||||
+ if (!is_omitted(task.XXXID) && ((task.cmdline && *task.cmdline) || opt_with_workers)) {
|
||||
|
||||
cmd_arg0 = (task.cmdline && *task.cmdline) ? *task.cmdline : "\0";
|
||||
- stat_cmd = task.cmd ? task.cmd : "\0";
|
||||
|
||||
/* processes starting with '-' are login shells */
|
||||
if (*cmd_arg0 == '-') {
|
||||
@@ -193,7 +194,7 @@ static void select_procs (void)
|
||||
!strcmp(program_base, cmd_arg0) ||
|
||||
!strcmp(program, cmd_arg0) ||
|
||||
|
||||
- !strcmp(program, stat_cmd) ||
|
||||
+ (opt_with_workers && !strcmp(program, task.cmd)) ||
|
||||
|
||||
!strcmp(program, exe_link_base) ||
|
||||
!strcmp(program, exe_link))
|
||||
@@ -293,13 +294,14 @@ int main (int argc, char **argv)
|
||||
int first_pid = 1;
|
||||
|
||||
const char *separator = " ";
|
||||
- const char *opts = "scnxmo:S:?Vh";
|
||||
+ const char *opts = "scnxwmo:S:?Vh";
|
||||
|
||||
static const struct option longopts[] = {
|
||||
{"check-root", no_argument, NULL, 'c'},
|
||||
{"single-shot", no_argument, NULL, 's'},
|
||||
{"omit-pid", required_argument, NULL, 'o'},
|
||||
{"separator", required_argument, NULL, 's'},
|
||||
+ {"with-workers", no_argument, NULL, 'w'},
|
||||
{"help", no_argument, NULL, 'h'},
|
||||
{"version", no_argument, NULL, 'V'},
|
||||
{NULL, 0, NULL, 0}
|
||||
@@ -325,6 +327,9 @@ int main (int argc, char **argv)
|
||||
case 'x':
|
||||
opt_scripts_too = 1;
|
||||
break;
|
||||
+ case 'w':
|
||||
+ opt_with_workers = 1;
|
||||
+ break;
|
||||
case 'c':
|
||||
if (geteuid() == 0) {
|
||||
opt_rootdir_check = 1;
|
||||
@@ -358,6 +363,8 @@ int main (int argc, char **argv)
|
||||
|
||||
program = argv[optind++];
|
||||
|
||||
+ if (*program == '\0') continue;
|
||||
+
|
||||
select_procs(); /* get the list of matching processes */
|
||||
|
||||
if (proc_count) {
|
||||
--
|
||||
2.25.4
|
||||
|
||||
@ -1,13 +0,0 @@
|
||||
diff --git a/pidof.c b/pidof.c
|
||||
index 7fdf27a..2166265 100644
|
||||
--- a/pidof.c
|
||||
+++ b/pidof.c
|
||||
@@ -300,7 +300,7 @@ int main (int argc, char **argv)
|
||||
{"check-root", no_argument, NULL, 'c'},
|
||||
{"single-shot", no_argument, NULL, 's'},
|
||||
{"omit-pid", required_argument, NULL, 'o'},
|
||||
- {"separator", required_argument, NULL, 's'},
|
||||
+ {"separator", required_argument, NULL, 'S'},
|
||||
{"with-workers", no_argument, NULL, 'w'},
|
||||
{"help", no_argument, NULL, 'h'},
|
||||
{"version", no_argument, NULL, 'V'},
|
||||
@ -1,54 +0,0 @@
|
||||
From 7dcb6b8eb6c69584d0d56797935f836bc06642f5 Mon Sep 17 00:00:00 2001
|
||||
From: Jan Rybar <jrybar@redhat.com>
|
||||
Date: Tue, 7 Apr 2020 13:41:48 +0200
|
||||
Subject: [PATCH] pidof: show worker threads
|
||||
|
||||
Reimplementation of pidof for procps toolset contains sort of deactivated code and does not return results for processes without task.cmdline entry (usually kernel worker threads). Old pidof and pgrep do that in comparison. Despite all perks provided by using pgrep instead, pidof should show those workers again.
|
||||
---
|
||||
pidof.c | 10 +++++++---
|
||||
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/pidof.c b/pidof.c
|
||||
index b0d08cc..90ecb13 100644
|
||||
--- a/pidof.c
|
||||
+++ b/pidof.c
|
||||
@@ -142,6 +142,7 @@ static void select_procs (void)
|
||||
static int size = 0;
|
||||
char *cmd_arg0, *cmd_arg0base;
|
||||
char *cmd_arg1, *cmd_arg1base;
|
||||
+ char *stat_cmd;
|
||||
char *program_base;
|
||||
char *root_link;
|
||||
char *exe_link;
|
||||
@@ -167,9 +168,10 @@ static void select_procs (void)
|
||||
}
|
||||
}
|
||||
|
||||
- if (!is_omitted(task.XXXID) && task.cmdline && *task.cmdline) {
|
||||
+ if (!is_omitted(task.XXXID)) {
|
||||
|
||||
- cmd_arg0 = *task.cmdline;
|
||||
+ cmd_arg0 = (task.cmdline && *task.cmdline) ? *task.cmdline : "\0";
|
||||
+ stat_cmd = task.cmd ? task.cmd : "\0";
|
||||
|
||||
/* processes starting with '-' are login shells */
|
||||
if (*cmd_arg0 == '-') {
|
||||
@@ -191,12 +193,14 @@ static void select_procs (void)
|
||||
!strcmp(program_base, cmd_arg0) ||
|
||||
!strcmp(program, cmd_arg0) ||
|
||||
|
||||
+ !strcmp(program, stat_cmd) ||
|
||||
+
|
||||
!strcmp(program, exe_link_base) ||
|
||||
!strcmp(program, exe_link))
|
||||
{
|
||||
match = 1;
|
||||
|
||||
- } else if (opt_scripts_too && *(task.cmdline+1)) {
|
||||
+ } else if (opt_scripts_too && task.cmdline && *(task.cmdline+1)) {
|
||||
|
||||
cmd_arg1 = *(task.cmdline+1);
|
||||
|
||||
--
|
||||
2.25.2
|
||||
|
||||
@ -1,23 +0,0 @@
|
||||
diff --git a/ps/display.c b/ps/display.c
|
||||
index 1927fd6..e7ab351 100644
|
||||
--- a/ps/display.c
|
||||
+++ b/ps/display.c
|
||||
@@ -357,7 +357,7 @@ static void simple_spew(void){
|
||||
if (selection_list && selection_list->typecode == SEL_PID_QUICK) {
|
||||
flags |= PROC_PID;
|
||||
|
||||
- pidlist = (pid_t*) malloc(selection_list->n * sizeof(pid_t));
|
||||
+ pidlist = (pid_t*) malloc((selection_list->n + 1) * sizeof(pid_t));
|
||||
if (!pidlist) {
|
||||
fprintf(stderr, _("error: not enough memory\n"));
|
||||
exit(1);
|
||||
@@ -366,6 +366,9 @@ static void simple_spew(void){
|
||||
for (i = 0; i < selection_list->n; i++) {
|
||||
pidlist[i] = selection_list->u[selection_list->n-i-1].pid;
|
||||
}
|
||||
+
|
||||
+ // delimit the array with nul object (0); RHBZ#2153813
|
||||
+ pidlist[selection_list->n] = (pid_t)0;
|
||||
}
|
||||
|
||||
ptp = openproc(flags, pidlist);
|
||||
@ -1,39 +0,0 @@
|
||||
From 06995518605fed7a1a29551be0eff01b2f9e89b7 Mon Sep 17 00:00:00 2001
|
||||
From: rpm-build <rpm-build>
|
||||
Date: Tue, 13 Dec 2022 16:02:50 -0500
|
||||
Subject: [PATCH]
|
||||
|
||||
---
|
||||
ps/common.h | 2 +-
|
||||
ps/select.c | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/ps/common.h b/ps/common.h
|
||||
index 905d320..fc4d3a8 100644
|
||||
--- a/ps/common.h
|
||||
+++ b/ps/common.h
|
||||
@@ -189,7 +189,7 @@ typedef union sel_union {
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
dev_t tty;
|
||||
- char cmd[64]; /* this is _not_ \0 terminated */
|
||||
+ char cmd[16]; /* this is _not_ \0 terminated */
|
||||
} sel_union;
|
||||
|
||||
typedef struct selection_node {
|
||||
diff --git a/ps/select.c b/ps/select.c
|
||||
index f58ca25..e12982d 100644
|
||||
--- a/ps/select.c
|
||||
+++ b/ps/select.c
|
||||
@@ -117,7 +117,7 @@ static int proc_was_listed(proc_t *buf){
|
||||
break; case SEL_SESS: return_if_match(session,pid);
|
||||
|
||||
break; case SEL_COMM: i=sn->n; while(i--)
|
||||
- if(!strncmp( buf->cmd, (*(sn->u+i)).cmd, 63 )) return 1;
|
||||
+ if(!strncmp( buf->cmd, (*(sn->u+i)).cmd, 15 )) return 1;
|
||||
|
||||
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
||||
@ -1,96 +0,0 @@
|
||||
diff -up ./NEWS.ori ./NEWS
|
||||
diff -up ./sysctl.8.ori ./sysctl.8
|
||||
--- ./sysctl.8.ori 2018-03-03 07:59:18.064843718 +0100
|
||||
+++ ./sysctl.8 2022-07-29 16:33:02.906648974 +0200
|
||||
@@ -6,7 +6,7 @@
|
||||
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
.\" GNU General Public License for more details."
|
||||
-.TH SYSCTL "8" "2018-02-19" "procps-ng" "System Administration"
|
||||
+.TH SYSCTL "8" "2020-02-27" "procps-ng" "System Administration"
|
||||
.SH NAME
|
||||
sysctl \- configure kernel parameters at runtime
|
||||
.SH SYNOPSIS
|
||||
@@ -81,10 +81,10 @@ directories in the following list in giv
|
||||
Once a file of a given filename is loaded, any file of the same name
|
||||
in subsequent directories is ignored.
|
||||
.br
|
||||
-/run/sysctl.d/*.conf
|
||||
-.br
|
||||
/etc/sysctl.d/*.conf
|
||||
.br
|
||||
+/run/sysctl.d/*.conf
|
||||
+.br
|
||||
/usr/local/lib/sysctl.d/*.conf
|
||||
.br
|
||||
/usr/lib/sysctl.d/*.conf
|
||||
@@ -152,6 +152,16 @@ echo 256 > /proc/sys/net/ipv6/neigh/eth0
|
||||
.SH FILES
|
||||
.I /proc/sys
|
||||
.br
|
||||
+.I /etc/sysctl.d/*.conf
|
||||
+.br
|
||||
+.I /run/sysctl.d/*.conf
|
||||
+.br
|
||||
+.I /usr/local/lib/sysctl.d/*.conf
|
||||
+.br
|
||||
+.I /usr/lib/sysctl.d/*.conf
|
||||
+.br
|
||||
+.I /lib/sysctl.d/*.conf
|
||||
+.br
|
||||
.I /etc/sysctl.conf
|
||||
.SH SEE ALSO
|
||||
.BR sysctl.conf (5)
|
||||
diff -up ./sysctl.conf.5.ori ./sysctl.conf.5
|
||||
--- ./sysctl.conf.5.ori 2017-12-22 05:13:14.771653252 +0100
|
||||
+++ ./sysctl.conf.5 2022-07-29 16:33:02.907648980 +0200
|
||||
@@ -51,22 +51,22 @@ to list all possible parameters. The des
|
||||
.RE
|
||||
.PP
|
||||
.SH FILES
|
||||
-.TP
|
||||
-/run/sysctl.d/*.conf
|
||||
-.TQ
|
||||
-/etc/sysctl.d/*.conf
|
||||
-.TQ
|
||||
-/usr/local/lib/sysctl.d/*.conf
|
||||
-.TQ
|
||||
-/usr/lib/sysctl.d/*.conf
|
||||
-.TQ
|
||||
-/lib/sysctl.d/*.conf
|
||||
-.TQ
|
||||
-/etc/sysctl.conf
|
||||
+.I /etc/sysctl.d/*.conf
|
||||
+.br
|
||||
+.I /run/sysctl.d/*.conf
|
||||
+.br
|
||||
+.I /usr/local/lib/sysctl.d/*.conf
|
||||
+.br
|
||||
+.I /usr/lib/sysctl.d/*.conf
|
||||
+.br
|
||||
+.I /lib/sysctl.d/*.conf
|
||||
+.br
|
||||
+.I /etc/sysctl.conf
|
||||
+
|
||||
The paths where
|
||||
-sysctl
|
||||
+.B sysctl
|
||||
preload files usually exist. See also
|
||||
-sysctl
|
||||
+.B sysctl
|
||||
option
|
||||
.IR \-\-system .
|
||||
.SH SEE ALSO
|
||||
diff -up ./sysctl.c.ori ./sysctl.c
|
||||
--- ./sysctl.c.ori 2018-05-17 13:23:41.574213737 +0200
|
||||
+++ ./sysctl.c 2022-07-29 16:33:02.907648980 +0200
|
||||
@@ -614,8 +614,8 @@ static int PreloadSystem(void)
|
||||
{
|
||||
unsigned di, i;
|
||||
const char *dirs[] = {
|
||||
- "/run/sysctl.d",
|
||||
"/etc/sysctl.d",
|
||||
+ "/run/sysctl.d",
|
||||
"/usr/local/lib/sysctl.d",
|
||||
"/usr/lib/sysctl.d",
|
||||
"/lib/sysctl.d",
|
||||
@ -1,40 +0,0 @@
|
||||
From 7eade2544e1c45bc516744aeaccc45df1d8f42df Mon Sep 17 00:00:00 2001
|
||||
From: Kyle Walker <kwalker@redhat.com>
|
||||
Date: Tue, 11 Feb 2020 14:30:39 -0500
|
||||
Subject: [PATCH] whattime: Refactor the pretty-print evaluation
|
||||
|
||||
This avoids rounding errors such as in the case of 364 days of uptime which
|
||||
results in only output that prints at the hour and below.
|
||||
---
|
||||
proc/whattime.c | 15 ++++++++++++---
|
||||
1 file changed, 12 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/proc/whattime.c b/proc/whattime.c
|
||||
index c223cad..3e1b65c 100644
|
||||
--- a/proc/whattime.c
|
||||
+++ b/proc/whattime.c
|
||||
@@ -69,9 +69,18 @@ char *sprint_uptime(int human_readable) {
|
||||
|
||||
if (human_readable) {
|
||||
updecades = (int) uptime_secs / (60*60*24*365*10);
|
||||
- upyears = ((int) uptime_secs / (60*60*24*365)) % 10;
|
||||
- upweeks = ((int) uptime_secs / (60*60*24*7)) % 52;
|
||||
- updays = ((int) uptime_secs / (60*60*24)) % 7;
|
||||
+ if (updecades)
|
||||
+ uptime_secs -= updecades * (60*60*24*365*10);
|
||||
+
|
||||
+ upyears = (int) uptime_secs / (60*60*24*365);
|
||||
+ if (upyears)
|
||||
+ uptime_secs -= upyears * (60*60*24*365);
|
||||
+
|
||||
+ upweeks = (int) uptime_secs / (60*60*24*7);
|
||||
+ if (upweeks)
|
||||
+ uptime_secs -= upweeks * (60*60*24*7);
|
||||
+
|
||||
+ updays = (int) uptime_secs / (60*60*24);
|
||||
}
|
||||
else
|
||||
updays = (int) uptime_secs / (60*60*24);
|
||||
--
|
||||
2.24.1
|
||||
|
||||
@ -1,147 +0,0 @@
|
||||
diff --git a/vmstat.8 b/vmstat.8
|
||||
index fa0938c..fd1078f 100644
|
||||
--- a/vmstat.8
|
||||
+++ b/vmstat.8
|
||||
@@ -87,6 +87,9 @@ Display version information and exit.
|
||||
.TP
|
||||
\fB\-h\fR, \fB\-\-help\fR
|
||||
Display help and exit.
|
||||
+.TP
|
||||
+\fB\-y\fR, \fB\-\-no-first\fR
|
||||
+Omits first report with statistics since system boot.
|
||||
.PD
|
||||
.SH "FIELD DESCRIPTION FOR VM MODE"
|
||||
.SS
|
||||
diff --git a/vmstat.c b/vmstat.c
|
||||
index f2aa2f4..07496cd 100644
|
||||
--- a/vmstat.c
|
||||
+++ b/vmstat.c
|
||||
@@ -75,6 +75,9 @@ static int a_option;
|
||||
/* "-w" means "wide output" */
|
||||
static int w_option;
|
||||
|
||||
+/* "-y" means "skip first output" */
|
||||
+static int y_option;
|
||||
+
|
||||
/* "-t" means "show timestamp" */
|
||||
static int t_option;
|
||||
|
||||
@@ -104,6 +107,7 @@ static void __attribute__ ((__noreturn__))
|
||||
fputs(_(" -S, --unit <char> define display unit\n"), out);
|
||||
fputs(_(" -w, --wide wide output\n"), out);
|
||||
fputs(_(" -t, --timestamp show timestamp\n"), out);
|
||||
+ fputs(_(" -y, --no-first skips first line of output\n"), out);
|
||||
fputs(USAGE_SEPARATOR, out);
|
||||
fputs(USAGE_HELP, out);
|
||||
fputs(USAGE_VERSION, out);
|
||||
@@ -304,43 +308,47 @@ static void new_format(void)
|
||||
cpu_zzz, pgpgin, pgpgout, pswpin, pswpout, intr, ctxt, &running,
|
||||
&blocked, &dummy_1, &dummy_2);
|
||||
|
||||
- if (t_option) {
|
||||
- (void) time( &the_time );
|
||||
- tm_ptr = localtime( &the_time );
|
||||
- strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S", tm_ptr);
|
||||
- }
|
||||
+ if (y_option == 0) {
|
||||
+ if (t_option) {
|
||||
+ (void) time( &the_time );
|
||||
+ tm_ptr = localtime( &the_time );
|
||||
+ strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S", tm_ptr);
|
||||
+ }
|
||||
|
||||
- duse = *cpu_use + *cpu_nic;
|
||||
- dsys = *cpu_sys + *cpu_xxx + *cpu_yyy;
|
||||
- didl = *cpu_idl;
|
||||
- diow = *cpu_iow;
|
||||
- dstl = *cpu_zzz;
|
||||
- Div = duse + dsys + didl + diow + dstl;
|
||||
- if (!Div) Div = 1, didl = 1;
|
||||
- divo2 = Div / 2UL;
|
||||
- printf(w_option ? wide_format : format,
|
||||
- running, blocked,
|
||||
- unitConvert(kb_swap_used), unitConvert(kb_main_free),
|
||||
- unitConvert(a_option?kb_inactive:kb_main_buffers),
|
||||
- unitConvert(a_option?kb_active:kb_main_cached),
|
||||
- (unsigned)( (unitConvert(*pswpin * kb_per_page) * hz + divo2) / Div ),
|
||||
- (unsigned)( (unitConvert(*pswpout * kb_per_page) * hz + divo2) / Div ),
|
||||
- (unsigned)( (*pgpgin * hz + divo2) / Div ),
|
||||
- (unsigned)( (*pgpgout * hz + divo2) / Div ),
|
||||
- (unsigned)( (*intr * hz + divo2) / Div ),
|
||||
- (unsigned)( (*ctxt * hz + divo2) / Div ),
|
||||
- (unsigned)( (100*duse + divo2) / Div ),
|
||||
- (unsigned)( (100*dsys + divo2) / Div ),
|
||||
- (unsigned)( (100*didl + divo2) / Div ),
|
||||
- (unsigned)( (100*diow + divo2) / Div ),
|
||||
- (unsigned)( (100*dstl + divo2) / Div )
|
||||
- );
|
||||
+ duse = *cpu_use + *cpu_nic;
|
||||
+ dsys = *cpu_sys + *cpu_xxx + *cpu_yyy;
|
||||
+ didl = *cpu_idl;
|
||||
+ diow = *cpu_iow;
|
||||
+ dstl = *cpu_zzz;
|
||||
+ Div = duse + dsys + didl + diow + dstl;
|
||||
+ if (!Div) Div = 1, didl = 1;
|
||||
+ divo2 = Div / 2UL;
|
||||
+ printf(w_option ? wide_format : format,
|
||||
+ running, blocked,
|
||||
+ unitConvert(kb_swap_used), unitConvert(kb_main_free),
|
||||
+ unitConvert(a_option?kb_inactive:kb_main_buffers),
|
||||
+ unitConvert(a_option?kb_active:kb_main_cached),
|
||||
+ (unsigned)( (unitConvert(*pswpin * kb_per_page) * hz + divo2) / Div ),
|
||||
+ (unsigned)( (unitConvert(*pswpout * kb_per_page) * hz + divo2) / Div ),
|
||||
+ (unsigned)( (*pgpgin * hz + divo2) / Div ),
|
||||
+ (unsigned)( (*pgpgout * hz + divo2) / Div ),
|
||||
+ (unsigned)( (*intr * hz + divo2) / Div ),
|
||||
+ (unsigned)( (*ctxt * hz + divo2) / Div ),
|
||||
+ (unsigned)( (100*duse + divo2) / Div ),
|
||||
+ (unsigned)( (100*dsys + divo2) / Div ),
|
||||
+ (unsigned)( (100*didl + divo2) / Div ),
|
||||
+ (unsigned)( (100*diow + divo2) / Div ),
|
||||
+ (unsigned)( (100*dstl + divo2) / Div )
|
||||
+ );
|
||||
|
||||
- if (t_option) {
|
||||
- printf(" %s", timebuf);
|
||||
- }
|
||||
+ if (t_option) {
|
||||
+ printf(" %s", timebuf);
|
||||
+ }
|
||||
|
||||
- printf("\n");
|
||||
+ printf("\n");
|
||||
+ }
|
||||
+ else
|
||||
+ num_updates++;
|
||||
|
||||
/* main loop */
|
||||
for (i = 1; infinite_updates || i < num_updates; i++) {
|
||||
@@ -865,6 +873,7 @@ int main(int argc, char *argv[])
|
||||
{"timestamp", no_argument, NULL, 't'},
|
||||
{"help", no_argument, NULL, 'h'},
|
||||
{"version", no_argument, NULL, 'V'},
|
||||
+ {"no-first", no_argument, NULL, 'y'},
|
||||
{NULL, 0, NULL, 0}
|
||||
};
|
||||
|
||||
@@ -877,7 +886,7 @@ int main(int argc, char *argv[])
|
||||
atexit(close_stdout);
|
||||
|
||||
while ((c =
|
||||
- getopt_long(argc, argv, "afmnsdDp:S:wthV", longopts,
|
||||
+ getopt_long(argc, argv, "afmnsdDp:S:wthVy", longopts,
|
||||
NULL)) != EOF)
|
||||
switch (c) {
|
||||
case 'V':
|
||||
@@ -946,6 +955,11 @@ int main(int argc, char *argv[])
|
||||
case 't':
|
||||
t_option = 1;
|
||||
break;
|
||||
+ case 'y':
|
||||
+ /* Don't display stats since system restart */
|
||||
+ y_option = 1;
|
||||
+ break;
|
||||
+
|
||||
default:
|
||||
/* no other aguments defined yet. */
|
||||
usage(stderr);
|
||||
@ -1,41 +0,0 @@
|
||||
commit 354b5a56bf2ea831427ab8268ec7101bd3870f8e
|
||||
Author: Jan Rybar <jrybar@redhat.com>
|
||||
Date: Thu Apr 30 17:06:18 2020 +0200
|
||||
|
||||
vmstat and watch manpage slight fixes
|
||||
|
||||
vmstat - align wording with proc manpage to clarify ambiguities (rhbz#1796043)
|
||||
watch - manpage presumes ntp tools are present by default (which they're not on rpm and deb distros, rhbz#1583669)
|
||||
|
||||
diff --git a/vmstat.8 b/vmstat.8
|
||||
index e408bca..dcc1b1e 100644
|
||||
--- a/vmstat.8
|
||||
+++ b/vmstat.8
|
||||
@@ -93,7 +93,7 @@ Display help and exit.
|
||||
.B "Procs"
|
||||
.nf
|
||||
r: The number of runnable processes (running or waiting for run time).
|
||||
-b: The number of processes in uninterruptible sleep.
|
||||
+b: The number of processes blocked waiting for I/O to complete.
|
||||
.fi
|
||||
.PP
|
||||
.SS
|
||||
diff --git a/watch.1 b/watch.1
|
||||
index 256c36b..e06e04e 100644
|
||||
--- a/watch.1
|
||||
+++ b/watch.1
|
||||
@@ -34,7 +34,7 @@ every
|
||||
.I interval
|
||||
seconds. Try it with
|
||||
.B ntptime
|
||||
-and notice how the fractional seconds stays (nearly) the same, as opposed to
|
||||
+(if present) and notice how the fractional seconds stays (nearly) the same, as opposed to
|
||||
normal mode where they continuously increase.
|
||||
.TP
|
||||
\fB\-t\fR, \fB\-\-no\-title\fR
|
||||
@@ -190,4 +190,4 @@ watch uname \-r
|
||||
.I \-p
|
||||
isn't guaranteed to work across reboots, especially in the face of
|
||||
.B ntpdate
|
||||
-or other bootup time-changing mechanisms)
|
||||
+(if present) or other bootup time-changing mechanisms)
|
||||
183
osh-findings.patch
Normal file
183
osh-findings.patch
Normal file
@ -0,0 +1,183 @@
|
||||
diff --git a/library/pids.c b/library/pids.c
|
||||
index 6ae94ad..41673b5 100644
|
||||
--- a/library/pids.c
|
||||
+++ b/library/pids.c
|
||||
@@ -1288,8 +1288,11 @@ PROCPS_EXPORT int procps_pids_new (
|
||||
memcpy(p->items, items, sizeof(enum pids_item) * numitems);
|
||||
p->items[numitems] = PIDS_logical_end;
|
||||
pids_libflags_set(p);
|
||||
- if (!pids_prep_func_array(p))
|
||||
+ if (!pids_prep_func_array(p)) {
|
||||
+ free(p->items);
|
||||
+ free(p);
|
||||
return -ENOMEM;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (!(p->hist = calloc(1, sizeof(struct history_info)))
|
||||
diff --git a/src/pgrep.c b/src/pgrep.c
|
||||
index d8e57df..56c020f 100644
|
||||
--- a/src/pgrep.c
|
||||
+++ b/src/pgrep.c
|
||||
@@ -127,7 +127,6 @@ static bool use_sigqueue = false;
|
||||
static bool require_handler = false;
|
||||
static union sigval sigval = {0};
|
||||
|
||||
-static const char *opt_delim = "\n";
|
||||
static struct el *opt_pgrp = NULL;
|
||||
static struct el *opt_rgid = NULL;
|
||||
static struct el *opt_pid = NULL;
|
||||
@@ -139,6 +138,7 @@ static struct el *opt_euid = NULL;
|
||||
static struct el *opt_ruid = NULL;
|
||||
static struct el *opt_nslist = NULL;
|
||||
static struct el *opt_cgroup = NULL;
|
||||
+static char *opt_delim = NULL;
|
||||
static char *opt_pattern = NULL;
|
||||
static char *opt_pidfile = NULL;
|
||||
static char *opt_runstates = NULL;
|
||||
@@ -978,6 +978,7 @@ static void parse_opts (int argc, char **argv)
|
||||
opt_count = 1;
|
||||
break;
|
||||
case 'd': /* Solaris: change the delimiter */
|
||||
+ free(opt_delim);
|
||||
opt_delim = xstrdup (optarg);
|
||||
break;
|
||||
case 'f': /* Solaris: match full process name (as in "ps -f") */
|
||||
@@ -1057,6 +1058,7 @@ static void parse_opts (int argc, char **argv)
|
||||
opt_ns_pid = atoi(optarg);
|
||||
if (opt_ns_pid == 0)
|
||||
case 'r': /* match by runstate */
|
||||
+ free(opt_runstates);
|
||||
opt_runstates = xstrdup (optarg);
|
||||
++criteria_count;
|
||||
break;
|
||||
@@ -1133,6 +1135,8 @@ int main (int argc, char **argv)
|
||||
struct epoll_event ev, events[32];
|
||||
#endif
|
||||
|
||||
+ opt_delim = xstrdup("\n");
|
||||
+
|
||||
#ifdef HAVE_PROGRAM_INVOCATION_NAME
|
||||
program_invocation_name = program_invocation_short_name;
|
||||
#endif
|
||||
@@ -1154,6 +1158,8 @@ int main (int argc, char **argv)
|
||||
else
|
||||
output_numlist (procs,num);
|
||||
}
|
||||
+ if (opt_delim)
|
||||
+ free(opt_delim);
|
||||
return !num;
|
||||
case PKILL:
|
||||
for (i = 0; i < num; i++) {
|
||||
@@ -1170,6 +1176,8 @@ int main (int argc, char **argv)
|
||||
}
|
||||
if (opt_count)
|
||||
fprintf(stdout, "%d\n", num);
|
||||
+ if (opt_delim)
|
||||
+ free(opt_delim);
|
||||
return !kill_count;
|
||||
#ifdef ENABLE_PIDWAIT
|
||||
case PIDWAIT:
|
||||
diff --git a/src/ps/parser.c b/src/ps/parser.c
|
||||
index 1f50a7a..9977f93 100644
|
||||
--- a/src/ps/parser.c
|
||||
+++ b/src/ps/parser.c
|
||||
@@ -1076,28 +1076,44 @@ static const char *parse_trailing_pids(void){
|
||||
case '-': err = parse_pid(++data, grpnode->u + grpnode->n++); break;
|
||||
case '+': err = parse_pid(++data, sidnode->u + sidnode->n++); break;
|
||||
}
|
||||
- if(err) return err; /* the node gets freed with the list */
|
||||
+ if(err) goto error;
|
||||
}
|
||||
|
||||
if(pidnode->n){
|
||||
pidnode->next = selection_list;
|
||||
selection_list = pidnode;
|
||||
selection_list->typecode = SEL_PID;
|
||||
- } /* else free both parts */
|
||||
+ }
|
||||
+ else {
|
||||
+ free(pidnode);
|
||||
+ }
|
||||
|
||||
if(grpnode->n){
|
||||
grpnode->next = selection_list;
|
||||
selection_list = grpnode;
|
||||
selection_list->typecode = SEL_PGRP;
|
||||
- } /* else free both parts */
|
||||
+ }
|
||||
+ else {
|
||||
+ free(grpnode);
|
||||
+ }
|
||||
|
||||
if(sidnode->n){
|
||||
sidnode->next = selection_list;
|
||||
selection_list = sidnode;
|
||||
selection_list->typecode = SEL_SESS;
|
||||
- } /* else free both parts */
|
||||
+ }
|
||||
+ else {
|
||||
+ free(sidnode);
|
||||
+ }
|
||||
|
||||
return NULL;
|
||||
+
|
||||
+error:
|
||||
+ free(pidnode);
|
||||
+ free(grpnode);
|
||||
+ free(sidnode);
|
||||
+
|
||||
+ return err;
|
||||
}
|
||||
|
||||
/************** misc stuff ***********/
|
||||
diff --git a/src/ps/sortformat.c b/src/ps/sortformat.c
|
||||
index a76ddee..a4c98aa 100644
|
||||
--- a/src/ps/sortformat.c
|
||||
+++ b/src/ps/sortformat.c
|
||||
@@ -165,8 +165,10 @@ static const char *aix_format_parse(sf_node *sfn){
|
||||
if(*walk == '%'){
|
||||
const aix_struct *aix;
|
||||
walk++;
|
||||
- if(*walk == '%')
|
||||
+ if(*walk == '%'){
|
||||
+ free(buf);
|
||||
return _("missing AIX field descriptor");
|
||||
+ }
|
||||
aix = search_aix_array(*walk);
|
||||
walk++;
|
||||
if(!aix){
|
||||
diff --git a/src/top/top.c b/src/top/top.c
|
||||
index 969c553..5f507fe 100644
|
||||
--- a/src/top/top.c
|
||||
+++ b/src/top/top.c
|
||||
@@ -3825,7 +3825,7 @@ static int cfg_xform (WIN_t *q, char *flds, const char *defs) {
|
||||
q->rc.sortindx = (fields_dst[x] & 0x7f) - FLD_OFFSET;
|
||||
}
|
||||
// now we're in a 3.3.0 format (soon to be transformed) ...
|
||||
- strcpy(flds, fields_dst);
|
||||
+ strncpy(flds, fields_dst, f);
|
||||
}
|
||||
|
||||
// lastly, let's attend to the 3.3.0 - 3.3.17 fieldcurs format ...
|
||||
@@ -3980,6 +3980,7 @@ end_oops:
|
||||
* a configuration file (personal or system-wide default) */
|
||||
static const char *configs_file (FILE *fp, const char *name, float *delay) {
|
||||
char fbuf[LRGBUFSIZ];
|
||||
+ char format_str[8]; // 6 would be enough, but in case LRGBUFSIZ gets larger in the future...
|
||||
int i, n, tmp_whole, tmp_fract;
|
||||
const char *p = NULL;
|
||||
|
||||
@@ -4013,10 +4014,11 @@ static const char *configs_file (FILE *fp, const char *name, float *delay) {
|
||||
WIN_t *w = &Winstk[i];
|
||||
p = fmtmk(N_fmt(RC_bad_entry_fmt), i+1, name);
|
||||
|
||||
+ snprintf(format_str, sizeof(format_str), "%%%ds\n", LRGBUFSIZ-1);
|
||||
if (1 != fscanf(fp, "%3s\tfieldscur=", w->rc.winname))
|
||||
return p;
|
||||
if (Rc.id < RCF_XFORMED_ID)
|
||||
- fscanf(fp, "%s\n", fbuf);
|
||||
+ fscanf(fp, format_str, fbuf); // because uncapped scanf+%s is considered as nasty as gets
|
||||
else {
|
||||
for (j = 0; ; j++)
|
||||
if (1 != fscanf(fp, "%d", &w->rc.fieldscur[j]))
|
||||
@ -3,33 +3,17 @@
|
||||
|
||||
Summary: System and process monitoring utilities
|
||||
Name: procps-ng
|
||||
Version: 3.3.15
|
||||
Release: 14%{?dist}
|
||||
License: GPL+ and GPLv2 and GPLv2+ and GPLv3+ and LGPLv2+
|
||||
Group: Applications/System
|
||||
Version: 4.0.4
|
||||
Release: 8%{?dist}
|
||||
License: GPL-2.0-or-later AND LGPL-2.0-or-later AND LGPL-2.1-or-later
|
||||
URL: https://sourceforge.net/projects/procps-ng/
|
||||
|
||||
Source0: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.xz
|
||||
# README files are missing in latest tarball
|
||||
# wget https://gitlab.com/procps-ng/procps/raw/e0784ddaed30d095bb1d9a8ad6b5a23d10a212c4/README.md
|
||||
Source1: README.md
|
||||
# wget https://gitlab.com/procps-ng/procps/raw/e0784ddaed30d095bb1d9a8ad6b5a23d10a212c4/top/README.top
|
||||
Source2: README.top
|
||||
Source0: https://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.xz
|
||||
|
||||
Patch1: procps-ng-3.3.15-pidof-show-worker-threads.patch
|
||||
Patch2: procps-ng-3.3.15-pgrep-uid-conversion-overflow.patch
|
||||
Patch3: procps-ng-3.3.15-vmstat-watch-manpage.patch
|
||||
Patch4: procps-ng-3.3.15-pidof-kernel-workers-option.patch
|
||||
Patch5: procps-ng-3.3.15-pidof-separator-option-backport.patch
|
||||
Patch6: procps-ng-3.3.15-uptime-pretty-mod.patch
|
||||
Patch7: procps-ng-3.3.15-vmstat-omit-first-report.patch
|
||||
Patch8: procps-ng-3.3.15-sysctl-config-dir-order.patch
|
||||
Patch9: procps-ng-3.3.15-pgrep-uid-gid-overflow.patch
|
||||
Patch10: procps-ng-3.3.15-display-sig-unsafe.patch
|
||||
Patch11: procps-ng-3.3.15-ps-select.patch
|
||||
Patch12: procps-ng-3.3.15-ps-out-of-bonds-read.patch
|
||||
Patch13: procps-ng-3.3.15-cve-2023-4016.patch
|
||||
Patch1: osh-findings.patch
|
||||
Patch2: top-fix-guest-tics.patch
|
||||
|
||||
BuildRequires: make
|
||||
BuildRequires: ncurses-devel
|
||||
BuildRequires: libtool
|
||||
BuildRequires: autoconf
|
||||
@ -38,13 +22,14 @@ BuildRequires: gcc
|
||||
BuildRequires: gettext-devel
|
||||
BuildRequires: systemd-devel
|
||||
BuildRequires: git
|
||||
BuildRequires: po4a
|
||||
|
||||
%if %{tests_enabled}
|
||||
BuildRequires: dejagnu
|
||||
%endif
|
||||
|
||||
Provides: procps = %{version}-%{release}
|
||||
Obsoletes: procps < 3.2.9-1
|
||||
Obsoletes: procps < 4.0.1-1
|
||||
|
||||
# usrmove hack - will be removed once initscripts are fixed
|
||||
Provides: /sbin/sysctl
|
||||
@ -54,8 +39,8 @@ Provides: /bin/ps
|
||||
%description
|
||||
The procps package contains a set of system utilities that provide
|
||||
system information. Procps includes ps, free, skill, pkill, pgrep,
|
||||
snice, tload, top, uptime, vmstat, pidof, pmap, slabtop, w, watch
|
||||
and pwdx.
|
||||
snice, tload, top, uptime, vmstat, pidof, pmap, slabtop, w, watch,
|
||||
pwdx and pidwait.
|
||||
The ps command displays a snapshot of running processes. The top command
|
||||
provides a repetitive update of the statuses of running processes.
|
||||
The free command displays the amounts of free and used memory on your
|
||||
@ -71,21 +56,20 @@ who are currently logged on and what they are running. The watch
|
||||
program watches a running program. The vmstat command displays
|
||||
virtual memory statistics about processes, memory, paging, block
|
||||
I/O, traps, and CPU activity. The pwdx command reports the current
|
||||
working directory of a process or processes.
|
||||
working directory of a process or processes. The pidwait command
|
||||
waits for processes of specified names.
|
||||
|
||||
%package devel
|
||||
Summary: System and process monitoring utilities
|
||||
Group: Development/Libraries
|
||||
Requires: %{name}%{?_isa} = %{version}-%{release}
|
||||
Provides: procps-devel = %{version}-%{release}
|
||||
Obsoletes: procps-devel < 3.2.9-1
|
||||
Obsoletes: procps-devel < 3.3.17-8
|
||||
|
||||
%description devel
|
||||
System and process monitoring utilities development headers
|
||||
|
||||
%package i18n
|
||||
Summary: Internationalization pack for procps-ng
|
||||
Group: Applications/System
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
BuildArch: noarch
|
||||
|
||||
@ -99,9 +83,6 @@ Internationalization pack for procps-ng
|
||||
|
||||
%prep
|
||||
%autosetup -S git
|
||||
cp -p %{SOURCE1} .
|
||||
cp -p %{SOURCE2} top/
|
||||
|
||||
|
||||
%build
|
||||
# The following stuff is needed for git archives only
|
||||
@ -112,16 +93,16 @@ autoreconf --verbose --force --install
|
||||
|
||||
%configure \
|
||||
--exec-prefix=/ \
|
||||
--docdir=/unwanted \
|
||||
--disable-static \
|
||||
--enable-w-from \
|
||||
--disable-w-from \
|
||||
--disable-kill \
|
||||
--enable-watch8bit \
|
||||
--enable-skill \
|
||||
--enable-sigwinch \
|
||||
--enable-libselinux \
|
||||
--with-systemd \
|
||||
--disable-modern-top
|
||||
--disable-modern-top\
|
||||
--enable-pidwait
|
||||
|
||||
make CFLAGS="%{optflags}"
|
||||
|
||||
@ -133,11 +114,11 @@ make check
|
||||
|
||||
|
||||
%install
|
||||
make DESTDIR=%{buildroot} install
|
||||
%make_install
|
||||
|
||||
# translated man pages
|
||||
find man-po/ -type d -maxdepth 1 -mindepth 1 | while read dirname; do cp -a $dirname %{buildroot}%{_mandir}/ ; done
|
||||
rm -f %{buildroot}%{_mandir}/{de,fr,uk}/man1/kill.1
|
||||
# these are created by make, yet empty. This causes rpmbuild errors.
|
||||
rm -rf %{buildroot}%{_mandir}/pl/man5
|
||||
rm -rf %{buildroot}%{_mandir}/{fr,de,pt_BR}/man3
|
||||
|
||||
%find_lang %{name} --all-name --with-man
|
||||
|
||||
@ -146,98 +127,169 @@ ln -s %{_bindir}/pidof %{buildroot}%{_sbindir}/pidof
|
||||
%ldconfig_scriptlets
|
||||
|
||||
%files
|
||||
%doc AUTHORS Documentation/bugs.md Documentation/FAQ NEWS README.md top/README.top Documentation/TODO
|
||||
%{!?_licensedir:%global license %%doc}
|
||||
%doc AUTHORS bugs.md FAQ NEWS README.md
|
||||
%license COPYING COPYING.LIB
|
||||
%{_libdir}/libprocps.so.*
|
||||
%{_libdir}/libproc2.so.*
|
||||
%{_bindir}/*
|
||||
%{_sbindir}/*
|
||||
%{_mandir}/man1/*
|
||||
%{_mandir}/man8/*
|
||||
%{_mandir}/man5/*
|
||||
|
||||
|
||||
%exclude %{_libdir}/libprocps.la
|
||||
%exclude /unwanted/*
|
||||
%exclude %{_pkgdocdir}/libproc.supp
|
||||
|
||||
%files devel
|
||||
%{!?_licensedir:%global license %%doc}
|
||||
%license COPYING COPYING.LIB
|
||||
%{_libdir}/libprocps.so
|
||||
%{_libdir}/pkgconfig/libprocps.pc
|
||||
%{_includedir}/proc
|
||||
%{_libdir}/libproc2.so
|
||||
%{_libdir}/pkgconfig/libproc2.pc
|
||||
%{_includedir}/libproc2
|
||||
%{_mandir}/man3/*
|
||||
|
||||
%files i18n -f %{name}.lang
|
||||
|
||||
%changelog
|
||||
* Tue Aug 15 2023 Jan Rybar <jrybar@redhat.com> - 3.3.15-14
|
||||
- CVE-2023-4016: ps: possible buffer overflow
|
||||
- Resolves: rhbz#2228503
|
||||
* Wed Apr 16 2025 Jan Rybar <jrybar@redhat.com> - 4.0.4-8
|
||||
- fix guest tics (backport upstr patch e1df029e6, 3fb34669)
|
||||
- Resolves: RHEL-84051
|
||||
|
||||
* Tue Jan 17 2023 Jan Rybar <jrybar@redhat.com> - 3.3.15-13
|
||||
- version bump requested to create -devel subpkg for CRB inclusion
|
||||
- Resolves: rhbz#2164781
|
||||
* Thu Jan 23 2025 Jan Rybar <jrybar@redhat.com> - 4.0.4-7
|
||||
- new build needed due to old centpkg glitch
|
||||
- Resolves: RHEL-44359
|
||||
|
||||
* Tue Jan 17 2023 Jan Rybar <jrybar@redhat.com> - 3.3.15-12
|
||||
- ps: out-of-bonds read in quick mode
|
||||
- Resolves: rhbz#2153813
|
||||
* Fri Jan 17 2025 Jan Rybar <jrybar@redhat.com> - 4.0.4-6
|
||||
- fixed OSH findings
|
||||
- Resolves: RHEL-44359
|
||||
|
||||
* Tue Dec 13 2022 Kyle Walker <kwalker@redhat.com> - 3.3.15-11
|
||||
- ps: revert increase command name length to 64 ____ (catch up)
|
||||
- Resolves: rhbz#2144978
|
||||
* Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 4.0.4-5
|
||||
- Bump release for October 2024 mass rebuild:
|
||||
Resolves: RHEL-64018
|
||||
|
||||
* Wed Nov 23 2022 Jan Rybar <jrybar@redhat.com> - 3.3.15-10
|
||||
- display.c: backport: async-signal-unsafe handler deadlocks on SIGHUP
|
||||
- Resolves: rhbz#2141696
|
||||
* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 4.0.4-4
|
||||
- Bump release for June 2024 mass rebuild
|
||||
|
||||
* Wed Aug 17 2022 Jan Rybar <jrybar@redhat.com> - 3.3.15-9
|
||||
- pgrep: backport uid/gid overflow fix
|
||||
- Resolves: rhbz#1827731
|
||||
* Fri Jan 26 2024 Fedora Release Engineering <releng@fedoraproject.org> - 4.0.4-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Wed Jul 20 2022 Jan Rybar <jrybar@redhat.com> - 3.3.15-8
|
||||
- vmstat: added -y option to omit first report
|
||||
- Resolves: rhbz#2027350
|
||||
- sysctl: backport config directory order, align with systemd
|
||||
- Resolves: rhbz#2111915
|
||||
* Sun Jan 21 2024 Fedora Release Engineering <releng@fedoraproject.org> - 4.0.4-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Wed Mar 23 2022 Jan Rybar <jrybar@redhat.com> - 3.3.15-7
|
||||
- uptime: human readable data not shown if 364 days up
|
||||
- Resolves: rhbz#1772999
|
||||
* Thu Oct 05 2023 Jan Rybar <jrybar@redhat.com> - 4.0.4-1
|
||||
- Rebase to procps-ng-4.0.4
|
||||
|
||||
* Tue Dec 01 2020 Jan Rybar <jrybar@redhat.com> - 3.3.15-6
|
||||
- pidof: option for separator collides with other option
|
||||
- Resolves: rhbz#1895985
|
||||
* Mon Aug 14 2023 Jan Rybar <jrybar@redhat.com> - 4.0.3-5
|
||||
- ps: buffer overflow
|
||||
- Resolves: bz#2230186
|
||||
|
||||
* Mon Nov 09 2020 Jan Rybar <jrybar@redhat.com> - 3.3.15-5
|
||||
- version bump due to unspotted malformed backport patch
|
||||
- Resolves: rhbz#1860486
|
||||
- Resolves: rhbz#1894526
|
||||
- Related: rhbz#1803640
|
||||
* Mon Aug 07 2023 Lukáš Zaoral <lzaoral@redhat.com> - 4.0.3-4
|
||||
- migrate to SPDX license format
|
||||
|
||||
* Fri Nov 06 2020 Jan Rybar <jrybar@redhat.com> - 3.3.15-4
|
||||
- pidof: new option to show kernel worker threads
|
||||
- pidof: empty input causes to show kernel worker threads
|
||||
- Resolves: rhbz#1860486
|
||||
- Resolves: rhbz#1894526
|
||||
- Related: rhbz#1803640
|
||||
-
|
||||
* Wed Jul 08 2020 Jan Rybar <jrybar@redhat.com> - 3.3.15-3
|
||||
- pgrep: uid/gid conversion overflow
|
||||
- vmstat: align manpage with procfs wording
|
||||
- watch: manpage presumes NTP on system
|
||||
- Resolves: rhbz#1827731
|
||||
- Resolves: rhbz#1829920
|
||||
- Resolves: rhbz#1583669
|
||||
* Thu Aug 03 2023 Jan Rybar <jrybar@redhat.com> - 4.0.3-3
|
||||
- sysctl -N <file> shows values instead of names
|
||||
|
||||
* Tue Apr 14 2020 Jan Rybar <jrybar@redhat.com> - 3.3.15-2
|
||||
- pidof: show kernel workers
|
||||
- gating activated
|
||||
- Resolves: rhbz#1803640
|
||||
* Fri Jul 21 2023 Fedora Release Engineering <releng@fedoraproject.org> - 4.0.3-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
|
||||
|
||||
* Wed Jul 04 2018 Jan Rybar <jrybar@redhat.com> - 3.3.15-1
|
||||
- Rebase to 3.3.15
|
||||
- Translated manual pages moved to -i18n subpackage
|
||||
* Fri Mar 24 2023 Jan Rybar <jrybar@redhat.com> - 4.0.3-1
|
||||
- rebase to 4.0.3
|
||||
|
||||
* Mon Feb 13 2023 Jan Rybar <jrybar@redhat.com> - 4.0.2-1
|
||||
- rebase to 4.0.2
|
||||
|
||||
* Fri Jan 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.17-9
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
|
||||
|
||||
* Wed Oct 05 2022 Jan Rybar <jrybar@redhat.com> - 3.3.17-8
|
||||
- sysctl: bring back dotted keys after globs-support backport
|
||||
|
||||
* Mon Sep 19 2022 Jan Rybar <jrybar@redhat.com> - 3.3.17-7
|
||||
- free: backport 91e58792: fix --si option + cleanup
|
||||
- Resolves: bz#2083789
|
||||
|
||||
* Fri Jul 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.17-6
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
|
||||
|
||||
* Thu Mar 31 2022 Jan Rybar <jrybar@redhat.com> - 3.3.17-5
|
||||
- sysctl: backport: support systemd glob patterns
|
||||
|
||||
* Fri Jan 21 2022 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.17-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
|
||||
|
||||
* Fri Jul 23 2021 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.17-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
|
||||
|
||||
* Tue May 04 2021 Jan Rybar <jrybar@redhat.com> - 3.3.17-2
|
||||
- fixed coverity findings
|
||||
|
||||
* Thu Feb 18 2021 Jan Rybar <jrybar@redhat.com> - 3.3.17-1
|
||||
- rebase to procps-ng-3.3.17
|
||||
- new distribution of i18n manpages
|
||||
- new pidwait command
|
||||
|
||||
* Tue Feb 02 2021 Jan Rybar <jrybar@redhat.com> - 3.3.16-4
|
||||
- version bump to apply latest specfile changes into build
|
||||
|
||||
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.16-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
||||
|
||||
* Tue Dec 22 2020 Jan Rybar <jrybar@redhat.com> - 3.3.16-2
|
||||
- ps: new exe format option to show real path to exe
|
||||
- pidof: new -w option to show kernel worker threads
|
||||
- pkill: manpage to document -e option
|
||||
- Resolves: bz#1629413
|
||||
- Resolves: bz#1399206
|
||||
|
||||
* Tue Aug 18 2020 Jan Rybar <jrybar@redhat.com> - 3.3.16-1
|
||||
- Rebase to newest upstream version
|
||||
|
||||
* Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.15-9
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
|
||||
|
||||
* Fri Jul 24 2020 Jan Rybar <jrybar@redhat.com> - 3.3.15-8
|
||||
- pidof: show PIDs for kernel worker threads
|
||||
|
||||
* Tue Jul 14 2020 Tom Stellard <tstellar@redhat.com> - 3.3.15-8
|
||||
- Use make macros
|
||||
- https://fedoraproject.org/wiki/Changes/UseMakeBuildInstallMacro
|
||||
|
||||
* Thu Jan 30 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.15-7
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
|
||||
|
||||
* Fri Jul 26 2019 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.15-6
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
||||
|
||||
* Sat Feb 02 2019 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.15-5
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
|
||||
|
||||
* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.15-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
|
||||
|
||||
* Mon Jul 02 2018 Jan Rybar <jrybar@redhat.com> - 3.3.15-3
|
||||
- Translated manual pages moved to i18n subpackage
|
||||
- Spec file cleanup
|
||||
|
||||
* Thu Jun 14 2018 Jan Rybar <jrybar@redhat.com> - 3.3.15-2
|
||||
- General rebuild after commit revert
|
||||
|
||||
* Wed Jun 06 2018 Jan Rybar <jrybar@redhat.com> - 3.3.15-1
|
||||
- Rebase to 3.3.15 (contains a LOT of CVE fixes)
|
||||
- Manpage translations temporarily unavailable
|
||||
|
||||
* Fri May 18 2018 Kamil Dudka <kdudka@redhat.com> - 3.3.14-2
|
||||
- fix integer overflows leading to heap overflow (CVE-2018-1124 CVE-2018-1126)
|
||||
|
||||
* Mon Apr 16 2018 Jan Rybar <jrybar@redhat.com> - 3.3.14-1
|
||||
- Rebase to 3.3.14
|
||||
- Translated man-pages returned
|
||||
|
||||
* Thu Apr 05 2018 Jan Rybar <jrybar@redhat.com> - 3.3.13-2
|
||||
- Build fails due to removal of libio.h from glibc-headers
|
||||
- Translated manpages deactivated since missing from 3.3.13 tarball
|
||||
|
||||
* Tue Apr 03 2018 Jan Rybar <jrybar@redhat.com> - 3.3.13-1
|
||||
- Rebase to 3.3.13
|
||||
|
||||
* Mon Feb 26 2018 Jan Rybar <jrybar@redhat.com> - 3.3.12-2
|
||||
- ps: LUID (LoginID) format option available
|
||||
|
||||
* Wed Feb 21 2018 Michael Cronenworth <mike@cchtml.com> - 3.3.12-1
|
||||
- Upgrading to 3.3.12
|
||||
1
sources
Normal file
1
sources
Normal file
@ -0,0 +1 @@
|
||||
SHA512 (procps-ng-4.0.4.tar.xz) = 94375544e2422fefc23d7634063c49ef1be62394c46039444f85e6d2e87e45cfadc33accba5ca43c96897b4295bfb0f88d55a30204598ddb26ef66f0420cefb4
|
||||
118
top-fix-guest-tics.patch
Normal file
118
top-fix-guest-tics.patch
Normal file
@ -0,0 +1,118 @@
|
||||
From f01e5e493644e5c8b50509d23f77796434fbeecc Mon Sep 17 00:00:00 2001
|
||||
From: rpm-build <rpm-build>
|
||||
Date: Wed, 16 Apr 2025 14:54:20 +0200
|
||||
Subject: [PATCH] Backport of upstream patch e1df029e and 3fb34669d
|
||||
|
||||
---
|
||||
library/include/stat.h | 6 +++---
|
||||
library/stat.c | 12 ++++++++----
|
||||
man/top.1 | 3 ---
|
||||
src/top/top.c | 9 ---------
|
||||
4 files changed, 11 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/library/include/stat.h b/library/include/stat.h
|
||||
index 7adefa6..fd7c690 100644
|
||||
--- a/library/include/stat.h
|
||||
+++ b/library/include/stat.h
|
||||
@@ -45,8 +45,8 @@ enum stat_item {
|
||||
STAT_TIC_IRQ, // ull_int "
|
||||
STAT_TIC_SOFTIRQ, // ull_int "
|
||||
STAT_TIC_STOLEN, // ull_int "
|
||||
- STAT_TIC_GUEST, // ull_int "
|
||||
- STAT_TIC_GUEST_NICE, // ull_int "
|
||||
+ STAT_TIC_GUEST, // ull_int " (note: also included in USER)
|
||||
+ STAT_TIC_GUEST_NICE, // ull_int " (note: also included in NICE)
|
||||
|
||||
STAT_TIC_DELTA_USER, // sl_int derived from above
|
||||
STAT_TIC_DELTA_NICE, // sl_int "
|
||||
@@ -63,7 +63,7 @@ enum stat_item {
|
||||
STAT_TIC_SUM_SYSTEM, // ull_int derived from SYSTEM + IRQ + SOFTIRQ tics
|
||||
STAT_TIC_SUM_IDLE, // ull_int derived from IDLE + IOWAIT tics
|
||||
STAT_TIC_SUM_BUSY, // ull_int derived from SUM_TOTAL - SUM_IDLE tics
|
||||
- STAT_TIC_SUM_TOTAL, // ull_int derived from sum of all 10 tics
|
||||
+ STAT_TIC_SUM_TOTAL, // ull_int derived from sum of all tics, minus 2 GUEST tics
|
||||
|
||||
STAT_TIC_SUM_DELTA_USER, // sl_int derived from above
|
||||
STAT_TIC_SUM_DELTA_SYSTEM, // sl_int "
|
||||
diff --git a/library/stat.c b/library/stat.c
|
||||
index 131cad5..506937b 100644
|
||||
--- a/library/stat.c
|
||||
+++ b/library/stat.c
|
||||
@@ -568,11 +568,15 @@ static inline void stat_derive_unique (
|
||||
this->new.xidl
|
||||
= this->new.idle
|
||||
+ this->new.iowait;
|
||||
+ /* note: we exclude guest tics from xtot since ...
|
||||
+ 'user' already includes 'guest'
|
||||
+ 'nice' already includes 'gnice'
|
||||
+ ( see linux sources: ./kernel/sched/cputime.c, kcpustat_cpu_fetch ) */
|
||||
this->new.xtot
|
||||
- = this->new.xusr + this->new.xsys + this->new.xidl
|
||||
- + this->new.stolen
|
||||
- + this->new.guest
|
||||
- + this->new.gnice;
|
||||
+ = this->new.xusr
|
||||
+ + this->new.xsys
|
||||
+ + this->new.xidl
|
||||
+ + this->new.stolen;
|
||||
this->new.xbsy
|
||||
= this->new.xtot - this->new.xidl;
|
||||
|
||||
diff --git a/man/top.1 b/man/top.1
|
||||
index 3791dfe..25eff12 100644
|
||||
--- a/man/top.1
|
||||
+++ b/man/top.1
|
||||
@@ -527,9 +527,6 @@ Depending on your kernel version, the \fBst\fR field may not be shown.
|
||||
\fBst\fR : time stolen from this vm by the hypervisor
|
||||
.fi
|
||||
|
||||
-The `sy' value above also reflects the time running a virtual \*(Pu
|
||||
-for guest operating systems, including those that have been niced.
|
||||
-
|
||||
Beyond the first tasks/threads line, there are alternate \*(PU display
|
||||
modes available via the 4-way `t' \*(CT.
|
||||
They show an abbreviated summary consisting of these elements:
|
||||
diff --git a/src/top/top.c b/src/top/top.c
|
||||
index 5f507fe..8bf5727 100644
|
||||
--- a/src/top/top.c
|
||||
+++ b/src/top/top.c
|
||||
@@ -286,7 +286,6 @@ static enum stat_item Stat_items[] = {
|
||||
STAT_TIC_DELTA_NICE, STAT_TIC_DELTA_IDLE,
|
||||
STAT_TIC_DELTA_IOWAIT, STAT_TIC_DELTA_IRQ,
|
||||
STAT_TIC_DELTA_SOFTIRQ, STAT_TIC_DELTA_STOLEN,
|
||||
- STAT_TIC_DELTA_GUEST, STAT_TIC_DELTA_GUEST_NICE,
|
||||
STAT_TIC_SUM_DELTA_USER, STAT_TIC_SUM_DELTA_SYSTEM,
|
||||
#ifdef CORE_TYPE_NO
|
||||
STAT_TIC_SUM_DELTA_TOTAL };
|
||||
@@ -299,7 +298,6 @@ enum Rel_statitems {
|
||||
stat_NI, stat_IL,
|
||||
stat_IO, stat_IR,
|
||||
stat_SI, stat_ST,
|
||||
- stat_GU, stat_GN,
|
||||
stat_SUM_USR, stat_SUM_SYS,
|
||||
#ifdef CORE_TYPE_NO
|
||||
stat_SUM_TOT };
|
||||
@@ -6357,11 +6355,6 @@ static int sum_tics (struct stat_stack *this, const char *pfx, int nobuf) {
|
||||
if (1 > tot_frme) idl_frme = tot_frme = 1;
|
||||
scale = 100.0 / (float)tot_frme;
|
||||
|
||||
- /* account for VM tics not otherwise provided for ...
|
||||
- ( with xtra-procps-debug.h, can't use PID_VAL w/ assignment ) */
|
||||
- this->head[stat_SY].result.sl_int += rSv(stat_GU) + rSv(stat_GN);
|
||||
- this->head[stat_SUM_SYS].result.sl_int += rSv(stat_GU) + rSv(stat_GN);
|
||||
-
|
||||
/* display some kinda' cpu state percentages
|
||||
(who or what is explained by the passed prefix) */
|
||||
if (Curwin->rc.graph_cpus) {
|
||||
@@ -6411,8 +6404,6 @@ static int sum_unify (struct stat_stack *this, int nobuf) {
|
||||
stack[stat_IR].result.sl_int += rSv(stat_IR, sl_int);
|
||||
stack[stat_SI].result.sl_int += rSv(stat_SI, sl_int);
|
||||
stack[stat_ST].result.sl_int += rSv(stat_ST, sl_int);
|
||||
- stack[stat_GU].result.sl_int += rSv(stat_GU, sl_int);
|
||||
- stack[stat_GN].result.sl_int += rSv(stat_GN, sl_int);
|
||||
stack[stat_SUM_USR].result.sl_int += rSv(stat_SUM_USR, sl_int);
|
||||
stack[stat_SUM_SYS].result.sl_int += rSv(stat_SUM_SYS, sl_int);
|
||||
stack[stat_SUM_TOT].result.sl_int += rSv(stat_SUM_TOT, sl_int);
|
||||
--
|
||||
2.48.1
|
||||
|
||||
Loading…
Reference in New Issue
Block a user