From 9379132a8234eeedf62d37ef57713e52c12db6ab Mon Sep 17 00:00:00 2001 From: Daniel Lange Date: Mon, 11 Apr 2016 13:00:22 +0200 Subject: Imported Upstream version 0.7 --- AffinityPanel.c | 45 +++++++ AffinityPanel.h | 19 +++ CPUMeter.c | 20 +-- CRT.c | 13 +- CRT.h | 1 + ChangeLog | 12 +- CheckItem.c | 22 +++- CheckItem.h | 9 +- ColorsPanel.c | 13 +- ColorsPanel.h | 1 - DisplayOptionsPanel.c | 22 ++-- DisplayOptionsPanel.h | 2 +- Makefile.am | 4 +- Makefile.in | 112 ++++++++-------- Process.c | 24 +++- Process.h | 10 +- ProcessList.c | 69 +++++----- ProcessList.h | 6 +- RichString.c | 18 +-- RichString.h | 4 +- Settings.c | 7 +- SignalsPanel.c | 4 +- SignalsPanel.h | 2 +- aclocal.m4 | 174 +++++++++++++------------ autogen.sh | 8 ++ config.h | 147 +++++++++++++++++++++ configure | 138 ++++++++++++-------- configure.ac | 2 +- depcomp | 64 +++++++++- htop.1 | 5 +- htop.c | 46 ++++++- htop.desktop | 2 +- htop.h | 1 + install-sh | 348 ++++++++++++++++++++++++++++++++++++++------------ missing | 61 +++++---- 35 files changed, 1025 insertions(+), 410 deletions(-) create mode 100644 AffinityPanel.c create mode 100644 AffinityPanel.h create mode 100755 autogen.sh create mode 100644 config.h diff --git a/AffinityPanel.c b/AffinityPanel.c new file mode 100644 index 0000000..73cf165 --- /dev/null +++ b/AffinityPanel.c @@ -0,0 +1,45 @@ + +#include "AffinityPanel.h" + +#include "Panel.h" +#include "CheckItem.h" + +#include "debug.h" +#include + +Panel* AffinityPanel_new(int processorCount, unsigned long mask) { + Panel* this = Panel_new(1, 1, 1, 1, CHECKITEM_CLASS, true, ListItem_compare); + this->eventHandler = AffinityPanel_eventHandler; + + Panel_setHeader(this, "Use CPUs:"); + for (int i = 0; i < processorCount; i++) { + char number[10]; + snprintf(number, 9, "%d", i+1); + Panel_add(this, (Object*) CheckItem_new(String_copy(number), NULL, mask & (1 << i))); + } + return this; +} + +unsigned long AffinityPanel_getAffinity(Panel* this) { + int size = Panel_getSize(this); + unsigned long mask = 0; + for (int i = 0; i < size; i++) { + if (CheckItem_get((CheckItem*)Panel_get(this, i))) + mask = mask | (1 << i); + } + return mask; +} + +HandlerResult AffinityPanel_eventHandler(Panel* this, int ch) { + HandlerResult result = IGNORED; + CheckItem* selected = (CheckItem*) Panel_getSelected(this); + switch(ch) { + case 0x0a: + case 0x0d: + case KEY_ENTER: + case ' ': + CheckItem_set(selected, ! (CheckItem_get(selected)) ); + result = HANDLED; + } + return result; +} diff --git a/AffinityPanel.h b/AffinityPanel.h new file mode 100644 index 0000000..dfea3d7 --- /dev/null +++ b/AffinityPanel.h @@ -0,0 +1,19 @@ +/* Do not edit this file. It was automatically generated. */ + +#ifndef HEADER_AffinityPanel +#define HEADER_AffinityPanel + + +#include "Panel.h" +#include "CheckItem.h" + +#include "debug.h" +#include + +Panel* AffinityPanel_new(int processorCount, unsigned long mask); + +unsigned long AffinityPanel_getAffinity(Panel* this); + +HandlerResult AffinityPanel_eventHandler(Panel* this, int ch); + +#endif diff --git a/CPUMeter.c b/CPUMeter.c index a252d5a..1fdac5c 100644 --- a/CPUMeter.c +++ b/CPUMeter.c @@ -19,7 +19,7 @@ in the source distribution for its full text. #include int CPUMeter_attributes[] = { - CPU_NICE, CPU_NORMAL, CPU_KERNEL, CPU_IOWAIT, CPU_IRQ, CPU_SOFTIRQ + CPU_NICE, CPU_NORMAL, CPU_KERNEL, CPU_IRQ, CPU_SOFTIRQ, CPU_IOWAIT }; MeterType CPUMeter = { @@ -74,14 +74,14 @@ void CPUMeter_setValues(Meter* this, char* buffer, int size) { double cpu; this->values[0] = pl->nicePeriod[processor] / total * 100.0; this->values[1] = pl->userPeriod[processor] / total * 100.0; - if (pl->expandSystemTime) { + if (pl->detailedCPUTime) { this->values[2] = pl->systemPeriod[processor] / total * 100.0; - this->values[3] = pl->ioWaitPeriod[processor] / total * 100.0; - this->values[4] = pl->irqPeriod[processor] / total * 100.0; - this->values[5] = pl->softIrqPeriod[processor] / total * 100.0; + this->values[3] = pl->irqPeriod[processor] / total * 100.0; + this->values[4] = pl->softIrqPeriod[processor] / total * 100.0; + this->values[5] = pl->ioWaitPeriod[processor] / total * 100.0; this->type->items = 6; cpu = MIN(100.0, MAX(0.0, (this->values[0]+this->values[1]+this->values[2]+ - this->values[3]+this->values[4]+this->values[5]))); + this->values[3]+this->values[4]))); } else { this->values[2] = pl->systemAllPeriod[processor] / total * 100.0; this->type->items = 3; @@ -97,7 +97,7 @@ void CPUMeter_display(Object* cast, RichString* out) { sprintf(buffer, "%5.1f%% ", this->values[1]); RichString_append(out, CRT_colors[METER_TEXT], ":"); RichString_append(out, CRT_colors[CPU_NORMAL], buffer); - if (this->pl->expandSystemTime) { + if (this->pl->detailedCPUTime) { sprintf(buffer, "%5.1f%% ", this->values[2]); RichString_append(out, CRT_colors[METER_TEXT], "sy:"); RichString_append(out, CRT_colors[CPU_KERNEL], buffer); @@ -105,14 +105,14 @@ void CPUMeter_display(Object* cast, RichString* out) { RichString_append(out, CRT_colors[METER_TEXT], "ni:"); RichString_append(out, CRT_colors[CPU_NICE], buffer); sprintf(buffer, "%5.1f%% ", this->values[3]); - RichString_append(out, CRT_colors[METER_TEXT], "wa:"); - RichString_append(out, CRT_colors[CPU_IOWAIT], buffer); - sprintf(buffer, "%5.1f%% ", this->values[4]); RichString_append(out, CRT_colors[METER_TEXT], "hi:"); RichString_append(out, CRT_colors[CPU_IRQ], buffer); sprintf(buffer, "%5.1f%% ", this->values[4]); RichString_append(out, CRT_colors[METER_TEXT], "si:"); RichString_append(out, CRT_colors[CPU_SOFTIRQ], buffer); + sprintf(buffer, "%5.1f%% ", this->values[5]); + RichString_append(out, CRT_colors[METER_TEXT], "wa:"); + RichString_append(out, CRT_colors[CPU_IOWAIT], buffer); } else { sprintf(buffer, "%5.1f%% ", this->values[2]); RichString_append(out, CRT_colors[METER_TEXT], "sys:"); diff --git a/CRT.c b/CRT.c index 9710452..5c0eac8 100644 --- a/CRT.c +++ b/CRT.c @@ -14,6 +14,7 @@ in the source distribution for its full text. #include "String.h" +#include "config.h" #include "debug.h" #define ColorPair(i,j) COLOR_PAIR((7-i)*8+j) @@ -181,7 +182,7 @@ void CRT_enableDelay() { void CRT_handleSIGSEGV(int signal) { CRT_done(); - fprintf(stderr, "Aborted. Please report bug at http://htop.sf.net"); + fprintf(stderr, "htop " VERSION " aborted. Please report bug at http://htop.sf.net\n"); exit(1); } @@ -254,7 +255,7 @@ void CRT_setColors(int colorScheme) { CRT_colors[CHECK_BOX] = A_BOLD; CRT_colors[CHECK_MARK] = A_NORMAL; CRT_colors[CHECK_TEXT] = A_NORMAL; - CRT_colors[CPU_IOWAIT] = A_BOLD; + CRT_colors[CPU_IOWAIT] = A_NORMAL; CRT_colors[CPU_IRQ] = A_BOLD; CRT_colors[CPU_SOFTIRQ] = A_BOLD; } else if (CRT_colorScheme == COLORSCHEME_BLACKONWHITE) { @@ -309,7 +310,7 @@ void CRT_setColors(int colorScheme) { CRT_colors[CHECK_BOX] = ColorPair(Blue,White); CRT_colors[CHECK_MARK] = ColorPair(Black,White); CRT_colors[CHECK_TEXT] = ColorPair(Black,White); - CRT_colors[CPU_IOWAIT] = ColorPair(Yellow,White); + CRT_colors[CPU_IOWAIT] = A_BOLD | ColorPair(Black, Black); CRT_colors[CPU_IRQ] = ColorPair(Blue,White); CRT_colors[CPU_SOFTIRQ] = ColorPair(Blue,White); } else if (CRT_colorScheme == COLORSCHEME_BLACKONWHITE2) { @@ -364,7 +365,7 @@ void CRT_setColors(int colorScheme) { CRT_colors[CHECK_BOX] = ColorPair(Blue,Black); CRT_colors[CHECK_MARK] = ColorPair(Black,Black); CRT_colors[CHECK_TEXT] = ColorPair(Black,Black); - CRT_colors[CPU_IOWAIT] = ColorPair(Yellow,Black); + CRT_colors[CPU_IOWAIT] = A_BOLD | ColorPair(Black, Black); CRT_colors[CPU_IRQ] = A_BOLD | ColorPair(Blue,Black); CRT_colors[CPU_SOFTIRQ] = ColorPair(Blue,Black); } else if (CRT_colorScheme == COLORSCHEME_MIDNIGHT) { @@ -419,7 +420,7 @@ void CRT_setColors(int colorScheme) { CRT_colors[CHECK_BOX] = ColorPair(Cyan,Blue); CRT_colors[CHECK_MARK] = A_BOLD | ColorPair(White,Blue); CRT_colors[CHECK_TEXT] = A_NORMAL | ColorPair(White,Blue); - CRT_colors[CPU_IOWAIT] = A_BOLD | ColorPair(Yellow,Blue); + CRT_colors[CPU_IOWAIT] = ColorPair(Yellow,Blue); CRT_colors[CPU_IRQ] = A_BOLD | ColorPair(Black,Blue); CRT_colors[CPU_SOFTIRQ] = ColorPair(Black,Blue); } else if (CRT_colorScheme == COLORSCHEME_BLACKNIGHT) { @@ -530,7 +531,7 @@ void CRT_setColors(int colorScheme) { CRT_colors[CHECK_BOX] = ColorPair(Cyan,Black); CRT_colors[CHECK_MARK] = A_BOLD; CRT_colors[CHECK_TEXT] = A_NORMAL; - CRT_colors[CPU_IOWAIT] = ColorPair(Cyan,Black); + CRT_colors[CPU_IOWAIT] = A_BOLD | ColorPair(Black, Black); CRT_colors[CPU_IRQ] = ColorPair(Yellow,Black); CRT_colors[CPU_SOFTIRQ] = ColorPair(Magenta,Black); } diff --git a/CRT.h b/CRT.h index 76a3b08..41de032 100644 --- a/CRT.h +++ b/CRT.h @@ -17,6 +17,7 @@ in the source distribution for its full text. #include "String.h" +#include "config.h" #include "debug.h" #define ColorPair(i,j) COLOR_PAIR((7-i)*8+j) diff --git a/ChangeLog b/ChangeLog index 3a35f2b..733c666 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ -What's new in version 0.6.7 +What's new in version 0.7 + +* CPU affinity configuration ('a' key) +* Improve display of tree view, properly nesting + threads of the same app based on TGID. +* IO-wait time now counts as idle time, which is a more + accurate description. It is still available in + split time, now called detailed CPU time. + (thanks to Samuel Thibault for the report) +* BUGFIX: Correct display of TPGID field +* Add TGID field * BUGFIX: Don't crash with invalid command-line flags (thanks to Nico Golde for the report) * Fix GCC 4.3 compilation issues diff --git a/CheckItem.c b/CheckItem.c index 8326123..45c0b22 100644 --- a/CheckItem.c +++ b/CheckItem.c @@ -16,7 +16,8 @@ in the source distribution for its full text. typedef struct CheckItem_ { Object super; char* text; - bool* value; + bool value; + bool* ref; } CheckItem; }*/ @@ -27,13 +28,14 @@ char* CHECKITEM_CLASS = "CheckItem"; #define CHECKITEM_CLASS NULL #endif -CheckItem* CheckItem_new(char* text, bool* value) { +CheckItem* CheckItem_new(char* text, bool* ref, bool value) { CheckItem* this = malloc(sizeof(CheckItem)); Object_setClass(this, CHECKITEM_CLASS); ((Object*)this)->display = CheckItem_display; ((Object*)this)->delete = CheckItem_delete; this->text = text; this->value = value; + this->ref = ref; return this; } @@ -45,11 +47,25 @@ void CheckItem_delete(Object* cast) { free(this); } +void CheckItem_set(CheckItem* this, bool value) { + if (this->ref) + *(this->ref) = value; + else + this->value = value; +} + +bool CheckItem_get(CheckItem* this) { + if (this->ref) + return *(this->ref); + else + return this->value; +} + void CheckItem_display(Object* cast, RichString* out) { CheckItem* this = (CheckItem*)cast; assert (this != NULL); RichString_write(out, CRT_colors[CHECK_BOX], "["); - if (*(this->value)) + if (CheckItem_get(this)) RichString_append(out, CRT_colors[CHECK_MARK], "x"); else RichString_append(out, CRT_colors[CHECK_MARK], " "); diff --git a/CheckItem.h b/CheckItem.h index e1ad4c9..359a0ef 100644 --- a/CheckItem.h +++ b/CheckItem.h @@ -18,7 +18,8 @@ in the source distribution for its full text. typedef struct CheckItem_ { Object super; char* text; - bool* value; + bool value; + bool* ref; } CheckItem; @@ -28,10 +29,14 @@ extern char* CHECKITEM_CLASS; #define CHECKITEM_CLASS NULL #endif -CheckItem* CheckItem_new(char* text, bool* value); +CheckItem* CheckItem_new(char* text, bool* ref, bool value); void CheckItem_delete(Object* cast); +void CheckItem_set(CheckItem* this, bool value); + +bool CheckItem_get(CheckItem* this); + void CheckItem_display(Object* cast, RichString* out); #endif diff --git a/ColorsPanel.c b/ColorsPanel.c index e62583c..0086845 100644 --- a/ColorsPanel.c +++ b/ColorsPanel.c @@ -23,7 +23,6 @@ typedef struct ColorsPanel_ { Settings* settings; ScreenManager* scr; - bool check[5]; } ColorsPanel; }*/ @@ -50,10 +49,9 @@ ColorsPanel* ColorsPanel_new(Settings* settings, ScreenManager* scr) { Panel_setHeader(super, "Colors"); for (int i = 0; ColorSchemes[i] != NULL; i++) { - Panel_add(super, (Object*) CheckItem_new(String_copy(ColorSchemes[i]), &(this->check[i]))); - this->check[i] = false; + Panel_add(super, (Object*) CheckItem_new(String_copy(ColorSchemes[i]), NULL, false)); } - this->check[settings->colorScheme] = true; + CheckItem_set((CheckItem*)Panel_get(super, settings->colorScheme), true); return this; } @@ -75,10 +73,9 @@ HandlerResult ColorsPanel_EventHandler(Panel* super, int ch) { case 0x0d: case KEY_ENTER: case ' ': - for (int i = 0; ColorSchemes[i] != NULL; i++) { - this->check[i] = false; - } - this->check[mark] = true; + for (int i = 0; ColorSchemes[i] != NULL; i++) + CheckItem_set((CheckItem*)Panel_get(super, i), false); + CheckItem_set((CheckItem*)Panel_get(super, mark), true); this->settings->colorScheme = mark; result = HANDLED; } diff --git a/ColorsPanel.h b/ColorsPanel.h index 2cf2947..ed60a8c 100644 --- a/ColorsPanel.h +++ b/ColorsPanel.h @@ -25,7 +25,6 @@ typedef struct ColorsPanel_ { Settings* settings; ScreenManager* scr; - bool check[5]; } ColorsPanel; diff --git a/DisplayOptionsPanel.c b/DisplayOptionsPanel.c index 119b4e6..2eeeb8a 100644 --- a/DisplayOptionsPanel.c +++ b/DisplayOptionsPanel.c @@ -28,17 +28,17 @@ DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager* this->settings = settings; this->scr = scr; - super->eventHandler = DisplayOptionsPanel_EventHandler; + super->eventHandler = DisplayOptionsPanel_eventHandler; Panel_setHeader(super, "Display options"); - Panel_add(super, (Object*) CheckItem_new(String_copy("Tree view"), &(settings->pl->treeView))); - Panel_add(super, (Object*) CheckItem_new(String_copy("Shadow other users' processes"), &(settings->pl->shadowOtherUsers))); - Panel_add(super, (Object*) CheckItem_new(String_copy("Hide kernel threads"), &(settings->pl->hideKernelThreads))); - Panel_add(super, (Object*) CheckItem_new(String_copy("Hide userland threads"), &(settings->pl->hideUserlandThreads))); - Panel_add(super, (Object*) CheckItem_new(String_copy("Highlight program \"basename\""), &(settings->pl->highlightBaseName))); - Panel_add(super, (Object*) CheckItem_new(String_copy("Highlight megabytes in memory counters"), &(settings->pl->highlightMegabytes))); - Panel_add(super, (Object*) CheckItem_new(String_copy("Leave a margin around header"), &(settings->header->margin))); - Panel_add(super, (Object*) CheckItem_new(String_copy("Split System Time into System/IO-Wait/Hard-IRQ/Soft-IRQ"), &(settings->pl->expandSystemTime))); + Panel_add(super, (Object*) CheckItem_new(String_copy("Tree view"), &(settings->pl->treeView), false)); + Panel_add(super, (Object*) CheckItem_new(String_copy("Shadow other users' processes"), &(settings->pl->shadowOtherUsers), false)); + Panel_add(super, (Object*) CheckItem_new(String_copy("Hide kernel threads"), &(settings->pl->hideKernelThreads), false)); + Panel_add(super, (Object*) CheckItem_new(String_copy("Hide userland threads"), &(settings->pl->hideUserlandThreads), false)); + Panel_add(super, (Object*) CheckItem_new(String_copy("Highlight program \"basename\""), &(settings->pl->highlightBaseName), false)); + Panel_add(super, (Object*) CheckItem_new(String_copy("Highlight megabytes in memory counters"), &(settings->pl->highlightMegabytes), false)); + Panel_add(super, (Object*) CheckItem_new(String_copy("Leave a margin around header"), &(settings->header->margin), false)); + Panel_add(super, (Object*) CheckItem_new(String_copy("Detailed CPU time (System/IO-Wait/Hard-IRQ/Soft-IRQ)"), &(settings->pl->detailedCPUTime), false)); return this; } @@ -49,7 +49,7 @@ void DisplayOptionsPanel_delete(Object* object) { free(this); } -HandlerResult DisplayOptionsPanel_EventHandler(Panel* super, int ch) { +HandlerResult DisplayOptionsPanel_eventHandler(Panel* super, int ch) { DisplayOptionsPanel* this = (DisplayOptionsPanel*) super; HandlerResult result = IGNORED; @@ -60,7 +60,7 @@ HandlerResult DisplayOptionsPanel_EventHandler(Panel* super, int ch) { case 0x0d: case KEY_ENTER: case ' ': - *(selected->value) = ! *(selected->value); + CheckItem_set(selected, ! (CheckItem_get(selected)) ); result = HANDLED; } diff --git a/DisplayOptionsPanel.h b/DisplayOptionsPanel.h index 87faaad..7c32b0c 100644 --- a/DisplayOptionsPanel.h +++ b/DisplayOptionsPanel.h @@ -25,7 +25,7 @@ DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager* void DisplayOptionsPanel_delete(Object* object); -HandlerResult DisplayOptionsPanel_EventHandler(Panel* super, int ch); +HandlerResult DisplayOptionsPanel_eventHandler(Panel* super, int ch); #endif diff --git a/Makefile.am b/Makefile.am index b7301ce..d1ef6e3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -17,7 +17,7 @@ DisplayOptionsPanel.c FunctionBar.c Hashtable.c Header.c htop.c ListItem.c \ LoadAverageMeter.c MemoryMeter.c Meter.c MetersPanel.c Object.c Panel.c \ Process.c ProcessList.c RichString.c ScreenManager.c Settings.c \ SignalItem.c SignalsPanel.c String.c SwapMeter.c TasksMeter.c TraceScreen.c \ -UptimeMeter.c UsersTable.c Vector.c AvailableColumnsPanel.c +UptimeMeter.c UsersTable.c Vector.c AvailableColumnsPanel.c AffinityPanel.c myhtopheaders = AvailableColumnsPanel.h AvailableMetersPanel.h \ CategoriesPanel.h CheckItem.h ClockMeter.h ColorsPanel.h ColumnsPanel.h \ @@ -26,7 +26,7 @@ Hashtable.h Header.h htop.h ListItem.h LoadAverageMeter.h MemoryMeter.h \ Meter.h MetersPanel.h Object.h Panel.h ProcessList.h RichString.h \ ScreenManager.h Settings.h SignalItem.h SignalsPanel.h String.h \ SwapMeter.h TasksMeter.h TraceScreen.h UptimeMeter.h UsersTable.h Vector.h \ -Process.h +Process.h AffinityPanel.h SUFFIXES = .h diff --git a/Makefile.in b/Makefile.in index 3ce42a4..a565622 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,15 +15,11 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -46,7 +42,7 @@ am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno configure.status.lineno + configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = @@ -69,11 +65,11 @@ am__objects_2 = AvailableMetersPanel.$(OBJEXT) \ SignalItem.$(OBJEXT) SignalsPanel.$(OBJEXT) String.$(OBJEXT) \ SwapMeter.$(OBJEXT) TasksMeter.$(OBJEXT) TraceScreen.$(OBJEXT) \ UptimeMeter.$(OBJEXT) UsersTable.$(OBJEXT) Vector.$(OBJEXT) \ - AvailableColumnsPanel.$(OBJEXT) + AvailableColumnsPanel.$(OBJEXT) AffinityPanel.$(OBJEXT) am_htop_OBJECTS = $(am__objects_1) $(am__objects_2) htop_OBJECTS = $(am_htop_OBJECTS) htop_LDADD = $(LDADD) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I. +DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ @@ -108,8 +104,6 @@ GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -129,6 +123,7 @@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -138,6 +133,7 @@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ @@ -150,9 +146,11 @@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -160,6 +158,7 @@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ +builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ @@ -183,8 +182,11 @@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ dist_man_MANS = htop.1 EXTRA_DIST = $(dist_man_MANS) htop.desktop htop.png scripts/MakeHeader.py \ install-sh autogen.sh missing @@ -201,7 +203,7 @@ DisplayOptionsPanel.c FunctionBar.c Hashtable.c Header.c htop.c ListItem.c \ LoadAverageMeter.c MemoryMeter.c Meter.c MetersPanel.c Object.c Panel.c \ Process.c ProcessList.c RichString.c ScreenManager.c Settings.c \ SignalItem.c SignalsPanel.c String.c SwapMeter.c TasksMeter.c TraceScreen.c \ -UptimeMeter.c UsersTable.c Vector.c AvailableColumnsPanel.c +UptimeMeter.c UsersTable.c Vector.c AvailableColumnsPanel.c AffinityPanel.c myhtopheaders = AvailableColumnsPanel.h AvailableMetersPanel.h \ CategoriesPanel.h CheckItem.h ClockMeter.h ColorsPanel.h ColumnsPanel.h \ @@ -210,7 +212,7 @@ Hashtable.h Header.h htop.h ListItem.h LoadAverageMeter.h MemoryMeter.h \ Meter.h MetersPanel.h Object.h Panel.h ProcessList.h RichString.h \ ScreenManager.h Settings.h SignalItem.h SignalsPanel.h String.h \ SwapMeter.h TasksMeter.h TraceScreen.h UptimeMeter.h UsersTable.h Vector.h \ -Process.h +Process.h AffinityPanel.h SUFFIXES = .h BUILT_SOURCES = $(myhtopheaders) @@ -257,7 +259,7 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ - $(MAKE) stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @@ -272,7 +274,7 @@ distclean-hdr: -rm -f config.h stamp-h1 install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ @@ -295,7 +297,7 @@ clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) htop$(EXEEXT): $(htop_OBJECTS) $(htop_DEPENDENCIES) @rm -f htop$(EXEEXT) - $(LINK) $(htop_LDFLAGS) $(htop_OBJECTS) $(htop_LDADD) $(LIBS) + $(LINK) $(htop_OBJECTS) $(htop_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -303,6 +305,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AffinityPanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AvailableColumnsPanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AvailableMetersPanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CPUMeter.Po@am__quote@ @@ -341,22 +344,21 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/htop.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` -uninstall-info-am: install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ @@ -401,7 +403,7 @@ uninstall-man1: done install-applicationsDATA: $(applications_DATA) @$(NORMAL_INSTALL) - test -z "$(applicationsdir)" || $(mkdir_p) "$(DESTDIR)$(applicationsdir)" + test -z "$(applicationsdir)" || $(MKDIR_P) "$(DESTDIR)$(applicationsdir)" @list='$(applications_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ @@ -418,7 +420,7 @@ uninstall-applicationsDATA: done install-pixmapDATA: $(pixmap_DATA) @$(NORMAL_INSTALL) - test -z "$(pixmapdir)" || $(mkdir_p) "$(DESTDIR)$(pixmapdir)" + test -z "$(pixmapdir)" || $(MKDIR_P) "$(DESTDIR)$(pixmapdir)" @list='$(pixmap_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ @@ -484,24 +486,22 @@ distclean-tags: distdir: $(DISTFILES) $(am__remove_distdir) - mkdir $(distdir) - $(mkdir_p) $(distdir)/scripts - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + test -d $(distdir) || mkdir $(distdir) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ @@ -515,7 +515,7 @@ distdir: $(DISTFILES) -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz @@ -590,7 +590,7 @@ distcheck: dist $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ @@ -615,7 +615,7 @@ check: $(BUILT_SOURCES) all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) config.h installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(applicationsdir)" "$(DESTDIR)$(pixmapdir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am @@ -667,12 +667,20 @@ info-am: install-data-am: install-applicationsDATA install-man \ install-pixmapDATA +install-dvi: install-dvi-am + install-exec-am: install-binPROGRAMS +install-html: install-html-am + install-info: install-info-am install-man: install-man1 +install-pdf: install-pdf-am + +install-ps: install-ps-am + installcheck-am: maintainer-clean: maintainer-clean-am @@ -695,10 +703,12 @@ ps: ps-am ps-am: uninstall-am: uninstall-applicationsDATA uninstall-binPROGRAMS \ - uninstall-info-am uninstall-man uninstall-pixmapDATA + uninstall-man uninstall-pixmapDATA uninstall-man: uninstall-man1 +.MAKE: install-am install-strip + .PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \ dist-gzip dist-shar dist-tarZ dist-zip distcheck distclean \ @@ -706,14 +716,16 @@ uninstall-man: uninstall-man1 distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-applicationsDATA install-binPROGRAMS install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-man1 install-pixmapDATA \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-man1 install-pdf \ + install-pdf-am install-pixmapDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-applicationsDATA \ - uninstall-binPROGRAMS uninstall-info-am uninstall-man \ - uninstall-man1 uninstall-pixmapDATA + uninstall-binPROGRAMS uninstall-man uninstall-man1 \ + uninstall-pixmapDATA profile: diff --git a/Process.c b/Process.c index 71840f4..ed49bac 100644 --- a/Process.c +++ b/Process.c @@ -25,6 +25,7 @@ in the source distribution for its full text. #include #include #include +#include // This works only with glibc 2.1+. On earlier versions // the behavior is similar to have a hardcoded page size. @@ -41,7 +42,7 @@ typedef enum ProcessField_ { STIME, CUTIME, CSTIME, PRIORITY, NICE, ITREALVALUE, STARTTIME, VSIZE, RSS, RLIM, STARTCODE, ENDCODE, STARTSTACK, KSTKESP, KSTKEIP, SIGNAL, BLOCKED, SSIGIGNORE, SIGCATCH, WCHAN, NSWAP, CNSWAP, EXIT_SIGNAL, PROCESSOR, M_SIZE, M_RESIDENT, M_SHARE, M_TRS, M_DRS, M_LRS, M_DT, ST_UID, PERCENT_CPU, PERCENT_MEM, - USER, TIME, NLWP, + USER, TIME, NLWP, TGID #ifdef HAVE_OPENVZ VEID, VPID, #endif @@ -65,7 +66,8 @@ typedef struct Process_ { unsigned int pgrp; unsigned int session; unsigned int tty_nr; - unsigned int tpgid; + unsigned int tgid; + int tpgid; unsigned long int flags; #ifdef DEBUG unsigned long int minflt; @@ -127,7 +129,7 @@ char* PROCESS_CLASS = "Process"; #endif char *Process_fieldNames[] = { - "", "PID", "Command", "STATE", "PPID", "PGRP", "SESSION", "TTY_NR", "TPGID", "FLAGS", "MINFLT", "CMINFLT", "MAJFLT", "CMAJFLT", "UTIME", "STIME", "CUTIME", "CSTIME", "PRIORITY", "NICE", "ITREALVALUE", "STARTTIME", "VSIZE", "RSS", "RLIM", "STARTCODE", "ENDCODE", "STARTSTACK", "KSTKESP", "KSTKEIP", "SIGNAL", "BLOCKED", "SIGIGNORE", "SIGCATCH", "WCHAN", "NSWAP", "CNSWAP", "EXIT_SIGNAL", "PROCESSOR", "M_SIZE", "M_RESIDENT", "M_SHARE", "M_TRS", "M_DRS", "M_LRS", "M_DT", "ST_UID", "PERCENT_CPU", "PERCENT_MEM", "USER", "TIME", "NLWP", + "", "PID", "Command", "STATE", "PPID", "PGRP", "SESSION", "TTY_NR", "TPGID", "FLAGS", "MINFLT", "CMINFLT", "MAJFLT", "CMAJFLT", "UTIME", "STIME", "CUTIME", "CSTIME", "PRIORITY", "NICE", "ITREALVALUE", "STARTTIME", "VSIZE", "RSS", "RLIM", "STARTCODE", "ENDCODE", "STARTSTACK", "KSTKESP", "KSTKEIP", "SIGNAL", "BLOCKED", "SIGIGNORE", "SIGCATCH", "WCHAN", "NSWAP", "CNSWAP", "EXIT_SIGNAL", "PROCESSOR", "M_SIZE", "M_RESIDENT", "M_SHARE", "M_TRS", "M_DRS", "M_LRS", "M_DT", "ST_UID", "PERCENT_CPU", "PERCENT_MEM", "USER", "TIME", "NLWP", "TGID", #ifdef HAVE_OPENVZ "VEID", "VPID", #endif @@ -193,6 +195,16 @@ void Process_setPriority(Process* this, int priority) { } } +unsigned long Process_getAffinity(Process* this) { + unsigned long mask = 0; + sched_getaffinity(this->pid, sizeof(unsigned long), (cpu_set_t*) &mask); + return mask; +} + +void Process_setAffinity(Process* this, unsigned long mask) { + sched_setaffinity(this->pid, sizeof(unsigned long), (cpu_set_t*) &mask); +} + void Process_sendSignal(Process* this, int signal) { kill(this->pid, signal); } @@ -281,7 +293,8 @@ void Process_writeField(Process* this, RichString* str, ProcessField field) { case PGRP: snprintf(buffer, n, "%5u ", this->pgrp); break; case SESSION: snprintf(buffer, n, "%5u ", this->session); break; case TTY_NR: snprintf(buffer, n, "%5u ", this->tty_nr); break; - case TPGID: snprintf(buffer, n, "%5u ", this->tpgid); break; + case TGID: snprintf(buffer, n, "%5u ", this->tgid); break; + case TPGID: snprintf(buffer, n, "%5d ", this->tpgid); break; case PROCESSOR: snprintf(buffer, n, "%3d ", this->processor+1); break; case NLWP: snprintf(buffer, n, "%4ld ", this->nlwp); break; case COMM: { @@ -462,7 +475,8 @@ char* Process_printField(ProcessField field) { case PGRP: return " PGRP "; case SESSION: return " SESN "; case TTY_NR: return " TTY "; - case TPGID: return " TGID "; + case TGID: return " TGID "; + case TPGID: return "TPGID "; case COMM: return "Command "; case STATE: return "S "; case PRIORITY: return "PRI "; diff --git a/Process.h b/Process.h index 37a20cb..778d464 100644 --- a/Process.h +++ b/Process.h @@ -28,6 +28,7 @@ in the source distribution for its full text. #include #include #include +#include // This works only with glibc 2.1+. On earlier versions // the behavior is similar to have a hardcoded page size. @@ -43,7 +44,7 @@ typedef enum ProcessField_ { STIME, CUTIME, CSTIME, PRIORITY, NICE, ITREALVALUE, STARTTIME, VSIZE, RSS, RLIM, STARTCODE, ENDCODE, STARTSTACK, KSTKESP, KSTKEIP, SIGNAL, BLOCKED, SSIGIGNORE, SIGCATCH, WCHAN, NSWAP, CNSWAP, EXIT_SIGNAL, PROCESSOR, M_SIZE, M_RESIDENT, M_SHARE, M_TRS, M_DRS, M_LRS, M_DT, ST_UID, PERCENT_CPU, PERCENT_MEM, - USER, TIME, NLWP, + USER, TIME, NLWP, TGID, #ifdef HAVE_OPENVZ VEID, VPID, #endif @@ -67,7 +68,8 @@ typedef struct Process_ { unsigned int pgrp; unsigned int session; unsigned int tty_nr; - unsigned int tpgid; + unsigned int tgid; + int tpgid; unsigned long int flags; #ifdef DEBUG unsigned long int minflt; @@ -141,6 +143,10 @@ void Process_toggleTag(Process* this); void Process_setPriority(Process* this, int priority); +unsigned long Process_getAffinity(Process* this); + +void Process_setAffinity(Process* this, unsigned long mask); + void Process_sendSignal(Process* this, int signal); #define ONE_K 1024 diff --git a/ProcessList.c b/ProcessList.c index fa550cb..6b18e04 100644 --- a/ProcessList.c +++ b/ProcessList.c @@ -53,7 +53,7 @@ in the source distribution for its full text. #endif #ifndef PER_PROCESSOR_FIELDS -#define PER_PROCESSOR_FIELDS 20 +#define PER_PROCESSOR_FIELDS 22 #endif }*/ @@ -80,6 +80,7 @@ typedef struct ProcessList_ { unsigned long long int* userTime; unsigned long long int* systemTime; unsigned long long int* systemAllTime; + unsigned long long int* idleAllTime; unsigned long long int* idleTime; unsigned long long int* niceTime; unsigned long long int* ioWaitTime; @@ -90,6 +91,7 @@ typedef struct ProcessList_ { unsigned long long int* userPeriod; unsigned long long int* systemPeriod; unsigned long long int* systemAllPeriod; + unsigned long long int* idleAllPeriod; unsigned long long int* idlePeriod; unsigned long long int* nicePeriod; unsigned long long int* ioWaitPeriod; @@ -117,7 +119,7 @@ typedef struct ProcessList_ { bool treeView; bool highlightBaseName; bool highlightMegabytes; - bool expandSystemTime; + bool detailedCPUTime; #ifdef DEBUG_PROC FILE* traceFile; #endif @@ -248,7 +250,7 @@ ProcessList* ProcessList_new(UsersTable* usersTable) { this->treeView = false; this->highlightBaseName = false; this->highlightMegabytes = false; - this->expandSystemTime = false; + this->detailedCPUTime = false; return this; } @@ -333,7 +335,7 @@ static void ProcessList_buildTree(ProcessList* this, int pid, int level, int ind for (int i = Vector_size(this->processes) - 1; i >= 0; i--) { Process* process = (Process*) (Vector_get(this->processes, i)); - if (process->ppid == pid) { + if (process->tgid == pid || (process->tgid == process->pid && process->ppid == pid)) { Process* process = (Process*) (Vector_take(this->processes, i)); Vector_add(children, process); } @@ -360,26 +362,34 @@ void ProcessList_sort(ProcessList* this) { if (!this->treeView) { Vector_sort(this->processes); } else { + // Save settings int direction = this->direction; int sortKey = this->sortKey; + // Sort by PID this->sortKey = PID; this->direction = 1; Vector_sort(this->processes); + // Restore settings this->sortKey = sortKey; this->direction = direction; + // Take PID 1 as root and add to the new listing int vsize = Vector_size(this->processes); Process* init = (Process*) (Vector_take(this->processes, 0)); assert(init->pid == 1); init->indent = 0; Vector_add(this->processes2, init); + // Recursively empty list ProcessList_buildTree(this, init->pid, 0, 0, direction); + // Add leftovers while (Vector_size(this->processes)) { Process* p = (Process*) (Vector_take(this->processes, 0)); p->indent = 0; Vector_add(this->processes2, p); + ProcessList_buildTree(this, p->pid, 0, 0, direction); } assert(Vector_size(this->processes2) == vsize); (void)vsize; assert(Vector_size(this->processes) == 0); + // Swap listings around Vector* t = this->processes; this->processes = this->processes2; this->processes2 = t; @@ -408,7 +418,7 @@ static int ProcessList_readStatFile(ProcessList* this, Process *proc, FILE *f, c #ifdef DEBUG_PROC int num = ProcessList_read(this, location, - "%c %u %u %u %u %u %lu %lu %lu %lu " + "%c %u %u %u %u %d %lu %lu %lu %lu " "%lu %lu %lu %ld %ld %ld %ld %ld %ld " "%lu %lu %ld %lu %lu %lu %lu %lu " "%lu %lu %lu %lu %lu %lu %lu %lu " @@ -426,7 +436,7 @@ static int ProcessList_readStatFile(ProcessList* this, Process *proc, FILE *f, c #else long int uzero; int num = ProcessList_read(this, location, - "%c %u %u %u %u %u %lu %lu %lu %lu " + "%c %u %u %u %u %d %lu %lu %lu %lu " "%lu %lu %lu %ld %ld %ld %ld %ld %ld " "%lu %lu %ld %lu %lu %lu %lu %lu " "%lu %lu %lu %lu %lu %lu %lu %lu " @@ -454,10 +464,12 @@ static int ProcessList_readStatFile(ProcessList* this, Process *proc, FILE *f, c bool ProcessList_readStatusFile(ProcessList* this, Process* proc, char* dirname, char* name) { char statusfilename[MAX_NAME+1]; statusfilename[MAX_NAME] = '\0'; - /* + bool success = false; char buffer[256]; buffer[255] = '\0'; + + // We need to parse the status file just for tgid, which is missing in stat. snprintf(statusfilename, MAX_NAME, "%s/%s/status", dirname, name); FILE* status = ProcessList_fopen(this, statusfilename, "r"); if (status) { @@ -465,12 +477,11 @@ bool ProcessList_readStatusFile(ProcessList* this, Process* proc, char* dirname, char* ok = fgets(buffer, 255, status); if (!ok) break; - if (String_startsWith(buffer, "Uid:")) { - int uid1, uid2, uid3, uid4; - // TODO: handle other uid's. - int ok = ProcessList_read(this, buffer, "Uid:\t%d\t%d\t%d\t%d", &uid1, &uid2, &uid3, &uid4); + if (String_startsWith(buffer, "Tgid:")) { + int tgid; + int ok = ProcessList_read(this, buffer, "Tgid:\t%d", &tgid); if (ok >= 1) { - proc->st_uid = uid1; + proc->tgid = tgid; success = true; } break; @@ -478,19 +489,13 @@ bool ProcessList_readStatusFile(ProcessList* this, Process* proc, char* dirname, } fclose(status); } - if (!success) { - */ - snprintf(statusfilename, MAX_NAME, "%s/%s", dirname, name); - struct stat sstat; - int statok = stat(statusfilename, &sstat); - if (statok == -1) - return false; - proc->st_uid = sstat.st_uid; - return true; - /* - } else - return true; - */ + snprintf(statusfilename, MAX_NAME, "%s/%s", dirname, name); + struct stat sstat; + int statok = stat(statusfilename, &sstat); + if (statok == -1) + return false; + proc->st_uid = sstat.st_uid; + return true; } void ProcessList_processEntries(ProcessList* this, char* dirname, int parent, float period) { @@ -521,9 +526,7 @@ void ProcessList_processEntries(ProcessList* this, char* dirname, int parent, fl char subdirname[MAX_NAME+1]; snprintf(subdirname, MAX_NAME, "%s/%s/task", dirname, name); - if (access(subdirname, X_OK) == 0) { - ProcessList_processEntries(this, subdirname, pid, period); - } + ProcessList_processEntries(this, subdirname, pid, period); } FILE* status; @@ -655,7 +658,7 @@ void ProcessList_processEntries(ProcessList* this, char* dirname, int parent, fl } void ProcessList_scan(ProcessList* this) { - unsigned long long int usertime, nicetime, systemtime, systemalltime, idletime, totaltime; + unsigned long long int usertime, nicetime, systemtime, systemalltime, idlealltime, idletime, totaltime; unsigned long long int swapFree; FILE* status; @@ -715,14 +718,16 @@ void ProcessList_scan(ProcessList* this) { } // Fields existing on kernels >= 2.6 // (and RHEL's patched kernel 2.4...) - systemalltime = systemtime + ioWait + irq + softIrq + steal; - totaltime = usertime + nicetime + systemalltime + idletime; + idlealltime = idletime + ioWait; + systemalltime = systemtime + irq + softIrq + steal; + totaltime = usertime + nicetime + systemalltime + idlealltime; assert (usertime >= this->userTime[i]); assert (nicetime >= this->niceTime[i]); assert (systemtime >= this->systemTime[i]); assert (idletime >= this->idleTime[i]); assert (totaltime >= this->totalTime[i]); assert (systemalltime >= this->systemAllTime[i]); + assert (idlealltime >= this->idleAllTime[i]); assert (ioWait >= this->ioWaitTime[i]); assert (irq >= this->irqTime[i]); assert (softIrq >= this->softIrqTime[i]); @@ -731,6 +736,7 @@ void ProcessList_scan(ProcessList* this) { this->nicePeriod[i] = nicetime - this->niceTime[i]; this->systemPeriod[i] = systemtime - this->systemTime[i]; this->systemAllPeriod[i] = systemalltime - this->systemAllTime[i]; + this->idleAllPeriod[i] = idlealltime - this->idleAllTime[i]; this->idlePeriod[i] = idletime - this->idleTime[i]; this->ioWaitPeriod[i] = ioWait - this->ioWaitTime[i]; this->irqPeriod[i] = irq - this->irqTime[i]; @@ -741,6 +747,7 @@ void ProcessList_scan(ProcessList* this) { this->niceTime[i] = nicetime; this->systemTime[i] = systemtime; this->systemAllTime[i] = systemalltime; + this->idleAllTime[i] = idlealltime; this->idleTime[i] = idletime; this->ioWaitTime[i] = ioWait; this->irqTime[i] = irq; diff --git a/ProcessList.h b/ProcessList.h index 8707ce4..578edb9 100644 --- a/ProcessList.h +++ b/ProcessList.h @@ -55,7 +55,7 @@ in the source distribution for its full text. #endif #ifndef PER_PROCESSOR_FIELDS -#define PER_PROCESSOR_FIELDS 20 +#define PER_PROCESSOR_FIELDS 22 #endif @@ -80,6 +80,7 @@ typedef struct ProcessList_ { unsigned long long int* userTime; unsigned long long int* systemTime; unsigned long long int* systemAllTime; + unsigned long long int* idleAllTime; unsigned long long int* idleTime; unsigned long long int* niceTime; unsigned long long int* ioWaitTime; @@ -90,6 +91,7 @@ typedef struct ProcessList_ { unsigned long long int* userPeriod; unsigned long long int* systemPeriod; unsigned long long int* systemAllPeriod; + unsigned long long int* idleAllPeriod; unsigned long long int* idlePeriod; unsigned long long int* nicePeriod; unsigned long long int* ioWaitPeriod; @@ -117,7 +119,7 @@ typedef struct ProcessList_ { bool treeView; bool highlightBaseName; bool highlightMegabytes; - bool expandSystemTime; + bool detailedCPUTime; #ifdef DEBUG_PROC FILE* traceFile; #endif diff --git a/RichString.c b/RichString.c index 3bdc82b..2cc7d17 100644 --- a/RichString.c +++ b/RichString.c @@ -26,15 +26,6 @@ typedef struct RichString_ { #define MIN(a,b) ((a)<(b)?(a):(b)) #endif -void RichString_write(RichString* this, int attrs, char* data) { - RichString_init(this); - RichString_append(this, attrs, data); -} - -inline void RichString_append(RichString* this, int attrs, char* data) { - RichString_appendn(this, attrs, data, strlen(data)); -} - inline void RichString_appendn(RichString* this, int attrs, char* data, int len) { int last = MIN(RICHSTRING_MAXLEN - 1, len + this->len); for (int i = this->len, j = 0; i < last; i++, j++) @@ -43,6 +34,15 @@ inline void RichString_appendn(RichString* this, int attrs, char* data, int len) this->len = last; } +inline void RichString_append(RichString* this, int attrs, char* data) { + RichString_appendn(this, attrs, data, strlen(data)); +} + +void RichString_write(RichString* this, int attrs, char* data) { + RichString_init(this); + RichString_append(this, attrs, data); +} + void RichString_setAttr(RichString *this, int attrs) { chtype* ch = this->chstr; for (int i = 0; i < this->len; i++) { diff --git a/RichString.h b/RichString.h index 6972afe..6eed0d9 100644 --- a/RichString.h +++ b/RichString.h @@ -27,11 +27,11 @@ typedef struct RichString_ { #define MIN(a,b) ((a)<(b)?(a):(b)) #endif -void RichString_write(RichString* this, int attrs, char* data); +extern void RichString_appendn(RichString* this, int attrs, char* data, int len); extern void RichString_append(RichString* this, int attrs, char* data); -extern void RichString_appendn(RichString* this, int attrs, char* data, int len); +void RichString_write(RichString* this, int attrs, char* data); void RichString_setAttr(RichString *this, int attrs); diff --git a/Settings.c b/Settings.c index 4c2595a..e53358c 100644 --- a/Settings.c +++ b/Settings.c @@ -140,7 +140,10 @@ bool Settings_read(Settings* this, char* fileName) { } else if (String_eq(option[0], "header_margin")) { this->header->margin = atoi(option[1]); } else if (String_eq(option[0], "expand_system_time")) { - this->pl->expandSystemTime = atoi(option[1]); + // Compatibility option. + this->pl->detailedCPUTime = atoi(option[1]); + } else if (String_eq(option[0], "detailed_cpu_time")) { + this->pl->detailedCPUTime = atoi(option[1]); } else if (String_eq(option[0], "delay")) { this->delay = atoi(option[1]); } else if (String_eq(option[0], "color_scheme")) { @@ -197,7 +200,7 @@ bool Settings_write(Settings* this) { fprintf(fd, "highlight_megabytes=%d\n", (int) this->pl->highlightMegabytes); fprintf(fd, "tree_view=%d\n", (int) this->pl->treeView); fprintf(fd, "header_margin=%d\n", (int) this->header->margin); - fprintf(fd, "expand_system_time=%d\n", (int) this->pl->expandSystemTime); + fprintf(fd, "detailed_cpu_time=%d\n", (int) this->pl->detailedCPUTime); fprintf(fd, "color_scheme=%d\n", (int) this->colorScheme); fprintf(fd, "delay=%d\n", (int) this->delay); fprintf(fd, "left_meters="); diff --git a/SignalsPanel.c b/SignalsPanel.c index cb9382e..517fee6 100644 --- a/SignalsPanel.c +++ b/SignalsPanel.c @@ -27,7 +27,7 @@ SignalsPanel* SignalsPanel_new(int x, int y, int w, int h) { ((Object*)this)->delete = SignalsPanel_delete; this->signals = Signal_getSignalTable(); - super->eventHandler = SignalsPanel_EventHandler; + super->eventHandler = SignalsPanel_eventHandler; int sigCount = Signal_getSignalCount(); for(int i = 0; i < sigCount; i++) Panel_set(super, i, (Object*) this->signals[i]); @@ -51,7 +51,7 @@ void SignalsPanel_reset(SignalsPanel* this) { this->state = 0; } -HandlerResult SignalsPanel_EventHandler(Panel* super, int ch) { +HandlerResult SignalsPanel_eventHandler(Panel* super, int ch) { SignalsPanel* this = (SignalsPanel*) super; int size = Panel_getSize(super); diff --git a/SignalsPanel.h b/SignalsPanel.h index d34a994..4401a52 100644 --- a/SignalsPanel.h +++ b/SignalsPanel.h @@ -27,6 +27,6 @@ void SignalsPanel_delete(Object* object); void SignalsPanel_reset(SignalsPanel* this); -HandlerResult SignalsPanel_EventHandler(Panel* super, int ch); +HandlerResult SignalsPanel_eventHandler(Panel* super, int ch); #endif diff --git a/aclocal.m4 b/aclocal.m4 index aef181a..ce67b57 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.9.6 -*- Autoconf -*- +# generated automatically by aclocal 1.10 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005 Free Software Foundation, Inc. +# 2005, 2006 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -11,7 +11,12 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. -# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. +m4_if(m4_PACKAGE_VERSION, [2.61],, +[m4_fatal([this file was generated for autoconf 2.61. +You have another version of autoconf. If you want to use that, +you should regenerate the build system entirely.], [63])]) + +# Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -21,14 +26,29 @@ # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. -AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.10' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.10], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- -# Call AM_AUTOMAKE_VERSION so it can be traced. +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], - [AM_AUTOMAKE_VERSION([1.9.6])]) +[AM_AUTOMAKE_VERSION([1.10])dnl +_AM_AUTOCONF_VERSION(m4_PACKAGE_VERSION)]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- @@ -85,14 +105,14 @@ am_aux_dir=`cd $ac_aux_dir && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 7 +# serial 8 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- @@ -101,8 +121,10 @@ AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE]) -AC_SUBST([$1_FALSE]) +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl if $2; then $1_TRUE= $1_FALSE='#' @@ -116,15 +138,14 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 8 +# serial 9 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, @@ -152,6 +173,7 @@ AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) @@ -217,6 +239,7 @@ AC_CACHE_CHECK([dependency style of $depcc], depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then @@ -269,7 +292,8 @@ if test "x$enable_dependency_tracking" != xno; then AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- @@ -294,8 +318,9 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. - # So let's grep whole file. - if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue @@ -342,8 +367,8 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -366,16 +391,20 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.58])dnl +[AC_PREREQ([2.60])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi fi # test whether we have cygpath @@ -395,6 +424,9 @@ m4_ifval([$2], AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl @@ -430,6 +462,10 @@ AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) ]) @@ -465,7 +501,7 @@ echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -install_sh=${install_sh-"$am_aux_dir/install-sh"} +install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. @@ -543,14 +579,14 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 +# serial 5 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ @@ -566,6 +602,7 @@ AC_SUBST($1)]) # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then @@ -576,7 +613,7 @@ else fi ]) -# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -584,60 +621,23 @@ fi # AM_PROG_MKDIR_P # --------------- -# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. -# -# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories -# created by `make install' are always world readable, even if the -# installer happens to have an overly restrictive umask (e.g. 077). -# This was a mistake. There are at least two reasons why we must not -# use `-m 0755': -# - it causes special bits like SGID to be ignored, -# - it may be too restrictive (some setups expect 775 directories). -# -# Do not use -m 0755 and let people choose whatever they expect by -# setting umask. -# -# We cannot accept any implementation of `mkdir' that recognizes `-p'. -# Some implementations (such as Solaris 8's) are not thread-safe: if a -# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' -# concurrently, both version can detect that a/ is missing, but only -# one can create it and the other will error out. Consequently we -# restrict ourselves to GNU make (using the --version option ensures -# this.) +# Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], -[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' - else - mkdir_p='$(install_sh) -d' - fi -fi -AC_SUBST([mkdir_p])]) +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) # Helper functions for option handling. -*- Autoconf -*- @@ -749,9 +749,21 @@ dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) +# Copyright (C) 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputing VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..602c151 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +aclocal +autoconf +autoheader +automake --add-missing --copy + + diff --git a/config.h b/config.h new file mode 100644 index 0000000..bd19e6d --- /dev/null +++ b/config.h @@ -0,0 +1,147 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if the `closedir' function returns void instead of `int'. */ +/* #undef CLOSEDIR_VOID */ + +/* Define to 1 if you have the header file. */ +#define HAVE_CURSES_H 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `m' library (-lm). */ +#define HAVE_LIBM 1 + +/* Define to 1 if you have the `ncurses' library (-lncurses). */ +#define HAVE_LIBNCURSES 1 + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#define HAVE_MALLOC 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +/* #undef HAVE_NDIR_H */ + +/* Define if openvz support enabled. */ +/* #undef HAVE_OPENVZ */ + +/* Define to 1 if your system has a GNU libc compatible `realloc' function, + and to 0 otherwise. */ +#define HAVE_REALLOC 1 + +/* Define to 1 if `stat' has the bug that it succeeds when given the + zero-length file name argument. */ +/* #undef HAVE_STAT_EMPTY_STRING_BUG */ + +/* Define to 1 if stdbool.h conforms to C99. */ +#define HAVE_STDBOOL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strncasecmp' function. */ +#define HAVE_STRNCASECMP 1 + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if the system has the type `_Bool'. */ +#define HAVE__BOOL 1 + +/* Define to 1 if `lstat' dereferences a symlink specified with a trailing + slash. */ +#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 + +/* Name of package */ +#define PACKAGE "htop" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "loderunner@users.sourceforge.net" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "htop" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "htop 0.7" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "htop" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "0.7" + +/* Path of proc filesystem */ +#define PROCDIR "/proc" + +/* Define as the return type of signal handlers (`int' or `void'). */ +#define RETSIGTYPE void + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "0.7" + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define to rpl_malloc if the replacement function should be used. */ +/* #undef malloc */ + +/* Define to `int' if does not define. */ +/* #undef pid_t */ + +/* Define to rpl_realloc if the replacement function should be used. */ +/* #undef realloc */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ diff --git a/configure b/configure index 9c225c1..f96991d 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.61 for htop 0.6.6. +# Generated by GNU Autoconf 2.61 for htop 0.7. # # Report bugs to . # @@ -574,8 +574,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='htop' PACKAGE_TARNAME='htop' -PACKAGE_VERSION='0.6.6' -PACKAGE_STRING='htop 0.6.6' +PACKAGE_VERSION='0.7' +PACKAGE_STRING='htop 0.7' PACKAGE_BUGREPORT='loderunner@users.sourceforge.net' ac_unique_file="htop.c" @@ -655,6 +655,7 @@ target_alias INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA +am__isrc CYGPATH_W PACKAGE VERSION @@ -1206,7 +1207,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures htop 0.6.6 to adapt to many kinds of systems. +\`configure' configures htop 0.7 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1272,7 +1273,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of htop 0.6.6:";; + short | recursive ) echo "Configuration of htop 0.7:";; esac cat <<\_ACEOF @@ -1362,7 +1363,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -htop configure 0.6.6 +htop configure 0.7 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1376,7 +1377,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by htop $as_me 0.6.6, which was +It was created by htop $as_me 0.7, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ @@ -1729,7 +1730,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -am__api_version="1.9" +am__api_version='1.10' + ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then @@ -1912,38 +1914,53 @@ else echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi -if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' +{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 +echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; } +if test -z "$MKDIR_P"; then + if test "${ac_cv_path_mkdir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done +done +IFS=$as_save_IFS + +fi + + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" else - mkdir_p='$(install_sh) -d' + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + test -d ./--version && rmdir ./--version + MKDIR_P="$ac_install_sh -d" fi fi +{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5 +echo "${ECHO_T}$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac for ac_prog in gawk mawk nawk awk do @@ -2026,12 +2043,16 @@ else fi rmdir .tst 2>/dev/null -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } + fi fi # test whether we have cygpath @@ -2046,7 +2067,7 @@ fi # Define the identity of the package. PACKAGE='htop' - VERSION='0.6.6' + VERSION='0.7' cat >>confdefs.h <<_ACEOF @@ -2074,7 +2095,7 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -install_sh=${install_sh-"$am_aux_dir/install-sh"} +install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right @@ -2178,7 +2199,7 @@ else fi fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. @@ -3168,9 +3189,7 @@ if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi - - -if test "x$enable_dependency_tracking" != xno; then + if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else @@ -3180,7 +3199,6 @@ fi - depcc="$CC" am_compiler_list= { echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 @@ -3248,6 +3266,7 @@ else depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then @@ -3277,9 +3296,7 @@ fi echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - -if + if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= @@ -6294,7 +6311,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by htop $as_me 0.6.6, which was +This file was extended by htop $as_me 0.7, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -6347,7 +6364,7 @@ Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -htop config.status 0.6.6 +htop config.status 0.7 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" @@ -6358,6 +6375,7 @@ gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF @@ -6565,6 +6583,7 @@ target_alias!$target_alias$ac_delim INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim INSTALL_DATA!$INSTALL_DATA$ac_delim +am__isrc!$am__isrc$ac_delim CYGPATH_W!$CYGPATH_W$ac_delim PACKAGE!$PACKAGE$ac_delim VERSION!$VERSION$ac_delim @@ -6606,7 +6625,7 @@ LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 79; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 80; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 @@ -6833,6 +6852,11 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF @@ -6886,6 +6910,7 @@ s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out @@ -7050,8 +7075,9 @@ echo "$as_me: executing $ac_file commands" >&6;} # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. - # So let's grep whole file. - if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ diff --git a/configure.ac b/configure.ac index 038343a..2e3a581 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.57) -AC_INIT([htop],[0.6.6],[loderunner@users.sourceforge.net]) +AC_INIT([htop],[0.7],[loderunner@users.sourceforge.net]) AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR([htop.c]) AC_CONFIG_HEADER([config.h]) diff --git a/depcomp b/depcomp index 04701da..ca5ea4e 100755 --- a/depcomp +++ b/depcomp @@ -1,9 +1,10 @@ #! /bin/sh # depcomp - compile a program generating dependencies as side-effects -scriptversion=2005-07-09.11 +scriptversion=2006-10-15.18 -# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software +# Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -91,7 +92,20 @@ gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. - "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" stat=$? if test $stat -eq 0; then : else @@ -276,6 +290,46 @@ icc) rm -f "$tmpdepfile" ;; +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. @@ -288,13 +342,13 @@ tru64) if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a - # static library. This mecanism is used in libtool 1.4 series to + # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in in $dir.libs/$base.o.d and + # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is diff --git a/htop.1 b/htop.1 index 45bb4eb..0d3a3ff 100644 --- a/htop.1 +++ b/htop.1 @@ -1,4 +1,4 @@ -.TH "htop" "1" "0.6.6" "Bartosz Fenski " "Utils" +.TH "htop" "1" "0.7" "Bartosz Fenski " "Utils" .SH "NAME" htop \- interactive process viewer .SH "SYNTAX" @@ -77,6 +77,9 @@ If none is tagged, sends to the currently selected process. .B F10, q Quit .TP +.B a (on multiprocessor machines) +Set CPU affinity: mark which CPUs a process is allowed to use. +.TP .B u Show only processes owned by a specified user. .TP diff --git a/htop.c b/htop.c index 5b2a996..15e3c3e 100644 --- a/htop.c +++ b/htop.c @@ -25,6 +25,7 @@ in the source distribution for its full text. #include "CategoriesPanel.h" #include "SignalsPanel.h" #include "TraceScreen.h" +#include "AffinityPanel.h" #include "config.h" #include "debug.h" @@ -62,13 +63,13 @@ void showHelp(ProcessList* pl) { mvaddstr(3, 0, "CPU usage bar: "); #define addattrstr(a,s) attrset(a);addstr(s) addattrstr(CRT_colors[BAR_BORDER], "["); - if (pl->expandSystemTime) { + if (pl->detailedCPUTime) { addattrstr(CRT_colors[CPU_NICE], "low"); addstr("/"); addattrstr(CRT_colors[CPU_NORMAL], "normal"); addstr("/"); addattrstr(CRT_colors[CPU_KERNEL], "kernel"); addstr("/"); - addattrstr(CRT_colors[CPU_IOWAIT], "io-wait"); addstr("/"); addattrstr(CRT_colors[CPU_IRQ], "irq"); addstr("/"); - addattrstr(CRT_colors[CPU_SOFTIRQ], "soft-irq"); + addattrstr(CRT_colors[CPU_SOFTIRQ], "soft-irq"); addstr("/"); + addattrstr(CRT_colors[CPU_IOWAIT], "io-wait"); addattrstr(CRT_colors[BAR_SHADOW], " used%"); } else { addattrstr(CRT_colors[CPU_NICE], "low-priority"); addstr("/"); @@ -104,7 +105,10 @@ void showHelp(ProcessList* pl) { mvaddstr(15, 0, " F9 k: kill process/tagged processes P: sort by CPU%"); mvaddstr(16, 0, " + [ F7: lower priority (+ nice) M: sort by MEM%"); mvaddstr(17, 0, " - ] F8: higher priority (root only) T: sort by TIME"); - mvaddstr(18, 0, " F4 I: invert sort order"); + if (pl->processorCount > 1) + mvaddstr(18, 0, " a: set CPU affinity F4 I: invert sort order"); + else + mvaddstr(18, 0, " F4 I: invert sort order"); mvaddstr(19, 0, " F2 S: setup F6 >: select sort column"); mvaddstr(20, 0, " F1 h: show this help screen"); mvaddstr(21, 0, " F10 q: quit s: trace syscalls with strace"); @@ -120,6 +124,8 @@ void showHelp(ProcessList* pl) { mvaddstr(16, 0, " + [ F7"); mvaddstr(16,40, " M"); mvaddstr(17, 0, " - ] F8"); mvaddstr(17,40, " T"); mvaddstr(18,40, " F4 I"); + if (pl->processorCount > 1) + mvaddstr(18, 0, " a:"); mvaddstr(19, 0, " F2 S"); mvaddstr(19,40, " F6 >"); mvaddstr(20, 0, " F1 h"); mvaddstr(21, 0, " F10 q"); mvaddstr(21,40, " s"); @@ -169,7 +175,7 @@ static HandlerResult pickWithEnter(Panel* panel, int ch) { static Object* pickFromList(Panel* panel, Panel* list, int x, int y, char** keyLabels, FunctionBar* prevBar) { char* fuKeys[2] = {"Enter", "Esc"}; int fuEvents[2] = {13, 27}; - if (!panel->eventHandler) + if (!list->eventHandler) Panel_setEventHandler(list, pickWithEnter); ScreenManager* scr = ScreenManager_new(0, y, 0, -1, HORIZONTAL, false); ScreenManager_add(scr, list, FunctionBar_new(2, keyLabels, fuKeys, fuEvents), x - 1); @@ -592,6 +598,36 @@ int main(int argc, char** argv) { refreshTimeout = 0; break; } + case 'a': + { + if (pl->processorCount == 1) + break; + + Process* p = (Process*) Panel_getSelected(panel); + unsigned long curr = Process_getAffinity(p); + + Panel* affinityPanel = AffinityPanel_new(pl->processorCount, curr); + + char* fuFunctions[2] = {"Toggle ", "Done "}; + pickFromList(panel, affinityPanel, 15, headerHeight, fuFunctions, defaultBar); + unsigned long new = AffinityPanel_getAffinity(affinityPanel); + bool anyTagged = false; + for (int i = 0; i < Panel_getSize(panel); i++) { + Process* p = (Process*) Panel_get(panel, i); + if (p->tag) { + Process_setAffinity(p, new); + anyTagged = true; + } + } + if (!anyTagged) { + Process* p = (Process*) Panel_getSelected(panel); + Process_setAffinity(p, new); + } + ((Object*)affinityPanel)->delete((Object*)affinityPanel); + Panel_setRichHeader(panel, ProcessList_printHeader(pl)); + refreshTimeout = 0; + break; + } case KEY_F(10): case 'q': quit = 1; diff --git a/htop.desktop b/htop.desktop index f1cb895..aaa2372 100644 --- a/htop.desktop +++ b/htop.desktop @@ -1,6 +1,6 @@ [Desktop Entry] Encoding=UTF-8 -Version=0.6.6 +Version=0.7 Name=Htop Type=Application Comment=Show System Processes diff --git a/htop.h b/htop.h index 5e7c385..ca3ae91 100644 --- a/htop.h +++ b/htop.h @@ -29,6 +29,7 @@ in the source distribution for its full text. #include "CategoriesPanel.h" #include "SignalsPanel.h" #include "TraceScreen.h" +#include "AffinityPanel.h" #include "config.h" #include "debug.h" diff --git a/install-sh b/install-sh index 4d4a951..4fbbae7 100755 --- a/install-sh +++ b/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2005-05-14.22 +scriptversion=2006-10-14.15 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -39,15 +39,24 @@ scriptversion=2005-05-14.22 # when there is no Makefile. # # This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. +# from scratch. + +nl=' +' +IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi -# put in absolute paths if you don't have them in your path; or use env. vars. +# Put in absolute file names if you don't have them in your path; +# or use environment vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" @@ -58,7 +67,13 @@ stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" -chmodcmd="$chmodprog 0755" +posix_glob= +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chmodcmd=$chmodprog chowncmd= chgrpcmd= stripcmd= @@ -95,7 +110,7 @@ Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " -while test -n "$1"; do +while test $# -ne 0; do case $1 in -c) shift continue;; @@ -111,9 +126,15 @@ while test -n "$1"; do --help) echo "$usage"; exit $?;; - -m) chmodcmd="$chmodprog $2" + -m) mode=$2 shift shift + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac continue;; -o) chowncmd="$chownprog $2" @@ -136,25 +157,33 @@ while test -n "$1"; do --version) echo "$0 $scriptversion"; exit $?;; - *) # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - test -n "$dir_arg$dstarg" && break - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dstarg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dstarg" - shift # fnord - fi - shift # arg - dstarg=$arg - done + --) shift break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; esac done -if test -z "$1"; then +if test $# -ne 0 && test -z "$dir_arg$dstarg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dstarg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dstarg" + shift # fnord + fi + shift # arg + dstarg=$arg + done +fi + +if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 @@ -164,6 +193,33 @@ if test -z "$1"; then exit 0 fi +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + for src do # Protect names starting with `-'. @@ -173,15 +229,11 @@ do if test -n "$dir_arg"; then dst=$src - src= - - if test -d "$dst"; then - mkdircmd=: - chmodcmd= - else - mkdircmd=$mkdirprog - fi + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? else + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. @@ -208,53 +260,188 @@ do echo "$0: $dstarg: Is a directory" >&2 exit 1 fi - dst=$dst/`basename "$src"` + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? fi fi - # This sed command emulates the dirname command. - dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` - - # Make sure that the destination directory exists. - - # Skip lots of stat calls in the usual case. - if test ! -d "$dstdir"; then - defaultIFS=' - ' - IFS="${IFS-$defaultIFS}" - - oIFS=$IFS - # Some sh's can't handle IFS=/ for some reason. - IFS='%' - set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` - shift - IFS=$oIFS + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac - pathcomp= + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else - while test $# -ne 0 ; do - pathcomp=$pathcomp$1 + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix=/ ;; + -*) prefix=./ ;; + *) prefix= ;; + esac + + case $posix_glob in + '') + if (set -f) 2>/dev/null; then + posix_glob=true + else + posix_glob=false + fi ;; + esac + + oIFS=$IFS + IFS=/ + $posix_glob && set -f + set fnord $dstdir shift - if test ! -d "$pathcomp"; then - $mkdirprog "$pathcomp" - # mkdir can fail with a `File exist' error in case several - # install-sh are creating the directory concurrently. This - # is OK. - test -d "$pathcomp" || exit + $posix_glob && set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true fi - pathcomp=$pathcomp/ - done + fi fi if test -n "$dir_arg"; then - $doit $mkdircmd "$dst" \ - && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ - && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ - && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } - + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else - dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ @@ -262,10 +449,9 @@ do # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. - $doit $cpprog "$src" "$dsttmp" && + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -276,10 +462,10 @@ do { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && + && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # Now rename the file to the real destination. - { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ + { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not @@ -291,11 +477,12 @@ do # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { - if test -f "$dstdir/$dstfile"; then - $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ - || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ + if test -f "$dst"; then + $doit $rmcmd -f "$dst" 2>/dev/null \ + || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ + && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ || { - echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } else @@ -304,16 +491,13 @@ do } && # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + $doit $mvcmd "$dsttmp" "$dst" } - } - fi || { (exit 1); exit 1; } -done + } || exit 1 -# The final little trick to "correctly" pass the exit status to the exit trap. -{ - (exit 0); exit 0 -} + trap '' 0 + fi +done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) diff --git a/missing b/missing index 894e786..1c8ff70 100755 --- a/missing +++ b/missing @@ -1,9 +1,9 @@ #! /bin/sh # Common stub for a few missing GNU programs while installing. -scriptversion=2005-06-08.21 +scriptversion=2006-05-10.23 -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. @@ -33,6 +33,8 @@ if test $# -eq 0; then fi run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. @@ -44,7 +46,7 @@ fi msg="missing on your system" -case "$1" in +case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= @@ -77,6 +79,7 @@ Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c @@ -106,7 +109,7 @@ esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). -case "$1" in +case $1 in lex|yacc) # Not GNU programs, they don't have --version. ;; @@ -135,7 +138,7 @@ esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. -case "$1" in +case $1 in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if @@ -164,7 +167,7 @@ WARNING: \`$1' is $msg. You should only need it if test -z "$files" && files="config.h" touch_files= for f in $files; do - case "$f" in + case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; @@ -192,8 +195,8 @@ WARNING: \`$1' is needed, but is $msg. You can get \`$1' as part of \`Autoconf' from any GNU archive site." - file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` - test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else @@ -214,25 +217,25 @@ WARNING: \`$1' $msg. You should only need it if in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h - if [ $# -ne 1 ]; then + if test $# -ne 1; then eval LASTARG="\${$#}" - case "$LASTARG" in + case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if [ -f "$SRCFILE" ]; then + if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if [ -f "$SRCFILE" ]; then + if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi - if [ ! -f y.tab.h ]; then + if test ! -f y.tab.h; then echo >y.tab.h fi - if [ ! -f y.tab.c ]; then + if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; @@ -244,18 +247,18 @@ WARNING: \`$1' is $msg. You should only need it if in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c - if [ $# -ne 1 ]; then + if test $# -ne 1; then eval LASTARG="\${$#}" - case "$LASTARG" in + case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if [ -f "$SRCFILE" ]; then + if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi - if [ ! -f lex.yy.c ]; then + if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; @@ -267,11 +270,9 @@ WARNING: \`$1' is $msg. You should only need it if \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` - fi - if [ -f "$file" ]; then + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then touch $file else test -z "$file" || exec >$file @@ -289,11 +290,17 @@ WARNING: \`$1' is $msg. You should only need it if DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi @@ -317,13 +324,13 @@ WARNING: \`$1' is $msg. You should only need it if fi firstarg="$1" if shift; then - case "$firstarg" in + case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac - case "$firstarg" in + case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 -- cgit v1.2.3