Consolidated patch of previously merged CYGWIN support
authorWayne Porter <wporter82@gmail.com>
Wed, 30 Aug 2017 20:15:15 +0000 (15:15 -0500)
committerCraig Small <csmall@enc.com.au>
Sun, 3 Sep 2017 10:59:23 +0000 (20:59 +1000)
The combined results of merge request #49 without that
overhead plus distortion in this repository's history.

Prototyped-by: Wayne Porter <wporter82@gmail.com>
.gitignore
Makefile.am
configure.ac
proc/devname.c
proc/procps.h
proc/sysinfo.c
ps/procps.1 [new symlink]
skill.c
testsuite/Makefile.am

index 4dd11a224b6a4d8e9f83481b6fe8a33ed9323bce..82c96bb19441e0d6a42a732ed90fb702b4c7c941 100644 (file)
@@ -62,3 +62,4 @@ watch
 *~
 *.log
 *.sum
+*.exe
index bf77c4dff4bc0fb85df9cbd3caf4c0946002e890..1d9203094ce04f016d98c010ef8cb5334f0eb34a 100644 (file)
@@ -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
 
index e8866d95125ef405da8af00af59fff99db785cf4..b0f82444da510a5744782caea6cfffe7d779b31d 100644 (file)
@@ -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"
index a28bc1b1737f400b059c5f64bd4cb44c87106071..9ba96d73dfd26d7282ca7e089a0863e2ed540f59 100644 (file)
@@ -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;
index c34dc056a7e123660c7ef94a45e67cd94407137a..375d6c692887e5604f3cb5fe7570ef88aad7688d 100644 (file)
@@ -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)))
index 4cb0b44812305c8ab2e4990cead3397839a4c6e9..aaf8a2d8fa344265662f95cf0ed677a3c2f00ee5 100644 (file)
@@ -28,6 +28,9 @@
 
 #include <unistd.h>
 #include <fcntl.h>
+#ifdef __CYGWIN__
+#include <sys/param.h>
+#endif
 #include "alloc.h"
 #include "version.h"
 #include "sysinfo.h" /* include self to verify prototypes */
@@ -36,7 +39,9 @@
 #include <netinet/in.h>  /* htons */
 #endif
 
+#ifndef __CYGWIN__
 #include <link.h>
+#endif
 #include <elf.h>
 
 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;    /* <sys/param.h> */
+  return;
+#endif
   old_Hertz_hack();
 }
 
diff --git a/ps/procps.1 b/ps/procps.1
new file mode 120000 (symlink)
index 0000000..81587b3
--- /dev/null
@@ -0,0 +1 @@
+ps.1
\ No newline at end of file
diff --git a/skill.c b/skill.c
index 14e5b58408a77707435a6283ac94dd425a062a49..59c6c7656bc5ebbfefa4e08f166f120b2029de01 100644 (file)
--- 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:
index 6acfa48a7da328f58a22e0893cd7733681aaee8c..4c1165d262148f3928fa32af1a3f2b842f6eba48 100644 (file)
@@ -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