commit 19b407ac749fcb8d978e8263ed98328100128de5 (HEAD, refs/remotes/origin/master) Author: Jim Porter Date: Thu Jun 13 21:44:40 2024 -0700 ; * lisp/eshell/em-script.el (eshell-execute-file): Improve docstring. diff --git a/lisp/eshell/em-script.el b/lisp/eshell/em-script.el index 6cddffdcf5f..ba020d2eb5b 100644 --- a/lisp/eshell/em-script.el +++ b/lisp/eshell/em-script.el @@ -108,6 +108,10 @@ Comments begin with `#'." ;;;###autoload (defun eshell-execute-file (file &optional args destination) "Execute a series of Eshell commands in FILE, passing ARGS. +If DESTINATION is t, write the command output to the current buffer. If +nil, don't write the output anywhere. For any other value, output to +the corresponding Eshell target (see `eshell-get-target'). + Comments begin with `#'." (let ((eshell-non-interactive-p t) (stdout (if (eq destination t) (current-buffer) destination))) commit a458dc5dc828cfbe5d74226d6ef45a3d205cb7d8 Author: Po Lu Date: Fri Jun 14 10:44:20 2024 +0800 Restore file's original name after a failed rename_replace on Windows 9X * src/w32.c (sys_rename_replace): If the rename operation fails and an intermediate name was generated and applied to the input file, restore the original. diff --git a/src/w32.c b/src/w32.c index 6d0b178e978..1c6a56bcbd9 100644 --- a/src/w32.c +++ b/src/w32.c @@ -4740,10 +4740,11 @@ int sys_rename_replace (const char *oldname, const char *newname, BOOL force) { BOOL result; - char temp[MAX_UTF8_PATH], temp_a[MAX_PATH];; + char temp[MAX_UTF8_PATH], temp_a[MAX_PATH]; int newname_dev; int oldname_dev; bool have_temp_a = false; + char oldname_a[MAX_PATH]; /* MoveFile on Windows 95 doesn't correctly change the short file name alias in a number of circumstances (it is not easy to predict when @@ -4768,7 +4769,6 @@ sys_rename_replace (const char *oldname, const char *newname, BOOL force) char * o; char * p; int i = 0; - char oldname_a[MAX_PATH]; oldname = map_w32_filename (oldname, NULL); filename_to_ansi (oldname, oldname_a); @@ -4844,7 +4844,7 @@ sys_rename_replace (const char *oldname, const char *newname, BOOL force) DWORD attributes_new; if (_wchmod (newname_w, 0666) != 0) - return result; + goto return_result; attributes_old = GetFileAttributesW (temp_w); attributes_new = GetFileAttributesW (newname_w); if (attributes_old != -1 && attributes_new != -1 @@ -4855,15 +4855,16 @@ sys_rename_replace (const char *oldname, const char *newname, BOOL force) errno = ENOTDIR; else errno = EISDIR; - return -1; + result = -1; + goto return_result; } if ((attributes_new & FILE_ATTRIBUTE_DIRECTORY) != 0) { if (_wrmdir (newname_w) != 0) - return result; + goto return_result; } else if (_wunlink (newname_w) != 0) - return result; + goto return_result; result = _wrename (temp_w, newname_w); } else if (w32err == ERROR_PRIVILEGE_NOT_HELD @@ -4902,7 +4903,7 @@ sys_rename_replace (const char *oldname, const char *newname, BOOL force) DWORD attributes_new; if (_chmod (newname_a, 0666) != 0) - return result; + goto return_result; attributes_old = GetFileAttributesA (temp_a); attributes_new = GetFileAttributesA (newname_a); if (attributes_old != -1 && attributes_new != -1 @@ -4913,15 +4914,16 @@ sys_rename_replace (const char *oldname, const char *newname, BOOL force) errno = ENOTDIR; else errno = EISDIR; - return -1; + result = -1; + goto return_result; } if ((attributes_new & FILE_ATTRIBUTE_DIRECTORY) != 0) { if (_rmdir (newname_a) != 0) - return result; + goto return_result; } else if (_unlink (newname_a) != 0) - return result; + goto return_result; result = rename (temp_a, newname_a); } else if (w32err == ERROR_PRIVILEGE_NOT_HELD @@ -4930,6 +4932,23 @@ sys_rename_replace (const char *oldname, const char *newname, BOOL force) } } + return_result: + /* This label is also invoked on failure, and on Windows 9X, restores + the initial name of files that will have been renamed in + preparation for being moved. It ought to be valid to rename temp_a + to its previous name, just as it would, but for the failure, have + been renamed to the target. */ + + if (have_temp_a && result) + { + int save_errno = errno; + + /* XXX: what if a new file has replaced oldname_a in the + meantime? */ + rename (temp_a, oldname_a); + errno = save_errno; + } + return result; } commit 4124b98509bf049a3ccf0f7319b7edf7cae3b6a0 Author: Po Lu Date: Fri Jun 14 09:58:04 2024 +0800 Enable compiling Emacs with implicit Make rules suppressed * lib/Makefile.in (.SUFFIXES): * lwlib/Makefile.in (.SUFFIXES): * oldXMenu/Makefile.in (.SUFFIXES): * src/Makefile.in (.SUFFIXES): Register .c as a default suffix, for this list is emptied when `-r' is provided to Make. diff --git a/lib/Makefile.in b/lib/Makefile.in index 6706d73ace0..a87b7b1f31b 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -98,6 +98,7 @@ libegnu_a_OBJECTS = $(patsubst %.o,e-%.o,$(for_emacs_OBJECTS)) $(libegnu_a_OBJECTS) $(libgnu_a_OBJECTS): $(BUILT_SOURCES) +.SUFFIXES: .c .c.o: $(AM_V_CC)$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -o $@ $< e-%.o: %.c diff --git a/lwlib/Makefile.in b/lwlib/Makefile.in index fbb60b35b24..b2c8d4b6e04 100644 --- a/lwlib/Makefile.in +++ b/lwlib/Makefile.in @@ -81,6 +81,7 @@ ALL_CFLAGS= $(C_SWITCH_SYSTEM) $(C_SWITCH_X_SITE) \ -Demacs -I../src \ -I$(srcdir) -I$(srcdir)/../src -I../lib -I$(srcdir)/../lib +.SUFFIXES: .c .c.o: $(AM_V_CC)$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $< diff --git a/oldXMenu/Makefile.in b/oldXMenu/Makefile.in index cdafe83b7a2..215a3f2b6cf 100644 --- a/oldXMenu/Makefile.in +++ b/oldXMenu/Makefile.in @@ -112,6 +112,7 @@ ALL_CFLAGS=$(C_SWITCH_SYSTEM) $(C_SWITCH_MACHINE) \ $(CPPFLAGS) $(CFLAGS) -DEMACS_BITMAP_FILES \ -I../src -I../lib -I${srcdir} -I${srcdir}/../src -I${srcdir}/../lib +.SUFFIXES: .c .c.o: $(AM_V_CC)$(CC) -c ${ALL_CFLAGS} $< diff --git a/src/Makefile.in b/src/Makefile.in index cac0b4ea280..7575ecbd07a 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -452,7 +452,7 @@ ALL_OBJC_CFLAGS = $(EMACS_CFLAGS) \ ALL_CXX_CFLAGS = $(EMACS_CFLAGS) \ $(filter-out $(NON_CXX_CFLAGS),$(WARN_CFLAGS)) $(CXXFLAGS) -.SUFFIXES: .m .cc +.SUFFIXES: .c .m .cc .c.o: $(AM_V_CC)$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $(PROFILING_CFLAGS) $< .m.o: commit 2dae603c4140a0a449b2ddaf572fe94de3908f31 Author: Pär Bohrarper Date: Fri Jun 14 04:04:20 2024 +0300 Fix file listing in submodules with project-files-relative-names=t * lisp/progmodes/project.el (project--vc-list-files): Prepend module names to files when project-files-relative-names is non-nil (bug#71538). diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index a16ff30395b..17550a83f95 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -714,10 +714,16 @@ See `project-vc-extra-root-markers' for the marker value format.") (mapcar (lambda (module) (when (file-directory-p module) - (project--vc-list-files - (concat default-directory module) - backend - extra-ignores))) + (let ((sub-files + (project--vc-list-files + (concat default-directory module) + backend + extra-ignores))) + (if project-files-relative-names + (mapcar (lambda (file) + (concat (file-name-as-directory module) file)) + sub-files) + sub-files)))) submodules))) (setq files (apply #'nconc files sub-files)))) commit 4973801c198a4292992b7df0488b3d467c99571e Author: Jim Porter Date: Thu Jun 13 12:22:01 2024 -0700 ; Minor editorial fixes to some Eshell tests * test/lisp/eshell/esh-proc-tests.el (esh-proc-test/kill-process/redirect-message): Move next to its sibling tests. (esh-proc-test/remote/remote-path): Rename from 'esh-var-test/...'. diff --git a/test/lisp/eshell/esh-proc-tests.el b/test/lisp/eshell/esh-proc-tests.el index 90bbb4fa14e..bb78f1786dd 100644 --- a/test/lisp/eshell/esh-proc-tests.el +++ b/test/lisp/eshell/esh-proc-tests.el @@ -271,6 +271,15 @@ prompt. See bug#54136." (eshell-wait-for-subprocess) (should (eshell-match-output "\\[sh\\(\\.exe\\)?\\] [[:digit:]]+\n")))) +(ert-deftest esh-proc-test/kill-process/redirect-message () + "Test that killing a process with a redirected stderr omits the exit status." + (skip-unless (executable-find "sleep")) + (eshell-with-temp-buffer bufname "" + (with-temp-eshell + (eshell-insert-command (format "sleep 100 2> #" bufname)) + (kill-process (eshell-head-process))) + (should (equal (buffer-string) "")))) + (ert-deftest esh-proc-test/kill-pipeline () "Test that killing a pipeline of processes only emits a single prompt. See bug#54136." @@ -310,19 +319,10 @@ write the exit status to the pipe. See bug#54136." output-start (eshell-end-of-output)) ""))))) -(ert-deftest esh-proc-test/kill-process/redirect-message () - "Test that killing a process with a redirected stderr omits the exit status." - (skip-unless (executable-find "sleep")) - (eshell-with-temp-buffer bufname "" - (with-temp-eshell - (eshell-insert-command (format "sleep 100 2> #" bufname)) - (kill-process (eshell-head-process))) - (should (equal (buffer-string) "")))) - ;; Remote processes -(ert-deftest esh-var-test/remote/remote-path () +(ert-deftest esh-proc-test/remote/remote-path () "Ensure that setting the remote PATH in Eshell doesn't interfere with Tramp. See bug#65551." (skip-unless (and (eshell-tests-remote-accessible-p) commit 56537ab0228262e96bf75f351642d8aaaa8097f7 Author: Eshel Yaron Date: Thu Jun 13 16:43:41 2024 +0200 ; (completion-basic-all-completions): Fix recent change * lisp/minibuffer.el (completion-basic-all-completions): Don't omit base size. https://lists.gnu.org/archive/html/emacs-devel/2024-06/msg00235.html diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 144cda8cfdc..0a0b17b3850 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -3816,7 +3816,9 @@ Return the new suffix." 'point (substring afterpoint 0 (cdr bounds))))) (all (completion-pcm--all-completions prefix pattern table pred))) - (completion-pcm--hilit-commonality pattern all))) + (when all + (nconc (completion-pcm--hilit-commonality pattern all) + (car bounds))))) ;;; Partial-completion-mode style completion. commit 39e3c30b514c21854f7fcc87c3a461bd9e81cbdb Author: Harald Jörg Date: Thu Jun 13 14:34:16 2024 +0200 ;cperl-mode.el: Avoid false positives when parsing new Perl syntax * lisp/progmodes/cperl-mode.el (cperl--package-for-imenu-rx) (cperl--class-for-imenu-rx): avoid false positives when collecting imenu entries * lisp/progmodes/cperl-mode.el (cperl-init-faces): avoid false positives when detecting package names * test/lisp/progmodes/cperl-mode-tests.el (cperl-test-imenu-index): Add test verifying that $class_false is not shown as a class _false * test/lisp/progmodes/cperl-mode-resources/grammar.pl: Add a line containing a false positive "$class_false" diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 1544dcd8a19..68ad7eda9a7 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -1392,7 +1392,7 @@ Contains three groups for the initial keyword \"package\" or (defconst cperl--package-for-imenu-rx `(sequence symbol-start (group-n 1 "package") - ,cperl--ws*-rx + ,cperl--ws+-rx (group-n 2 ,cperl--normal-identifier-rx) (optional (sequence ,cperl--ws+-rx (regexp ,cperl--version-regexp))) @@ -1408,9 +1408,9 @@ name, and one for the discovery of a following BLOCK.") ;; (e.g. ":isa(Parent)") while packages don't. We skip over it, but ;; like for "package" we capture the following ";" or "{". (defconst cperl--class-for-imenu-rx - `(sequence symbol-start + `(sequence (or space line-start) (group-n 1 "class") - ,cperl--ws*-rx + ,cperl--ws+-rx (group-n 2 ,cperl--normal-identifier-rx) (optional (sequence ,cperl--ws+-rx (regexp ,cperl--version-regexp))) @@ -6395,7 +6395,7 @@ functions (which they are not). Inherits from `default'.") ;; -------- various stuff calling for a package name ;; (matcher (subexp facespec) (subexp facespec)) `(,(rx (sequence - (or (sequence symbol-start + (or (sequence (or line-start space "{" ) (or "package" "require" "use" "import" "no" "bootstrap" "class") (eval cperl--ws+-rx)) diff --git a/test/lisp/progmodes/cperl-mode-resources/grammar.pl b/test/lisp/progmodes/cperl-mode-resources/grammar.pl index 14da28b0fd8..b4d2d7c68e3 100644 --- a/test/lisp/progmodes/cperl-mode-resources/grammar.pl +++ b/test/lisp/progmodes/cperl-mode-resources/grammar.pl @@ -192,6 +192,9 @@ package Class::Class; method init_again (@with_parameters) { ...; } + + # A false positive + my $class_false; } =head1 Perl 5.40 brings new stuff diff --git a/test/lisp/progmodes/cperl-mode-tests.el b/test/lisp/progmodes/cperl-mode-tests.el index 7c8cc3931bc..c91253cbeba 100644 --- a/test/lisp/progmodes/cperl-mode-tests.el +++ b/test/lisp/progmodes/cperl-mode-tests.el @@ -977,7 +977,8 @@ created by CPerl mode, so skip it for Perl mode." "With::Readers::auto_reader" "With::Readers::named"))) (dolist (sub expected) - (should (assoc-string sub index))))))) + (should (assoc-string sub index)))) + (should-not (assoc-string "_false" index))))) ;;; Tests for issues reported in the Bug Tracker commit 14f7506c99b19abe411d140c3f09dbf1de63a4b6 Author: Po Lu Date: Thu Jun 13 20:11:43 2024 +0800 ; * src/androidterm.c (android_term_init): Typo. diff --git a/src/androidterm.c b/src/androidterm.c index f98da97eeba..6ae9a676f3c 100644 --- a/src/androidterm.c +++ b/src/androidterm.c @@ -6686,7 +6686,8 @@ android_term_init (void) which being keyboard-local is not accessible from any point in android-win.el. */ Fdefine_key (KVAR (terminal->kboard, Vinput_decode_map), - make_vector (1, Qselect), Qreturn, Qnil); + make_vector (1, Qselect), make_vector (1, Qreturn), + Qnil); } commit 59367f6a3a9dd7fb30429494b622ebdec94e6e32 Author: Mattias Engdegård Date: Thu Jun 13 10:49:28 2024 +0200 php-ts-mode: minor fixes * lisp/progmodes/php-ts-mode.el (php-ts-mode-flymake-php): Don't use `any` to mean `not-newline`; it's misleading. (php-ts-mode--predefined-constant): Remove duplicate "E_USER_NOTICE". diff --git a/lisp/progmodes/php-ts-mode.el b/lisp/progmodes/php-ts-mode.el index 3473057edd4..6a576d9c7c5 100644 --- a/lisp/progmodes/php-ts-mode.el +++ b/lisp/progmodes/php-ts-mode.el @@ -242,8 +242,8 @@ Calls REPORT-FN directly." (rx bol (? "PHP ") ;; every dignostic line start with PHP (group (or "Fatal" "Parse")) ;; 1: type " error:" (+ (syntax whitespace)) - (group (+? any)) ;; 2: msg - " in " (group (+? any)) ;; 3: file + (group (+? nonl)) ;; 2: msg + " in " (group (+? nonl)) ;; 3: file " on line " (group (+ num)) ;; 4: line eol)))) (save-restriction @@ -739,7 +739,7 @@ characters of the current line." "PHP_SHLIB_SUFFIX" "PHP_FD_SETSIZE" "E_ERROR" "E_WARNING" "E_PARSE" "E_NOTICE" "E_CORE_ERROR" "E_CORE_WARNING" "E_COMPILE_ERROR" "E_COMPILE_WARNING" "E_USER_ERROR" "E_USER_WARNING" - "E_USER_NOTICE" "E_USER_NOTICE" "E_DEPRECATED" "E_USER_DEPRECATED" + "E_USER_NOTICE" "E_DEPRECATED" "E_USER_DEPRECATED" "E_ALL" "E_STRICT" ;; magic constant "__COMPILER_HALT_OFFSET__" "__CLASS__" "__DIR__" "__FILE__" commit 72e6b05221502cf722f7bddf2d100e5eff424dd8 Author: Eli Zaretskii Date: Thu Jun 13 11:03:52 2024 +0300 ; * src/w32proc.c (sys_kill): Handle negative PID when sig == 0. diff --git a/src/w32proc.c b/src/w32proc.c index 4d237992b14..40181e09830 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -2727,6 +2727,7 @@ sys_kill (pid_t pid, int sig) HANDLE proc_hand; int need_to_free = 0; int rc = 0; + pid_t orig_pid = pid; /* Each process is in its own process group. */ if (pid < 0) @@ -2734,7 +2735,8 @@ sys_kill (pid_t pid, int sig) /* Only handle signals that can be mapped to a similar behavior on Windows */ if (sig != 0 - && sig != SIGINT && sig != SIGKILL && sig != SIGQUIT && sig != SIGHUP && sig != SIGTRAP) + && sig != SIGINT && sig != SIGKILL && sig != SIGQUIT + && sig != SIGHUP && sig != SIGTRAP) { errno = EINVAL; return -1; @@ -2760,11 +2762,34 @@ sys_kill (pid_t pid, int sig) errno = EPERM; return -1; case ERROR_INVALID_PARAMETER: /* process PID does not exist */ - errno = ESRCH; - return -1; + { + if (orig_pid == pid) + { + errno = ESRCH; + return -1; + } + /* If we received a negative value, try again with the + original one we received. */ + proc_hand = OpenProcess (PROCESS_QUERY_INFORMATION, + 0, orig_pid); + if (proc_hand == NULL) + { + err = GetLastError (); + switch (err) + { + case ERROR_ACCESS_DENIED: + errno = EPERM; + return -1; + case ERROR_INVALID_PARAMETER: + errno = ESRCH; + return -1; + } + } + break; + } } } - else + if (proc_hand != NULL) CloseHandle (proc_hand); return 0; } commit 8eeb159b95130a0dc29040ffa9f330874576964e Author: Michael Albinus Date: Thu Jun 13 09:29:44 2024 +0200 Adapt emacsclient options in doc * doc/emacs/misc.texi (emacsclient Options): * doc/man/emacsclient.1: Adapt option list. diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi index 68ea030e219..13d86a32e79 100644 --- a/doc/emacs/misc.texi +++ b/doc/emacs/misc.texi @@ -2157,6 +2157,7 @@ overrides the environment variable.) @item -t @itemx --tty @itemx -nw +@itemx --no-window-system Create a new client frame on the current text terminal, instead of using an existing Emacs frame. This behaves just like the @samp{-c} option, described above, except that it creates a text terminal frame @@ -2212,6 +2213,14 @@ remote$ export EDITOR=emacsclient remote$ $EDITOR /tmp/foo.txt #Should open in local emacs. @end example +@item -V +@itemx --version +Print version information and exit. + +@item -H +@itemx --help +Print usage information message and exit. + @end table The new graphical or text terminal frames created by the @samp{-c} diff --git a/doc/man/emacsclient.1 b/doc/man/emacsclient.1 index 75f38e4e50e..8ceca65d7b1 100644 --- a/doc/man/emacsclient.1 +++ b/doc/man/emacsclient.1 @@ -1,5 +1,5 @@ .\" See section COPYING for conditions for redistribution. -.TH EMACSCLIENT 1 "2023-12-23" "GNU Emacs" "GNU" +.TH EMACSCLIENT 1 "2024-06-13" "GNU Emacs" "GNU" .\" NAME should be all caps, SECTION should be 1-8, maybe w/ subsection .\" other params are allowed: see man(7), man(1) .SH NAME @@ -125,7 +125,7 @@ Relative filenames are relative to "$XDG_RUNTIME_DIR/emacs/" or "$TMPDIR/". See also the EMACS_SOCKET_NAME environment variable, over which this option takes precedence. .TP -.B \-nw, \-t, \-\-tty +.B \-nw, \-t, \-\-tty, \-\-no-window-system Open a new Emacs frame on the current terminal. .TP .B \-T, \-\-tramp=PREFIX commit 0007231a7805abce945349c7c9c75b45155bda5c Author: Eli Zaretskii Date: Thu Jun 13 10:24:21 2024 +0300 Fix removal of file locks on MS-Windows 9X A new Windows-specific function for validating process ID is introduced that does TRT with possibly negative PID values returned by 'getpid' on Windows 9X and also with values larger than INT_MAX, since PID on Windows is actually an unsigned 32-bit value. * src/w32proc.c (w32_valid_process_id): New function. * src/w32common.h (VALID_PROCESS_ID): Define for WINDOWSNT. * src/filelock.c [WINDOWSNT]: Include w32common.h. (Bug#71477) diff --git a/src/filelock.c b/src/filelock.c index d4a4747955a..43ede30975e 100644 --- a/src/filelock.c +++ b/src/filelock.c @@ -47,6 +47,7 @@ along with GNU Emacs. If not, see . */ #ifdef WINDOWSNT #include #include /* for fcntl */ +#include "w32common.h" #endif #ifndef MSDOS @@ -353,7 +354,7 @@ integer_prefixed (char const *s) /* Whether the integer P could identify an individual process. On most platforms this simply checks for positive pid_t, but on some - Microsoft ports our headers #define it to to some other test. */ + MS-Windows ports our headers #define it to to some other test. */ #ifndef VALID_PROCESS_ID # define VALID_PROCESS_ID(p) (0 < (p) && (p) <= TYPE_MAXIMUM (pid_t)) #endif diff --git a/src/w32common.h b/src/w32common.h index 9475481b64e..8a5c7c03bca 100644 --- a/src/w32common.h +++ b/src/w32common.h @@ -53,6 +53,8 @@ extern void cache_system_info (void); #ifdef WINDOWSNT /* Return a static buffer with the MS-Windows version string. */ extern char * w32_version_string (void); +extern bool w32_valid_process_id (intmax_t); +# define VALID_PROCESS_ID(p) w32_valid_process_id(p) #endif typedef void (* VOIDFNPTR) (void); diff --git a/src/w32proc.c b/src/w32proc.c index 55ead13647b..4d237992b14 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -2676,6 +2676,19 @@ sys_select (int nfds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds, return nr; } +/* This is called from filelock.c:current_lock_owner to validate a PID. + Return true if PID could identify a process on the current host, + false otherwise. */ +bool +w32_valid_process_id (intmax_t id) +{ + if (id == -1 || id == 0 /* always invalid */ + || id > UINT32_MAX /* PID is actually a DWORD */ + || id < INT32_MIN) /* Windows 9X can report negative PIDs */ + return false; + return true; +} + /* Substitute for certain kill () operations */ static BOOL CALLBACK