commit
3e712f7136
@ -0,0 +1 @@
|
|||||||
|
SOURCES/procps-ng-3.3.17.tar.xz
|
@ -0,0 +1 @@
|
|||||||
|
a52952e8bc6aaab812176c00d25adc4d4e1552e2 SOURCES/procps-ng-3.3.17.tar.xz
|
@ -0,0 +1,52 @@
|
|||||||
|
[](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.
|
@ -0,0 +1,377 @@
|
|||||||
|
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)
|
@ -0,0 +1,55 @@
|
|||||||
|
commit a1bc3bf207c64e2a26d8a7a3c20dd960e0e5c545
|
||||||
|
Author: Jan Rybar <jrybar@redhat.com>
|
||||||
|
Date: Thu May 6 16:30:54 2021 +0200
|
||||||
|
|
||||||
|
Coverity scan findings - memleaks, unused vars, potential nullptr dereferences
|
||||||
|
|
||||||
|
diff --git a/lib/test_process.c b/lib/test_process.c
|
||||||
|
index e20b270d..f8ff5ed0 100644
|
||||||
|
--- a/lib/test_process.c
|
||||||
|
+++ b/lib/test_process.c
|
||||||
|
@@ -69,6 +69,7 @@ signal_handler(int signum, siginfo_t *siginfo, void *ucontext)
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ free(signame);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
diff --git a/pmap.c b/pmap.c
|
||||||
|
index 49a2a6a8..d8565fc3 100644
|
||||||
|
--- a/pmap.c
|
||||||
|
+++ b/pmap.c
|
||||||
|
@@ -346,6 +346,9 @@ static void print_extended_maps (FILE *f)
|
||||||
|
if (listnode == NULL) {
|
||||||
|
assert(firstmapping == 2);
|
||||||
|
listnode = calloc(1, sizeof *listnode);
|
||||||
|
+ if (listnode == NULL)
|
||||||
|
+ xerrx(EXIT_FAILURE, _("ERROR: memory allocation failed"));
|
||||||
|
+
|
||||||
|
if (listhead == NULL) {
|
||||||
|
assert(listtail == NULL);
|
||||||
|
listhead = listnode;
|
||||||
|
diff --git a/watch.c b/watch.c
|
||||||
|
index 1a95454e..772879cd 100644
|
||||||
|
--- a/watch.c
|
||||||
|
+++ b/watch.c
|
||||||
|
@@ -124,8 +124,6 @@ static void reset_ansi(void)
|
||||||
|
|
||||||
|
static void init_ansi_colors(void)
|
||||||
|
{
|
||||||
|
- int color;
|
||||||
|
-
|
||||||
|
short ncurses_colors[] = {
|
||||||
|
-1, COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW,
|
||||||
|
COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE
|
||||||
|
@@ -172,6 +170,9 @@ static int process_ansi_color_escape_sequence(char** escape_sequence) {
|
||||||
|
// ESC[ 48;2;⟨r⟩;⟨g⟩;⟨b⟩ m Select RGB background color
|
||||||
|
int num;
|
||||||
|
|
||||||
|
+ if (!escape_sequence)
|
||||||
|
+ return 0; /* avoid NULLPTR dereference, return "not understood" */
|
||||||
|
+
|
||||||
|
if ((*escape_sequence)[0] != ';')
|
||||||
|
return 0; /* not understood */
|
||||||
|
|
@ -0,0 +1,38 @@
|
|||||||
|
diff -up ./proc/sysinfo.c.ori ./proc/sysinfo.c
|
||||||
|
--- ./proc/sysinfo.c.ori 2021-02-09 11:11:25.000000000 +0100
|
||||||
|
+++ ./proc/sysinfo.c 2022-07-29 14:08:42.093322509 +0200
|
||||||
|
@@ -786,10 +786,8 @@ nextline:
|
||||||
|
where such values will be dramatically distorted over those of the host. */
|
||||||
|
if (kb_main_available > kb_main_total)
|
||||||
|
kb_main_available = kb_main_free;
|
||||||
|
- mem_used = kb_main_total - kb_main_free - kb_main_cached - kb_main_buffers;
|
||||||
|
- if (mem_used < 0)
|
||||||
|
- mem_used = kb_main_total - kb_main_free;
|
||||||
|
- kb_main_used = (unsigned long)mem_used;
|
||||||
|
+ mem_used = kb_main_total - kb_main_available;
|
||||||
|
+ kb_main_used = mem_used < 0 ? 0 : (unsigned long) mem_used;
|
||||||
|
|
||||||
|
/* zero? might need fallback for 2.6.27 <= kernel <? 3.14 */
|
||||||
|
if (!kb_main_available) {
|
||||||
|
diff -up ./top/top.c.ori ./top/top.c
|
||||||
|
--- ./top/top.c.ori 2021-02-09 11:11:25.000000000 +0100
|
||||||
|
+++ ./top/top.c 2022-07-29 13:59:04.681966019 +0200
|
||||||
|
@@ -6076,12 +6076,16 @@ numa_nope:
|
||||||
|
char used[SMLBUFSIZ], util[SMLBUFSIZ], dual[MEDBUFSIZ];
|
||||||
|
float pct_used, pct_misc, pct_swap;
|
||||||
|
int ix, num_used, num_misc;
|
||||||
|
+ unsigned long my_used;
|
||||||
|
|
||||||
|
- pct_used = (float)kb_main_used * (100.0 / (float)kb_main_total);
|
||||||
|
+ // upstream kept old calculation of 'used' here for some reason
|
||||||
|
+ // https://gitlab.com/procps-ng/procps/-/commit/047d16ccfda6638eda78f56b67def196a2002b6f
|
||||||
|
+ my_used = kb_main_total - kb_main_free - kb_main_cached - kb_main_buffers;
|
||||||
|
+ pct_used = (float)my_used * (100.0 / (float)kb_main_total);
|
||||||
|
#ifdef MEMGRAPH_OLD
|
||||||
|
pct_misc = (float)(kb_main_buffers + kb_main_cached) * (100.0 / (float)kb_main_total);
|
||||||
|
#else
|
||||||
|
- pct_misc = (float)(kb_main_total - kb_main_available - kb_main_used) * (100.0 / (float)kb_main_total);
|
||||||
|
+ pct_misc = (float)(kb_main_total - kb_main_available - my_used) * (100.0 / (float)kb_main_total);
|
||||||
|
#endif
|
||||||
|
if (pct_used + pct_misc > 100.0 || pct_misc < 0) pct_misc = 0;
|
||||||
|
pct_swap = kb_swap_total ? (float)kb_swap_used * (100.0 / (float)kb_swap_total) : 0;
|
@ -0,0 +1,72 @@
|
|||||||
|
From 401d587d2deb78adcf62517654f955a24b2d537d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Todd Lewis <todd_lewis@unc.edu>
|
||||||
|
Date: Mon, 25 Oct 2021 19:38:10 -0400
|
||||||
|
Subject: [PATCH] fix uid/gid > 2^31
|
||||||
|
|
||||||
|
---
|
||||||
|
pgrep.c | 10 +++++++---
|
||||||
|
proc/readproc.h | 12 ++++++------
|
||||||
|
2 files changed, 13 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/pgrep.c b/pgrep.c
|
||||||
|
index 1905cd1d..7d731620 100644
|
||||||
|
--- a/pgrep.c
|
||||||
|
+++ b/pgrep.c
|
||||||
|
@@ -229,8 +229,12 @@ static int strict_atol (const char *restrict str, long *restrict value)
|
||||||
|
|
||||||
|
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;
|
||||||
|
@@ -305,7 +309,7 @@ static int conv_uid (const char *restrict name, struct el *restrict e)
|
||||||
|
xwarnx(_("invalid user name: %s"), name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
- e->num = (int) pwd->pw_uid;
|
||||||
|
+ e->num = pwd->pw_uid;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -322,7 +326,7 @@ static int conv_gid (const char *restrict name, struct el *restrict e)
|
||||||
|
xwarnx(_("invalid group name: %s"), name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
- e->num = (int) grp->gr_gid;
|
||||||
|
+ e->num = grp->gr_gid;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/proc/readproc.h b/proc/readproc.h
|
||||||
|
index 7905ea99..8d9ae392 100644
|
||||||
|
--- a/proc/readproc.h
|
||||||
|
+++ b/proc/readproc.h
|
||||||
|
@@ -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
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
@ -0,0 +1,286 @@
|
|||||||
|
From 52afb3a8d31871d28b1c39573a7ed5196c2d5023 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Craig Small <csmall@dropbear.xyz>
|
||||||
|
Date: Mon, 15 Feb 2021 21:10:06 +1100
|
||||||
|
Subject: [PATCH] pidwait: Rename from pwait
|
||||||
|
|
||||||
|
pwait is already in at least Debian in a different package
|
||||||
|
|
||||||
|
References:
|
||||||
|
https://bugs.debian.org/982391
|
||||||
|
---
|
||||||
|
diff --git a/Makefile.am b/Makefile.am
|
||||||
|
index e037e4c..de15e13 100644
|
||||||
|
--- a/Makefile.am
|
||||||
|
+++ b/Makefile.am
|
||||||
|
@@ -49,8 +49,8 @@ bin_PROGRAMS = \
|
||||||
|
uptime \
|
||||||
|
vmstat \
|
||||||
|
w
|
||||||
|
-if BUILD_PWAIT
|
||||||
|
-bin_PROGRAMS += pwait
|
||||||
|
+if BUILD_PIDWAIT
|
||||||
|
+bin_PROGRAMS += pidwait
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
usrbin_exec_PROGRAMS += \
|
||||||
|
@@ -85,8 +85,8 @@ dist_man_MANS += \
|
||||||
|
sysctl.conf.5 \
|
||||||
|
ps/ps.1
|
||||||
|
|
||||||
|
-if BUILD_PWAIT
|
||||||
|
-dist_man_MANS += pwait.1
|
||||||
|
+if BUILD_PIDWAIT
|
||||||
|
+dist_man_MANS += pidwait.1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
@@ -199,8 +199,8 @@ free_SOURCES = free.c lib/strutils.c lib/fileutils.c
|
||||||
|
pgrep_SOURCES = pgrep.c lib/fileutils.c lib/nsutils.c
|
||||||
|
pkill_SOURCES = pgrep.c lib/fileutils.c lib/nsutils.c
|
||||||
|
pmap_SOURCES = pmap.c lib/fileutils.c
|
||||||
|
-if BUILD_PWAIT
|
||||||
|
-pwait_SOURCES = pgrep.c lib/fileutils.c lib/nsutils.c
|
||||||
|
+if BUILD_PIDWAIT
|
||||||
|
+pidwait_SOURCES = pgrep.c lib/fileutils.c lib/nsutils.c
|
||||||
|
endif
|
||||||
|
if !CYGWIN
|
||||||
|
pwdx_SOURCES = pwdx.c lib/fileutils.c
|
||||||
|
diff --git a/NEWS b/NEWS
|
||||||
|
index da63c9c..5fe6761 100644
|
||||||
|
--- a/NEWS
|
||||||
|
+++ b/NEWS
|
||||||
|
@@ -1,3 +1,7 @@
|
||||||
|
+procps-ng-NEXT
|
||||||
|
+---------------
|
||||||
|
+ * Rename pwait to pidwait
|
||||||
|
+
|
||||||
|
procps-ng-3.3.17
|
||||||
|
---------------
|
||||||
|
* library: Incremented to 8:3:0
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 56a8669..750c0fb 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -132,20 +132,20 @@ AC_TRY_COMPILE([#include <errno.h>],
|
||||||
|
AC_MSG_RESULT(yes),
|
||||||
|
AC_MSG_RESULT(no))
|
||||||
|
|
||||||
|
-AC_CHECK_FUNC([pidfd_open], [enable_pwait=yes], [
|
||||||
|
+AC_CHECK_FUNC([pidfd_open], [enable_pidwait=yes], [
|
||||||
|
AC_MSG_CHECKING([for __NR_pidfd_open])
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#ifndef __NR_pidfd_open
|
||||||
|
#error __NR_pidfd_open not defined
|
||||||
|
#endif
|
||||||
|
- ])], [enable_pwait=yes], [enable_pwait=no])
|
||||||
|
- AC_MSG_RESULT([$enable_pwait])
|
||||||
|
+ ])], [enable_pidwait=yes], [enable_pidwait=no])
|
||||||
|
+ AC_MSG_RESULT([$enable_pidwait])
|
||||||
|
])
|
||||||
|
-if test "$enable_pwait" = yes; then
|
||||||
|
- AC_DEFINE([ENABLE_PWAIT], [1], [Enable pwait])
|
||||||
|
+if test "$enable_pidwait" = yes; then
|
||||||
|
+ AC_DEFINE([ENABLE_PIDWAIT], [1], [Enable pidwait])
|
||||||
|
fi
|
||||||
|
-AM_CONDITIONAL([BUILD_PWAIT], [test x$enable_pwait = xyes])
|
||||||
|
+AM_CONDITIONAL([BUILD_PIDWAIT], [test x$enable_pidwait = xyes])
|
||||||
|
|
||||||
|
dnl watch8bit must be before the AC_ARG_WITH set as it sets up ncurses
|
||||||
|
AC_SUBST([WITH_WATCH8BIT])
|
||||||
|
diff --git a/pgrep.1 b/pgrep.1
|
||||||
|
index 4f8907b..af6dcd5 100644
|
||||||
|
--- a/pgrep.1
|
||||||
|
+++ b/pgrep.1
|
||||||
|
@@ -9,7 +9,7 @@
|
||||||
|
.\"
|
||||||
|
.TH PGREP "1" "2020-06-04" "procps-ng" "User Commands"
|
||||||
|
.SH NAME
|
||||||
|
-pgrep, pkill, pwait \- look up, signal, or wait for processes based on name and other attributes
|
||||||
|
+pgrep, pkill, pidwait \- look up, signal, or wait for processes based on name and other attributes
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B pgrep
|
||||||
|
[options] pattern
|
||||||
|
@@ -17,7 +17,7 @@ pgrep, pkill, pwait \- look up, signal, or wait for processes based on name and
|
||||||
|
.B pkill
|
||||||
|
[options] pattern
|
||||||
|
.br
|
||||||
|
-.B pwait
|
||||||
|
+.B pidwait
|
||||||
|
[options] pattern
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B pgrep
|
||||||
|
@@ -45,7 +45,7 @@ will send the specified signal (by default
|
||||||
|
.BR SIGTERM )
|
||||||
|
to each process instead of listing them on stdout.
|
||||||
|
.PP
|
||||||
|
-.B pwait
|
||||||
|
+.B pidwait
|
||||||
|
will wait for each process instead of listing them on stdout.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
@@ -60,7 +60,7 @@ only.)
|
||||||
|
\fB\-c\fR, \fB\-\-count\fR
|
||||||
|
Suppress normal output; instead print a count of matching processes. When
|
||||||
|
count does not match anything, e.g. returns zero, the command will return
|
||||||
|
-non-zero value. Note that for pkill and pwait, the count is the number of
|
||||||
|
+non-zero value. Note that for pkill and pidwait, the count is the number of
|
||||||
|
matching processes, not the processes that were successfully signaled or waited
|
||||||
|
for.
|
||||||
|
.TP
|
||||||
|
@@ -88,7 +88,7 @@ translated into
|
||||||
|
.BR pgrep 's,
|
||||||
|
.BR pkill 's,
|
||||||
|
or
|
||||||
|
-.BR pwait 's
|
||||||
|
+.BR pidwait 's
|
||||||
|
own process group.
|
||||||
|
.TP
|
||||||
|
\fB\-G\fR, \fB\-\-group\fR \fIgid\fP,...
|
||||||
|
@@ -126,7 +126,7 @@ is translated into
|
||||||
|
.BR pgrep 's,
|
||||||
|
.BR pkill 's,
|
||||||
|
or
|
||||||
|
-.BR pwait 's
|
||||||
|
+.BR pidwait 's
|
||||||
|
own session ID.
|
||||||
|
.TP
|
||||||
|
\fB\-t\fR, \fB\-\-terminal\fR \fIterm\fP,...
|
||||||
|
@@ -145,7 +145,7 @@ symbolical value may be used.
|
||||||
|
Negates the matching. This option is usually used in
|
||||||
|
.BR pgrep 's
|
||||||
|
or
|
||||||
|
-.BR pwait 's
|
||||||
|
+.BR pidwait 's
|
||||||
|
context. In
|
||||||
|
.BR pkill 's
|
||||||
|
context the short option is disabled to avoid accidental usage of the option.
|
||||||
|
@@ -154,7 +154,7 @@ context the short option is disabled to avoid accidental usage of the option.
|
||||||
|
Shows all thread ids instead of pids in
|
||||||
|
.BR pgrep 's
|
||||||
|
or
|
||||||
|
-.BR pwait 's
|
||||||
|
+.BR pidwait 's
|
||||||
|
context. In
|
||||||
|
.BR pkill 's
|
||||||
|
context this option is disabled.
|
||||||
|
@@ -167,7 +167,7 @@ match the
|
||||||
|
.TP
|
||||||
|
\fB\-F\fR, \fB\-\-pidfile\fR \fIfile\fR
|
||||||
|
Read \fIPID\fRs from \fIfile\fR. This option is more useful for
|
||||||
|
-.BR pkill or pwait
|
||||||
|
+.BR pkill or pidwait
|
||||||
|
than
|
||||||
|
.BR pgrep .
|
||||||
|
.TP
|
||||||
|
@@ -237,7 +237,7 @@ $ renice +4 $(pgrep chrome)
|
||||||
|
.PD 0
|
||||||
|
.TP
|
||||||
|
0
|
||||||
|
-One or more processes matched the criteria. For pkill and pwait, one or more
|
||||||
|
+One or more processes matched the criteria. For pkill and pidwait, one or more
|
||||||
|
processes must also have been successfully signalled or waited for.
|
||||||
|
.TP
|
||||||
|
1
|
||||||
|
@@ -258,7 +258,7 @@ The running
|
||||||
|
.BR pgrep ,
|
||||||
|
.BR pkill ,
|
||||||
|
or
|
||||||
|
-.B pwait
|
||||||
|
+.B pidwait
|
||||||
|
process will never report itself as a
|
||||||
|
match.
|
||||||
|
.SH BUGS
|
||||||
|
diff --git a/pgrep.c b/pgrep.c
|
||||||
|
index 4fe5e8a..1905cd1 100644
|
||||||
|
--- a/pgrep.c
|
||||||
|
+++ b/pgrep.c
|
||||||
|
@@ -38,7 +38,7 @@
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
-#if defined(ENABLE_PWAIT) && !defined(HAVE_PIDFD_OPEN)
|
||||||
|
+#if defined(ENABLE_PIDWAIT) && !defined(HAVE_PIDFD_OPEN)
|
||||||
|
#include <sys/epoll.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#endif
|
||||||
|
@@ -68,8 +68,8 @@
|
||||||
|
static enum {
|
||||||
|
PGREP = 0,
|
||||||
|
PKILL,
|
||||||
|
-#ifdef ENABLE_PWAIT
|
||||||
|
- PWAIT,
|
||||||
|
+#ifdef ENABLE_PIDWAIT
|
||||||
|
+ PIDWAIT,
|
||||||
|
#endif
|
||||||
|
} prog_mode;
|
||||||
|
|
||||||
|
@@ -136,8 +136,8 @@ static int __attribute__ ((__noreturn__)) usage(int opt)
|
||||||
|
fputs(_(" -q, --queue <value> integer value to be sent with the signal\n"), fp);
|
||||||
|
fputs(_(" -e, --echo display what is killed\n"), fp);
|
||||||
|
break;
|
||||||
|
-#ifdef ENABLE_PWAIT
|
||||||
|
- case PWAIT:
|
||||||
|
+#ifdef ENABLE_PIDWAIT
|
||||||
|
+ case PIDWAIT:
|
||||||
|
fputs(_(" -e, --echo display PIDs before waiting\n"), fp);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
@@ -687,7 +687,7 @@ static struct el * select_procs (int *num)
|
||||||
|
xerrx(EXIT_FAILURE, _("internal error"));
|
||||||
|
}
|
||||||
|
|
||||||
|
- // pkill and pwait don't support -w, but this is checked in getopt
|
||||||
|
+ // pkill and pidwait don't support -w, but this is checked in getopt
|
||||||
|
if (opt_threads) {
|
||||||
|
while (readtask(ptp, &task, &subtask)){
|
||||||
|
// don't add redundant tasks
|
||||||
|
@@ -742,7 +742,7 @@ static int signal_option(int *argc, char **argv)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#if defined(ENABLE_PWAIT) && !defined(HAVE_PIDFD_OPEN)
|
||||||
|
+#if defined(ENABLE_PIDWAIT) && !defined(HAVE_PIDFD_OPEN)
|
||||||
|
static int pidfd_open (pid_t pid, unsigned int flags)
|
||||||
|
{
|
||||||
|
return syscall(__NR_pidfd_open, pid, flags);
|
||||||
|
@@ -793,9 +793,9 @@ static void parse_opts (int argc, char **argv)
|
||||||
|
{NULL, 0, NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
-#ifdef ENABLE_PWAIT
|
||||||
|
- if (strcmp (program_invocation_short_name, "pwait") == 0) {
|
||||||
|
- prog_mode = PWAIT;
|
||||||
|
+#ifdef ENABLE_PIDWAIT
|
||||||
|
+ if (strcmp (program_invocation_short_name, "pidwait") == 0) {
|
||||||
|
+ prog_mode = PIDWAIT;
|
||||||
|
strcat (opts, "e");
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
@@ -1008,7 +1008,7 @@ int main (int argc, char **argv)
|
||||||
|
int num;
|
||||||
|
int i;
|
||||||
|
int kill_count = 0;
|
||||||
|
-#ifdef ENABLE_PWAIT
|
||||||
|
+#ifdef ENABLE_PIDWAIT
|
||||||
|
int poll_count = 0;
|
||||||
|
int wait_count = 0;
|
||||||
|
int epollfd = epoll_create(1);
|
||||||
|
@@ -1055,8 +1055,8 @@ int main (int argc, char **argv)
|
||||||
|
fprintf(stdout, "%d\n", num);
|
||||||
|
return !kill_count;
|
||||||
|
|
||||||
|
-#ifdef ENABLE_PWAIT
|
||||||
|
- case PWAIT:
|
||||||
|
+#ifdef ENABLE_PIDWAIT
|
||||||
|
+ case PIDWAIT:
|
||||||
|
if (opt_count)
|
||||||
|
fprintf(stdout, "%d\n", num);
|
||||||
|
|
||||||
|
diff --git a/pwait.1 b/pidwait.1
|
||||||
|
similarity index 100%
|
||||||
|
rename from pwait.1
|
||||||
|
rename to pidwait.1
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
@ -0,0 +1,153 @@
|
|||||||
|
diff -up ./NEWS.ori ./NEWS
|
||||||
|
--- ./NEWS.ori 2022-08-15 11:59:35.929714848 +0200
|
||||||
|
+++ ./NEWS 2022-08-15 12:00:12.892937479 +0200
|
||||||
|
@@ -1,4 +1,14 @@
|
||||||
|
procps-ng-NEXT
|
||||||
|
+<<<<<<< HEAD
|
||||||
|
+=======
|
||||||
|
+ * library
|
||||||
|
+ Re-add elogind support merge #151
|
||||||
|
+ * ps: threads again display when -L is used with -q issue #234
|
||||||
|
+ * ps: proper aix format string behavior was restored
|
||||||
|
+ * sysctl: print dotted keys again
|
||||||
|
+
|
||||||
|
+procps-ng-4.0.0
|
||||||
|
+>>>>>>> b159c198 (sysctl: print dotted keys again)
|
||||||
|
---------------
|
||||||
|
* Rename pwait to pidwait
|
||||||
|
|
||||||
|
diff -up ./sysctl.c.ori ./sysctl.c
|
||||||
|
--- ./sysctl.c.ori 2022-08-15 11:59:35.934714878 +0200
|
||||||
|
+++ ./sysctl.c 2022-08-15 12:00:12.893937485 +0200
|
||||||
|
@@ -152,7 +152,7 @@ static SysctlSetting *setting_new(
|
||||||
|
strcat(path + proc_len, key+1);
|
||||||
|
else
|
||||||
|
strcat(path + proc_len, key);
|
||||||
|
- /* change . to / */
|
||||||
|
+ /* change . to / for path */
|
||||||
|
slashdot(path + proc_len, '.', '/');
|
||||||
|
|
||||||
|
s = xmalloc(sizeof(SysctlSetting));
|
||||||
|
@@ -510,7 +510,8 @@ static int WriteSetting(
|
||||||
|
|
||||||
|
int rc = EXIT_SUCCESS;
|
||||||
|
FILE *fp;
|
||||||
|
- struct stat ts;
|
||||||
|
+ struct stat ts;
|
||||||
|
+ char *dotted_key;
|
||||||
|
|
||||||
|
if (!key || !path)
|
||||||
|
return rc;
|
||||||
|
@@ -523,13 +524,22 @@ static int WriteSetting(
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if ((ts.st_mode & S_IWUSR) == 0) {
|
||||||
|
- xwarn(_("setting key \"%s\""), key);
|
||||||
|
+ /* Convert the globbed path into a dotted key */
|
||||||
|
+ if ( (dotted_key = strdup(path + strlen(PROC_PATH))) == NULL) {
|
||||||
|
+ xerrx(EXIT_FAILURE, _("strdup key"));
|
||||||
|
+ return EXIT_FAILURE;
|
||||||
|
+ }
|
||||||
|
+ slashdot(dotted_key, '/', '.');
|
||||||
|
+
|
||||||
|
+ if ((ts.st_mode & S_IWUSR) == 0) {
|
||||||
|
+ xwarn(_("setting key \"%s\""), dotted_key);
|
||||||
|
+ free(dotted_key);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (S_ISDIR(ts.st_mode)) {
|
||||||
|
- xwarn(_("setting key \"%s\""), key);
|
||||||
|
+ if (S_ISDIR(ts.st_mode)) {
|
||||||
|
+ xwarn(_("setting key \"%s\""), dotted_key);
|
||||||
|
+ free(dotted_key);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -539,7 +549,7 @@ static int WriteSetting(
|
||||||
|
case ENOENT:
|
||||||
|
if (!IgnoreError) {
|
||||||
|
xwarnx(_("\"%s\" is an unknown key%s"),
|
||||||
|
- key, (ignore_failure?_(", ignoring"):""));
|
||||||
|
+ dotted_key, (ignore_failure?_(", ignoring"):""));
|
||||||
|
if (!ignore_failure)
|
||||||
|
rc = EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
@@ -548,11 +558,11 @@ static int WriteSetting(
|
||||||
|
case EROFS:
|
||||||
|
case EACCES:
|
||||||
|
xwarnx(_("permission denied on key \"%s\"%s"),
|
||||||
|
- key, (ignore_failure?_(", ignoring"):""));
|
||||||
|
+ dotted_key, (ignore_failure?_(", ignoring"):""));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
xwarn(_("setting key \"%s\"%s"),
|
||||||
|
- key, (ignore_failure?_(", ignoring"):""));
|
||||||
|
+ dotted_key, (ignore_failure?_(", ignoring"):""));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!ignore_failure && errno != ENOENT)
|
||||||
|
@@ -561,7 +571,7 @@ static int WriteSetting(
|
||||||
|
if (0 < fprintf(fp, "%s\n", value))
|
||||||
|
rc = EXIT_SUCCESS;
|
||||||
|
if (close_stream(fp) != 0) {
|
||||||
|
- xwarn(_("setting key \"%s\""), path);
|
||||||
|
+ xwarn(_("setting key \"%s\""), dotted_key);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -571,7 +581,7 @@ static int WriteSetting(
|
||||||
|
printf("%s\n", value);
|
||||||
|
} else {
|
||||||
|
if (PrintName) {
|
||||||
|
- printf("%s = %s\n", path, value);
|
||||||
|
+ printf("%s = %s\n", dotted_key, value);
|
||||||
|
} else {
|
||||||
|
if (PrintNewline)
|
||||||
|
printf("%s\n", value);
|
||||||
|
@@ -580,6 +590,7 @@ static int WriteSetting(
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ free(dotted_key);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff -up ./testsuite/sysctl_slash_test.conf.ori ./testsuite/sysctl_slash_test.conf
|
||||||
|
--- ./testsuite/sysctl_slash_test.conf.ori 2022-08-15 12:00:12.894937491 +0200
|
||||||
|
+++ ./testsuite/sysctl_slash_test.conf 2022-08-15 12:00:12.893937485 +0200
|
||||||
|
@@ -0,0 +1 @@
|
||||||
|
+kernel/hostname = procps-test
|
||||||
|
diff -up ./testsuite/sysctl.test/sysctl_write.exp.ori ./testsuite/sysctl.test/sysctl_write.exp
|
||||||
|
--- ./testsuite/sysctl.test/sysctl_write.exp.ori 2022-08-15 11:59:35.934714878 +0200
|
||||||
|
+++ ./testsuite/sysctl.test/sysctl_write.exp 2022-08-15 12:00:12.893937485 +0200
|
||||||
|
@@ -3,11 +3,19 @@ set sysctl ${topdir}sysctl
|
||||||
|
|
||||||
|
set test "sysctl write from command line"
|
||||||
|
spawn $sysctl --dry-run kernel.hostname=procps-test
|
||||||
|
-expect_pass "$test" "/proc/sys/kernel/hostname = procps-test"
|
||||||
|
+expect_pass "$test" "kernel.hostname = procps-test"
|
||||||
|
+
|
||||||
|
+set test "sysctl write from command line using slash"
|
||||||
|
+spawn $sysctl --dry-run kernel/hostname=procps-test
|
||||||
|
+expect_pass "$test" "kernel.hostname = procps-test"
|
||||||
|
|
||||||
|
set test "sysctl write from configuration file"
|
||||||
|
spawn $sysctl --dry-run -f ${topdir}testsuite/sysctl_glob_test.conf
|
||||||
|
-expect_pass "$test" "/proc/sys/fs/protected_fifos = 2\\s+/proc/sys/fs/protected_symlinks = 2\\s+/proc/sys/fs/protected_hardlinks = 1"
|
||||||
|
+expect_pass "$test" "fs.protected_fifos = 2\\s+fs.protected_symlinks = 2\\s+fs.protected_hardlinks = 1"
|
||||||
|
+
|
||||||
|
+set test "sysctl write from file with slashes"
|
||||||
|
+spawn $sysctl --dry-run -f ${topdir}testsuite/sysctl_slash_test.conf
|
||||||
|
+expect_pass "$test" "kernel.hostname = procps-test"
|
||||||
|
|
||||||
|
set hostname_file "/proc/sys/kernel/hostname"
|
||||||
|
if {[file exists ${hostname_file}]} {
|
||||||
|
@@ -25,5 +33,5 @@ if {[file exists ${hostname_file}]} {
|
||||||
|
expect_spawn_retval "$test" 0
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
- unsupported "sysctl write: hostname file doe not exist"
|
||||||
|
+ unsupported "sysctl write: hostname file does not exist"
|
||||||
|
}
|
@ -0,0 +1,833 @@
|
|||||||
|
diff -up ./NEWS.ori ./NEWS
|
||||||
|
diff -up ./sysctl.c.ori ./sysctl.c
|
||||||
|
--- ./sysctl.c.ori 2021-02-09 11:11:25.000000000 +0100
|
||||||
|
+++ ./sysctl.c 2022-07-29 15:50:50.767380061 +0200
|
||||||
|
@@ -17,6 +17,7 @@
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
+ * Part of this code comes from systemd, especially sysctl.c
|
||||||
|
* Changelog:
|
||||||
|
* v1.01:
|
||||||
|
* - added -p <preload> to preload values from a file
|
||||||
|
@@ -40,6 +41,7 @@
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
+#include <ctype.h>
|
||||||
|
|
||||||
|
#include "c.h"
|
||||||
|
#include "fileutils.h"
|
||||||
|
@@ -66,12 +68,34 @@ static bool PrintName;
|
||||||
|
static bool PrintNewline;
|
||||||
|
static bool IgnoreError;
|
||||||
|
static bool Quiet;
|
||||||
|
+static bool DryRun;
|
||||||
|
static char *pattern;
|
||||||
|
|
||||||
|
#define LINELEN 4096
|
||||||
|
static char *iobuf;
|
||||||
|
static size_t iolen = LINELEN;
|
||||||
|
|
||||||
|
+typedef struct SysctlSetting {
|
||||||
|
+ char *key;
|
||||||
|
+ char *path;
|
||||||
|
+ char *value;
|
||||||
|
+ bool ignore_failure;
|
||||||
|
+ bool glob_exclude;
|
||||||
|
+ struct SysctlSetting *next;
|
||||||
|
+} SysctlSetting;
|
||||||
|
+
|
||||||
|
+typedef struct SettingList {
|
||||||
|
+ struct SysctlSetting *head;
|
||||||
|
+ struct SysctlSetting *tail;
|
||||||
|
+} SettingList;
|
||||||
|
+
|
||||||
|
+#define GLOB_CHARS "*?["
|
||||||
|
+static inline bool string_is_glob(const char *p)
|
||||||
|
+{
|
||||||
|
+ return !!strpbrk(p, GLOB_CHARS);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
/* Function prototypes. */
|
||||||
|
static int pattern_match(const char *string, const char *pat);
|
||||||
|
static int DisplayAll(const char *restrict const path);
|
||||||
|
@@ -100,6 +124,81 @@ static void slashdot(char *restrict p, c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void setting_free(SysctlSetting *s) {
|
||||||
|
+ if (!s)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ free(s->key);
|
||||||
|
+ free(s->path);
|
||||||
|
+ free(s->value);
|
||||||
|
+ free(s);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static SysctlSetting *setting_new(
|
||||||
|
+ const char *key,
|
||||||
|
+ const char *value,
|
||||||
|
+ bool ignore_failure,
|
||||||
|
+ bool glob_exclude) {
|
||||||
|
+
|
||||||
|
+ SysctlSetting *s = NULL;
|
||||||
|
+ char *path = NULL;
|
||||||
|
+ int proc_len;
|
||||||
|
+
|
||||||
|
+ proc_len = strlen(PROC_PATH);
|
||||||
|
+ /* used to open the file */
|
||||||
|
+ path = xmalloc(strlen(key) + proc_len + 2);
|
||||||
|
+ strcpy(path, PROC_PATH);
|
||||||
|
+ if (key[0] == '-')
|
||||||
|
+ strcat(path + proc_len, key+1);
|
||||||
|
+ else
|
||||||
|
+ strcat(path + proc_len, key);
|
||||||
|
+ /* change . to / */
|
||||||
|
+ slashdot(path + proc_len, '.', '/');
|
||||||
|
+
|
||||||
|
+ s = xmalloc(sizeof(SysctlSetting));
|
||||||
|
+
|
||||||
|
+ *s = (SysctlSetting) {
|
||||||
|
+ .key = strdup(key),
|
||||||
|
+ .path = path,
|
||||||
|
+ .value = value? strdup(value): NULL,
|
||||||
|
+ .ignore_failure = ignore_failure,
|
||||||
|
+ .glob_exclude = glob_exclude,
|
||||||
|
+ .next = NULL,
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ return s;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void settinglist_add(SettingList *l, SysctlSetting *s) {
|
||||||
|
+ SysctlSetting *old_tail;
|
||||||
|
+
|
||||||
|
+ if (!l)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (l->head == NULL)
|
||||||
|
+ l->head = s;
|
||||||
|
+
|
||||||
|
+ if (l->tail != NULL) {
|
||||||
|
+ old_tail = l->tail;
|
||||||
|
+ old_tail->next = s;
|
||||||
|
+ }
|
||||||
|
+ l->tail = s;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static SysctlSetting *settinglist_findpath(const SettingList *l, const char *path) {
|
||||||
|
+ SysctlSetting *node;
|
||||||
|
+
|
||||||
|
+ for (node=l->head; node != NULL; node = node->next) {
|
||||||
|
+ if (strcmp(node->path, path) == 0)
|
||||||
|
+ return node;
|
||||||
|
+ }
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* Function prototypes. */
|
||||||
|
+static int pattern_match(const char *string, const char *pat);
|
||||||
|
+static int DisplayAll(const char *restrict const path);
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Display the usage format
|
||||||
|
*/
|
||||||
|
@@ -115,6 +214,7 @@ static void __attribute__ ((__noreturn__
|
||||||
|
fputs(_(" -A alias of -a\n"), out);
|
||||||
|
fputs(_(" -X alias of -a\n"), out);
|
||||||
|
fputs(_(" --deprecated include deprecated parameters to listing\n"), out);
|
||||||
|
+ fputs(_(" --dry-run Print the key and values but do not write\n"), out);
|
||||||
|
fputs(_(" -b, --binary print value without new line\n"), out);
|
||||||
|
fputs(_(" -e, --ignore ignore unknown variables errors\n"), out);
|
||||||
|
fputs(_(" -N, --names print variable names without values\n"), out);
|
||||||
|
@@ -138,6 +238,39 @@ static void __attribute__ ((__noreturn__
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
+ * Strip left/leading side of a string
|
||||||
|
+ */
|
||||||
|
+static char *lstrip(char *line)
|
||||||
|
+{
|
||||||
|
+ char *start;
|
||||||
|
+
|
||||||
|
+ if (!line || !*line)
|
||||||
|
+ return line;
|
||||||
|
+
|
||||||
|
+ start = line;
|
||||||
|
+ while(isspace(*start)) start++;
|
||||||
|
+
|
||||||
|
+ return start;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Strip right/trailing side of a string
|
||||||
|
+ * by placing a \0
|
||||||
|
+ */
|
||||||
|
+static void rstrip(char *line)
|
||||||
|
+{
|
||||||
|
+ char *end;
|
||||||
|
+
|
||||||
|
+ if (!line || !*line)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ end = line + strlen(line) - 1;
|
||||||
|
+ while(end > line && isspace(*end)) end--;
|
||||||
|
+
|
||||||
|
+ end[1] = '\0';
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
* Strip the leading and trailing spaces from a string
|
||||||
|
*/
|
||||||
|
static char *StripLeadingAndTrailingSpaces(char *oneline)
|
||||||
|
@@ -166,7 +299,7 @@ static char *StripLeadingAndTrailingSpac
|
||||||
|
*/
|
||||||
|
static int ReadSetting(const char *restrict const name)
|
||||||
|
{
|
||||||
|
- int rc = 0;
|
||||||
|
+ int rc = EXIT_SUCCESS;
|
||||||
|
char *restrict tmpname;
|
||||||
|
char *restrict outname;
|
||||||
|
ssize_t rlen;
|
||||||
|
@@ -198,7 +331,7 @@ static int ReadSetting(const char *restr
|
||||||
|
if (stat(tmpname, &ts) < 0) {
|
||||||
|
if (!IgnoreError) {
|
||||||
|
xwarn(_("cannot stat %s"), tmpname);
|
||||||
|
- rc = -1;
|
||||||
|
+ rc = EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
@@ -215,7 +348,7 @@ static int ReadSetting(const char *restr
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pattern && !pattern_match(outname, pattern)) {
|
||||||
|
- rc = 0;
|
||||||
|
+ rc = EXIT_SUCCESS;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -231,19 +364,19 @@ static int ReadSetting(const char *restr
|
||||||
|
case ENOENT:
|
||||||
|
if (!IgnoreError) {
|
||||||
|
xwarnx(_("\"%s\" is an unknown key"), outname);
|
||||||
|
- rc = -1;
|
||||||
|
+ rc = EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EACCES:
|
||||||
|
xwarnx(_("permission denied on key '%s'"), outname);
|
||||||
|
- rc = -1;
|
||||||
|
+ rc = EXIT_FAILURE;
|
||||||
|
break;
|
||||||
|
case EIO: /* Ignore stable_secret below /proc/sys/net/ipv6/conf */
|
||||||
|
- rc = -1;
|
||||||
|
+ rc = EXIT_FAILURE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
xwarn(_("reading key \"%s\""), outname);
|
||||||
|
- rc = -1;
|
||||||
|
+ rc = EXIT_FAILURE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
@@ -279,7 +412,7 @@ static int ReadSetting(const char *restr
|
||||||
|
case EACCES:
|
||||||
|
xwarnx(_("permission denied on key '%s'"),
|
||||||
|
outname);
|
||||||
|
- rc = -1;
|
||||||
|
+ rc = EXIT_FAILURE;
|
||||||
|
break;
|
||||||
|
case EISDIR: {
|
||||||
|
size_t len;
|
||||||
|
@@ -291,11 +424,11 @@ static int ReadSetting(const char *restr
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
case EIO: /* Ignore stable_secret below /proc/sys/net/ipv6/conf */
|
||||||
|
- rc = -1;
|
||||||
|
+ rc = EXIT_FAILURE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
xwarnx(_("reading key \"%s\""), outname);
|
||||||
|
- rc = -1;
|
||||||
|
+ rc = EXIT_FAILURE;
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
@@ -323,7 +456,7 @@ static int is_deprecated(char *filename)
|
||||||
|
*/
|
||||||
|
static int DisplayAll(const char *restrict const path)
|
||||||
|
{
|
||||||
|
- int rc = 0;
|
||||||
|
+ int rc = EXIT_SUCCESS;
|
||||||
|
int rc2;
|
||||||
|
DIR *restrict dp;
|
||||||
|
struct dirent *restrict de;
|
||||||
|
@@ -333,7 +466,7 @@ static int DisplayAll(const char *restri
|
||||||
|
|
||||||
|
if (!dp) {
|
||||||
|
xwarnx(_("unable to open directory \"%s\""), path);
|
||||||
|
- rc = -1;
|
||||||
|
+ rc = EXIT_FAILURE;
|
||||||
|
} else {
|
||||||
|
readdir(dp); /* skip . */
|
||||||
|
readdir(dp); /* skip .. */
|
||||||
|
@@ -369,130 +502,183 @@ static int DisplayAll(const char *restri
|
||||||
|
/*
|
||||||
|
* Write a sysctl setting
|
||||||
|
*/
|
||||||
|
-static int WriteSetting(const char *setting)
|
||||||
|
-{
|
||||||
|
- int rc = 0;
|
||||||
|
- const char *name = setting;
|
||||||
|
- const char *value;
|
||||||
|
- const char *equals;
|
||||||
|
- char *tmpname;
|
||||||
|
- char *outname;
|
||||||
|
- char *last_dot;
|
||||||
|
- bool ignore_failure;
|
||||||
|
+static int WriteSetting(
|
||||||
|
+ const char *key,
|
||||||
|
+ const char *path,
|
||||||
|
+ const char *value,
|
||||||
|
+ const bool ignore_failure) {
|
||||||
|
|
||||||
|
- FILE *fp;
|
||||||
|
+ int rc = EXIT_SUCCESS;
|
||||||
|
+ FILE *fp;
|
||||||
|
struct stat ts;
|
||||||
|
|
||||||
|
- if (!name)
|
||||||
|
- /* probably don't want to display this err */
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
- equals = strchr(setting, '=');
|
||||||
|
-
|
||||||
|
- if (!equals) {
|
||||||
|
- xwarnx(_("\"%s\" must be of the form name=value"),
|
||||||
|
- setting);
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* point to the value in name=value */
|
||||||
|
- value = equals + 1;
|
||||||
|
-
|
||||||
|
- if (!*name || name == equals) {
|
||||||
|
- xwarnx(_("malformed setting \"%s\""), setting);
|
||||||
|
- return -2;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- ignore_failure = name[0] == '-';
|
||||||
|
- if (ignore_failure)
|
||||||
|
- name++;
|
||||||
|
+ if (!key || !path)
|
||||||
|
+ return rc;
|
||||||
|
|
||||||
|
- /* used to open the file */
|
||||||
|
- tmpname = xmalloc(equals - name + 1 + strlen(PROC_PATH));
|
||||||
|
- strcpy(tmpname, PROC_PATH);
|
||||||
|
- strncat(tmpname, name, (int) (equals - name));
|
||||||
|
- tmpname[equals - name + strlen(PROC_PATH)] = 0;
|
||||||
|
- /* change . to / */
|
||||||
|
- slashdot(tmpname + strlen(PROC_PATH), '.', '/');
|
||||||
|
-
|
||||||
|
- /* used to display the output */
|
||||||
|
- outname = xmalloc(equals - name + 1);
|
||||||
|
- strncpy(outname, name, (int) (equals - name));
|
||||||
|
- outname[equals - name] = 0;
|
||||||
|
- /* change / to . */
|
||||||
|
- slashdot(outname, '/', '.');
|
||||||
|
- last_dot = strrchr(outname, '.');
|
||||||
|
- if (last_dot != NULL && is_deprecated(last_dot + 1)) {
|
||||||
|
- xwarnx(_("%s is deprecated, value not set"), outname);
|
||||||
|
- goto out;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (stat(tmpname, &ts) < 0) {
|
||||||
|
+ if (stat(path, &ts) < 0) {
|
||||||
|
if (!IgnoreError) {
|
||||||
|
- xwarn(_("cannot stat %s"), tmpname);
|
||||||
|
- rc = -1;
|
||||||
|
+ xwarn(_("cannot stat %s"), path);
|
||||||
|
+ rc = EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
- goto out;
|
||||||
|
+ return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ts.st_mode & S_IWUSR) == 0) {
|
||||||
|
- xwarn(_("setting key \"%s\""), outname);
|
||||||
|
- goto out;
|
||||||
|
+ xwarn(_("setting key \"%s\""), key);
|
||||||
|
+ return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (S_ISDIR(ts.st_mode)) {
|
||||||
|
- xwarn(_("setting key \"%s\""), outname);
|
||||||
|
- goto out;
|
||||||
|
+ xwarn(_("setting key \"%s\""), key);
|
||||||
|
+ return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
- fp = fprocopen(tmpname, "w");
|
||||||
|
-
|
||||||
|
- if (!fp) {
|
||||||
|
- switch (errno) {
|
||||||
|
- case ENOENT:
|
||||||
|
- if (!IgnoreError) {
|
||||||
|
- xwarnx(_("\"%s\" is an unknown key%s"), outname, (ignore_failure?_(", ignoring"):""));
|
||||||
|
+ if (!DryRun) {
|
||||||
|
+ if ((fp = fprocopen(path, "w")) == NULL) {
|
||||||
|
+ switch (errno) {
|
||||||
|
+ case ENOENT:
|
||||||
|
+ if (!IgnoreError) {
|
||||||
|
+ xwarnx(_("\"%s\" is an unknown key%s"),
|
||||||
|
+ key, (ignore_failure?_(", ignoring"):""));
|
||||||
|
if (!ignore_failure)
|
||||||
|
- rc = -1;
|
||||||
|
+ rc = EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
- case EPERM:
|
||||||
|
- case EROFS:
|
||||||
|
- case EACCES:
|
||||||
|
- xwarnx(_("permission denied on key \"%s\"%s"), outname, (ignore_failure?_(", ignoring"):""));
|
||||||
|
- break;
|
||||||
|
- default:
|
||||||
|
- xwarn(_("setting key \"%s\"%s"), outname, (ignore_failure?_(", ignoring"):""));
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- if (!ignore_failure && errno != ENOENT)
|
||||||
|
- rc = -1;
|
||||||
|
- } else {
|
||||||
|
- rc = fprintf(fp, "%s\n", value);
|
||||||
|
- if (0 < rc)
|
||||||
|
- rc = 0;
|
||||||
|
- if (close_stream(fp) != 0)
|
||||||
|
- xwarn(_("setting key \"%s\""), outname);
|
||||||
|
- else if (rc == 0 && !Quiet) {
|
||||||
|
- if (NameOnly) {
|
||||||
|
- fprintf(stdout, "%s\n", outname);
|
||||||
|
- } else {
|
||||||
|
- if (PrintName) {
|
||||||
|
- fprintf(stdout, "%s = %s\n",
|
||||||
|
- outname, value);
|
||||||
|
- } else {
|
||||||
|
- if (PrintNewline)
|
||||||
|
- fprintf(stdout, "%s\n", value);
|
||||||
|
- else
|
||||||
|
- fprintf(stdout, "%s", value);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- out:
|
||||||
|
- free(tmpname);
|
||||||
|
- free(outname);
|
||||||
|
- return rc;
|
||||||
|
+ case EPERM:
|
||||||
|
+ case EROFS:
|
||||||
|
+ case EACCES:
|
||||||
|
+ xwarnx(_("permission denied on key \"%s\"%s"),
|
||||||
|
+ key, (ignore_failure?_(", ignoring"):""));
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ xwarn(_("setting key \"%s\"%s"),
|
||||||
|
+ key, (ignore_failure?_(", ignoring"):""));
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ if (!ignore_failure && errno != ENOENT)
|
||||||
|
+ rc = EXIT_FAILURE;
|
||||||
|
+ } else {
|
||||||
|
+ if (0 < fprintf(fp, "%s\n", value))
|
||||||
|
+ rc = EXIT_SUCCESS;
|
||||||
|
+ if (close_stream(fp) != 0) {
|
||||||
|
+ xwarn(_("setting key \"%s\""), path);
|
||||||
|
+ return rc;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ if ((rc == EXIT_SUCCESS && !Quiet) || DryRun) {
|
||||||
|
+ if (NameOnly) {
|
||||||
|
+ printf("%s\n", value);
|
||||||
|
+ } else {
|
||||||
|
+ if (PrintName) {
|
||||||
|
+ printf("%s = %s\n", path, value);
|
||||||
|
+ } else {
|
||||||
|
+ if (PrintNewline)
|
||||||
|
+ printf("%s\n", value);
|
||||||
|
+ else
|
||||||
|
+ printf("%s", value);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * parse each configuration line, there are multiple ways of specifying
|
||||||
|
+ * a key/value here:
|
||||||
|
+ *
|
||||||
|
+ * key = value simple setting
|
||||||
|
+ * -key = value ignore errors
|
||||||
|
+ * key.pattern.*.with.glob = value set keys that match glob
|
||||||
|
+ * -key.pattern.exclude.with.glob dont set this value
|
||||||
|
+ * key.pattern.override.with.glob = value set this glob match to value
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+static SysctlSetting *parse_setting_line(
|
||||||
|
+ const char *path,
|
||||||
|
+ const int linenum,
|
||||||
|
+ char *line)
|
||||||
|
+{
|
||||||
|
+ SysctlSetting *s;
|
||||||
|
+ char *key;
|
||||||
|
+ char *value;
|
||||||
|
+ bool glob_exclude = FALSE;
|
||||||
|
+ bool ignore_failure = FALSE;
|
||||||
|
+
|
||||||
|
+ key = lstrip(line);
|
||||||
|
+ if (strlen(key) < 2)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ /* skip over comments */
|
||||||
|
+ if (key[0] == '#' || key[0] == ';')
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ if (pattern && !pattern_match(key, pattern))
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ value = strchr(key, '=');
|
||||||
|
+ if (value == NULL) {
|
||||||
|
+ if (key[0] == '-') {
|
||||||
|
+ glob_exclude = TRUE;
|
||||||
|
+ key++;
|
||||||
|
+ value = NULL;
|
||||||
|
+ rstrip(key);
|
||||||
|
+ } else {
|
||||||
|
+ xwarnx(_("%s(%d): invalid syntax, continuing..."),
|
||||||
|
+ path, linenum);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ value[0]='\0';
|
||||||
|
+ if (key[0] == '-') {
|
||||||
|
+ ignore_failure = TRUE;
|
||||||
|
+ key++;
|
||||||
|
+ }
|
||||||
|
+ value++; // skip over =
|
||||||
|
+ value=lstrip(value);
|
||||||
|
+ rstrip(value);
|
||||||
|
+ rstrip(key);
|
||||||
|
+ }
|
||||||
|
+ return setting_new(key, value, ignore_failure, glob_exclude);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* Go through the setting list, expand and sort out
|
||||||
|
+ * setting globs and actually write the settings out
|
||||||
|
+ */
|
||||||
|
+static int write_setting_list(const SettingList *sl)
|
||||||
|
+{
|
||||||
|
+ SysctlSetting *node;
|
||||||
|
+ int rc = EXIT_SUCCESS;
|
||||||
|
+
|
||||||
|
+ for (node=sl->head; node != NULL; node=node->next) {
|
||||||
|
+ if (node->glob_exclude)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ if (string_is_glob(node->path)) {
|
||||||
|
+ char *gl_path;
|
||||||
|
+ glob_t globbuf;
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ if (glob(node->path, 0, NULL, &globbuf) != 0)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ for(i=0; i < globbuf.gl_pathc; i++) {
|
||||||
|
+ if (settinglist_findpath(sl, globbuf.gl_pathv[i]))
|
||||||
|
+ continue; // override or exclude
|
||||||
|
+
|
||||||
|
+ rc |= WriteSetting(node->key, globbuf.gl_pathv[i], node->value,
|
||||||
|
+ node->ignore_failure);
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ rc |= WriteSetting(node->key, node->path, node->value,
|
||||||
|
+ node->ignore_failure);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pattern_match(const char *string, const char *pat)
|
||||||
|
@@ -513,12 +699,12 @@ static int pattern_match(const char *str
|
||||||
|
* Preload the sysctl's from the conf file. We parse the file and then
|
||||||
|
* reform it (strip out whitespace).
|
||||||
|
*/
|
||||||
|
-static int Preload(const char *restrict const filename)
|
||||||
|
+static int Preload(SettingList *setlist, const char *restrict const filename)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
char *t;
|
||||||
|
int n = 0;
|
||||||
|
- int rc = 0;
|
||||||
|
+ int rc = EXIT_SUCCESS;
|
||||||
|
ssize_t rlen;
|
||||||
|
char *name, *value;
|
||||||
|
glob_t globbuf;
|
||||||
|
@@ -547,62 +733,26 @@ static int Preload(const char *restrict
|
||||||
|
? stdin : fopen(globbuf.gl_pathv[j], "r");
|
||||||
|
if (!fp) {
|
||||||
|
xwarn(_("cannot open \"%s\""), globbuf.gl_pathv[j]);
|
||||||
|
- rc = -1;
|
||||||
|
- goto out;
|
||||||
|
+ return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((rlen = getline(&iobuf, &iolen, fp)) > 0) {
|
||||||
|
size_t offset;
|
||||||
|
+ SysctlSetting *setting;
|
||||||
|
|
||||||
|
n++;
|
||||||
|
|
||||||
|
if (rlen < 2)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- t = StripLeadingAndTrailingSpaces(iobuf);
|
||||||
|
- if (strlen(t) < 2)
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
- if (*t == '#' || *t == ';')
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
- name = strtok(t, "=");
|
||||||
|
- if (!name || !*name) {
|
||||||
|
- xwarnx(_("%s(%d): invalid syntax, continuing..."),
|
||||||
|
- globbuf.gl_pathv[j], n);
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- StripLeadingAndTrailingSpaces(name);
|
||||||
|
-
|
||||||
|
- if (pattern && !pattern_match(name, pattern))
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
- offset = strlen(name);
|
||||||
|
- memmove(&iobuf[0], name, offset);
|
||||||
|
- iobuf[offset++] = '=';
|
||||||
|
-
|
||||||
|
- value = strtok(NULL, "\n\r");
|
||||||
|
- if (!value || !*value) {
|
||||||
|
- xwarnx(_("%s(%d): invalid syntax, continuing..."),
|
||||||
|
- globbuf.gl_pathv[j], n);
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- while ((*value == ' ' || *value == '\t') && *value != 0)
|
||||||
|
- value++;
|
||||||
|
-
|
||||||
|
- /* should NameOnly affect this? */
|
||||||
|
- memmove(&iobuf[offset], value, strlen(value));
|
||||||
|
- offset += strlen(value);
|
||||||
|
- iobuf[offset] = '\0';
|
||||||
|
-
|
||||||
|
- rc |= WriteSetting(iobuf);
|
||||||
|
+ if ( (setting = parse_setting_line(globbuf.gl_pathv[j], n, iobuf))
|
||||||
|
+ == NULL)
|
||||||
|
+ continue;
|
||||||
|
+ settinglist_add(setlist, setting);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
-out:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -618,7 +768,7 @@ static int sortpairs(const void *A, cons
|
||||||
|
return strcmp(a->name, b->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int PreloadSystem(void)
|
||||||
|
+static int PreloadSystem(SettingList *setlist)
|
||||||
|
{
|
||||||
|
unsigned di, i;
|
||||||
|
const char *dirs[] = {
|
||||||
|
@@ -630,7 +780,7 @@ static int PreloadSystem(void)
|
||||||
|
};
|
||||||
|
struct pair **cfgs = NULL;
|
||||||
|
unsigned ncfgs = 0;
|
||||||
|
- int rc = 0;
|
||||||
|
+ int rc = EXIT_SUCCESS;
|
||||||
|
struct stat ts;
|
||||||
|
enum { nprealloc = 16 };
|
||||||
|
|
||||||
|
@@ -688,14 +838,14 @@ static int PreloadSystem(void)
|
||||||
|
for (i = 0; i < ncfgs; ++i) {
|
||||||
|
if (!Quiet)
|
||||||
|
printf(_("* Applying %s ...\n"), cfgs[i]->value);
|
||||||
|
- rc |= Preload(cfgs[i]->value);
|
||||||
|
+ rc |= Preload(setlist, cfgs[i]->value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (stat(DEFAULT_PRELOAD, &ts) == 0 && S_ISREG(ts.st_mode)) {
|
||||||
|
if (!Quiet)
|
||||||
|
printf(_("* Applying %s ...\n"), DEFAULT_PRELOAD);
|
||||||
|
- rc |= Preload(DEFAULT_PRELOAD);
|
||||||
|
+ rc |= Preload(setlist, DEFAULT_PRELOAD);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cleaning */
|
||||||
|
@@ -717,15 +867,19 @@ int main(int argc, char *argv[])
|
||||||
|
bool preloadfileOpt = false;
|
||||||
|
int ReturnCode = 0;
|
||||||
|
int c;
|
||||||
|
+ int rc;
|
||||||
|
const char *preloadfile = NULL;
|
||||||
|
+ SettingList *setlist;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
DEPRECATED_OPTION = CHAR_MAX + 1,
|
||||||
|
- SYSTEM_OPTION
|
||||||
|
+ SYSTEM_OPTION,
|
||||||
|
+ DRYRUN_OPTION
|
||||||
|
};
|
||||||
|
static const struct option longopts[] = {
|
||||||
|
{"all", no_argument, NULL, 'a'},
|
||||||
|
{"deprecated", no_argument, NULL, DEPRECATED_OPTION},
|
||||||
|
+ {"dry-run", no_argument, NULL, DRYRUN_OPTION},
|
||||||
|
{"binary", no_argument, NULL, 'b'},
|
||||||
|
{"ignore", no_argument, NULL, 'e'},
|
||||||
|
{"names", no_argument, NULL, 'N'},
|
||||||
|
@@ -753,6 +907,10 @@ int main(int argc, char *argv[])
|
||||||
|
IgnoreError = false;
|
||||||
|
Quiet = false;
|
||||||
|
IgnoreDeprecated = true;
|
||||||
|
+ DryRun = false;
|
||||||
|
+ setlist = xmalloc(sizeof(SettingList));
|
||||||
|
+ setlist->head = NULL;
|
||||||
|
+ setlist->tail = NULL;
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
Usage(stderr);
|
||||||
|
@@ -805,7 +963,12 @@ int main(int argc, char *argv[])
|
||||||
|
break;
|
||||||
|
case SYSTEM_OPTION:
|
||||||
|
IgnoreError = true;
|
||||||
|
- return PreloadSystem();
|
||||||
|
+ rc |= PreloadSystem(setlist);
|
||||||
|
+ rc |= write_setting_list(setlist);
|
||||||
|
+ return rc;
|
||||||
|
+ case DRYRUN_OPTION:
|
||||||
|
+ DryRun = true;
|
||||||
|
+ break;
|
||||||
|
case 'r':
|
||||||
|
pattern = xstrdup(optarg);
|
||||||
|
break;
|
||||||
|
@@ -833,15 +996,16 @@ int main(int argc, char *argv[])
|
||||||
|
int ret = EXIT_SUCCESS, i;
|
||||||
|
if (!preloadfile) {
|
||||||
|
if (!argc) {
|
||||||
|
- ret |= Preload(DEFAULT_PRELOAD);
|
||||||
|
+ ret |= Preload(setlist, DEFAULT_PRELOAD);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* This happens when -pfile option is
|
||||||
|
* used without space. */
|
||||||
|
- ret |= Preload(preloadfile);
|
||||||
|
+ ret |= Preload(setlist, preloadfile);
|
||||||
|
}
|
||||||
|
for (i = 0; i < argc; i++)
|
||||||
|
- ret |= Preload(argv[i]);
|
||||||
|
+ ret |= Preload(setlist, argv[i]);
|
||||||
|
+ ret |= write_setting_list(setlist);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -855,9 +1019,14 @@ int main(int argc, char *argv[])
|
||||||
|
program_invocation_short_name);
|
||||||
|
|
||||||
|
for ( ; *argv; argv++) {
|
||||||
|
- if (WriteMode || strchr(*argv, '='))
|
||||||
|
- ReturnCode += WriteSetting(*argv);
|
||||||
|
- else
|
||||||
|
+ if (WriteMode || strchr(*argv, '=')) {
|
||||||
|
+ SysctlSetting *s;
|
||||||
|
+ if ( (s = parse_setting_line("command line", 0, *argv)) != NULL)
|
||||||
|
+ ReturnCode |= WriteSetting(s->key, s->path, s->value,
|
||||||
|
+ s->ignore_failure);
|
||||||
|
+ else
|
||||||
|
+ ReturnCode |= EXIT_FAILURE;
|
||||||
|
+ } else
|
||||||
|
ReturnCode += ReadSetting(*argv);
|
||||||
|
}
|
||||||
|
return ReturnCode;
|
||||||
|
diff -up ./testsuite/config/unix.exp.ori ./testsuite/config/unix.exp
|
||||||
|
--- ./testsuite/config/unix.exp.ori 2021-02-09 11:11:25.000000000 +0100
|
||||||
|
+++ ./testsuite/config/unix.exp 2022-07-29 15:50:50.768380067 +0200
|
||||||
|
@@ -136,6 +136,15 @@ proc expect_table_dsc { test match_heade
|
||||||
|
#}
|
||||||
|
}
|
||||||
|
|
||||||
|
+proc expect_spawn_retval { test retval } {
|
||||||
|
+ foreach {pid spawnid os_error_flag value} [wait] break
|
||||||
|
+
|
||||||
|
+ if {$value == $retval} {
|
||||||
|
+ return
|
||||||
|
+ }
|
||||||
|
+ fail "$test (exit value)"
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
proc make_pipeproc { } {
|
||||||
|
global pipeproc_pid pipeproc_spawnid topdir
|
||||||
|
|
||||||
|
diff -up ./testsuite/sysctl_glob_test.conf.ori ./testsuite/sysctl_glob_test.conf
|
||||||
|
--- ./testsuite/sysctl_glob_test.conf.ori 2022-07-29 15:50:50.768380067 +0200
|
||||||
|
+++ ./testsuite/sysctl_glob_test.conf 2022-07-29 15:50:50.768380067 +0200
|
||||||
|
@@ -0,0 +1,6 @@
|
||||||
|
+#
|
||||||
|
+# Test configuration for for glob in sysctl
|
||||||
|
+#
|
||||||
|
+fs.protected_* = 2
|
||||||
|
+fs.protected_hardlinks = 1
|
||||||
|
+-fs.protected_regular
|
||||||
|
diff -up ./testsuite/sysctl.test/sysctl_write.exp.ori ./testsuite/sysctl.test/sysctl_write.exp
|
||||||
|
--- ./testsuite/sysctl.test/sysctl_write.exp.ori 2022-07-29 15:50:50.768380067 +0200
|
||||||
|
+++ ./testsuite/sysctl.test/sysctl_write.exp 2022-07-29 15:50:50.768380067 +0200
|
||||||
|
@@ -0,0 +1,29 @@
|
||||||
|
+
|
||||||
|
+set sysctl ${topdir}sysctl
|
||||||
|
+
|
||||||
|
+set test "sysctl write from command line"
|
||||||
|
+spawn $sysctl --dry-run kernel.hostname=procps-test
|
||||||
|
+expect_pass "$test" "/proc/sys/kernel/hostname = procps-test"
|
||||||
|
+
|
||||||
|
+set test "sysctl write from configuration file"
|
||||||
|
+spawn $sysctl --dry-run -f ${topdir}testsuite/sysctl_glob_test.conf
|
||||||
|
+expect_pass "$test" "/proc/sys/fs/protected_fifos = 2\\s+/proc/sys/fs/protected_symlinks = 2\\s+/proc/sys/fs/protected_hardlinks = 1"
|
||||||
|
+
|
||||||
|
+set hostname_file "/proc/sys/kernel/hostname"
|
||||||
|
+if {[file exists ${hostname_file}]} {
|
||||||
|
+ if {[file writable ${hostname_file}]} {
|
||||||
|
+ unsupported "sysctl write: hostname file is writable"
|
||||||
|
+ } else {
|
||||||
|
+ set test "sysctl write unwritable file"
|
||||||
|
+ spawn $sysctl -q kernel.hostname=procpstest
|
||||||
|
+ expect_pass "$test" "sysctl: permission denied on key \"kernel.hostname\"\\s*$"
|
||||||
|
+ expect_spawn_retval "$test" 1
|
||||||
|
+
|
||||||
|
+ set test "sysctl write unwritable file ignored"
|
||||||
|
+ spawn $sysctl -q -- -kernel.hostname=procpstest
|
||||||
|
+ expect_pass "$test" "sysctl: permission denied on key \"kernel.hostname\", ignoring\\s*$"
|
||||||
|
+ expect_spawn_retval "$test" 0
|
||||||
|
+ }
|
||||||
|
+} else {
|
||||||
|
+ unsupported "sysctl write: hostname file doe not exist"
|
||||||
|
+}
|
@ -0,0 +1,40 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,482 @@
|
|||||||
|
# The testsuite is unsuitable for running on buildsystems
|
||||||
|
%global tests_enabled 0
|
||||||
|
|
||||||
|
Summary: System and process monitoring utilities
|
||||||
|
Name: procps-ng
|
||||||
|
Version: 3.3.17
|
||||||
|
Release: 8%{?dist}
|
||||||
|
License: GPL+ and GPLv2 and GPLv2+ and GPLv3+ and LGPLv2+
|
||||||
|
URL: https://sourceforge.net/projects/procps-ng/
|
||||||
|
|
||||||
|
Source0: https://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
|
||||||
|
|
||||||
|
Patch1: pwait-to-pidwait.patch
|
||||||
|
Patch2: covscan_findings.patch
|
||||||
|
Patch3: uptime-pretty-mod.patch
|
||||||
|
Patch4: free-new-used-calc.patch
|
||||||
|
Patch5: sysctl-support-systemd-globs.patch
|
||||||
|
Patch6: sysctl-print-dotted-keys-again.patch
|
||||||
|
Patch7: pgrep-uid-gid-overflow-backport.patch
|
||||||
|
|
||||||
|
|
||||||
|
BuildRequires: make
|
||||||
|
BuildRequires: ncurses-devel
|
||||||
|
BuildRequires: libtool
|
||||||
|
BuildRequires: autoconf
|
||||||
|
BuildRequires: automake
|
||||||
|
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
|
||||||
|
|
||||||
|
# usrmove hack - will be removed once initscripts are fixed
|
||||||
|
Provides: /sbin/sysctl
|
||||||
|
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,
|
||||||
|
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
|
||||||
|
system. The skill command sends a terminate command (or another
|
||||||
|
specified signal) to a specified set of processes. The snice
|
||||||
|
command is used to change the scheduling priority of specified
|
||||||
|
processes. The tload command prints a graph of the current system
|
||||||
|
load average to a specified tty. The uptime command displays the
|
||||||
|
current time, how long the system has been running, how many users
|
||||||
|
are logged on, and system load averages for the past one, five,
|
||||||
|
and fifteen minutes. The w command displays a list of the users
|
||||||
|
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. The pidwait command
|
||||||
|
waits for processes of specified names.
|
||||||
|
|
||||||
|
%package devel
|
||||||
|
Summary: System and process monitoring utilities
|
||||||
|
Requires: %{name}%{?_isa} = %{version}-%{release}
|
||||||
|
Provides: procps-devel = %{version}-%{release}
|
||||||
|
Obsoletes: procps-devel < 3.2.9-1
|
||||||
|
|
||||||
|
%description devel
|
||||||
|
System and process monitoring utilities development headers
|
||||||
|
|
||||||
|
%package i18n
|
||||||
|
Summary: Internationalization pack for procps-ng
|
||||||
|
Requires: %{name} = %{version}-%{release}
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
# fortunately the same release number for f21 and f22
|
||||||
|
Conflicts: man-pages-de < 1.7-3
|
||||||
|
Conflicts: man-pages-fr < 3.66-3
|
||||||
|
Conflicts: man-pages-pl < 0.7-5
|
||||||
|
|
||||||
|
%description i18n
|
||||||
|
Internationalization pack for procps-ng
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%setup -q -n procps-%{version}
|
||||||
|
%autopatch -p1
|
||||||
|
|
||||||
|
cp -p %{SOURCE1} .
|
||||||
|
cp -p %{SOURCE2} top/
|
||||||
|
|
||||||
|
%build
|
||||||
|
# The following stuff is needed for git archives only
|
||||||
|
#echo "%{version}" > .tarball-version
|
||||||
|
#./autogen.sh
|
||||||
|
|
||||||
|
autoreconf --verbose --force --install
|
||||||
|
|
||||||
|
%configure \
|
||||||
|
--exec-prefix=/ \
|
||||||
|
--docdir=/unwanted \
|
||||||
|
--disable-static \
|
||||||
|
--disable-w-from \
|
||||||
|
--disable-kill \
|
||||||
|
--enable-watch8bit \
|
||||||
|
--enable-skill \
|
||||||
|
--enable-sigwinch \
|
||||||
|
--enable-libselinux \
|
||||||
|
--with-systemd \
|
||||||
|
--disable-modern-top\
|
||||||
|
--enable-pidwait
|
||||||
|
|
||||||
|
make CFLAGS="%{optflags}"
|
||||||
|
|
||||||
|
|
||||||
|
%if %{tests_enabled}
|
||||||
|
%check
|
||||||
|
make check
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
%make_install
|
||||||
|
|
||||||
|
# these are created by make, yet empty. This causes rpmbuild errors.
|
||||||
|
rm -rf %{buildroot}%{_mandir}/{pl,pt_BR,sv}/man5
|
||||||
|
|
||||||
|
%find_lang %{name} --all-name --with-man
|
||||||
|
|
||||||
|
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
|
||||||
|
%license COPYING COPYING.LIB
|
||||||
|
%{_libdir}/libprocps.so.*
|
||||||
|
%{_bindir}/*
|
||||||
|
%{_sbindir}/*
|
||||||
|
%{_mandir}/man1/*
|
||||||
|
%{_mandir}/man8/*
|
||||||
|
%{_mandir}/man5/*
|
||||||
|
|
||||||
|
|
||||||
|
%exclude %{_libdir}/libprocps.la
|
||||||
|
%exclude /unwanted/*
|
||||||
|
|
||||||
|
%files devel
|
||||||
|
%license COPYING COPYING.LIB
|
||||||
|
%{_libdir}/libprocps.so
|
||||||
|
%{_libdir}/pkgconfig/libprocps.pc
|
||||||
|
%{_includedir}/proc
|
||||||
|
%{_mandir}/man3/*
|
||||||
|
|
||||||
|
%files i18n -f %{name}.lang
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* Thu Aug 18 2022 Jan Rybar <jrybar@redhat.com> - 3.3.17-8
|
||||||
|
- pgrep: uid/gid overflow fix backport
|
||||||
|
- Resolves: rhbz#2119083
|
||||||
|
|
||||||
|
* Mon Aug 15 2022 Jan Rybar <jrybar@redhat.com> - 3.3.17-7
|
||||||
|
- sysctl: backport - keys with dots instead of slashes again
|
||||||
|
- Resolves: rhbz#2116977
|
||||||
|
- Related: rhbz#2052536
|
||||||
|
|
||||||
|
* Fri Jul 29 2022 Jan Rybar <jrybar@redhat.com> - 3.3.17-6
|
||||||
|
- free: backport new 'used' calculation
|
||||||
|
- sysctl: backport support of systemd glob patterns
|
||||||
|
- Resolves: rhbz#2003033
|
||||||
|
- Resolves: rhbz#2052536
|
||||||
|
|
||||||
|
* Fri Mar 25 2022 Jan Rybar <jrybar@redhat.com> - 3.3.17-5
|
||||||
|
- uptime: human readable data not shown if 364 days up
|
||||||
|
- Resolves: rhbz#2067166
|
||||||
|
|
||||||
|
* Tue Aug 10 2021 Mohan Boddu <mboddu@redhat.com> - 3.3.17-4
|
||||||
|
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
|
||||||
|
Related: rhbz#1991688
|
||||||
|
|
||||||
|
* Fri Jul 09 2021 Jan Rybar <jrybar@redhat.com> - 3.3.17-3
|
||||||
|
- Coverity scan findings fix
|
||||||
|
- Resolves: rhbz#1938848
|
||||||
|
|
||||||
|
* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 3.3.17-2
|
||||||
|
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
|
||||||
|
|
||||||
|
* 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
|
||||||
|
|
||||||
|
* Fri Feb 09 2018 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 3.3.10-18
|
||||||
|
- Escape macros in %%changelog
|
||||||
|
|
||||||
|
* Fri Feb 09 2018 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.10-17
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
|
||||||
|
|
||||||
|
* Sat Feb 03 2018 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 3.3.10-16
|
||||||
|
- Switch to %%ldconfig_scriptlets
|
||||||
|
|
||||||
|
* Thu Aug 03 2017 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.10-15
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Jul 27 2017 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.10-14
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
|
||||||
|
|
||||||
|
* Sat Feb 11 2017 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.10-13
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon Nov 28 2016 Lubomir Rintel - 3.3.10-12
|
||||||
|
- Fix FTBFS with new systemd
|
||||||
|
|
||||||
|
* Thu Feb 04 2016 Fedora Release Engineering <releng@fedoraproject.org> - 3.3.10-11
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Jan 14 2016 Jaromir Capik <jcapik@redhat.com> - 3.3.10-10
|
||||||
|
- Enhancing find_elf_note to allow calling lib functions with dlopen (#1287752)
|
||||||
|
|
||||||
|
* Fri Aug 14 2015 Adam Jackson <ajax@redhat.com> 3.3.10-9
|
||||||
|
- Use %%configure so the hardened cflags get applied correctly
|
||||||
|
|
||||||
|
* Mon Aug 10 2015 Jaromir Capik <jcapik@redhat.com> - 3.3.10-8
|
||||||
|
- Fixing crashes in 'top' when a deep forking appears (#1153642)
|
||||||
|
|
||||||
|
* Thu Jun 18 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.3.10-7
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
|
||||||
|
|
||||||
|
* Sat Feb 21 2015 Till Maas <opensource@till.name> - 3.3.10-6
|
||||||
|
- Rebuilt for Fedora 23 Change
|
||||||
|
https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-independent_code
|
||||||
|
|
||||||
|
* Tue Nov 25 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.10-5
|
||||||
|
- Fixing locale dirs ownership (#1167443)
|
||||||
|
|
||||||
|
* Mon Oct 20 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.10-4
|
||||||
|
- Bringing the old 'top' defaults back (#1153049)
|
||||||
|
|
||||||
|
* Mon Oct 06 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.10-3
|
||||||
|
- Resolving file conflicts with man-pages-*
|
||||||
|
- Replacing hardcoded paths with macros
|
||||||
|
- Making the i18n subpackage noarch
|
||||||
|
|
||||||
|
* Tue Sep 30 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.10-2
|
||||||
|
- Removing explicit dependency on systemd-libs
|
||||||
|
- Removing /etc/sysctl.d (ownership quietly stolen by systemd)
|
||||||
|
|
||||||
|
* Tue Sep 09 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.10-1
|
||||||
|
- Upgrading to 3.3.10
|
||||||
|
|
||||||
|
* Sun Aug 17 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.3.9-12
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Jul 31 2014 Tom Callaway <spot@fedoraproject.org> - 3.3.9-11
|
||||||
|
- fix license handling
|
||||||
|
|
||||||
|
* Sat Jun 07 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.3.9-10
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Apr 30 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-9
|
||||||
|
- Dropping Cached -= Shmem (#963799)
|
||||||
|
|
||||||
|
* Tue Apr 08 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-8
|
||||||
|
- Documenting the 't' process state code in the ps manual (#946864)
|
||||||
|
|
||||||
|
* Fri Mar 14 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-7
|
||||||
|
- Fixing sysctl line length limit (#1071530)
|
||||||
|
|
||||||
|
* Thu Feb 27 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-6
|
||||||
|
- Subtracting Shmem from Cached (#1070736)
|
||||||
|
|
||||||
|
* Wed Feb 05 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-5
|
||||||
|
- Support for timestamps & wide diskstat (#1053428, #1025833)
|
||||||
|
- Fixing fd leak in watch
|
||||||
|
- Fixing format-security build issues
|
||||||
|
|
||||||
|
* Fri Jan 24 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-4
|
||||||
|
- Skipping trailing zeros in read_unvectored (#1057600)
|
||||||
|
|
||||||
|
* Mon Jan 20 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-3
|
||||||
|
- 'vmstat -w' was not wide enough (#1025833)
|
||||||
|
|
||||||
|
* Tue Jan 07 2014 Jaromir Capik <jcapik@redhat.com> - 3.3.9-2
|
||||||
|
- Replacing the /sbin/pidof wrapper with symlink
|
||||||
|
|
||||||
|
* Tue Dec 03 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.9-1
|
||||||
|
- Update to 3.3.9
|
||||||
|
|
||||||
|
* Mon Nov 04 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-17
|
||||||
|
- Fixing pidof compilation warnings
|
||||||
|
- RPM workaround - changing sysvinit-tools Conflicts/Obsoletes (#1026504)
|
||||||
|
|
||||||
|
* Wed Oct 16 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-16
|
||||||
|
- Introducing pidof (#987064)
|
||||||
|
|
||||||
|
* Tue Sep 17 2013 Aristeu Rozanski <aris@redhat.com> - 3.3.8-15
|
||||||
|
- Introduce namespaces support (#1016242)
|
||||||
|
|
||||||
|
* Tue Sep 17 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-14
|
||||||
|
- top: Fixing missing newline when running in the batch mode (#1008674)
|
||||||
|
|
||||||
|
* Fri Aug 09 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-13
|
||||||
|
- Including forgotten man fixes (#948522)
|
||||||
|
|
||||||
|
* Wed Aug 07 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-12
|
||||||
|
- Fixing the license tag
|
||||||
|
|
||||||
|
* Wed Aug 07 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-11
|
||||||
|
- Support for libselinux (#975459)
|
||||||
|
- Support for systemd (#994457)
|
||||||
|
- Support for 'Shmem' in free (#993271)
|
||||||
|
|
||||||
|
* Sun Aug 04 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.3.8-10
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
|
||||||
|
|
||||||
|
* Fri Jul 19 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-9
|
||||||
|
- RH man page scan (#948522)
|
||||||
|
|
||||||
|
* Tue Jul 02 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-8
|
||||||
|
- Extending the end-of-job patch disabling the screen content restoration
|
||||||
|
|
||||||
|
* Mon Jul 01 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-7
|
||||||
|
- Disabling screen content restoration when exiting 'top' (#977561)
|
||||||
|
- Enabling SIGWINCH flood prevention
|
||||||
|
|
||||||
|
* Wed Jun 26 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-6
|
||||||
|
- Avoiding "write error" messages when piping to grep (#976199)
|
||||||
|
|
||||||
|
* Wed Jun 26 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-5
|
||||||
|
- Disabling tests - unsuitable for running on buildsystems
|
||||||
|
|
||||||
|
* Mon Jun 17 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-4
|
||||||
|
- Enabling skill and snice (#974752)
|
||||||
|
|
||||||
|
* Wed Jun 12 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-3
|
||||||
|
- Adding major version in the libnuma soname
|
||||||
|
|
||||||
|
* Thu May 30 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-2
|
||||||
|
- watch: enabling UTF-8 (#965867)
|
||||||
|
|
||||||
|
* Wed May 29 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.8-1
|
||||||
|
- Update to 3.3.8
|
||||||
|
|
||||||
|
* Wed May 22 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.7-4
|
||||||
|
- top: inoculated against a window manager like 'screen' (#962022)
|
||||||
|
|
||||||
|
* Tue Apr 16 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.7-3
|
||||||
|
- Avoid segfaults when reading zero bytes - file2str (#951391)
|
||||||
|
|
||||||
|
* Mon Apr 15 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.7-2
|
||||||
|
- Moving libprocps.pc to the devel subpackage (#951726)
|
||||||
|
|
||||||
|
* Tue Mar 26 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.7-1
|
||||||
|
- Update to 3.3.7
|
||||||
|
- Reverting upstream commit for testsuite/unix.exp
|
||||||
|
|
||||||
|
* Tue Feb 05 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.6-4
|
||||||
|
- Fixing empty pmap output on ppc/s390 (#906457)
|
||||||
|
|
||||||
|
* Tue Jan 15 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.6-3
|
||||||
|
- Typo in the description, pdwx instead of pwdx (#891476)
|
||||||
|
|
||||||
|
* Tue Jan 08 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.6-2
|
||||||
|
- Rebuilding with tests disabled (koji issue #853084)
|
||||||
|
|
||||||
|
* Tue Jan 08 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.6-1
|
||||||
|
- Update to 3.3.6
|
||||||
|
- Changing URL/Source from gitorious to recently created sourceforge page
|
||||||
|
- Replacing autogen.sh with autoreconf
|
||||||
|
|
||||||
|
* Mon Jan 07 2013 Jaromir Capik <jcapik@redhat.com> - 3.3.5-1
|
||||||
|
- Update to 3.3.5
|
||||||
|
|
||||||
|
* Tue Dec 11 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.4-2
|
||||||
|
- fixing the following regressions:
|
||||||
|
- negative ETIME field in ps (#871819)
|
||||||
|
- procps states a bug is hit when receiving a signal (#871824)
|
||||||
|
- allow core file generation by ps command (#871825)
|
||||||
|
|
||||||
|
* Tue Dec 11 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.4-1
|
||||||
|
- Update to 3.3.4
|
||||||
|
|
||||||
|
* Tue Sep 25 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.3-3.20120807git
|
||||||
|
- SELinux spelling fixes (#859900)
|
||||||
|
|
||||||
|
* Tue Aug 21 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.3-2.20120807git
|
||||||
|
- Tests enabled
|
||||||
|
|
||||||
|
* Tue Aug 07 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.3-1.20120807git
|
||||||
|
- Update to 3.3.3-20120807git
|
||||||
|
|
||||||
|
* Sat Jul 21 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.3.2-4
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Mar 08 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.2-3
|
||||||
|
- Second usrmove hack - providing /bin/ps
|
||||||
|
|
||||||
|
* Tue Mar 06 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.2-2
|
||||||
|
- Fixing requires in the devel subpackage (missing %%{?_isa} macro)
|
||||||
|
- License statement clarification (upstream patch referrenced in the spec header)
|
||||||
|
|
||||||
|
* Mon Feb 27 2012 Jaromir Capik <jcapik@redhat.com> - 3.3.2-1
|
||||||
|
- Initial version
|
Loading…
Reference in new issue