From 53e101452fe90f88b21ebe2bf80ff045f71f6b93 Mon Sep 17 00:00:00 2001 From: Wayne Porter Date: Wed, 30 Aug 2017 15:15:15 -0500 Subject: [PATCH] Consolidated patch of previously merged CYGWIN support The combined results of merge request #49 without that overhead plus distortion in this repository's history. Prototyped-by: Wayne Porter --- .gitignore | 1 + Makefile.am | 104 ++++++++++++++++++++++++++++++++++++------ configure.ac | 21 +++++++++ proc/devname.c | 41 +++++++++++++++++ proc/procps.h | 2 +- proc/sysinfo.c | 17 +++++++ ps/procps.1 | 1 + skill.c | 5 ++ testsuite/Makefile.am | 14 ++++-- 9 files changed, 187 insertions(+), 19 deletions(-) create mode 120000 ps/procps.1 diff --git a/.gitignore b/.gitignore index 4dd11a22..82c96bb1 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,4 @@ watch *~ *.log *.sum +*.exe diff --git a/Makefile.am b/Makefile.am index bf77c4df..1d920309 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,7 @@ CYGWINFLAGS = if CYGWIN - CYGWINFLAGS += -lintl +CYGWINFLAGS += -lintl +usrbin_exec_PROGRAMS = endif AM_CPPFLAGS = \ @@ -21,8 +22,21 @@ SUBDIRS = \ AM_CFLAGS = -Iproc LDADD = ./proc/libprocps.la $(CYGWINFLAGS) -transform = s/pscommand/ps/; $(program_transform_name) +if CYGWIN +AM_LDFLAGS = ./proc/libprocps.la $(CYGWINFLAGS) +endif +transform = + +if !CYGWIN +transform += s/pscommand/ps/; $(program_transform_name) +sbin_PROGRAMS = \ + sysctl +else +transform += s/pscommand/procps/; $(program_transform_name) +endif + +if !CYGWIN bin_PROGRAMS = \ ps/pscommand \ free \ @@ -34,9 +48,17 @@ bin_PROGRAMS = \ uptime \ vmstat \ w - -sbin_PROGRAMS = \ - sysctl +else +usrbin_exec_PROGRAMS += \ + ps/pscommand \ + free \ + pgrep \ + pkill \ + pmap \ + uptime \ + vmstat \ + w +endif lib_LTLIBRARIES = \ proc/libprocps.la @@ -46,14 +68,19 @@ dist_man_MANS = \ pgrep.1 \ pkill.1 \ pmap.1 \ - pwdx.1 \ - sysctl.8 \ - sysctl.conf.5 \ - tload.1 \ uptime.1 \ vmstat.8 \ w.1 \ + ps/procps.1 + +if !CYGWIN +dist_man_MANS += \ + pwdx.1 \ + tload.1 \ + sysctl.8 \ + sysctl.conf.5 \ ps/ps.1 +endif EXTRA_DIST = \ .version \ @@ -63,7 +90,6 @@ EXTRA_DIST = \ misc/git-version-gen \ Documentation/CodingStyle.md \ Documentation/TODO \ - sysctl.conf \ ps/HACKING \ ps/regression \ $(DIST_MAN_POTS) @@ -73,8 +99,17 @@ dist_procpsng_DATA = \ Documentation/bugs.md \ Documentation/FAQ +if !CYGWIN +EXTRA_DIST += \ + sysctl.conf +endif + if BUILD_PIDOF +if !CYGWIN bin_PROGRAMS += pidof +else +usrbin_exec_PROGRAMS += pidof +endif dist_man_MANS += pidof.1 pidof_SOURCES = pidof.c lib/fileutils.c else @@ -82,7 +117,13 @@ else endif if BUILD_KILL +if CYGWIN +transform += ;s/^kill/prockill/; $(program_transform_name) +usrbin_exec_PROGRAMS += kill +else bin_PROGRAMS += kill +endif + dist_man_MANS += kill.1 kill_SOURCES = skill.c lib/strutils.c lib/fileutils.c lib/nsutils.c else @@ -90,16 +131,20 @@ else endif if WITH_NCURSES +if !CYGWIN bin_PROGRAMS += \ slabtop \ watch \ top/top +else +usrbin_exec_PROGRAMS += \ + watch \ + top/top +endif + dist_man_MANS += \ - slabtop.1 \ watch.1 \ top/top.1 -slabtop_SOURCES = slabtop.c lib/strutils.c lib/fileutils.c -slabtop_LDADD = $(LDADD) @NCURSES_LIBS@ watch_SOURCES = watch.c lib/strutils.c lib/fileutils.c watch_LDADD = @WATCH_NCURSES_LIBS@ $(CYGWINFLAGS) watch_CFLAGS = @WATCH_NCURSES_CFLAGS@ @@ -109,17 +154,29 @@ top_top_SOURCES = \ top/top_nls.h \ top/top_nls.c \ lib/fileutils.c + if CYGWIN - top_top_SOURCES += lib/strverscmp.c +top_top_SOURCES += lib/strverscmp.c +else +dist_man_MANS += \ + slabtop.1 +slabtop_SOURCES = slabtop.c lib/strutils.c lib/fileutils.c +slabtop_LDADD = $(LDADD) @NCURSES_LIBS@ endif top_top_LDADD = $(LDADD) @NCURSES_LIBS@ $(DL_LIB) endif if BUILD_SKILL +if !CYGWIN bin_PROGRAMS += \ skill \ snice +else +usrbin_exec_PROGRAMS += \ + skill \ + snice +endif skill_SOURCES = skill.c lib/strutils.c lib/fileutils.c lib/nsutils.c snice_SOURCES = skill.c lib/strutils.c lib/fileutils.c lib/nsutils.c dist_man_MANS += \ @@ -135,9 +192,11 @@ free_SOURCES = free.c lib/strutils.c lib/fileutils.c pgrep_SOURCES = pgrep.c lib/fileutils.c lib/nsutils.c pkill_SOURCES = pgrep.c lib/fileutils.c lib/nsutils.c pmap_SOURCES = pmap.c lib/fileutils.c +if !CYGWIN pwdx_SOURCES = pwdx.c lib/fileutils.c pwdx_LDADD= $(CYGWINFLAGS) sysctl_SOURCES = sysctl.c lib/fileutils.c +endif tload_SOURCES = tload.c lib/strutils.c lib/fileutils.c uptime_SOURCES = uptime.c lib/fileutils.c vmstat_SOURCES = vmstat.c lib/strutils.c lib/fileutils.c @@ -254,9 +313,26 @@ lib_test_process_LDADD = $(CYGWINFLAGS) lib_test_strtod_nol_SOURCES = lib/test_strtod_nol.c lib/strutils.c lib_test_strtod_nol_LDADD = $(CYGWINFLAGS) +if CYGWIN + skill_LDADD = $(CYGWINFLAGS) + kill_LDADD = $(CYGWINFLAGS) + free_LDADD = $(CYGWINFLAGS) + pgrep_LDADD = $(CYGWINFLAGS) + pkill_LDADD = $(CYGWINFLAGS) + pidof_LDADD = $(CYGWINFLAGS) + pmap_LDADD = $(CYGWINFLAGS) + snice_LDADD = $(CYGWINFLAGS) + tload_LDADD = $(CYGWINFLAGS) + uptime_LDADD = $(CYGWINFLAGS) + w_LDADD = $(CYGWINFLAGS) + vmstat_LDADD = $(CYGWINFLAGS) +endif + if EXAMPLE_FILES +if !CYGWIN sysconf_DATA = sysctl.conf endif +endif BUILT_SOURCES = $(top_srcdir)/.version diff --git a/configure.ac b/configure.ac index e8866d95..b0f82444 100644 --- a/configure.ac +++ b/configure.ac @@ -69,6 +69,27 @@ AC_FUNC_MMAP AC_FUNC_REALLOC AC_FUNC_STRTOD +usrbin_execdir='${exec_prefix}/bin' +AC_SUBST([usrbin_execdir]) + +if test "x$host_os" = xcygwin +then + prefix=/usr + sysconfdir=/etc + libexecdir=/usr/lib + localstatedir=/var + datadir=/usr/share + mandir=/usr/share/man + infodir=/usr/share/info + AC_SUBST([prefix]) + AC_SUBST([sysconfdir]) + AC_SUBST([libexecdir]) + AC_SUBST([localstatedir]) + AC_SUBST([datadir]) + AC_SUBST([mandir]) + AC_SUBST([infodir]) +fi + AM_GNU_GETTEXT_VERSION([0.14.1]) AM_GNU_GETTEXT([external]) if test -d "$srcdir/po" diff --git a/proc/devname.c b/proc/devname.c index a28bc1b1..9ba96d73 100644 --- a/proc/devname.c +++ b/proc/devname.c @@ -203,15 +203,25 @@ int main(int argc, char *argv[]){ /* Try to guess the device name (useful until /proc/PID/tty is added) */ static int guess_name(char *restrict const buf, unsigned maj, unsigned min){ struct stat sbuf; +#ifndef __CYGWIN__ int t0, t1; +#endif unsigned tmpmin = min; switch(maj){ case 3: /* /dev/[pt]ty[p-za-o][0-9a-z] is 936 */ if(tmpmin > 255) return 0; // should never happen; array index protection +#ifdef __CYGWIN__ + sprintf(buf, "dev/cons%d", tmpmin); + /* Skip stat call. The reason is that cons devices are local to + the processes running in that console. Calling stat from another + console or pty will return -1. */ + return 1; +#else t0 = "pqrstuvwxyzabcde"[tmpmin>>4]; t1 = "0123456789abcdef"[tmpmin&0x0f]; sprintf(buf, "/dev/tty%c%c", t0, t1); +#endif break; case 4: if(min<64){ @@ -236,8 +246,12 @@ static int guess_name(char *restrict const buf, unsigned maj, unsigned min){ case 78: sprintf(buf, "/dev/ttyM%d", min); break; /* conflict */ case 105: sprintf(buf, "/dev/ttyV%d", min); break; case 112: sprintf(buf, "/dev/ttyM%d", min); break; /* conflict */ +#ifdef __CYGWIN__ + case 136: sprintf(buf, "/dev/pty%d", min); break; +#else /* 136 ... 143 are /dev/pts/0, /dev/pts/1, /dev/pts/2 ... */ case 136 ... 143: sprintf(buf, "/dev/pts/%d", min+(maj-136)*256); break; +#endif case 148: sprintf(buf, "/dev/ttyT%d", min); break; case 154: sprintf(buf, "/dev/ttySR%d", min); break; case 156: sprintf(buf, "/dev/ttySR%d", min+256); break; @@ -285,6 +299,30 @@ static int link_name(char *restrict const buf, unsigned maj, unsigned min, int p return 1; } +#ifdef __CYGWIN__ +/* Cygwin keeps the name to the controlling tty in a virtual file called + /proc/PID/ctty, including a trailing LF (sigh). */ +static int ctty_name(char *restrict const buf, int pid) { + char path[32]; + FILE *fp; + char *lf; + sprintf (path, "/proc/%d/ctty", pid); /* often permission denied */ + fp = fopen (path, "r"); + if (!fp) + return 0; + if (!fgets (buf,TTY_NAME_SIZE,fp)) + { + fclose (fp); + return 0; + } + fclose (fp); + lf = strchr (buf, '\n'); + if (lf) + *lf = (lf == buf ? '?' : '\0'); + return 1; +} +#endif + /* number --> name */ unsigned dev_to_tty(char *restrict ret, unsigned chop, dev_t dev_t_dev, int pid, unsigned int flags) { static char buf[TTY_NAME_SIZE]; @@ -293,6 +331,9 @@ unsigned dev_to_tty(char *restrict ret, unsigned chop, dev_t dev_t_dev, int pid, unsigned i = 0; int c; if(dev == 0u) goto no_tty; +#ifdef __CYGWIN__ + if( ctty_name(tmp, pid )) goto abbrev; +#endif if(driver_name(tmp, MAJOR_OF(dev), MINOR_OF(dev) )) goto abbrev; if( link_name(tmp, MAJOR_OF(dev), MINOR_OF(dev), pid, "fd/2" )) goto abbrev; if( guess_name(tmp, MAJOR_OF(dev), MINOR_OF(dev) )) goto abbrev; diff --git a/proc/procps.h b/proc/procps.h index c34dc056..375d6c69 100644 --- a/proc/procps.h +++ b/proc/procps.h @@ -81,7 +81,7 @@ // Like HIDDEN, but for an alias that gets created. // In gcc-3.2 there is an alias+hidden conflict. // Many will have patched this bug, but oh well. -#if ( __GNUC__ == 3 && __GNUC_MINOR__ > 2 ) || __GNUC__ > 3 +#if (( __GNUC__ == 3 && __GNUC_MINOR__ > 2 ) || __GNUC__ > 3) && !defined(__CYGWIN__) #define HIDDEN_ALIAS(x) extern __typeof(x) x##_direct __attribute__((alias(#x),visibility("hidden"))) #else #define HIDDEN_ALIAS(x) extern __typeof(x) x##_direct __attribute__((alias(#x))) diff --git a/proc/sysinfo.c b/proc/sysinfo.c index 4cb0b448..aaf8a2d8 100644 --- a/proc/sysinfo.c +++ b/proc/sysinfo.c @@ -28,6 +28,9 @@ #include #include +#ifdef __CYGWIN__ +#include +#endif #include "alloc.h" #include "version.h" #include "sysinfo.h" /* include self to verify prototypes */ @@ -36,7 +39,9 @@ #include /* htons */ #endif +#ifndef __CYGWIN__ #include +#endif #include long smp_num_cpus; /* number of CPUs */ @@ -91,7 +96,9 @@ static char buf[8192]; #define SET_IF_DESIRED(x,y) do{ if(x) *(x) = (y); }while(0) /* return minimum of two values */ +#ifndef __CYGWIN__ #define MIN(x,y) ((x) < (y) ? (x) : (y)) +#endif /***********************************************************************/ int uptime(double *restrict uptime_secs, double *restrict idle_secs) { @@ -224,6 +231,7 @@ static void old_Hertz_hack(void){ case 247 ... 252 : Hertz = 250; break; case 253 ... 260 : Hertz = 256; break; case 393 ... 408 : Hertz = 400; break; /* normal << 2 */ + case 410 ... 600 : Hertz = 500; break; /* SMP WinNT */ case 790 ... 808 : Hertz = 800; break; /* normal << 3 */ case 990 ... 1010 : Hertz = 1000; break; /* ARM */ case 1015 ... 1035 : Hertz = 1024; break; /* Alpha, ia64 */ @@ -254,6 +262,9 @@ extern char** environ; static unsigned long find_elf_note(unsigned long type) { +#ifdef __CYGWIN__ + return NOTE_NOT_FOUND; +#else ElfW(auxv_t) auxv_struct; ElfW(auxv_t) *auxv_temp; FILE *fd; @@ -313,6 +324,7 @@ static unsigned long find_elf_note(unsigned long type) auxv = NULL; } return ret_val; +#endif } int have_privs; @@ -350,6 +362,11 @@ static void init_libproc(void){ Hertz = 100; return; #endif /* __FreeBSD__ */ +#ifdef __CYGWIN__ + // On Cygwin we can rely on the HZ value given in sys/param.h + Hertz = (unsigned long long)HZ; /* */ + return; +#endif old_Hertz_hack(); } diff --git a/ps/procps.1 b/ps/procps.1 new file mode 120000 index 00000000..81587b32 --- /dev/null +++ b/ps/procps.1 @@ -0,0 +1 @@ +ps.1 \ No newline at end of file diff --git a/skill.c b/skill.c index 14e5b584..59c6c765 100644 --- a/skill.c +++ b/skill.c @@ -743,6 +743,11 @@ int main(int argc, char ** argv) else if (strcmp(program_invocation_short_name, "snice") == 0 || strcmp(program_invocation_short_name, "lt-snice") == 0) program = PROG_SNICE; +#ifdef __CYGWIN__ + else if (strcmp(program_invocation_short_name, "prockill") == 0 || + strcmp(program_invocation_short_name, "lt-prockill") == 0) + program = PROG_KILL; +#endif switch (program) { case PROG_SNICE: diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am index 6acfa48a..4c1165d2 100644 --- a/testsuite/Makefile.am +++ b/testsuite/Makefile.am @@ -13,9 +13,12 @@ if LINUX # temporarily disabled on other than linux systems, see commit # 3d807ae853b8b4264da156065b34f1447658a8ba DEJATOOL += \ - pmap \ + pmap +if !CYGWIN +DEJATOOL += \ slabtop \ sysctl +endif if BUILD_KILL DEJATOOL += kill @@ -34,7 +37,7 @@ DEJATOOL += \ endif EXTRA_DIST = \ - config/unix.exp \ + config/unix.exp \ free.test/free.exp \ kill.test/kill.exp \ lib.test/fileutils.exp \ @@ -48,8 +51,11 @@ EXTRA_DIST = \ ps.test/ps_personality.exp \ ps.test/ps_sched_batch.exp \ pwdx.test/pwdx.exp \ - slabtop.test/slabtop.exp \ - sysctl.test/sysctl_read.exp \ uptime.test/uptime.exp \ vmstat.test/vmstat.exp \ w.test/w.exp +if !CYGWIN +EXTRA_DIST += \ + slabtop.test/slabtop.exp \ + sysctl.test/sysctl_read.exp +endif