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 <wporter82@gmail.com>
This commit is contained in:
Wayne Porter 2017-08-30 15:15:15 -05:00 committed by Craig Small
parent 854e2c5528
commit 53e101452f
9 changed files with 187 additions and 19 deletions

1
.gitignore vendored
View File

@ -62,3 +62,4 @@ watch
*~ *~
*.log *.log
*.sum *.sum
*.exe

View File

@ -1,6 +1,7 @@
CYGWINFLAGS = CYGWINFLAGS =
if CYGWIN if CYGWIN
CYGWINFLAGS += -lintl CYGWINFLAGS += -lintl
usrbin_exec_PROGRAMS =
endif endif
AM_CPPFLAGS = \ AM_CPPFLAGS = \
@ -21,8 +22,21 @@ SUBDIRS = \
AM_CFLAGS = -Iproc AM_CFLAGS = -Iproc
LDADD = ./proc/libprocps.la $(CYGWINFLAGS) 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 = \ bin_PROGRAMS = \
ps/pscommand \ ps/pscommand \
free \ free \
@ -34,9 +48,17 @@ bin_PROGRAMS = \
uptime \ uptime \
vmstat \ vmstat \
w w
else
sbin_PROGRAMS = \ usrbin_exec_PROGRAMS += \
sysctl ps/pscommand \
free \
pgrep \
pkill \
pmap \
uptime \
vmstat \
w
endif
lib_LTLIBRARIES = \ lib_LTLIBRARIES = \
proc/libprocps.la proc/libprocps.la
@ -46,14 +68,19 @@ dist_man_MANS = \
pgrep.1 \ pgrep.1 \
pkill.1 \ pkill.1 \
pmap.1 \ pmap.1 \
pwdx.1 \
sysctl.8 \
sysctl.conf.5 \
tload.1 \
uptime.1 \ uptime.1 \
vmstat.8 \ vmstat.8 \
w.1 \ w.1 \
ps/procps.1
if !CYGWIN
dist_man_MANS += \
pwdx.1 \
tload.1 \
sysctl.8 \
sysctl.conf.5 \
ps/ps.1 ps/ps.1
endif
EXTRA_DIST = \ EXTRA_DIST = \
.version \ .version \
@ -63,7 +90,6 @@ EXTRA_DIST = \
misc/git-version-gen \ misc/git-version-gen \
Documentation/CodingStyle.md \ Documentation/CodingStyle.md \
Documentation/TODO \ Documentation/TODO \
sysctl.conf \
ps/HACKING \ ps/HACKING \
ps/regression \ ps/regression \
$(DIST_MAN_POTS) $(DIST_MAN_POTS)
@ -73,8 +99,17 @@ dist_procpsng_DATA = \
Documentation/bugs.md \ Documentation/bugs.md \
Documentation/FAQ Documentation/FAQ
if !CYGWIN
EXTRA_DIST += \
sysctl.conf
endif
if BUILD_PIDOF if BUILD_PIDOF
if !CYGWIN
bin_PROGRAMS += pidof bin_PROGRAMS += pidof
else
usrbin_exec_PROGRAMS += pidof
endif
dist_man_MANS += pidof.1 dist_man_MANS += pidof.1
pidof_SOURCES = pidof.c lib/fileutils.c pidof_SOURCES = pidof.c lib/fileutils.c
else else
@ -82,7 +117,13 @@ else
endif endif
if BUILD_KILL if BUILD_KILL
if CYGWIN
transform += ;s/^kill/prockill/; $(program_transform_name)
usrbin_exec_PROGRAMS += kill
else
bin_PROGRAMS += kill bin_PROGRAMS += kill
endif
dist_man_MANS += kill.1 dist_man_MANS += kill.1
kill_SOURCES = skill.c lib/strutils.c lib/fileutils.c lib/nsutils.c kill_SOURCES = skill.c lib/strutils.c lib/fileutils.c lib/nsutils.c
else else
@ -90,16 +131,20 @@ else
endif endif
if WITH_NCURSES if WITH_NCURSES
if !CYGWIN
bin_PROGRAMS += \ bin_PROGRAMS += \
slabtop \ slabtop \
watch \ watch \
top/top top/top
else
usrbin_exec_PROGRAMS += \
watch \
top/top
endif
dist_man_MANS += \ dist_man_MANS += \
slabtop.1 \
watch.1 \ watch.1 \
top/top.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_SOURCES = watch.c lib/strutils.c lib/fileutils.c
watch_LDADD = @WATCH_NCURSES_LIBS@ $(CYGWINFLAGS) watch_LDADD = @WATCH_NCURSES_LIBS@ $(CYGWINFLAGS)
watch_CFLAGS = @WATCH_NCURSES_CFLAGS@ watch_CFLAGS = @WATCH_NCURSES_CFLAGS@
@ -109,17 +154,29 @@ top_top_SOURCES = \
top/top_nls.h \ top/top_nls.h \
top/top_nls.c \ top/top_nls.c \
lib/fileutils.c lib/fileutils.c
if CYGWIN 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 endif
top_top_LDADD = $(LDADD) @NCURSES_LIBS@ $(DL_LIB) top_top_LDADD = $(LDADD) @NCURSES_LIBS@ $(DL_LIB)
endif endif
if BUILD_SKILL if BUILD_SKILL
if !CYGWIN
bin_PROGRAMS += \ bin_PROGRAMS += \
skill \ skill \
snice snice
else
usrbin_exec_PROGRAMS += \
skill \
snice
endif
skill_SOURCES = skill.c lib/strutils.c lib/fileutils.c lib/nsutils.c 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 snice_SOURCES = skill.c lib/strutils.c lib/fileutils.c lib/nsutils.c
dist_man_MANS += \ 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 pgrep_SOURCES = pgrep.c lib/fileutils.c lib/nsutils.c
pkill_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 pmap_SOURCES = pmap.c lib/fileutils.c
if !CYGWIN
pwdx_SOURCES = pwdx.c lib/fileutils.c pwdx_SOURCES = pwdx.c lib/fileutils.c
pwdx_LDADD= $(CYGWINFLAGS) pwdx_LDADD= $(CYGWINFLAGS)
sysctl_SOURCES = sysctl.c lib/fileutils.c sysctl_SOURCES = sysctl.c lib/fileutils.c
endif
tload_SOURCES = tload.c lib/strutils.c lib/fileutils.c tload_SOURCES = tload.c lib/strutils.c lib/fileutils.c
uptime_SOURCES = uptime.c lib/fileutils.c uptime_SOURCES = uptime.c lib/fileutils.c
vmstat_SOURCES = vmstat.c lib/strutils.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_SOURCES = lib/test_strtod_nol.c lib/strutils.c
lib_test_strtod_nol_LDADD = $(CYGWINFLAGS) 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 EXAMPLE_FILES
if !CYGWIN
sysconf_DATA = sysctl.conf sysconf_DATA = sysctl.conf
endif endif
endif
BUILT_SOURCES = $(top_srcdir)/.version BUILT_SOURCES = $(top_srcdir)/.version

View File

@ -69,6 +69,27 @@ AC_FUNC_MMAP
AC_FUNC_REALLOC AC_FUNC_REALLOC
AC_FUNC_STRTOD 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_VERSION([0.14.1])
AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT([external])
if test -d "$srcdir/po" if test -d "$srcdir/po"

View File

@ -203,15 +203,25 @@ int main(int argc, char *argv[]){
/* Try to guess the device name (useful until /proc/PID/tty is added) */ /* 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){ static int guess_name(char *restrict const buf, unsigned maj, unsigned min){
struct stat sbuf; struct stat sbuf;
#ifndef __CYGWIN__
int t0, t1; int t0, t1;
#endif
unsigned tmpmin = min; unsigned tmpmin = min;
switch(maj){ switch(maj){
case 3: /* /dev/[pt]ty[p-za-o][0-9a-z] is 936 */ case 3: /* /dev/[pt]ty[p-za-o][0-9a-z] is 936 */
if(tmpmin > 255) return 0; // should never happen; array index protection 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]; t0 = "pqrstuvwxyzabcde"[tmpmin>>4];
t1 = "0123456789abcdef"[tmpmin&0x0f]; t1 = "0123456789abcdef"[tmpmin&0x0f];
sprintf(buf, "/dev/tty%c%c", t0, t1); sprintf(buf, "/dev/tty%c%c", t0, t1);
#endif
break; break;
case 4: case 4:
if(min<64){ 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 78: sprintf(buf, "/dev/ttyM%d", min); break; /* conflict */
case 105: sprintf(buf, "/dev/ttyV%d", min); break; case 105: sprintf(buf, "/dev/ttyV%d", min); break;
case 112: sprintf(buf, "/dev/ttyM%d", min); break; /* conflict */ 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 ... */ /* 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; case 136 ... 143: sprintf(buf, "/dev/pts/%d", min+(maj-136)*256); break;
#endif
case 148: sprintf(buf, "/dev/ttyT%d", min); break; case 148: sprintf(buf, "/dev/ttyT%d", min); break;
case 154: sprintf(buf, "/dev/ttySR%d", min); break; case 154: sprintf(buf, "/dev/ttySR%d", min); break;
case 156: sprintf(buf, "/dev/ttySR%d", min+256); 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; 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 */ /* number --> name */
unsigned dev_to_tty(char *restrict ret, unsigned chop, dev_t dev_t_dev, int pid, unsigned int flags) { 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]; 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; unsigned i = 0;
int c; int c;
if(dev == 0u) goto no_tty; 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(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( 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; if( guess_name(tmp, MAJOR_OF(dev), MINOR_OF(dev) )) goto abbrev;

View File

@ -81,7 +81,7 @@
// Like HIDDEN, but for an alias that gets created. // Like HIDDEN, but for an alias that gets created.
// In gcc-3.2 there is an alias+hidden conflict. // In gcc-3.2 there is an alias+hidden conflict.
// Many will have patched this bug, but oh well. // 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"))) #define HIDDEN_ALIAS(x) extern __typeof(x) x##_direct __attribute__((alias(#x),visibility("hidden")))
#else #else
#define HIDDEN_ALIAS(x) extern __typeof(x) x##_direct __attribute__((alias(#x))) #define HIDDEN_ALIAS(x) extern __typeof(x) x##_direct __attribute__((alias(#x)))

View File

@ -28,6 +28,9 @@
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#ifdef __CYGWIN__
#include <sys/param.h>
#endif
#include "alloc.h" #include "alloc.h"
#include "version.h" #include "version.h"
#include "sysinfo.h" /* include self to verify prototypes */ #include "sysinfo.h" /* include self to verify prototypes */
@ -36,7 +39,9 @@
#include <netinet/in.h> /* htons */ #include <netinet/in.h> /* htons */
#endif #endif
#ifndef __CYGWIN__
#include <link.h> #include <link.h>
#endif
#include <elf.h> #include <elf.h>
long smp_num_cpus; /* number of CPUs */ 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) #define SET_IF_DESIRED(x,y) do{ if(x) *(x) = (y); }while(0)
/* return minimum of two values */ /* return minimum of two values */
#ifndef __CYGWIN__
#define MIN(x,y) ((x) < (y) ? (x) : (y)) #define MIN(x,y) ((x) < (y) ? (x) : (y))
#endif
/***********************************************************************/ /***********************************************************************/
int uptime(double *restrict uptime_secs, double *restrict idle_secs) { 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 247 ... 252 : Hertz = 250; break;
case 253 ... 260 : Hertz = 256; break; case 253 ... 260 : Hertz = 256; break;
case 393 ... 408 : Hertz = 400; break; /* normal << 2 */ 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 790 ... 808 : Hertz = 800; break; /* normal << 3 */
case 990 ... 1010 : Hertz = 1000; break; /* ARM */ case 990 ... 1010 : Hertz = 1000; break; /* ARM */
case 1015 ... 1035 : Hertz = 1024; break; /* Alpha, ia64 */ case 1015 ... 1035 : Hertz = 1024; break; /* Alpha, ia64 */
@ -254,6 +262,9 @@ extern char** environ;
static unsigned long find_elf_note(unsigned long type) 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_struct;
ElfW(auxv_t) *auxv_temp; ElfW(auxv_t) *auxv_temp;
FILE *fd; FILE *fd;
@ -313,6 +324,7 @@ static unsigned long find_elf_note(unsigned long type)
auxv = NULL; auxv = NULL;
} }
return ret_val; return ret_val;
#endif
} }
int have_privs; int have_privs;
@ -350,6 +362,11 @@ static void init_libproc(void){
Hertz = 100; Hertz = 100;
return; return;
#endif /* __FreeBSD__ */ #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(); old_Hertz_hack();
} }

1
ps/procps.1 Symbolic link
View File

@ -0,0 +1 @@
ps.1

View File

@ -743,6 +743,11 @@ int main(int argc, char ** argv)
else if (strcmp(program_invocation_short_name, "snice") == 0 || else if (strcmp(program_invocation_short_name, "snice") == 0 ||
strcmp(program_invocation_short_name, "lt-snice") == 0) strcmp(program_invocation_short_name, "lt-snice") == 0)
program = PROG_SNICE; 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) { switch (program) {
case PROG_SNICE: case PROG_SNICE:

View File

@ -13,9 +13,12 @@ if LINUX
# temporarily disabled on other than linux systems, see commit # temporarily disabled on other than linux systems, see commit
# 3d807ae853b8b4264da156065b34f1447658a8ba # 3d807ae853b8b4264da156065b34f1447658a8ba
DEJATOOL += \ DEJATOOL += \
pmap \ pmap
if !CYGWIN
DEJATOOL += \
slabtop \ slabtop \
sysctl sysctl
endif
if BUILD_KILL if BUILD_KILL
DEJATOOL += kill DEJATOOL += kill
@ -34,7 +37,7 @@ DEJATOOL += \
endif endif
EXTRA_DIST = \ EXTRA_DIST = \
config/unix.exp \ config/unix.exp \
free.test/free.exp \ free.test/free.exp \
kill.test/kill.exp \ kill.test/kill.exp \
lib.test/fileutils.exp \ lib.test/fileutils.exp \
@ -48,8 +51,11 @@ EXTRA_DIST = \
ps.test/ps_personality.exp \ ps.test/ps_personality.exp \
ps.test/ps_sched_batch.exp \ ps.test/ps_sched_batch.exp \
pwdx.test/pwdx.exp \ pwdx.test/pwdx.exp \
slabtop.test/slabtop.exp \
sysctl.test/sysctl_read.exp \
uptime.test/uptime.exp \ uptime.test/uptime.exp \
vmstat.test/vmstat.exp \ vmstat.test/vmstat.exp \
w.test/w.exp w.test/w.exp
if !CYGWIN
EXTRA_DIST += \
slabtop.test/slabtop.exp \
sysctl.test/sysctl_read.exp
endif