From 2006bab8353d4fb88b4b334e8c5b128cd3d78856 Mon Sep 17 00:00:00 2001 From: CentOS Buildsys Date: Oct 21 2013 12:52:50 +0000 Subject: import procps-ng-3.3.8-15.el7.src.rpm --- diff --git a/.procps-ng.metadata b/.procps-ng.metadata new file mode 100644 index 0000000..7f35ad4 --- /dev/null +++ b/.procps-ng.metadata @@ -0,0 +1 @@ +4fa6a373f969989a9e490df5eb49a2df62eca19a SOURCES/procps-ng-3.3.8.tar.xz diff --git a/README.md b/README.md deleted file mode 100644 index 0e7897f..0000000 --- a/README.md +++ /dev/null @@ -1,5 +0,0 @@ -The master branch has no content - -Look at the c7 branch if you are working with CentOS-7, or the c4/c5/c6 branch for CentOS-4, 5 or 6 - -If you find this file in a distro specific branch, it means that no content has been checked in yet diff --git a/SOURCES/0001-misc-correct-errors-from-merge-request-13.patch b/SOURCES/0001-misc-correct-errors-from-merge-request-13.patch new file mode 100644 index 0000000..5f9a93e --- /dev/null +++ b/SOURCES/0001-misc-correct-errors-from-merge-request-13.patch @@ -0,0 +1,21 @@ +diff --git a/skill.c b/skill.c +index ab83a03..01b29cb 100644 +--- a/skill.c ++++ b/skill.c +@@ -640,14 +640,14 @@ static void skillsnice_parse(int argc, + case NS_OPTION: + ns_pid = atoi(optarg); + if (ns_pid == 0) { +- xwarnx(_("invalid pid number %i"), optarg); ++ xwarnx(_("invalid pid number %s"), optarg); + kill_usage(stderr); + } + if (ns_read(ns_pid, &ns_task)) { + xwarnx(_("error reading reference namespace " + "information")); + kill_usage(stderr); +- } ++ } + + break; + case NSLIST_OPTION: diff --git a/SOURCES/0001-top-add-the-major-version-to-dlopen-of-libnuma-sonam.patch b/SOURCES/0001-top-add-the-major-version-to-dlopen-of-libnuma-sonam.patch new file mode 100644 index 0000000..5b12dce --- /dev/null +++ b/SOURCES/0001-top-add-the-major-version-to-dlopen-of-libnuma-sonam.patch @@ -0,0 +1,42 @@ +From a6dfe2648a39d5fed8de0361aecf0e035ad80222 Mon Sep 17 00:00:00 2001 +From: Jim Warner +Date: Thu, 6 Jun 2013 00:00:00 -0500 +Subject: [PATCH] top: add the major version to dlopen of libnuma soname + +When the plug-in approach to NUMA support was added, I +carelessly employed the compile-time linker convention +for naming the library. Technically this then required +the 'devel' package for NUMA support to be present for +the unqualified soname symlink to be available. Either +that or one must have manually created such a symlink. + +This commit adds the missing major version to dlopen() +of libnuma.so.1 so simply having a more likely package +such as 'numactl' will enable both '2' & '3' commands. + +References(s): +http://www.freelists.org/post/procps/top-NUMA-node-CPU-utilization-support,25 +. initial dlopen support +commit edba932a7e9b950dd91bc486e107788e977a5186 + +Signed-off-by: Jim Warner +--- + top/top.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/top/top.c b/top/top.c +index c1853ee..1d38c0f 100644 +--- a/top/top.c ++++ b/top/top.c +@@ -3246,7 +3246,7 @@ static void before (char *me) { + #if defined(PRETEND_NUMA) || defined(PRETEND8CPUS) + Numa_node_tot = Numa_max_node() + 1; + #else +- Libnuma_handle = dlopen("libnuma.so", RTLD_LAZY); ++ Libnuma_handle = dlopen("libnuma.so.1", RTLD_LAZY); + if (Libnuma_handle) { + Numa_max_node = dlsym(Libnuma_handle, "numa_max_node"); + Numa_node_of_cpu = dlsym(Libnuma_handle, "numa_node_of_cpu"); +-- +1.8.1.2 + diff --git a/SOURCES/0001-top-enable-screen-contents-preservation-at-end-of-jo.patch b/SOURCES/0001-top-enable-screen-contents-preservation-at-end-of-jo.patch new file mode 100644 index 0000000..131da97 --- /dev/null +++ b/SOURCES/0001-top-enable-screen-contents-preservation-at-end-of-jo.patch @@ -0,0 +1,150 @@ +From b765e587bf737efffbfe4fff087452de7a090708 Mon Sep 17 00:00:00 2001 +From: Jim Warner +Date: Fri, 28 Jun 2013 00:00:00 -0500 +Subject: [PATCH] top: enable screen contents preservation at end-of-job + +The title of this commit is actually quite misleading. + +Were it more accurate, it would at least mention a tty +emulator's scrollback buffer, which was the cumulation +of a long pursuit to reduce the SIGWINCH overhead when +a window manager carelessly floods an application with +that signal *while* a user is still resizing a window! + +Disabling and enabling that scrollback buffer resulted +in the final top display replaced with original screen +contents, a phenomenon acknowledged at the time but it +also represented a user interface change which has now +produced the first request for return to old behavior. + +After the SIGWINCH dust settled, another problem arose +regarding behaviors under the 'screen' window manager. +In response, top was refactored a bit to avoid display +corruption. That was before discovering 'screen' could +duplicate the scrollback buffer behavior top expected. + +As it turns out, the 'screen' refactoring had probably +made scrollback buffer manipulation unnecessary. Still +one could argue that a window should not be allowed to +scroll while a constantly updating program was active. + +The solution represented in this commit returns former +behavior at program end (retaining top's last screen). +And if we ever wish to disable scrollback buffers, the +associated logic was retained but made conditional. It +is not reflected in configure.ac but might be someday. + +Lastly, this commit corrects cursor positioning when a +^C is issued under 'Fields Management' at any terminal +that didn't have a scrollback buffer (i.e. a console). + +Reference(s): +https://bugzilla.redhat.com/show_bug.cgi?id=977561 +http://www.freelists.org/post/procps/top-library-miscellaneous-tweaks,1 +. screen program refactor +commit 0fe393ff270922cd4f6edbcaabba006314e73a37 +. scrollback buffer disabled +commit dedaf6e1a81738ff08ee8e8523871e12f555ad6d +. sigwinch management defines +commit adca737758e5afc7be344a736953931894cbc19f +commit 4f33b6b8c56464b4044deb29a3bb0e32622e108f + +Signed-off-by: Jim Warner +--- + top/top.c | 18 +++++++++++------- + top/top.h | 1 + + 2 files changed, 12 insertions(+), 7 deletions(-) + +diff --git a/top/top.c b/top/top.c +index 1d38c0f..cdcf3c0 100644 +--- a/top/top.c ++++ b/top/top.c +@@ -72,8 +72,9 @@ static struct termios Tty_original, // our inherited terminal definition + Tty_raw; // for unsolicited input + static int Ttychanged = 0; + +- /* Last established cursor state/shape */ ++ /* Last established cursor state/shape, and is re-position needed */ + static const char *Cursor_state = ""; ++static int Cursor_repos; + + /* Program name used in error messages and local 'rc' file name */ + static char *Myname; +@@ -350,12 +351,15 @@ static void at_eoj (void) { + if (Ttychanged) { + tcsetattr(STDIN_FILENO, TCSAFLUSH, &Tty_original); + if (keypad_local) putp(keypad_local); ++ if (Cursor_repos) putp(tg2(0, Screen_rows)); + putp("\n"); ++#ifdef OFF_SCROLLBK + if (exit_ca_mode) { + // this next will also replace top's most recent screen with the + // original display contents that were visible at our invocation + putp(exit_ca_mode); + } ++#endif + putp(Cap_curs_norm); + putp(Cap_clr_eol); + #ifndef RMAN_IGNORED +@@ -591,17 +595,13 @@ static void sig_endpgm (int dont_care_sig) { + + /* + * Catches: +- * SIGTSTP, SIGTTIN and SIGTTOU +- * note: +- * we don't fiddle with with those enter/exit_ca_mode strings +- * because we want to retain most of the last screen contents +- * as a visual reminder this program is suspended, not ended! */ ++ * SIGTSTP, SIGTTIN and SIGTTOU */ + static void sig_paused (int dont_care_sig) { + // POSIX.1-2004 async-signal-safe: tcsetattr, tcdrain, raise + if (-1 == tcsetattr(STDIN_FILENO, TCSAFLUSH, &Tty_original)) + error_exit(fmtmk(N_fmt(FAIL_tty_set_fmt), strerror(errno))); + if (keypad_local) putp(keypad_local); +- putp(tg2(0, Screen_rows)); ++ if (Cursor_repos) putp(tg2(0, Screen_rows)); + putp(Cap_curs_norm); + #ifndef RMAN_IGNORED + putp(Cap_smam); +@@ -2120,6 +2120,7 @@ static void fields_utility (void) { + int i, key; + FLG_t f; + ++ Cursor_repos = 1; + spewFI + signify_that: + putp(Cap_clr_scr); +@@ -2180,6 +2181,7 @@ signify_that: + break; + } + } while (key != 'q' && key != kbd_ESC); ++ Cursor_repos = 0; + #undef unSCRL + #undef swapEM + #undef spewFI +@@ -3768,8 +3770,10 @@ static void whack_terminal (void) { + // thanks anyway stdio, but we'll manage buffering at the frame level... + setbuffer(stdout, Stdout_buf, sizeof(Stdout_buf)); + #endif ++#ifdef OFF_SCROLLBK + // this has the effect of disabling any troublesome scrollback buffer... + if (enter_ca_mode) putp(enter_ca_mode); ++#endif + // and don't forget to ask iokey to initialize his tinfo_tab + iokey(0); + } // end: whack_terminal +diff --git a/top/top.h b/top/top.h +index f356798..a8a7357 100644 +--- a/top/top.h ++++ b/top/top.h +@@ -41,6 +41,7 @@ + //#define INSP_SAVEBUF /* preserve 'Insp_buf' contents in a file */ + //#define INSP_SLIDE_1 /* when scrolling left/right don't move 8 */ + //#define OFF_HST_HASH /* use BOTH qsort+bsrch vs. hashing scheme */ ++//#define OFF_SCROLLBK /* disable tty emulators scrollback buffer */ + //#define OFF_STDIOLBF /* disable our own stdout _IOFBF override */ + //#define PRETEND2_5_X /* pretend we're linux 2.5.x (for IO-wait) */ + //#define PRETEND8CPUS /* pretend we're smp with 8 ticsers (sic) */ +-- +1.8.1.2 + diff --git a/SOURCES/0001-top-refine-some-miscellaneous-signals-interrupt-stuf.patch b/SOURCES/0001-top-refine-some-miscellaneous-signals-interrupt-stuf.patch new file mode 100644 index 0000000..8c92995 --- /dev/null +++ b/SOURCES/0001-top-refine-some-miscellaneous-signals-interrupt-stuf.patch @@ -0,0 +1,232 @@ +From e5d1a884f4e780aca7f9eaf68a51b967f9b43abf Mon Sep 17 00:00:00 2001 +From: Jim Warner +Date: Sun, 30 Jun 2013 00:00:00 -0500 +Subject: [PATCH 1/2] top: refine some miscellaneous signals interrupt stuff + +This commit mostly justs renames a few identifiers but +it also will now suppress any end-of-job report if top +wasn't ended via the 'q' key convention (i.e. signal). + +Signed-off-by: Jim Warner +--- + top/top.c | 48 +++++++++++++++++++++++++----------------------- + top/top.h | 4 ++-- + 2 files changed, 27 insertions(+), 25 deletions(-) + +diff --git a/top/top.c b/top/top.c +index cdcf3c0..c1c61dd 100644 +--- a/top/top.c ++++ b/top/top.c +@@ -174,7 +174,7 @@ static WIN_t *Curwin; + and/or that are simply more efficiently handled as globals + [ 'Frames_...' (plural) stuff persists beyond 1 frame ] + [ or are used in response to async signals received ! ] */ +-static volatile int Frames_resize; // time to rebuild all column headers ++static volatile int Frames_signal; // time to rebuild all column headers + static int Frames_libflags; // PROC_FILLxxx flags + static int Frame_maxtask; // last known number of active tasks + // ie. current 'size' of proc table +@@ -377,7 +377,7 @@ static void bye_bye (const char *str) { + at_eoj(); // restore tty in preparation for exit + #ifdef ATEOJ_RPTSTD + { proc_t *p; +- if (!str && Ttychanged) { fprintf(stderr, ++ if (!str && !Frames_signal && Ttychanged) { fprintf(stderr, + "\n%s's Summary report:" + "\n\tProgram" + "\n\t Linux version = %u.%u.%u, %s" +@@ -447,7 +447,7 @@ static void bye_bye (const char *str) { + + #ifndef OFF_HST_HASH + #ifdef ATEOJ_RPTHSH +- if (!str && Ttychanged) { ++ if (!str && !Frames_signal && Ttychanged) { + int i, j, pop, total_occupied, maxdepth, maxdepth_sav, numdepth + , cross_foot, sz = HHASH_SIZ * (unsigned)sizeof(int); + int depths[HHASH_SIZ]; +@@ -588,6 +588,7 @@ static void sig_endpgm (int dont_care_sig) { + // POSIX.1-2004 async-signal-safe: sigfillset, sigprocmask + sigfillset(&ss); + sigprocmask(SIG_BLOCK, &ss, NULL); ++ Frames_signal = BREAK_sig; + bye_bye(NULL); + (void)dont_care_sig; + } // end: sig_endpgm +@@ -619,7 +620,7 @@ static void sig_paused (int dont_care_sig) { + #endif + if (keypad_xmit) putp(keypad_xmit); + putp(Cursor_state); +- Frames_resize = RESIZ_sig; ++ Frames_signal = BREAK_sig; + (void)dont_care_sig; + } // end: sig_paused + +@@ -630,7 +631,7 @@ static void sig_paused (int dont_care_sig) { + static void sig_resize (int dont_care_sig) { + // POSIX.1-2004 async-signal-safe: tcdrain + tcdrain(STDOUT_FILENO); +- Frames_resize = RESIZ_sig; ++ Frames_signal = BREAK_sig; + (void)dont_care_sig; + } // end: sig_resize + +@@ -928,12 +929,13 @@ static inline int ioa (struct timespec *ts) { + FD_ZERO(&fs); + FD_SET(STDIN_FILENO, &fs); + +-#ifndef SIGNALS_LESS // conditional comments are silly, but help in documenting +- // hold here until we've got keyboard input, any signal (including SIGWINCH) +-#else ++#ifdef SIGNALS_LESS // conditional comments are silly, but help in documenting + // hold here until we've got keyboard input, any signal except SIGWINCH +-#endif + // or (optionally) we timeout with nanosecond granularity ++#else ++ // hold here until we've got keyboard input, any signal (including SIGWINCH) ++ // or (optionally) we timeout with nanosecond granularity ++#endif + rc = pselect(STDIN_FILENO + 1, &fs, NULL, NULL, ts, &Sigwinch_set); + + if (rc < 0) rc = 0; +@@ -1263,7 +1265,7 @@ static float get_float (const char *prompt) { + float f; + + line = ioline(prompt); +- if (!line[0] || Frames_resize) return -1.0; ++ if (!line[0] || Frames_signal) return -1.0; + // note: we're not allowing negative floats + if (strcspn(line, "+,.0123456789")) { + show_msg(N_txt(BAD_numfloat_txt)); +@@ -1284,7 +1286,7 @@ static int get_int (const char *prompt) { + int n; + + line = ioline(prompt); +- if (Frames_resize) return GET_INT_BAD; ++ if (Frames_signal) return GET_INT_BAD; + if (!line[0]) return GET_INTNONE; + // note: we've got to allow negative ints (renice) + if (strcspn(line, "-+0123456789")) { +@@ -1822,7 +1824,7 @@ static void adj_geometry (void) { + PSU_CLREOS(0); + + fflush(stdout); +- Frames_resize = RESIZ_clr; ++ Frames_signal = BREAK_off; + } // end: adj_geometry + + +@@ -2134,7 +2136,7 @@ signify_that: + display_fields(i, (p != NULL)); + fflush(stdout); + +- if (Frames_resize) goto signify_that; ++ if (Frames_signal) goto signify_that; + key = iokey(1); + if (key < 1) goto signify_that; + +@@ -3053,7 +3055,7 @@ signify_that: + lest repeated keys produce immediate re-selection in caller */ + tcflush(STDIN_FILENO, TCIFLUSH); + +- if (Frames_resize) goto signify_that; ++ if (Frames_signal) goto signify_that; + key = iokey(1); + if (key < 1) goto signify_that; + +@@ -3158,7 +3160,7 @@ signify_that: + , pid, p->cmd, p->euser, sels)); + INSP_MKSL(0, " "); + +- if (Frames_resize) goto signify_that; ++ if (Frames_signal) goto signify_that; + if (key == INT_MAX) key = iokey(1); + if (key < 1) goto signify_that; + +@@ -3903,7 +3905,7 @@ signify_that: + putp(Cap_clr_eos); + fflush(stdout); + +- if (Frames_resize) goto signify_that; ++ if (Frames_signal) goto signify_that; + key = iokey(1); + if (key < 1) goto signify_that; + +@@ -4135,7 +4137,7 @@ signify_that: + putp(Cap_clr_eos); + fflush(stdout); + +- if (Frames_resize) goto signify_that; ++ if (Frames_signal) goto signify_that; + key = iokey(1); + if (key < 1) goto signify_that; + +@@ -4151,7 +4153,7 @@ signify_that: + , Winstk[2].rc.winname, Winstk[3].rc.winname)); + putp(Cap_clr_eos); + fflush(stdout); +- if (Frames_resize || (key = iokey(1)) < 1) { ++ if (Frames_signal || (key = iokey(1)) < 1) { + adj_geometry(); + putp(Cap_clr_scr); + } else w = win_select(key); +@@ -4341,7 +4343,7 @@ static void keys_global (int ch) { + if (0 > pid) pid = def; + str = ioline(fmtmk(N_fmt(GET_sigs_num_fmt), pid, SIGTERM)); + if (*str) sig = signal_name_to_number(str); +- if (Frames_resize) break; ++ if (Frames_signal) break; + if (0 < sig && kill(pid, sig)) + show_msg(fmtmk(N_fmt(FAIL_signals_fmt) + , pid, sig, strerror(errno))); +@@ -4909,12 +4911,12 @@ static void do_key (int ch) { + for (i = 0; i < MAXTBL(key_tab); ++i) + if (strchr(key_tab[i].keys, ch)) { + key_tab[i].func(ch); +- Frames_resize = RESIZ_kbd; ++ Frames_signal = BREAK_kbd; + putp((Cursor_state = Cap_curs_hide)); + return; + } + }; +- /* Frames_resize above will force a rebuild of all column headers and ++ /* Frames_signal above will force a rebuild of all column headers and + the PROC_FILLxxx flags. It's NOT simply lazy programming. Here are + some keys that COULD require new column headers and/or libproc flags: + 'A' - likely +@@ -5458,7 +5460,7 @@ static void frame_make (void) { + int i, scrlins; + + // deal with potential signal(s) since the last time around... +- if (Frames_resize) ++ if (Frames_signal) + zap_fieldstab(); + + // whoa either first time or thread/task mode change, (re)prime the pump... +@@ -5549,7 +5551,7 @@ int main (int dont_care_argc, char **argv) { + produce a screen refresh. in this main loop frame_make + assumes responsibility for such refreshes. other logic + in contact with users must deal more obliquely with an +- interrupt/refresh (hint: Frames_resize + return code)! ++ interrupt/refresh (hint: Frames_signal + return code)! + + (everything is perfectly justified plus right margins) + (are completely filled, but of course it must be luck) +diff --git a/top/top.h b/top/top.h +index a8a7357..43d1ebc 100644 +--- a/top/top.h ++++ b/top/top.h +@@ -208,9 +208,9 @@ enum scale_enum { + SK_Kb, SK_Mb, SK_Gb, SK_Tb, SK_Pb, SK_Eb, SK_SENTINEL + }; + +- /* Used to manipulate (and document) the Frames_resize states */ ++ /* Used to manipulate (and document) the Frames_signal states */ + enum resize_states { +- RESIZ_clr, RESIZ_kbd, RESIZ_sig ++ BREAK_off = 0, BREAK_kbd, BREAK_sig + }; + + /* This typedef just ensures consistent 'process flags' handling */ +-- +1.8.1.2 + diff --git a/SOURCES/0002-library-for-atexit-support-fix-fileutils-for-EPIPE.patch b/SOURCES/0002-library-for-atexit-support-fix-fileutils-for-EPIPE.patch new file mode 100644 index 0000000..da8de50 --- /dev/null +++ b/SOURCES/0002-library-for-atexit-support-fix-fileutils-for-EPIPE.patch @@ -0,0 +1,42 @@ +From b1f06bdcc9e02f7dbaf1161ad6231c45ea3f9d88 Mon Sep 17 00:00:00 2001 +From: Jim Warner +Date: Tue, 25 Jun 2013 00:00:00 -0500 +Subject: [PATCH 2/2] library: for atexit() support, fix fileutils for EPIPE + +When fileutils with stream error checking was borrowed +from GNU lib, an omission was also propagated where an +errno of EPIPE wouldn't be preserved in close_stream() +making a test for EPIPE in close_stdout() meaningless. + +This patch corrects such oversight so that an errno of +EPIPE no longer produces 'write error' at program end. + +( gnulib provides for optionally ignoring EPIPE, but ) +( if a program chooses to ignore it, then their code ) +( appears to suffer from this close_stream oversight ) + +Reference(s): +. original fileutilis addition +commit c7cf98b0e03780f78abe5275c6fb282f71a2369f +. bugzilla report +https://bugzilla.redhat.com/show_bug.cgi?id=976199 +--- + lib/fileutils.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/fileutils.c b/lib/fileutils.c +index a9ef2ff..1ade3d8 100644 +--- a/lib/fileutils.c ++++ b/lib/fileutils.c +@@ -24,7 +24,7 @@ int close_stream(FILE * stream) + const int prev_fail = (ferror(stream) != 0); + const int fclose_fail = (fclose(stream) != 0); + if (prev_fail || (fclose_fail && (some_pending || errno != EBADF))) { +- if (!fclose_fail) ++ if (!fclose_fail && errno != EPIPE) + errno = 0; + return EOF; + } +-- +1.8.1.2 + diff --git a/SOURCES/0002-top-cursor-repositioning-includes-line-oriented-inpu.patch b/SOURCES/0002-top-cursor-repositioning-includes-line-oriented-inpu.patch new file mode 100644 index 0000000..b57f813 --- /dev/null +++ b/SOURCES/0002-top-cursor-repositioning-includes-line-oriented-inpu.patch @@ -0,0 +1,60 @@ +From eee15b862dd5b051f16c719bf3c974591783a8f8 Mon Sep 17 00:00:00 2001 +From: Jim Warner +Date: Mon, 1 Jul 2013 00:00:00 -0500 +Subject: [PATCH 2/2] top: cursor repositioning includes line oriented input + +A recent patch introduced the ability to recognize the +need to reposition the cursor at suspension or program +end. There remained unmet 1 additional potential need. + +This commit extends that ability to embrace line input +so that if a user issues ^Z or ^C while being prompted +the resulting shell output will no longer be embedded. + +Reference(s): +http://www.freelists.org/post/procps/top-library-miscellaneous-tweaks,7 +commit 5c974ff44da4fbbb9170dd15bdd81555c62c31a9 + +Signed-off-by: Jim Warner +--- + top/top.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/top/top.c b/top/top.c +index c1c61dd..138f3ee 100644 +--- a/top/top.c ++++ b/top/top.c +@@ -1081,12 +1081,14 @@ static char *ioline (const char *prompt) { + static char buf[MEDBUFSIZ]; + char *p; + ++ Cursor_repos = 1; + show_pmt(prompt); + memset(buf, '\0', sizeof(buf)); + ioch(1, buf, sizeof(buf)-1); + + if ((p = strpbrk(buf, ws))) *p = '\0'; + // note: we DO produce a vaid 'string' ++ Cursor_repos = 0; + return buf; + } // end: ioline + +@@ -1117,6 +1119,7 @@ static char *ioline (const char *prompt) { + }; + static struct lin_s *anchor, *plin; + ++ Cursor_repos = 1; + if (!anchor) { + anchor = alloc_c(sizeof(struct lin_s)); + anchor->str = alloc_s(""); // top-of-stack == empty str +@@ -1182,6 +1185,7 @@ static char *ioline (const char *prompt) { + putp(tg2(beg+pos, Msg_row)); + } while (key && key != kbd_ENTER && key != kbd_ESC); + ++ Cursor_repos = 0; + // weed out duplicates, including empty strings (top-of-stack)... + for (i = 0, plin = anchor; ; i++) { + #ifdef RECALL_FIXED +-- +1.8.1.2 + diff --git a/SOURCES/pgrep-introduce_support_for_namespaces.patch b/SOURCES/pgrep-introduce_support_for_namespaces.patch new file mode 100644 index 0000000..2b725d0 --- /dev/null +++ b/SOURCES/pgrep-introduce_support_for_namespaces.patch @@ -0,0 +1,265 @@ +commit de7b3b9222ab4e2f75db88f0f75b555ab306140b +Author: Aristeu Rozanski +Date: Fri Apr 12 14:40:27 2013 -0400 + + pgrep: introduce support for namespaces + + A PID should be specified with --ns: + $ pgrep --ns 12345 + which will only match the processes which belong to to the same 6 + namespaces. It is also possible to specify which namespaces to test: + $ pgrep --ns 12345 --nslist mnt,net,ipc + which will match processes that belong to the same mount, network and + IPC namespaces as PID 12345. + + Signed-off-by: Aristeu Rozanski + +--- + Makefile.am | 4 +-- + include/nsutils.h | 7 +++++ + lib/nsutils.c | 32 +++++++++++++++++++++++++ + pgrep.1 | 9 +++++++ + pgrep.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- + 5 files changed, 117 insertions(+), 4 deletions(-) + +--- procps-ng-3.3.8.orig/Makefile.am 2013-05-25 17:39:39.000000000 -0400 ++++ procps-ng-3.3.8/Makefile.am 2013-09-17 16:57:03.515128029 -0400 +@@ -89,8 +89,8 @@ else + endif + + free_SOURCES = free.c $(top_srcdir)/lib/strutils.c $(top_srcdir)/lib/fileutils.c +-pgrep_SOURCES = pgrep.c $(top_srcdir)/lib/fileutils.c +-pkill_SOURCES = pgrep.c $(top_srcdir)/lib/fileutils.c ++pgrep_SOURCES = pgrep.c $(top_srcdir)/lib/fileutils.c $(top_srcdir)/lib/nsutils.c ++pkill_SOURCES = pgrep.c $(top_srcdir)/lib/fileutils.c $(top_srcdir)/lib/nsutils.c + pmap_SOURCES = pmap.c $(top_srcdir)/lib/fileutils.c + pwdx_SOURCES = pwdx.c $(top_srcdir)/lib/fileutils.c + sysctl_SOURCES = sysctl.c $(top_srcdir)/lib/fileutils.c +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ procps-ng-3.3.8/include/nsutils.h 2013-09-17 16:57:03.515128029 -0400 +@@ -0,0 +1,7 @@ ++#ifndef PROCPS_NG_NSUTILS ++#define PROCPS_NG_NSUTILS ++ ++#include "proc/readproc.h" ++int ns_read(pid_t pid, proc_t *ns_task); ++ ++#endif +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ procps-ng-3.3.8/lib/nsutils.c 2013-09-17 16:57:03.515128029 -0400 +@@ -0,0 +1,32 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "proc/readproc.h" ++#include "nsutils.h" ++ ++/* we need to fill in only namespace information */ ++int ns_read(pid_t pid, proc_t *ns_task) ++{ ++ struct stat st; ++ char buff[50]; ++ int i, rc = 0; ++ ++ for (i = 0; i < NUM_NS; i++) { ++ snprintf(buff, sizeof(buff), "/proc/%i/ns/%s", pid, ++ get_ns_name(i)); ++ if (stat(buff, &st)) { ++ if (errno != ENOENT) ++ rc = errno; ++ ns_task->ns[i] = 0; ++ continue; ++ } ++ ns_task->ns[i] = st.st_ino; ++ } ++ return rc; ++} ++ +--- procps-ng-3.3.8.orig/pgrep.1 2013-05-25 17:39:40.000000000 -0400 ++++ procps-ng-3.3.8/pgrep.1 2013-09-17 16:57:03.516128042 -0400 +@@ -146,6 +146,15 @@ than + \fB\-L\fR, \fB\-\-logpidfile\fR + Fail if pidfile (see -F) not locked. + .TP ++\fB\-\-ns \fIpid\fP ++Match processes that belong to the same namespaces. Required to run as ++root to match processes from other users. See \-\-nslist for how to limit ++which namespaces to match. ++.TP ++\fB\-\-nslist \fIname\fP,... ++Match only the provided namespaces. Available namespaces: ++ipc, mnt, net, pid, user,uts. ++.TP + \fB\-V\fR, \fB\-\-version\fR + Display version information and exit. + .TP +--- procps-ng-3.3.8.orig/pgrep.c 2013-05-25 17:39:40.000000000 -0400 ++++ procps-ng-3.3.8/pgrep.c 2013-09-17 16:58:18.439105071 -0400 +@@ -46,6 +46,7 @@ #define CMDSTRSIZE 4096 + + #include "c.h" + #include "fileutils.h" ++#include "nsutils.h" + #include "nls.h" + #include "xalloc.h" + #include "proc/readproc.h" +@@ -76,6 +77,7 @@ static int opt_lock = 0; + static int opt_case = 0; + static int opt_echo = 0; + static int opt_threads = 0; ++static pid_t opt_ns_pid = 0; + + static const char *opt_delim = "\n"; + static struct el *opt_pgrp = NULL; +@@ -86,9 +88,13 @@ static struct el *opt_sid = NULL; + static struct el *opt_term = NULL; + static struct el *opt_euid = NULL; + static struct el *opt_ruid = NULL; ++static struct el *opt_nslist = NULL; + static char *opt_pattern = NULL; + static char *opt_pidfile = NULL; + ++/* by default, all namespaces will be checked */ ++static int ns_flags = 0x3f; ++ + static int __attribute__ ((__noreturn__)) usage(int opt) + { + int err = (opt == '?'); +@@ -121,7 +127,12 @@ if (i_am_pkill == 0) { + " -U, --uid match by real IDs\n" + " -x, --exact match exactly with the command name\n" + " -F, --pidfile read PIDs from file\n" +- " -L, --logpidfile fail if PID file is not locked\n"), fp); ++ " -L, --logpidfile fail if PID file is not locked\n" ++ " --ns match the processes that belong to the same\n" ++ " namespace as \n" ++ " --nslist list which namespaces will be considered for\n" ++ " the --ns option.\n" ++ " Available namespaces: ipc, mnt, net, pid, user, uts\n"), fp); + fputs(USAGE_SEPARATOR, fp); + fputs(USAGE_HELP, fp); + fputs(USAGE_VERSION, fp); +@@ -320,6 +331,20 @@ static int conv_str (const char *restric + } + + ++static int conv_ns (const char *restrict name, struct el *restrict e) ++{ ++ int rc = conv_str(name, e); ++ int id; ++ ++ ns_flags = 0; ++ id = get_ns_id(name); ++ if (id == -1) ++ return 0; ++ ns_flags |= (1 << id); ++ ++ return rc; ++} ++ + static int match_numlist (long value, const struct el *restrict list) + { + int found = 0; +@@ -350,6 +375,21 @@ for (i = list[0].num; i > 0; i--) { + return found; + } + ++static int match_ns (const proc_t *task, const proc_t *ns_task) ++{ ++ int found = 1; ++ int i; ++ ++ for (i = 0; i < NUM_NS; i++) { ++ if (ns_flags & (1 << i)) { ++ if (task->ns[i] != ns_task->ns[i]) ++ found = 0; ++ } ++ } ++ ++ return found; ++} ++ + static void output_numlist (const struct el *restrict list, int num) + { + int i; +@@ -386,6 +426,8 @@ int flags = 0; + flags |= PROC_FILLSTAT; + if (!(flags & PROC_FILLSTAT)) + flags |= PROC_FILLSTATUS; /* FIXME: need one, and PROC_FILLANY broken */ ++ if (opt_ns_pid) ++ flags |= PROC_FILLNS; + if (opt_euid && !opt_negate) { + int num = opt_euid[0].num; + int i = num; +@@ -442,6 +484,7 @@ int size = 0; + char cmdline[CMDSTRSIZE]; + char cmdsearch[CMDSTRSIZE]; + char cmdoutput[CMDSTRSIZE]; ++ proc_t ns_task; + + ptp = do_openproc(); + preg = do_regcomp(); +@@ -451,6 +494,11 @@ else saved_start_time = ~0ULL; + + if (opt_newest) saved_pid = 0; + if (opt_oldest) saved_pid = INT_MAX; ++ if (opt_ns_pid && ns_read(opt_ns_pid, &ns_task)) { ++ fputs(_("Error reading reference namespace information\n"), ++ stderr); ++ exit (EXIT_FATAL); ++ } + + memset(&task, 0, sizeof (task)); + while(readproc(ptp, &task)) { +@@ -476,6 +524,8 @@ match = 0; + match = 0; + else if (opt_sid && ! match_numlist (task.session, opt_sid)) + match = 0; ++ else if (opt_ns_pid && ! match_ns (&task, &ns_task)) ++ match = 0; + else if (opt_term) { + if (task.tty == 0) { + match = 0; +@@ -622,7 +672,9 @@ static void parse_opts (int argc, char * + int criteria_count = 0; + + enum { +- SIGNAL_OPTION = CHAR_MAX + 1 ++ SIGNAL_OPTION = CHAR_MAX + 1, ++ NS_OPTION, ++ NSLIST_OPTION, + }; + static const struct option longopts[] = { + {"signal", required_argument, NULL, SIGNAL_OPTION}, +@@ -646,6 +698,8 @@ int criteria_count = 0; + {"pidfile", required_argument, NULL, 'F'}, + {"logpidfile", no_argument, NULL, 'L'}, + {"echo", no_argument, NULL, 'e'}, ++ {"ns", required_argument, NULL, NS_OPTION}, ++ {"nslist", required_argument, NULL, NSLIST_OPTION}, + {"help", no_argument, NULL, 'h'}, + {"version", no_argument, NULL, 'V'}, + {NULL, 0, NULL, 0} +@@ -792,6 +846,17 @@ case 'l': /* Solaris: long output fo + break; + /* case 'z': / * Solaris: match by zone ID * / + * break; */ ++ case NS_OPTION: ++ opt_ns_pid = atoi(optarg); ++ if (opt_ns_pid == 0) ++ usage (opt); ++ ++criteria_count; ++ break; ++ case NSLIST_OPTION: ++ opt_nslist = split_list (optarg, conv_ns); ++ if (opt_nslist == NULL) ++ usage (opt); ++ break; + case 'h': + usage (opt); + break; diff --git a/SOURCES/procps-add_support_for_linux_namespaces.patch b/SOURCES/procps-add_support_for_linux_namespaces.patch new file mode 100644 index 0000000..db5de99 --- /dev/null +++ b/SOURCES/procps-add_support_for_linux_namespaces.patch @@ -0,0 +1,325 @@ +commit a01ee3c0b32d4c39aa83066ed61103343469527e +Author: Aristeu Rozanski +Date: Mon Apr 8 15:03:13 2013 -0400 + + procps: add support for linux namespaces + + Each process in Linux has a /proc//ns directory which contains + symbolic links to pipes that identify which namespaces that process + belongs to. This patch adds support for ps to display that information + optionally. + + Signed-off-by: Aristeu Rozanski + +--- + proc/libprocps.sym | 2 + + proc/readproc.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + proc/readproc.h | 15 +++++++++++++ + ps/output.c | 38 ++++++++++++++++++++++++++++++++++ + ps/ps.1 | 24 +++++++++++++++++++++ + 5 files changed, 137 insertions(+) + +--- procps-ng-3.3.8.orig/proc/libprocps.sym 2013-05-25 17:39:40.000000000 -0400 ++++ procps-ng-3.3.8/proc/libprocps.sym 2013-09-17 16:09:45.496846630 -0400 +@@ -11,6 +11,8 @@ global: + escaped_copy; + free_slabinfo; + freeproc; ++ get_ns_id; ++ get_ns_name; + get_pid_digits; + get_slabinfo; + getbtime; +--- procps-ng-3.3.8.orig/proc/readproc.c 2013-05-25 17:39:40.000000000 -0400 ++++ procps-ng-3.3.8/proc/readproc.c 2013-09-17 16:09:45.498846654 -0400 +@@ -457,6 +457,51 @@ static void oomadj2proc(const char* S, p + #endif + /////////////////////////////////////////////////////////////////////// + ++static ino_t _ns2proc(unsigned pid, const char *ns) ++{ ++ struct stat s; ++ char filename[40]; ++ ++ snprintf(filename, sizeof(filename), "/proc/%i/ns/%s", pid, ns); ++ ++ if (stat(filename, &s) == -1) ++ return 0; ++ ++ return s.st_ino; ++} ++ ++static const char *ns_names[] = { ++ [IPCNS] = "ipc", ++ [MNTNS] = "mnt", ++ [NETNS] = "net", ++ [PIDNS] = "pid", ++ [USERNS] = "user", ++ [UTSNS] = "uts", ++}; ++ ++const char *get_ns_name(int id) { ++ if (id >= NUM_NS) ++ return NULL; ++ return ns_names[id]; ++} ++ ++int get_ns_id(const char *name) { ++ int i; ++ ++ for (i = 0; i < NUM_NS; i++) ++ if (!strcmp(ns_names[i], name)) ++ return i; ++ return -1; ++} ++ ++static void ns2proc(proc_t *restrict P) { ++ int i; ++ ++ for (i = 0; i < NUM_NS; i++) ++ P->ns[i] = _ns2proc(P->tgid, ns_names[i]); ++} ++/////////////////////////////////////////////////////////////////////// ++ + + // Reads /proc/*/stat files, being careful not to trip over processes with + // names like ":-) 1 2 3 4 5 6". +@@ -757,6 +802,7 @@ static struct utlbuf_s ub = { NULL, + static struct stat sb; // stat() buffer + char *restrict const path = PT->path; + unsigned flags = PT->flags; ++ int i; + + if (unlikely(stat(path, &sb) == -1)) /* no such dirent (anymore) */ + goto next_proc; +@@ -844,6 +890,12 @@ p->wchan = (KLONG)~0ull; + } + #endif + ++ if (unlikely(flags & PROC_FILLNS)) // read /proc/#/ns/* ++ ns2proc(p); ++ else ++ for (i = 0; i < NUM_NS; i++) ++ p->ns[i] = 0; ++ + return p; + next_proc: + return NULL; +@@ -862,6 +914,7 @@ static proc_t* simple_readtask(PROCTAB * + static struct utlbuf_s ub = { NULL, 0 }; // buf for stat,statm,status + static struct stat sb; // stat() buffer + unsigned flags = PT->flags; ++ int i; + + if (unlikely(stat(path, &sb) == -1)) /* no such dirent (anymore) */ + goto next_task; +@@ -974,6 +1027,11 @@ status2proc(ub.buf, t, 0); + oomadj2proc(ub.buf, t); + } + #endif ++ if (unlikely(flags & PROC_FILLNS)) ++ ns2proc(t); ++ else ++ for (i = 0; i < NUM_NS; i++) ++ t->ns[i] = 0; + + return t; + next_task: +--- procps-ng-3.3.8.orig/proc/readproc.h 2013-05-25 17:39:40.000000000 -0400 ++++ procps-ng-3.3.8/proc/readproc.h 2013-09-17 16:09:45.499846666 -0400 +@@ -31,6 +31,18 @@ EXTERN_C_BEGIN + // neither tgid nor tid seemed correct. (in other words, FIXME) + #define XXXID tid + ++#define NUM_NS 6 ++enum ns_type { ++ IPCNS = 0, ++ MNTNS, ++ NETNS, ++ PIDNS, ++ USERNS, ++ UTSNS ++}; ++extern const char *get_ns_name(int id); ++extern int get_ns_id(const char *name); ++ + // Basic data structure which holds all information we can get about a process. + // (unless otherwise specified, fields are read from /proc/#/stat) + // +@@ -157,6 +169,8 @@ nlwp, // stat,status number of thr + oom_score, // oom_score (badness for OOM killer) + oom_adj; // oom_adj (adjustment to OOM score) + #endif ++ ino_t ++ ns[NUM_NS]; // ns/* inode number of /proc//ns/* + } proc_t; + + // PROCTAB: data structure holding the persistent information readproc needs +@@ -266,6 +280,7 @@ #define PROC_FILLARG 0x0100 // a + #define PROC_FILLCGROUP 0x0200 // alloc and fill in `cgroup` + #define PROC_FILLSUPGRP 0x0400 // resolve supplementary group id -> group name + #define PROC_FILLOOM 0x0800 // fill in proc_t oom_score and oom_adj ++#define PROC_FILLNS 0x8000 // fill in proc_t namespace information + + #define PROC_LOOSE_TASKS 0x2000 // treat threads as if they were processes + +--- procps-ng-3.3.8.orig/ps/output.c 2013-09-17 16:08:53.000000000 -0400 ++++ procps-ng-3.3.8/ps/output.c 2013-09-17 16:10:41.087532129 -0400 +@@ -139,6 +139,13 @@ static int sr_ ## NAME (const proc_t* P, + return 0; \ + } + ++#define CMP_NS(NAME, ID) \ ++static int sr_ ## NAME (const proc_t* P, const proc_t* Q) { \ ++ if (P->ns[ID] < Q->ns[ID]) return -1; \ ++ if (P->ns[ID] > Q->ns[ID]) return 1; \ ++ return 0; \ ++} ++ + CMP_INT(rtprio) + CMP_SMALL(sched) + CMP_INT(cutime) +@@ -216,6 +223,13 @@ CMP_SMALL(state) + CMP_COOKED_TIME(time) + CMP_COOKED_TIME(etime) + ++CMP_NS(ipcns, IPCNS); ++CMP_NS(mntns, MNTNS); ++CMP_NS(netns, NETNS); ++CMP_NS(pidns, PIDNS); ++CMP_NS(userns, USERNS); ++CMP_NS(utsns, UTSNS); ++ + /* approximation to: kB of address space that could end up in swap */ + static int sr_swapable(const proc_t* P, const proc_t* Q) { + unsigned long p_swapable = P->vm_data + P->vm_stack; +@@ -1279,6 +1293,23 @@ outbuf[1] = '\0'; + } + + #endif ++ ++/************************ Linux namespaces ******************************/ ++ ++#define _pr_ns(NAME, ID)\ ++static int pr_##NAME(char *restrict const outbuf, const proc_t *restrict const pp) {\ ++ if (pp->ns[ID])\ ++ return snprintf(outbuf, COLWID, "%li", pp->ns[ID]);\ ++ else\ ++ return snprintf(outbuf, COLWID, "-");\ ++} ++_pr_ns(ipcns, IPCNS); ++_pr_ns(mntns, MNTNS); ++_pr_ns(netns, NETNS); ++_pr_ns(pidns, PIDNS); ++_pr_ns(userns, USERNS); ++_pr_ns(utsns, UTSNS); ++ + /****************** FLASK & seLinux security stuff **********************/ + // move the bulk of this to libproc sometime + +@@ -1439,6 +1470,7 @@ static const char *const vals[] = {"tt + #define USR PROC_FILLUSR /* uid_t -> user names */ + #define GRP PROC_FILLGRP /* gid_t -> group names */ + #define WCH PROC_FILLWCHAN /* do WCHAN lookup */ ++#define NS PROC_FILLNS /* read namespace information */ + + #define SGRP PROC_FILLSTATUS | PROC_FILLSUPGRP /* supgid -> supgrp (names) */ + #define CGRP PROC_FILLCGROUP | PROC_EDITCGRPCVT /* read cgroup */ +@@ -1527,6 +1559,7 @@ {"ignored", "IGNORED", pr_sigignore,sr + {"inblk", "INBLK", pr_nop, sr_nop, 5, 0, BSD, AN|RIGHT}, /*inblock*/ + {"inblock", "INBLK", pr_nop, sr_nop, 5, 0, DEC, AN|RIGHT}, /*inblk*/ + {"intpri", "PRI", pr_opri, sr_priority, 3, 0, HPU, TO|RIGHT}, ++{"ipcns", "IPCNS", pr_ipcns, sr_ipcns, 10, NS, LNX, ET|RIGHT}, + {"jid", "JID", pr_nop, sr_nop, 1, 0, SGI, PO|RIGHT}, + {"jobc", "JOBC", pr_nop, sr_nop, 4, 0, XXX, AN|RIGHT}, + {"ktrace", "KTRACE", pr_nop, sr_nop, 8, 0, BSD, AN|RIGHT}, +@@ -1559,9 +1592,11 @@ {"maj_flt", "MAJFL", pr_majflt, sr + {"majflt", "MAJFLT", pr_majflt, sr_maj_flt, 6, 0, XXX, AN|RIGHT}, + {"min_flt", "MINFL", pr_minflt, sr_min_flt, 6, 0, LNX, AN|RIGHT}, + {"minflt", "MINFLT", pr_minflt, sr_min_flt, 6, 0, XXX, AN|RIGHT}, ++{"mntns", "MNTNS", pr_mntns, sr_mntns, 10, NS, LNX, ET|RIGHT}, + {"msgrcv", "MSGRCV", pr_nop, sr_nop, 6, 0, XXX, AN|RIGHT}, + {"msgsnd", "MSGSND", pr_nop, sr_nop, 6, 0, XXX, AN|RIGHT}, + {"mwchan", "MWCHAN", pr_nop, sr_nop, 6, WCH, BSD, TO|WCHAN}, /* mutex (FreeBSD) */ ++{"netns", "NETNS", pr_netns, sr_netns, 10, NS, LNX, ET|RIGHT}, + {"ni", "NI", pr_nice, sr_nice, 3, 0, BSD, TO|RIGHT}, /*nice*/ + {"nice", "NI", pr_nice, sr_nice, 3, 0, U98, TO|RIGHT}, /*ni*/ + {"nivcsw", "IVCSW", pr_nop, sr_nop, 5, 0, XXX, AN|RIGHT}, +@@ -1586,6 +1621,7 @@ {"pending", "PENDING", pr_sig, sr + {"pgid", "PGID", pr_pgid, sr_pgrp, 5, 0, U98, PO|PIDMAX|RIGHT}, + {"pgrp", "PGRP", pr_pgid, sr_pgrp, 5, 0, LNX, PO|PIDMAX|RIGHT}, + {"pid", "PID", pr_procs, sr_procs, 5, 0, U98, PO|PIDMAX|RIGHT}, ++{"pidns", "PIDNS", pr_pidns, sr_pidns, 10, NS, LNX, ET|RIGHT}, + {"pmem", "%MEM", pr_pmem, sr_rss, 4, 0, XXX, PO|RIGHT}, /*%mem*/ + {"poip", "-", pr_nop, sr_nop, 1, 0, BSD, AN|RIGHT}, + {"policy", "POL", pr_class, sr_sched, 3, 0, DEC, TO|LEFT}, +@@ -1693,6 +1729,7 @@ {"unit", "UNIT", pr_sd_unit, sr + {"upr", "UPR", pr_nop, sr_nop, 3, 0, BSD, TO|RIGHT}, /*usrpri*/ + {"uprocp", "UPROCP", pr_nop, sr_nop, 8, 0, BSD, AN|RIGHT}, + {"user", "USER", pr_euser, sr_euser, 8, USR, U98, ET|USER}, /* BSD n forces this to UID */ ++{"userns", "USERNS", pr_userns, sr_userns, 10, NS, LNX, ET|RIGHT}, + {"usertime", "USER", pr_nop, sr_nop, 4, 0, DEC, ET|RIGHT}, + {"usrpri", "UPR", pr_nop, sr_nop, 3, 0, DEC, TO|RIGHT}, /*upr*/ + {"util", "C", pr_c, sr_pcpu, 2, 0, SGI, ET|RIGHT}, // not sure about "C" +@@ -1700,6 +1737,7 @@ {"utime", "UTIME", pr_nop, sr + #ifdef WITH_SYSTEMD + {"uunit", "UUNIT", pr_sd_uunit, sr_nop, 31, 0, LNX, ET|LEFT}, + #endif ++{"utsns", "UTSNS", pr_utsns, sr_utsns, 10, NS, LNX, ET|RIGHT}, + {"vm_data", "DATA", pr_nop, sr_vm_data, 5, 0, LNx, PO|RIGHT}, + {"vm_exe", "EXE", pr_nop, sr_vm_exe, 5, 0, LNx, PO|RIGHT}, + {"vm_lib", "LIB", pr_nop, sr_vm_lib, 5, 0, LNx, PO|RIGHT}, +--- procps-ng-3.3.8.orig/ps/ps.1 2013-05-25 17:39:40.000000000 -0400 ++++ procps-ng-3.3.8/ps/ps.1 2013-09-17 16:11:12.942925254 -0400 +@@ -1299,6 +1299,10 @@ format is displayed. (alias + .BR sig_ignore , \ sigignore ). + T} + ++ipcns IPCNS T{ ++Unique inode number describing the namespace the process belongs to. See namespaces(7). ++T} ++ + label LABEL T{ + security label, most commonly used for SELinux context data. This is for + the +@@ -1335,6 +1339,14 @@ min_flt MINFLT T{ + The number of minor page faults that have occurred with this process. + T} + ++mntns MNTNS T{ ++Unique inode number describing the namespace the process belongs to. See namespaces(7). ++T} ++ ++netns NETNS T{ ++Unique inode number describing the namespace the process belongs to. See namespaces(7). ++T} ++ + ni NI T{ + nice value. This ranges from 19 (nicest) to \-20 (not nice to others), + see +@@ -1403,6 +1415,10 @@ a number representing the process ID (al + .BR tgid ). + T} + ++pidns PIDNS T{ ++Unique inode number describing the namespace the process belongs to. See namespaces(7). ++T} ++ + pmem %MEM T{ + see + .BR %mem . +@@ -1739,6 +1755,14 @@ uunit UUNIT T{ + displays systemd user unit which a process belongs to. + T} + ++userns USERNS T{ ++Unique inode number describing the namespace the process belongs to. See namespaces(7). ++T} ++ ++utsns UTSNS T{ ++Unique inode number describing the namespace the process belongs to. See namespaces(7). ++T} ++ + vsize VSZ T{ + see + .BR vsz . diff --git a/SOURCES/procps-fix_the_fatal_make_dist_error_for_nsutils.patch b/SOURCES/procps-fix_the_fatal_make_dist_error_for_nsutils.patch new file mode 100644 index 0000000..26e4362 --- /dev/null +++ b/SOURCES/procps-fix_the_fatal_make_dist_error_for_nsutils.patch @@ -0,0 +1,28 @@ +commit e2242cb943c620599913db3a68ccba06fa07ac36 +Author: Jim Warner +Date: Wed Sep 11 09:11:13 2013 -0500 + + build-sys: fix the fatal 'make dist' error for nsutils + + While a 'make dist' appeared to work fine without this + patch, the nsutils.h file was missing from the include + subdirectory. Thus the tarball could not support make. + + Reference(s): + http://gitorious.org/procps/procps/merge_requests/13 + commit dd6f24dbed12e95235b3df49e550b5039e74e6d8 + + Signed-off-by: Jim Warner + +diff --git a/include/Makefile.am b/include/Makefile.am +index c511513..fee45ca 100644 +--- a/include/Makefile.am ++++ b/include/Makefile.am +@@ -2,6 +2,7 @@ dist_noinst_HEADERS = \ + c.h \ + fileutils.h \ + nls.h \ ++ nsutils.h \ + rpmatch.h \ + strutils.h \ + xalloc.h diff --git a/SOURCES/procps-ng-3.3.8-RH-man-page-check.patch b/SOURCES/procps-ng-3.3.8-RH-man-page-check.patch new file mode 100644 index 0000000..599b685 --- /dev/null +++ b/SOURCES/procps-ng-3.3.8-RH-man-page-check.patch @@ -0,0 +1,73 @@ +diff --git a/sysctl.8 b/sysctl.8 +index d57ecd1..faf2255 100644 +--- a/sysctl.8 ++++ b/sysctl.8 +@@ -92,7 +92,7 @@ Load settings from all system configuration files. + .br + /etc/sysctl.conf + .TP +-\fB\-\-pattern\fR \fIpattern\fR ++\fB\-r\fR, \fB\-\-pattern\fR \fIpattern\fR + Only apply settings that match + .IR pattern . + The +diff --git a/w.1 b/w.1 +index 5b2b264..7537f1d 100644 +--- a/w.1 ++++ b/w.1 +@@ -49,7 +49,7 @@ field is shown by default. + \fB\-\-help\fR + Display help text and exit. + .TP +-\fB\-\-ip\-addr\fR ++\fB\-i\fR, \fB\-\-ip\-addr\fR + Display IP address instead of hostname for \fBfrom\fR field. + .TP + \fB\-V\fR, \fB\-\-version\fR +diff --git a/w.c b/w.c +index fee9308..c80e117 100644 +--- a/w.c ++++ b/w.c +@@ -475,9 +475,10 @@ int main(int argc, char **argv) + static const struct option longopts[] = { + {"no-header", no_argument, NULL, 'h'}, + {"no-current", no_argument, NULL, 'u'}, +- {"sort", no_argument, NULL, 's'}, ++ {"short", no_argument, NULL, 's'}, + {"from", no_argument, NULL, 'f'}, + {"old-style", no_argument, NULL, 'o'}, ++ {"ip-addr", no_argument, NULL, 'i'}, + {"help", no_argument, NULL, HELP_OPTION}, + {"version", no_argument, NULL, 'V'}, + {NULL, 0, NULL, 0} +diff --git a/top/top.1 b/top/top.1 +index 0a753a8..bfe8ae7 100644 +--- a/top/top.1 ++++ b/top/top.1 +@@ -359,7 +359,7 @@ A pid value of zero will be treated as the process id of the \*(We program + itself once it is running. + + This is a \*(CO only and should you wish to return to normal operation, +-it is not necessary to quit and and restart \*(We \*(Em just issue any ++it is not necessary to quit and restart \*(We \*(Em just issue any + of these \*(CIs: '=', 'u' or 'U'. + + The 'p', 'u' and 'U' \*(COs are mutually exclusive. +@@ -757,7 +757,7 @@ of a second. + The process group ID of the foreground process for the connected tty, + or \-1 if a process is not connected to a terminal. + By convention, this value equals the process ID (\*(Xa PID) of the +-the process group leader (\*(Xa PGRP). ++process group leader (\*(Xa PGRP). + + .TP 4 + 32.\fB TTY \*(Em Controlling Tty \fR +@@ -1340,7 +1340,7 @@ no processes will be shown. + Prepending an exclamation point ('!') to the user id or name instucts top + to display only processes with users not matching the one provided. + +-Different \*(TWs can can be used to filter different users. ++Different \*(TWs can be used to filter different users. + Later, if you wish to monitor all users again in the \*(CW, re-issue this + command but just press at the prompt. + diff --git a/SOURCES/procps-ng-3.3.8-free-shmem.patch b/SOURCES/procps-ng-3.3.8-free-shmem.patch new file mode 100644 index 0000000..6582934 --- /dev/null +++ b/SOURCES/procps-ng-3.3.8-free-shmem.patch @@ -0,0 +1,38 @@ +diff --git a/free.1 b/free.1 +index f7c2313..1e8e7ef 100644 +--- a/free.1 ++++ b/free.1 +@@ -11,8 +11,11 @@ free \- Display amount of free and used memory in the system + .SH DESCRIPTION + .B free + displays the total amount of free and used physical and swap memory in the +-system, as well as the buffers used by the kernel. The shared memory column +-should be ignored; it is obsolete. ++system, as well as the buffers used by the kernel. ++The shared memory column represents either the MemShared value (2.4 series ++kernels) or the Shmem value (2.6 series kernels and later) taken from the ++/proc/meminfo file. The value is zero if none of the entries is exported ++by the kernel. + .SH OPTIONS + .TP + \fB\-b\fR, \fB\-\-bytes\fR +diff --git a/proc/sysinfo.c b/proc/sysinfo.c +index 15cdb83..8e4aca2 100644 +--- a/proc/sysinfo.c ++++ b/proc/sysinfo.c +@@ -629,13 +629,14 @@ void meminfo(void){ + {"LowTotal", &kb_low_total}, + {"Mapped", &kb_mapped}, // kB version of vmstat nr_mapped + {"MemFree", &kb_main_free}, // important +- {"MemShared", &kb_main_shared}, // important, but now gone! ++ {"MemShared", &kb_main_shared}, // obsolete since kernel 2.6! (sharing the variable with Shmem replacement) + {"MemTotal", &kb_main_total}, // important + {"NFS_Unstable", &kb_nfs_unstable}, + {"PageTables", &kb_pagetables}, // kB version of vmstat nr_page_table_pages + {"ReverseMaps", &nr_reversemaps}, // same as vmstat nr_page_table_pages + {"SReclaimable", &kb_swap_reclaimable}, // "swap reclaimable" (dentry and inode structures) + {"SUnreclaim", &kb_swap_unreclaimable}, ++ {"Shmem", &kb_main_shared}, // sharing the output variable with obsolete MemShared (kernel 2.6 and later) + {"Slab", &kb_slab}, // kB version of vmstat nr_slab + {"SwapCached", &kb_swap_cached}, + {"SwapFree", &kb_swap_free}, // important diff --git a/SOURCES/procps-ng-3.3.8-libselinux.patch b/SOURCES/procps-ng-3.3.8-libselinux.patch new file mode 100644 index 0000000..e3f1246 --- /dev/null +++ b/SOURCES/procps-ng-3.3.8-libselinux.patch @@ -0,0 +1,48 @@ +diff -Naur procps-ng-3.3.8.orig/configure.ac procps-ng-3.3.8/configure.ac +--- procps-ng-3.3.8.orig/configure.ac 2013-05-25 23:39:39.000000000 +0200 ++++ procps-ng-3.3.8/configure.ac 2013-08-06 19:53:49.595654086 +0200 +@@ -111,6 +111,14 @@ + AC_DEFINE([WITH_WATCH8BIT], [1], [Enable 8 bit clean watch]) + fi + ++AC_ARG_ENABLE([libselinux], ++ AS_HELP_STRING([--enable-libselinux], [enable libselinux]), ++ [enable_libselinux=$enableval], ++ [enable_libselinux="no"]) ++if test "$enable_libselinux" = "yes"; then ++ AC_DEFINE([ENABLE_LIBSELINUX], [1], [Enable libselinux]) ++fi ++ + # Optional packages - AC_ARG_WITH + AC_ARG_WITH([ncurses], + AS_HELP_STRING([--without-ncurses], [build only applications not needing ncurses]), +diff -Naur procps-ng-3.3.8.orig/ps/output.c procps-ng-3.3.8/ps/output.c +--- procps-ng-3.3.8.orig/ps/output.c 2013-05-25 23:39:40.000000000 +0200 ++++ procps-ng-3.3.8/ps/output.c 2013-08-06 19:55:32.477650664 +0200 +@@ -1282,6 +1282,8 @@ + /****************** FLASK & seLinux security stuff **********************/ + // move the bulk of this to libproc sometime + ++#if !ENABLE_LIBSELINUX ++ + static int pr_context(char *restrict const outbuf, const proc_t *restrict const pp){ + char filename[48]; + size_t len; +@@ -1310,7 +1312,8 @@ + return 1; + } + +-#if 0 ++#else ++ + // This needs more study, considering: + // 1. the static linking option (maybe disable this in that case) + // 2. the -z and -Z option issue +@@ -1345,6 +1348,7 @@ + } + return len; + } ++ + #endif + + diff --git a/SOURCES/skill-support_namespaces.patch b/SOURCES/skill-support_namespaces.patch new file mode 100644 index 0000000..28b59a2 --- /dev/null +++ b/SOURCES/skill-support_namespaces.patch @@ -0,0 +1,228 @@ +commit 91d225f3b8fcfa514f1ef20239af7b0ada64c01c +Author: Aristeu Rozanski +Date: Tue Apr 16 12:07:10 2013 -0400 + + skill: support namespaces + + In the same fashion of pgrep, introduce two new options: + --ns + - nslist + which allows processes to be filtered by namespace. + + Signed-off-by: Aristeu Rozanski + +diff --git a/Makefile.am b/Makefile.am +index 05128a4..3d66d60 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -55,7 +55,7 @@ EXTRA_DIST = \ + if BUILD_KILL + bin_PROGRAMS = kill + dist_man_MANS += kill.1 +-kill_SOURCES = skill.c $(top_srcdir)/lib/strutils.c $(top_srcdir)/lib/fileutils.c ++kill_SOURCES = skill.c $(top_srcdir)/lib/strutils.c $(top_srcdir)/lib/fileutils.c $(top_srcdir)/lib/nsutils.c + else + EXTRA_DIST += kill.1 + endif +@@ -77,8 +77,8 @@ if BUILD_SKILL + usrbin_exec_PROGRAMS += \ + skill \ + snice +-skill_SOURCES = skill.c $(top_srcdir)/lib/strutils.c $(top_srcdir)/lib/fileutils.c +-snice_SOURCES = skill.c $(top_srcdir)/lib/strutils.c $(top_srcdir)/lib/fileutils.c ++skill_SOURCES = skill.c $(top_srcdir)/lib/strutils.c $(top_srcdir)/lib/fileutils.c $(top_srcdir)/lib/nsutils.c ++snice_SOURCES = skill.c $(top_srcdir)/lib/strutils.c $(top_srcdir)/lib/fileutils.c $(top_srcdir)/lib/nsutils.c + dist_man_MANS += \ + skill.1 \ + snice.1 +diff --git a/skill.1 b/skill.1 +index 9748a1d..8ef7683 100644 +--- a/skill.1 ++++ b/skill.1 +@@ -77,6 +77,13 @@ The next expression is a process ID number. + .TP + \fB\-c\fR, \fB\-\-command\fR \fIcommand\fR + The next expression is a command name. ++.TP ++\fB\-\-ns \fIpid\fR ++Match the processes that belong to the same namespace as pid. ++.TP ++\fB\-\-nslist \fIns,...\fR ++list which namespaces will be considered for the --ns option. ++Available namespaces: ipc, mnt, net, pid, user, uts. + .PD + .SH SIGNALS + The behavior of signals is explained in +diff --git a/skill.c b/skill.c +index 03df229..d3fc978 100644 +--- a/skill.c ++++ b/skill.c +@@ -36,6 +36,7 @@ + + #include "c.h" + #include "fileutils.h" ++#include "nsutils.h" + #include "strutils.h" + #include "nls.h" + #include "xalloc.h" +@@ -43,6 +44,7 @@ + #include "proc/sig.h" + #include "proc/devname.h" + #include "proc/procps.h" /* char *user_from_uid(uid_t uid) */ ++#include "proc/readproc.h" + #include "proc/version.h" /* procps_version */ + #include "rpmatch.h" + +@@ -56,11 +58,14 @@ struct run_time_conf_t { + int noaction; + int debugging; + }; +-static int tty_count, uid_count, cmd_count, pid_count; ++static int tty_count, uid_count, cmd_count, pid_count, namespace_count; + static int *ttys; + static uid_t *uids; + static const char **cmds; + static int *pids; ++static char **namespaces; ++static int ns_pid; ++static proc_t ns_task; + + #define ENLIST(thing,addme) do{ \ + if(!thing##s) thing##s = xmalloc(sizeof(*thing##s)*saved_argc); \ +@@ -85,6 +90,39 @@ static void display_kill_version(void) + fprintf(stdout, PROCPS_NG_VERSION); + } + ++static int ns_flags = 0x3f; ++static int parse_namespaces(char *optarg) ++{ ++ char *ptr = optarg, *tmp; ++ int len, id; ++ ++ ns_flags = 0; ++ while (1) { ++ if (strchr(ptr, ',') == NULL) { ++ len = -1; ++ tmp = strdup(ptr); ++ } else { ++ len = strchr(ptr, ',') - ptr; ++ tmp = strndup(ptr, len); ++ } ++ ++ id = get_ns_id(tmp); ++ if (id == -1) { ++ fprintf(stderr, "%s is not a valid namespace\n", tmp); ++ free(tmp); ++ return 1; ++ } ++ ns_flags |= (1 << id); ++ ENLIST(namespace, tmp); ++ ++ if (len == -1) ++ break; ++ ++ ptr+= len + 1; ++ } ++ return 0; ++} ++ + /* kill or nice a process */ + static void hurt_proc(int tty, int uid, int pid, const char *restrict const cmd, + struct run_time_conf_t *run_time) +@@ -131,6 +169,7 @@ static void check_proc(int pid, struct run_time_conf_t *run_time) + { + char buf[128]; + struct stat statbuf; ++ proc_t task; + char *tmp; + int tty; + int fd; +@@ -183,6 +222,16 @@ static void check_proc(int pid, struct run_time_conf_t *run_time) + if (i == -1) + goto closure; + } ++ if (ns_pid) { ++ if (ns_read(pid, &task)) ++ goto closure; ++ for (i = 0; i < NUM_NS; i++) { ++ if (ns_flags & (1 << i)) { ++ if (task.ns[i] != ns_task.ns[i]) ++ goto closure; ++ } ++ } ++ } + /* This is where we kill/nice something. */ + /* for debugging purposes? + fprintf(stderr, "PID %d, UID %d, TTY %d,%d, COMM %s\n", +@@ -317,6 +366,15 @@ static void __attribute__ ((__noreturn__)) skillsnice_usage(FILE * out) + " -t, --tty expression is a terminal\n" + " -u, --user expression is a username\n"), out); + fputs(USAGE_SEPARATOR, out); ++ fputs(_("Alternatively, expression can be:\n" ++ " --ns match the processes that belong to the same\n" ++ " namespace as \n" ++ " --nslist list which namespaces will be considered for\n" ++ " the --ns option.\n" ++ " Available namespaces: ipc, mnt, net, pid, user, uts\n"), out); ++ ++ fputs(USAGE_SEPARATOR, out); ++ fputs(USAGE_SEPARATOR, out); + fputs(USAGE_HELP, out); + fputs(USAGE_VERSION, out); + if (program == PROG_SKILL) { +@@ -488,6 +546,11 @@ static void skillsnice_parse(int argc, + int prino = DEFAULT_NICE; + int ch, i; + ++ enum { ++ NS_OPTION = CHAR_MAX + 1, ++ NSLIST_OPTION, ++ }; ++ + static const struct option longopts[] = { + {"command", required_argument, NULL, 'c'}, + {"debug", no_argument, NULL, 'd'}, +@@ -499,6 +562,8 @@ static void skillsnice_parse(int argc, + {"table", no_argument, NULL, 'L'}, + {"tty", required_argument, NULL, 't'}, + {"user", required_argument, NULL, 'u'}, ++ {"ns", required_argument, NULL, NS_OPTION}, ++ {"nslist", required_argument, NULL, NSLIST_OPTION}, + {"verbose", no_argument, NULL, 'v'}, + {"warnings", no_argument, NULL, 'w'}, + {"help", no_argument, NULL, 'h'}, +@@ -572,6 +637,25 @@ static void skillsnice_parse(int argc, + } + } + break; ++ case NS_OPTION: ++ ns_pid = atoi(optarg); ++ if (ns_pid == 0) { ++ xwarnx(_("invalid pid number %i"), optarg); ++ kill_usage(stderr); ++ } ++ if (ns_read(ns_pid, &ns_task)) { ++ xwarnx(_("error reading reference namespace " ++ "information")); ++ kill_usage(stderr); ++ } ++ ++ break; ++ case NSLIST_OPTION: ++ if (parse_namespaces(optarg)) { ++ xwarnx(_("invalid namespace list")); ++ kill_usage(stderr); ++ } ++ break; + case 'v': + run_time->verbose = 1; + break; +@@ -605,7 +689,7 @@ static void skillsnice_parse(int argc, + } + + /* No more arguments to process. Must sanity check. */ +- if (!tty_count && !uid_count && !cmd_count && !pid_count) ++ if (!tty_count && !uid_count && !cmd_count && !pid_count && !ns_pid) + xerrx(EXIT_FAILURE, _("no process selection criteria")); + if ((run_time->fast | run_time->interactive | run_time-> + verbose | run_time->warnings | run_time->noaction) & ~1) diff --git a/SPECS/procps-ng.spec b/SPECS/procps-ng.spec new file mode 100644 index 0000000..b56e45b --- /dev/null +++ b/SPECS/procps-ng.spec @@ -0,0 +1,271 @@ +# The testsuite is unsuitable for running on buildsystems +%global tests_enabled 0 + +Summary: System and process monitoring utilities +Name: procps-ng +Version: 3.3.8 +Release: 15%{?dist} +License: GPL+ and GPLv2 and GPLv2+ and GPLv3+ and LGPLv2+ +Group: Applications/System +URL: https://sourceforge.net/projects/procps-ng/ + +Source: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.xz + +Patch0: 0001-top-add-the-major-version-to-dlopen-of-libnuma-sonam.patch +Patch1: 0002-library-for-atexit-support-fix-fileutils-for-EPIPE.patch +Patch2: 0001-top-enable-screen-contents-preservation-at-end-of-jo.patch +Patch3: 0001-top-refine-some-miscellaneous-signals-interrupt-stuf.patch +Patch4: 0002-top-cursor-repositioning-includes-line-oriented-inpu.patch +Patch5: procps-ng-3.3.8-RH-man-page-check.patch +Patch6: procps-ng-3.3.8-libselinux.patch +Patch7: procps-ng-3.3.8-free-shmem.patch +Patch8: procps-add_support_for_linux_namespaces.patch +Patch9: pgrep-introduce_support_for_namespaces.patch +Patch10: skill-support_namespaces.patch +Patch11: procps-fix_the_fatal_make_dist_error_for_nsutils.patch +Patch12: 0001-misc-correct-errors-from-merge-request-13.patch + +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig + +Requires: systemd-libs + +BuildRequires: ncurses-devel +BuildRequires: libtool +BuildRequires: autoconf +BuildRequires: automake +BuildRequires: gettext-devel +BuildRequires: systemd-devel + +%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, w, watch and pwdx. 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. + +%package devel +Summary: System and process monitoring utilities +Group: Development/Libraries +Requires: %{name}%{?_isa} = %{version}-%{release} +Provides: procps-devel = %{version}-%{release} +Obsoletes: procps-devel < 3.2.9-1 + +%description devel +System and process monitoring utilities development headers + +%prep +%setup -q -n %{name}-%{version} + +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 + +%build +# The following stuff is needed for git archives only +#echo "%{version}" > .tarball-version +#./autogen.sh + +autoreconf --verbose --force --install + +./configure --prefix=/ \ + --bindir=%{_bindir} \ + --sbindir=%{_sbindir} \ + --libdir=%{_libdir} \ + --mandir=%{_mandir} \ + --includedir=%{_includedir} \ + --sysconfdir=%{_sysconfdir} \ + --docdir=/unwanted \ + --disable-static \ + --disable-w-from \ + --disable-kill \ + --disable-rpath \ + --enable-watch8bit \ + --enable-skill \ + --enable-sigwinch \ + --enable-libselinux \ + --with-systemd + +make CFLAGS="%{optflags}" + + +%if %{tests_enabled} +%check +make check +%endif + + +%install +make DESTDIR=%{buildroot} install + +mkdir -p %{buildroot}%{_sysconfdir}/sysctl.d + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + +%files +%doc AUTHORS Documentation/BUGS COPYING COPYING.LIB Documentation/FAQ NEWS README top/README.top Documentation/TODO + +%{_libdir}/libprocps.so.* +%{_bindir}/* +%{_sbindir}/* +%{_sysconfdir}/sysctl.d +%{_mandir}/man1/* +%{_mandir}/man8/* +%{_mandir}/man5/* + +%exclude %{_libdir}/libprocps.la +%exclude %{_sysconfdir}/sysctl.conf +%exclude /unwanted/* + +%files devel +%doc COPYING COPYING.LIB +%{_libdir}/libprocps.so +%{_libdir}/pkgconfig/libprocps.pc +%{_includedir}/proc + +%changelog +* Mon Oct 21 2013 Jaromir Capik - 3.3.8-15 +- Fixing incorrect format specifier (introduced with namespaces) + +* Tue Sep 17 2013 Aristeu Rozanski - 3.3.8-14 +- Introduce namespaces support (#980516) + +* Fri Aug 09 2013 Jaromir Capik - 3.3.8-13 +- Including forgotten man fixes (#948522) + +* Wed Aug 07 2013 Jaromir Capik - 3.3.8-12 +- Fixing the license tag + +* Wed Aug 07 2013 Jaromir Capik - 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 - 3.3.8-10 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Fri Jul 19 2013 Jaromir Capik - 3.3.8-9 +- RH man page scan (#948522) + +* Tue Jul 02 2013 Jaromir Capik - 3.3.8-8 +- Extending the end-of-job patch disabling the screen content restoration + +* Mon Jul 01 2013 Jaromir Capik - 3.3.8-7 +- Disabling screen content restoration when exiting 'top' (#977561) +- Enabling SIGWINCH flood prevention + +* Wed Jun 26 2013 Jaromir Capik - 3.3.8-6 +- Avoiding "write error" messages when piping to grep (#976199) + +* Wed Jun 26 2013 Jaromir Capik - 3.3.8-5 +- Disabling tests - unsuitable for running on buildsystems + +* Mon Jun 17 2013 Jaromir Capik - 3.3.8-4 +- Enabling skill and snice (#974752) + +* Wed Jun 12 2013 Jaromir Capik - 3.3.8-3 +- Adding major version in the libnuma soname + +* Thu May 30 2013 Jaromir Capik - 3.3.8-2 +- watch: enabling UTF-8 (#965867) + +* Wed May 29 2013 Jaromir Capik - 3.3.8-1 +- Update to 3.3.8 + +* Wed May 22 2013 Jaromir Capik - 3.3.7-4 +- top: inoculated against a window manager like 'screen' (#962022) + +* Tue Apr 16 2013 Jaromir Capik - 3.3.7-3 +- Avoid segfaults when reading zero bytes - file2str (#951391) + +* Mon Apr 15 2013 Jaromir Capik - 3.3.7-2 +- Moving libprocps.pc to the devel subpackage (#951726) + +* Tue Mar 26 2013 Jaromir Capik - 3.3.7-1 +- Update to 3.3.7 +- Reverting upstream commit for testsuite/unix.exp + +* Tue Feb 05 2013 Jaromir Capik - 3.3.6-4 +- Fixing empty pmap output on ppc/s390 (#906457) + +* Tue Jan 15 2013 Jaromir Capik - 3.3.6-3 +- Typo in the description, pdwx instead of pwdx (#891476) + +* Tue Jan 08 2013 Jaromir Capik - 3.3.6-2 +- Rebuilding with tests disabled (koji issue #853084) + +* Tue Jan 08 2013 Jaromir Capik - 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 - 3.3.5-1 +- Update to 3.3.5 + +* Tue Dec 11 2012 Jaromir Capik - 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 - 3.3.4-1 +- Update to 3.3.4 + +* Tue Sep 25 2012 Jaromir Capik - 3.3.3-3.20120807git +- SELinux spelling fixes (#859900) + +* Tue Aug 21 2012 Jaromir Capik - 3.3.3-2.20120807git +- Tests enabled + +* Tue Aug 07 2012 Jaromir Capik - 3.3.3-1.20120807git +- Update to 3.3.3-20120807git + +* Sat Jul 21 2012 Fedora Release Engineering - 3.3.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Thu Mar 08 2012 Jaromir Capik - 3.3.2-3 +- Second usrmove hack - providing /bin/ps + +* Tue Mar 06 2012 Jaromir Capik - 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 - 3.3.2-1 +- Initial version