From d8fb86dbc596ca1c70766b65c5fd6d29a6972da7 Mon Sep 17 00:00:00 2001 From: Craig Small Date: Sat, 19 Aug 2017 23:05:22 +1000 Subject: [PATCH] Port of merge request 49 to newlib Wayne Porter made !49 which added Cygwin support to the master branch This is the port of those changes to newlib --- .gitignore | 1 + Makefile.am | 103 ++++++++++++++++++++++++++++++++++++------ configure.ac | 21 +++++++++ proc/devname.c | 41 +++++++++++++++++ proc/sysinfo.c | 5 ++ skill.c | 5 ++ testsuite/Makefile.am | 14 ++++-- 7 files changed, 172 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 4333f549..ed739fa9 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,4 @@ watch *~ *.log *.sum +*.exe diff --git a/Makefile.am b/Makefile.am index d1dcf28d..97dcd4fa 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,7 @@ CYGWINFLAGS = if CYGWIN - CYGWINFLAGS += -lintl +CYGWINFLAGS += -lintl +usrbin_exec_PROGRAMS = endif AM_CPPFLAGS = \ @@ -24,8 +25,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 \ @@ -37,9 +51,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 @@ -49,14 +71,9 @@ 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/ps.1 \ doc/libproc.3 \ doc/procps_linux_version.3 \ doc/procps_pids_new.3 \ @@ -70,6 +87,15 @@ dist_man_MANS = \ doc/procps_uptime_sprint.3 \ doc/procps_uptime_sprint_short.3 +if !CYGWIN +dist_man_MANS += \ + pwdx.1 \ + tload.1 \ + sysctl.8 \ + sysctl.conf.5 \ + ps/ps.1 +endif + EXTRA_DIST = \ .version \ autogen.sh \ @@ -78,18 +104,26 @@ EXTRA_DIST = \ misc/git-version-gen \ Documentation/CodingStyle.md \ Documentation/TODO \ - sysctl.conf \ ps/HACKING \ ps/regression \ $(DIST_MAN_POTS) +if !CYGWIN +EXTRA_DIST += \ + sysctl.conf +endif + procpsngdir = $(docdir) dist_procpsng_DATA = \ Documentation/bugs.md \ Documentation/FAQ 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 @@ -97,7 +131,12 @@ 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 = kill.c lib/strutils.c lib/fileutils.c lib/signals.c kill_LDADD = @@ -106,16 +145,27 @@ 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 +if !CYGWIN +bin_PROGRAMS += \ + slabtop +dist_man_MANS += \ + slabtop.1 slabtop_SOURCES = slabtop.c lib/strutils.c lib/fileutils.c slabtop_LDADD = $(LDADD) @NCURSES_LIBS@ +endif watch_SOURCES = watch.c lib/strutils.c lib/fileutils.c watch_LDADD = @WATCH_NCURSES_LIBS@ $(CYGWINFLAGS) top_top_SOURCES = \ @@ -126,16 +176,22 @@ top_top_SOURCES = \ lib/fileutils.c \ lib/signals.c if CYGWIN - top_top_SOURCES += lib/strverscmp.c +top_top_SOURCES += lib/strverscmp.c 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/signals.c snice_SOURCES = skill.c lib/strutils.c lib/fileutils.c lib/signals.c dist_man_MANS += \ @@ -151,10 +207,12 @@ free_SOURCES = free.c lib/strutils.c lib/fileutils.c pgrep_SOURCES = pgrep.c lib/fileutils.c lib/signals.c pkill_SOURCES = pgrep.c lib/fileutils.c lib/signals.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 sysctl_LDADD= +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 @@ -284,9 +342,26 @@ proc_test_version_LDADD = proc/libprocps.la 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 72ab2734..4898a375 100644 --- a/configure.ac +++ b/configure.ac @@ -70,6 +70,27 @@ AC_FUNC_REALLOC AC_FUNC_STRCOLL AC_FUNC_STRTOD +usrbin_execdir='${exec_prefix}/bin' +AC_SUBST([usrbin_execdir]) + +if test "x$host_os" = xcygwin +then + prefix=/usr + sysconfdir='${prefix}/etc' + libexecdir='${prefix}/lib' + localstatedir='${prefix}/var' + datadir='${prefix}/share' + mandir='${prefix}/share/man' + infodir='${prefix}/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 10b7845d..d36f5619 100644 --- a/proc/devname.c +++ b/proc/devname.c @@ -202,15 +202,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){ @@ -235,8 +245,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; @@ -284,6 +298,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]; @@ -291,6 +329,9 @@ unsigned dev_to_tty(char *restrict ret, unsigned chop, dev_t dev_t_dev, int pid, unsigned dev = dev_t_dev; unsigned i = 0; int c; +#ifdef __CYGWIN__ + if( ctty_name(tmp, pid )) goto abbrev; +#endif if(dev == 0u) goto no_tty; 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; diff --git a/proc/sysinfo.c b/proc/sysinfo.c index 92de3ff0..c1cbbee2 100644 --- a/proc/sysinfo.c +++ b/proc/sysinfo.c @@ -29,6 +29,9 @@ #include #include +#ifdef __CYGWIN__ +#include +#endif #include "alloc.h" #include "version.h" #include "sysinfo.h" /* include self to verify prototypes */ @@ -74,7 +77,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 /* * procps_hertz_get: diff --git a/skill.c b/skill.c index 34695497..88c2fdf8 100644 --- a/skill.c +++ b/skill.c @@ -570,6 +570,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..10d26a00 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