annotate msdos/is_exec.c @ 47576:b31c8ab7336a

Sync with version 2.0.20. Lengthy ChangeLog follows: 2002-09-22 Kai Gro?ohann <grossjoh@ls6.informatik.uni-dortmund.de> Version 2.0.20 released. 2002-09-20 Kai Gro?ohann <grossjoh@ls6.informatik.uni-dortmund.de> * net/tramp.el (tramp-completion-function-alist): Escape open paren in docstring. (tramp-user-regexp, tramp-host-regexp): Allow empty strings. (tramp-handle-insert-file-contents): Call tramp-message-for-buffer instead of tramp-message. (tramp-open-connection-rsh): Handle empty string as user name. (tramp-open-connection-su): Handle empty string as host name. Handle nil user name. (tramp-handle-file-local-copy, tramp-handle-write-region) (tramp-completion-handle-file-name-all-completions) (tramp-open-connection-telnet, tramp-open-connection-rsh) (tramp-open-connection-su, tramp-post-connection) (tramp-maybe-open-connection, tramp-method-out-of-band-p) (tramp-get-connection-function, tramp-get-remote-sh) (tramp-get-rsh-program, tramp-get-rsh-args) (tramp-get-rcp-program, tramp-get-rcp-args) (tramp-get-rcp-keep-date-arg, tramp-get-su-program) (tramp-get-su-args, tramp-get-telnet-program) (tramp-get-telnet-args): Use `tramp-find-method', perhaps require additional args USER, HOST. (tramp-action-password, tramp-open-connection-telnet) (tramp-open-connection-su, tramp-open-connection-multi) (tramp-method-out-of-band-p): `tramp-method-out-of-band-p' now takes USER and HOST arguments, to be able to use `tramp-find-method'. Update callers. (tramp-find-method): New function. 2002-09-20 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-handle-insert-directory): Handle "--dired" in SWITCHES (by removing it). 2002-09-18 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-file-name-handler): Add `file-remote-p' property. 2002-09-17 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (top-level): Maybe autoload uudecode-decode-region. 2002-09-16 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-bug): Add tramp-methods. 2002-09-16 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-methods): Update docstring: tramp-encoding-command, tramp-decoding-command, tramp-encoding-function and tramp-decoding-function are not parameters anymore. (tramp-uuencode-region): Autoload it. 2002-09-13 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> Version 2.0.19 released. * net/tramp-uu.el: New file, implements uuencode in Lisp. * net/tramp.el (tramp-coding-commands): Use `tramp-uuencode-region' as local encoder for the uuencode based entries. 2002-09-13 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-handle-write-region): Wrong parens. 2002-09-13 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> Version 2.0.18 released. * net/tramp.el (tramp-perl-decode): Perl changes to accomodate older versions of Perl. Now tested with 5.004. Suggestion from Michael Albinus. 2002-09-12 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-find-inline-encoding): Call tramp-call-local-coding-command with nil for INPUT and OUTPUT. (tramp-call-local-coding-command): OUTPUT equals nil means to discard the output. INPUT equals nil means /dev/null. 2002-09-12 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-encoding-shell): Default to environment variable COMSPEC on Windows. (tramp-handle-write-region): More debugging output. (tramp-find-inline-encoding): Ditto. 2002-09-11 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-completion-handle-file-name-all-completions): Define `result1'. (tramp-parse-hosts-group): Discard IPv6 entries. 2002-09-11 Kai Gro?ohann <grossjoh@ls6.informatik.uni-dortmund.de> * net/tramp.el (tramp-post-connection): Only send Perl mime-encode/decode implementations when using inline method. (tramp-handle-file-local-copy) (tramp-handle-write-region, tramp-post-connection) (tramp-coding-commands, tramp-find-inline-encoding): For the inline encodings, distinguish between local and remote commands, instead of between commands and functions. (The local commands can be functions, too.) If the local host is a Windows machine, we can't expect the same commands to work there as on the remote host. (tramp-call-local-coding-command): New function for calling local encoding and decoding commands. (tramp-set-remote-encoding, tramp-get-remote-encoding) (tramp-set-remote-decoding, tramp-get-remote-decoding) (tramp-set-local-encoding, tramp-get-local-encoding) (tramp-set-local-decoding, tramp-get-local-decoding): New functions. (tramp-get-encoding-command, tramp-set-encoding-command) (tramp-get-decoding-command, tramp-set-decoding-command) (tramp-get-encoding-function, tramp-set-encoding-function) (tramp-get-decoding-function, tramp-set-decoding-function): Old functions, removed. 2002-09-10 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-open-connection-setup-interactive-shell): Change command to invoke /bin/sh slightly to make it compatible with the `rc' shell. Suggested by Daniel Pittman. 2002-09-10 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-handle-write-region): Added missing `)'. Hope it's the right place. 2002-09-09 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-open-connection-setup-interactive-shell): Do "exec env PS1='$ ' /bin/sh" instead of just "exec /bin/sh" in order to get a sane shell prompt. If people have ${CWD}, say, in their shell prompt, then the default login shell might display something harmless, but the /bin/sh will display a dollar sign which confused the subsequent prompt recognition. (tramp-multi-action-password): More debugging output. (tramp-encoding-shell): Renamed from tramp-sh-program. More documentation. Default to cmd.exe on Windows NT. (tramp-encoding-command-switch): New variable. Use instead of hard-wired "-c" which is only good for /bin/sh. (tramp-encoding-reads-stdin): New variable. If t, commands are called like "/bin/sh -c COMMAND <INPUT", if nil, they are called like "/bin/sh -c COMMAND INPUT", ie the input file is the last argument. (tramp-multi-sh-program): Always default to tramp-encoding-shell. (tramp-handle-file-local-copy, tramp-handle-write-region): Respect tramp-encoding-shell and friends. (tramp-find-inline-encoding): Use new-style calls for checking if the local commands work. 2002-09-07 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-methods): Remove `tramp-completion-function' entries. They are handled now by `tramp-completion-function-alist'. (tramp-completion-function): Defvar removed. I've never used it. Hmm. (tramp-get-completion-function) (tramp-get-completion-rsh, tramp-get-completion-ssh) (tramp-get-completion-telnet, tramp-get-completion-su): Functions removed as well. Not necessary any longer due to extended customization means. (tramp-completion-function-alist): New defcustom. Holds all FUNCTION FILE pairs used for user and host name completion relevant for METHOD. (tramp-completion-function-alist-rsh) (tramp-completion-function-alist-ssh) (tramp-completion-function-alist-telnet) (tramp-completion-function-alist-su): Defconst for initializing `tramp-completion-function-alist'. Unfortunately, mainly UNIX-like values are known for me until now. Needs to be completed for at least VMS++ like operating systems. (tramp-set-completion-function) (tramp-get-completion-function): New functions for configuration of `tramp-completion-function-alist'. The old definition of `tramp-get-completion-function' has been discarded. (tramp-completion-handle-file-name-all-completions): Change function call for user/host completion according to definition in `tramp-completion-function-alist'. (tramp-parse-passwd): Added exception handling for "root", because `tramp-get-completion-su' (the previous place for this stuff) doesn't exist any longer. 2002-09-07 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-enter-password): Use `tramp-password-end-of-line' to terminate the line. (tramp-bug): Include new variable `tramp-password-end-of-line'. (tramp-password-end-of-line): New variable. People who use plink under Windows might have to issue "\r\n" after the password, but they need to send just "\n" after the other commands. So this variable was introduced to complement `tramp-rsh-end-of-line'. (tramp-wait-for-output, tramp-post-connection): Allow "\r" at end of line of the output delimiter. 2002-09-06 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-handle-file-local-copy, tramp-find-shell) (tramp-open-connection-setup-interactive-shell): Add some comments about Douglas Grey Stephen's suggestions to make Tramp work better with plink under Windows. I'm not sure what to think of them, but now I have a guinea pig to try it out on. Said guinea pig is having other problems, though... Also remove some commented-out code. 2002-09-06 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-get-completion-methods): Algorithm slightly tuned. (tramp-get-completion-user-host): Accept user names as they are if typed until "@". (tramp-completion-mode): Replace `last-input-char' by modern `last-input-event'. Check for `event-modifiers'. 2002-09-06 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (file-expand-wildcards): Corrected check to see if advising is necessary. 2002-09-05 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-postfix-single-method-format) (tramp-postfix-multi-method-format) (tramp-postfix-multi-hop-format) (tramp-postfix-user-format): New format strings. (tramp-postfix-single-method-regexp) (tramp-postfix-multi-method-regexp) (tramp-postfix-multi-hop-regexp) (tramp-postfix-user-regexp) (tramp-make-multi-tramp-file-format) (tramp-make-tramp-file-name): Apply them. (tramp-completion-handle-file-name-all-completions): Fix for invoking ange-ftp in case of "/ftp:xxx" file names. 2002-09-04 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-prefix-format) (tramp-postfix-host-format): New format strings. (tramp-prefix-regexp, tramp-method-regexp) (tramp-postfix-single-method-regexp) (tramp-postfix-multi-method-regexp) (tramp-postfix-multi-hop-regexp) (tramp-user-regexp, tramp-postfix-user-regexp) (tramp-host-regexp, tramp-postfix-host-regexp) (tramp-path-regexp): New atomar regular expressions. If corresponding format strings exist, derived from them. (tramp-file-name-structure) (tramp-multi-file-name-structure) (tramp-multi-file-name-hop-structure) (tramp-make-multi-tramp-file-format) (tramp-completion-mode) (tramp-completion-dissect-file-name) (tramp-parse-rhosts-group) (tramp-parse-shosts-group) (tramp-parse-hosts-group) (tramp-parse-passwd-group): Apply these expressions. (tramp-file-name-structure-unified) (tramp-file-name-structure-separate) (tramp-make-tramp-file-format-unified) (tramp-make-tramp-file-format-separate) (tramp-make-tramp-file-format) (tramp-make-tramp-file-user-nil-format-unified) (tramp-make-tramp-file-user-nil-format-separate) (tramp-make-tramp-file-user-nil-format) (tramp-multi-file-name-structure-unified) (tramp-multi-file-name-structure-separate) (tramp-multi-file-name-hop-structure-unified) (tramp-multi-file-name-hop-structure-separate) (tramp-make-multi-tramp-file-format-unified) (tramp-make-multi-tramp-file-format-separate): Removed. (tramp-make-tramp-file-name): Allow partial tramp file names. Generate tramp file format on-the-fly depending on parameters. Apply atomar format strings resp expressions. (tramp-get-completion-methods) (tramp-get-completion-user-host): Apply `tramp-make-tramp-file-name'. (tramp-parse-hosts-group): Take all host names and IP addresses into account. (tramp-bug): Remove `tramp-make-tramp-file-format'. 2002-09-01 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-methods): Add `tramp-completion-function' for "su" and "sudo". (tramp-get-completion-telnet): Implement it. (tramp-parse-hosts) (tramp-parse-hosts-group) (tramp-get-completion-su) (tramp-parse-passwd) (tramp-parse-passwd-group): New functions. 2002-08-31 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-completion-mode): Check for `last-input-char'. (tramp-completion-file-name-handler-alist): Add handler for `file-exists-p. (tramp-completion-handle-file-exists-p): New function. (tramp-completion-handle-file-name-completion): Simplified. (tramp-completion-dissect-file-name): Regexp's reorganised. (tramp-completion-handle-file-name-all-completions): Call completion-function only if `user' or `host' is given. (tramp-get-completion-user-host): New function. (tramp-get-completion-rsh) (tramp-get-completion-ssh): Apply it. 2002-08-29 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-completion-file-name-handler-alist): Add handler for `expand-file-name'. (tramp-completion-handle-expand-file-name): New function. 2002-08-26 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-completion-mode): New function. (tramp-completion-handle-file-name-directory) (tramp-completion-handle-file-name-all-completions): Apply it. (tramp-methods): Remove double definition of `ssh1-old' and `ssh2-old'. (tramp-point-at-eol): New defalias. (tramp-parse-rhosts-group) (tramp-parse-shosts-group):: Apply it. 2002-08-25 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-get-completion-methods) (tramp-get-completion-rsh) (tramp-get-completion-ssh): Add "[" for Xemacs. (tramp-completion-file-name-regexp-separate): Expression adapted. (tramp-completion-file-name-handler-alist): Add handler for `file-name-directory' and `file-name-nondirectory'. (tramp-completion-handle-file-name-directory) (tramp-completion-handle-file-name-nondirectory) (tramp-completion-run-real-handler): New functions. (tramp-completion-file-name-handler) (tramp-completion-handle-file-name-all-completions): Apply `tramp-completion-run-real-handler'. (tramp-parse-rhosts) (tramp-parse-shosts): Use `with-temp-buffer'. `result? renamed to `res' (otherwise side effects in XEmacs). 2002-08-24 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-completion-file-name-regexp) (tramp-completion-file-name-handler-alist) (tramp-flatten-list) (tramp-completion-dissect-file-name) (tramp-get-completion-rsh) (tramp-parse-rhosts) (tramp-parse-rhosts-group) (tramp-get-completion-ssh): Doc string tuned. (tramp-methods): Doc string and custom type extended for `tramp-completion-function'. (tramp-completion-function): Variable added. Is it really used? Other variables like `tramp-completion-function' aren't used. (tramp-completion-file-name-handler-alist): Add handler for `file-name-completion'. (tramp-completion-handle-file-name-completion): New function. 2002-08-18 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-parse-rhosts) (tramp-parse-rhosts-group) (tramp-parse-shosts) (tramp-parse-shosts-group): New functions. 2002-08-17 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-completion-dissect-file-name) (tramp-completion-dissect-file-name1): New functions. 2002-08-16 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-get-completion-function) (tramp-get-completion-rsh) (tramp-get-completion-ssh) (tramp-get-completion-telnet): New functions. (tramp-methods): Add `tramp-completion-function' for all methods. 2002-08-15 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-get-completion-methods): New function. (tramp-find-default-method): Allow host to be nil (like user). 2002-08-14 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-completion-file-name-regexp-unified) (tramp-completion-file-name-regexp-separate) (tramp-completion-file-name-regexp) (tramp-completion-file-name-handler-alist): New defcustoms. (tramp-completion-file-name-handler): New function. Add `tramp-completion-file-name-handler' to `file-name-handler-alist'. (tramp-run-real-handler): Add `tramp-completion-file-name-handler' to `inhibit-file-name-handlers'. (tramp-completion-handle-file-name-all-completions) (tramp-completion-handle-file-name-completion): New functions. 2002-08-12 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-invoke-ange-ftp): `tramp-disable-ange-ftp' must be called again after activating `ange-ftp'. (tramp-ange-ftp-file-name-p): Check for Xemacs. 2002-08-08 Michael Albinus <Michael.Albinus@alcatel.de> * net/tramp.el (tramp-do-copy-or-rename-file): Don't pass KEEP-DATE to tramp-invoke-ange-ftp 'rename. (tramp-handle-write-region): Don't pass LOCKNAME and CONFIRM to tramp-invoke-ange-ftp 'write-region. (tramp-handle-set-file-modes): Change order of FILENAME and MODE passing to tramp-invoke-ange-ftp 'set-file-modes. (tramp-flatten-list): New function. Maybe this functionality does exist already elsewhere in the libraries. (tramp-invoke-ange-ftp): Apply `tramp-flatten-list' to parameter list in order to avoid nested lists, f.e. when invoked from `tramp-handle-dired-call-process'. 2002-09-05 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-chunksize): New kluge variable. (tramp-send-region): If tramp-chunksize is non-nil, send region in parts and sleep 0.1 seconds between chunks. 2002-09-03 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-handle-insert-directory): Use `insert-buffer-substring' instead of `insert-buffer', which is not supposed to be used from Lisp. Remember old point in a variable instead of using `mark'. Suggestion from Stefan Monnier. (tramp-unified-filenames): New variable. Use it in default value of other filename variables. (file-expand-wildcards): Don't advise unless "[" and "]" are used in the filename format. 2002-09-01 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * net/tramp.el (tramp-methods): Remove duplicate definition of ssh1-old and ssh2-old.
author Kai Großjohann <kgrossjo@eu.uu.net>
date Sun, 22 Sep 2002 13:23:36 +0000
parents 354e0c45cedf
children 695cf19ef79e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25856
Dave Love <fx@gnu.org>
parents:
diff changeset
1 /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
Dave Love <fx@gnu.org>
parents:
diff changeset
2 /* IS_EXEC.C
Dave Love <fx@gnu.org>
parents:
diff changeset
3 *
Dave Love <fx@gnu.org>
parents:
diff changeset
4 * Given a filename or a file handle, and the extension of the file,
Dave Love <fx@gnu.org>
parents:
diff changeset
5 * determine if the file is executable.
Dave Love <fx@gnu.org>
parents:
diff changeset
6 * First, the file extension is checked in case it uniquely identifies
Dave Love <fx@gnu.org>
parents:
diff changeset
7 * the file as either an executable or not. Failing this, the first
Dave Love <fx@gnu.org>
parents:
diff changeset
8 * two bytes of the file are tested for known signatures of executable
Dave Love <fx@gnu.org>
parents:
diff changeset
9 * files.
Dave Love <fx@gnu.org>
parents:
diff changeset
10 *
Dave Love <fx@gnu.org>
parents:
diff changeset
11 * Copyright (c) 1994 Eli Zaretskii <eliz@is.elta.co.il>
Dave Love <fx@gnu.org>
parents:
diff changeset
12 *
Dave Love <fx@gnu.org>
parents:
diff changeset
13 * This software may be used freely so long as this copyright notice is
Dave Love <fx@gnu.org>
parents:
diff changeset
14 * left intact. There is no warranty on this software.
Dave Love <fx@gnu.org>
parents:
diff changeset
15 *
Dave Love <fx@gnu.org>
parents:
diff changeset
16 */
Dave Love <fx@gnu.org>
parents:
diff changeset
17
Dave Love <fx@gnu.org>
parents:
diff changeset
18 #include <libc/stubs.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
19 #include <stdio.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
20 #include <string.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
21 #include <ctype.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
22 #include <errno.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
23 #include <dpmi.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
24 #include <go32.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
25 #include <io.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
26 #include <libc/farptrgs.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
27 #include <libc/dosio.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
28
Dave Love <fx@gnu.org>
parents:
diff changeset
29 extern unsigned short _djstat_flags;
Dave Love <fx@gnu.org>
parents:
diff changeset
30 unsigned short _get_magic(const char *, int);
Dave Love <fx@gnu.org>
parents:
diff changeset
31 int _is_executable(const char *, int, const char *);
Dave Love <fx@gnu.org>
parents:
diff changeset
32
Dave Love <fx@gnu.org>
parents:
diff changeset
33 /*
Dave Love <fx@gnu.org>
parents:
diff changeset
34 * Read a MAGIC NUMBER from a given file. These are the first
Dave Love <fx@gnu.org>
parents:
diff changeset
35 * two bytes of the file, if we look at them as an unsigned short. */
Dave Love <fx@gnu.org>
parents:
diff changeset
36
Dave Love <fx@gnu.org>
parents:
diff changeset
37 #define _STAT_EXEC_EXT 2 /* get execute bits from file extension? */
Dave Love <fx@gnu.org>
parents:
diff changeset
38 #define _STAT_EXEC_MAGIC 4 /* get execute bits from magic signature? */
Dave Love <fx@gnu.org>
parents:
diff changeset
39
Dave Love <fx@gnu.org>
parents:
diff changeset
40 unsigned short
Dave Love <fx@gnu.org>
parents:
diff changeset
41 _get_magic(const char *s, int fh)
Dave Love <fx@gnu.org>
parents:
diff changeset
42 {
Dave Love <fx@gnu.org>
parents:
diff changeset
43 __dpmi_regs regs;
Dave Love <fx@gnu.org>
parents:
diff changeset
44 unsigned short retval;
Dave Love <fx@gnu.org>
parents:
diff changeset
45 unsigned short fpos_high = 0, fpos_low = 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
46 int read_fail = 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
47
Dave Love <fx@gnu.org>
parents:
diff changeset
48 /* If given a pathname, open the file. */
Dave Love <fx@gnu.org>
parents:
diff changeset
49 if (s)
Dave Love <fx@gnu.org>
parents:
diff changeset
50 {
Dave Love <fx@gnu.org>
parents:
diff changeset
51 int handle;
Dave Love <fx@gnu.org>
parents:
diff changeset
52 if((handle = _open(s,0)) == -1)
Dave Love <fx@gnu.org>
parents:
diff changeset
53 return 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
54 regs.x.bx = handle;
Dave Love <fx@gnu.org>
parents:
diff changeset
55 }
Dave Love <fx@gnu.org>
parents:
diff changeset
56 /* Else file already open. Remember its current file position
Dave Love <fx@gnu.org>
parents:
diff changeset
57 and move to beginning of file. */
Dave Love <fx@gnu.org>
parents:
diff changeset
58 else
Dave Love <fx@gnu.org>
parents:
diff changeset
59 {
Dave Love <fx@gnu.org>
parents:
diff changeset
60 regs.x.ax = 0x4201; /* set pointer from current position */
Dave Love <fx@gnu.org>
parents:
diff changeset
61 regs.x.bx = fh;
Dave Love <fx@gnu.org>
parents:
diff changeset
62 regs.x.cx = regs.x.dx = 0; /* move 0 bytes (i.e., stay put) */
Dave Love <fx@gnu.org>
parents:
diff changeset
63 __dpmi_int(0x21, &regs);
Dave Love <fx@gnu.org>
parents:
diff changeset
64 if (regs.x.flags & 1)
Dave Love <fx@gnu.org>
parents:
diff changeset
65 {
Dave Love <fx@gnu.org>
parents:
diff changeset
66 errno = __doserr_to_errno(regs.x.ax);
Dave Love <fx@gnu.org>
parents:
diff changeset
67 return 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
68 }
Dave Love <fx@gnu.org>
parents:
diff changeset
69 fpos_high = regs.x.dx; /* got current position */
Dave Love <fx@gnu.org>
parents:
diff changeset
70 fpos_low = regs.x.ax;
Dave Love <fx@gnu.org>
parents:
diff changeset
71
Dave Love <fx@gnu.org>
parents:
diff changeset
72 regs.x.ax = 0x4200; /* set pointer from the beginning of file */
Dave Love <fx@gnu.org>
parents:
diff changeset
73 regs.x.cx = regs.x.dx = 0; /* move to beginning of file */
Dave Love <fx@gnu.org>
parents:
diff changeset
74 __dpmi_int(0x21, &regs);
Dave Love <fx@gnu.org>
parents:
diff changeset
75 if (regs.x.flags & 1)
Dave Love <fx@gnu.org>
parents:
diff changeset
76 {
Dave Love <fx@gnu.org>
parents:
diff changeset
77 errno = __doserr_to_errno(regs.x.ax);
Dave Love <fx@gnu.org>
parents:
diff changeset
78 return 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
79 }
Dave Love <fx@gnu.org>
parents:
diff changeset
80 }
Dave Love <fx@gnu.org>
parents:
diff changeset
81 regs.x.ds = __tb_segment;
Dave Love <fx@gnu.org>
parents:
diff changeset
82 regs.x.dx = __tb_offset;
Dave Love <fx@gnu.org>
parents:
diff changeset
83
Dave Love <fx@gnu.org>
parents:
diff changeset
84 /* Read 2 bytes from the file. */
Dave Love <fx@gnu.org>
parents:
diff changeset
85 regs.x.ax = 0x3f00;
Dave Love <fx@gnu.org>
parents:
diff changeset
86 regs.x.cx = 2;
Dave Love <fx@gnu.org>
parents:
diff changeset
87 __dpmi_int(0x21, &regs);
Dave Love <fx@gnu.org>
parents:
diff changeset
88
Dave Love <fx@gnu.org>
parents:
diff changeset
89 /* We can either (1) succeed, (2) read less than 2 bytes,
Dave Love <fx@gnu.org>
parents:
diff changeset
90 or (3) fail to read at all. */
Dave Love <fx@gnu.org>
parents:
diff changeset
91 if (regs.x.ax != 2)
Dave Love <fx@gnu.org>
parents:
diff changeset
92 read_fail = (regs.x.flags & 1) ? regs.x.ax : -1;
Dave Love <fx@gnu.org>
parents:
diff changeset
93
Dave Love <fx@gnu.org>
parents:
diff changeset
94 /* If called with filename, close the file. */
Dave Love <fx@gnu.org>
parents:
diff changeset
95 if (s)
Dave Love <fx@gnu.org>
parents:
diff changeset
96 {
Dave Love <fx@gnu.org>
parents:
diff changeset
97 regs.x.ax = 0x3e00;
Dave Love <fx@gnu.org>
parents:
diff changeset
98 __dpmi_int(0x21, &regs);
Dave Love <fx@gnu.org>
parents:
diff changeset
99 if (regs.x.flags & 1)
Dave Love <fx@gnu.org>
parents:
diff changeset
100 errno = __doserr_to_errno(regs.x.ax);
Dave Love <fx@gnu.org>
parents:
diff changeset
101 }
Dave Love <fx@gnu.org>
parents:
diff changeset
102 /* Else leave file pointer where we found it. */
Dave Love <fx@gnu.org>
parents:
diff changeset
103 else
Dave Love <fx@gnu.org>
parents:
diff changeset
104 {
Dave Love <fx@gnu.org>
parents:
diff changeset
105 regs.x.ax = 0x4200; /* set pointer from the beginning of file */
Dave Love <fx@gnu.org>
parents:
diff changeset
106 regs.x.bx = fh;
Dave Love <fx@gnu.org>
parents:
diff changeset
107 regs.x.cx = fpos_high;
Dave Love <fx@gnu.org>
parents:
diff changeset
108 regs.x.dx = fpos_low;
Dave Love <fx@gnu.org>
parents:
diff changeset
109 __dpmi_int(0x21, &regs);
Dave Love <fx@gnu.org>
parents:
diff changeset
110 if (regs.x.flags & 1)
Dave Love <fx@gnu.org>
parents:
diff changeset
111 {
Dave Love <fx@gnu.org>
parents:
diff changeset
112 errno = __doserr_to_errno(regs.x.ax);
Dave Love <fx@gnu.org>
parents:
diff changeset
113 return 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
114 }
Dave Love <fx@gnu.org>
parents:
diff changeset
115 }
Dave Love <fx@gnu.org>
parents:
diff changeset
116
Dave Love <fx@gnu.org>
parents:
diff changeset
117 if (read_fail == 0)
Dave Love <fx@gnu.org>
parents:
diff changeset
118 retval = _farpeekw(_dos_ds, __tb);
Dave Love <fx@gnu.org>
parents:
diff changeset
119 else
Dave Love <fx@gnu.org>
parents:
diff changeset
120 {
Dave Love <fx@gnu.org>
parents:
diff changeset
121 /* The file couldn't be read: assume non-executable. If the file
Dave Love <fx@gnu.org>
parents:
diff changeset
122 *is* executable, but was passed as a file-handle, and the user
Dave Love <fx@gnu.org>
parents:
diff changeset
123 opened it in write-only mode, they lose... */
Dave Love <fx@gnu.org>
parents:
diff changeset
124 retval = 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
125 if (read_fail != -1)
Dave Love <fx@gnu.org>
parents:
diff changeset
126 errno = __doserr_to_errno(read_fail);
Dave Love <fx@gnu.org>
parents:
diff changeset
127 }
Dave Love <fx@gnu.org>
parents:
diff changeset
128
Dave Love <fx@gnu.org>
parents:
diff changeset
129 return retval;
Dave Love <fx@gnu.org>
parents:
diff changeset
130 }
Dave Love <fx@gnu.org>
parents:
diff changeset
131
Dave Love <fx@gnu.org>
parents:
diff changeset
132 /* A list of extensions which designate executable files. These
Dave Love <fx@gnu.org>
parents:
diff changeset
133 are NOT tested for the magic number. */
Dave Love <fx@gnu.org>
parents:
diff changeset
134 static char executables[] = "|EXE|COM|BAT|BTM|DLL|VXD|";
Dave Love <fx@gnu.org>
parents:
diff changeset
135
Dave Love <fx@gnu.org>
parents:
diff changeset
136 /* A list of extensions which belong to files known to NEVER be
Dave Love <fx@gnu.org>
parents:
diff changeset
137 executables. These exist to minimize read()'ing files while
Dave Love <fx@gnu.org>
parents:
diff changeset
138 detecting executables by magic number. You are welcome to
Dave Love <fx@gnu.org>
parents:
diff changeset
139 add to this list, but remember: only extensions which could
Dave Love <fx@gnu.org>
parents:
diff changeset
140 NEVER be present in executables should go here. */
Dave Love <fx@gnu.org>
parents:
diff changeset
141 static char non_executables[] = "\
Dave Love <fx@gnu.org>
parents:
diff changeset
142 |A|A01|A02|A03|A04|A05|ADL|ARC|ARJ|ASC|ASM|AUX|AWK\
Dave Love <fx@gnu.org>
parents:
diff changeset
143 |BAS|BIB|BGI|BMP\
Dave Love <fx@gnu.org>
parents:
diff changeset
144 |C|CC|CFG|CGZ|CH3|CHR|CI|CLP|CMF|CPI|CPP|CXX\
Dave Love <fx@gnu.org>
parents:
diff changeset
145 |DAT|DBF|DIZ|DOC|DVI\
Dave Love <fx@gnu.org>
parents:
diff changeset
146 |E|EL|ELC\
Dave Love <fx@gnu.org>
parents:
diff changeset
147 |F77|FN3\
Dave Love <fx@gnu.org>
parents:
diff changeset
148 |GIF|GZ\
Dave Love <fx@gnu.org>
parents:
diff changeset
149 |H|HLP|HPP|HXX\
Dave Love <fx@gnu.org>
parents:
diff changeset
150 |ICO|IN|INC|INF|INI\
Dave Love <fx@gnu.org>
parents:
diff changeset
151 |JPG\
Dave Love <fx@gnu.org>
parents:
diff changeset
152 |L|LEX|LF|LIB|LOG|LST|LZH\
Dave Love <fx@gnu.org>
parents:
diff changeset
153 |M|MAK|MAP|MF|MID|MPG\
Dave Love <fx@gnu.org>
parents:
diff changeset
154 |O|OBJ\
Dave Love <fx@gnu.org>
parents:
diff changeset
155 |PAK|PAS|PBM|PCD|PCX|PDS|PIC|PIF|PN3|PRJ|PS\
Dave Love <fx@gnu.org>
parents:
diff changeset
156 |RAS|RGB|RLE\
Dave Love <fx@gnu.org>
parents:
diff changeset
157 |S|SND|SY3\
Dave Love <fx@gnu.org>
parents:
diff changeset
158 |TAR|TAZ|TEX|TGA|TGZ|TIF|TXH|TXI|TXT\
Dave Love <fx@gnu.org>
parents:
diff changeset
159 |VOC\
Dave Love <fx@gnu.org>
parents:
diff changeset
160 |WAV|WK1|WK3|WKB|WQ1|WQ3|WQ4|WQ5|WQ6|WQ!\
Dave Love <fx@gnu.org>
parents:
diff changeset
161 |XBM\
Dave Love <fx@gnu.org>
parents:
diff changeset
162 |Y\
Dave Love <fx@gnu.org>
parents:
diff changeset
163 |ZIP|ZOO|";
Dave Love <fx@gnu.org>
parents:
diff changeset
164
Dave Love <fx@gnu.org>
parents:
diff changeset
165 int
Dave Love <fx@gnu.org>
parents:
diff changeset
166 _is_executable(const char *filename, int fhandle, const char *extension)
Dave Love <fx@gnu.org>
parents:
diff changeset
167 {
Dave Love <fx@gnu.org>
parents:
diff changeset
168 if (!extension && filename)
Dave Love <fx@gnu.org>
parents:
diff changeset
169 {
Dave Love <fx@gnu.org>
parents:
diff changeset
170 const char *cp, *ep=0;
Dave Love <fx@gnu.org>
parents:
diff changeset
171 for (cp=filename; *cp; cp++)
Dave Love <fx@gnu.org>
parents:
diff changeset
172 {
Dave Love <fx@gnu.org>
parents:
diff changeset
173 if (*cp == '.')
Dave Love <fx@gnu.org>
parents:
diff changeset
174 ep = cp;
Dave Love <fx@gnu.org>
parents:
diff changeset
175 if (*cp == '/' || *cp == '\\' || *cp == ':')
Dave Love <fx@gnu.org>
parents:
diff changeset
176 ep = 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
177 }
Dave Love <fx@gnu.org>
parents:
diff changeset
178 extension = ep;
Dave Love <fx@gnu.org>
parents:
diff changeset
179 }
Dave Love <fx@gnu.org>
parents:
diff changeset
180 if ((_djstat_flags & _STAT_EXEC_EXT) == 0
Dave Love <fx@gnu.org>
parents:
diff changeset
181 && extension
Dave Love <fx@gnu.org>
parents:
diff changeset
182 && *extension
Dave Love <fx@gnu.org>
parents:
diff changeset
183 && strlen(extension) <= ((extension[0]=='.') ? 4 : 3))
Dave Love <fx@gnu.org>
parents:
diff changeset
184 {
Dave Love <fx@gnu.org>
parents:
diff changeset
185 /* Search the list of extensions in executables[]. */
Dave Love <fx@gnu.org>
parents:
diff changeset
186 char tmp_buf[6], *tp = tmp_buf;
Dave Love <fx@gnu.org>
parents:
diff changeset
187
Dave Love <fx@gnu.org>
parents:
diff changeset
188 *tp++ = '|';
Dave Love <fx@gnu.org>
parents:
diff changeset
189 if (*extension == '.')
Dave Love <fx@gnu.org>
parents:
diff changeset
190 extension++;
Dave Love <fx@gnu.org>
parents:
diff changeset
191 while (*extension)
Dave Love <fx@gnu.org>
parents:
diff changeset
192 *tp++ = toupper (*extension++);
Dave Love <fx@gnu.org>
parents:
diff changeset
193 *tp++ = '|';
Dave Love <fx@gnu.org>
parents:
diff changeset
194 *tp = '\0';
Dave Love <fx@gnu.org>
parents:
diff changeset
195 if (strstr(non_executables, tmp_buf))
Dave Love <fx@gnu.org>
parents:
diff changeset
196 return 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
197 else if (strstr(executables, tmp_buf))
Dave Love <fx@gnu.org>
parents:
diff changeset
198 return 1;
Dave Love <fx@gnu.org>
parents:
diff changeset
199 }
Dave Love <fx@gnu.org>
parents:
diff changeset
200
Dave Love <fx@gnu.org>
parents:
diff changeset
201 /* No extension, or extension doesn't define execute
Dave Love <fx@gnu.org>
parents:
diff changeset
202 bits unambiguously. We are in for some dirty work.
Dave Love <fx@gnu.org>
parents:
diff changeset
203 Read the first two bytes of the file and see if they
Dave Love <fx@gnu.org>
parents:
diff changeset
204 are any of the known magic numbers which designate
Dave Love <fx@gnu.org>
parents:
diff changeset
205 executable files.
Dave Love <fx@gnu.org>
parents:
diff changeset
206 Unix-like shells, which have executable shell scripts
Dave Love <fx@gnu.org>
parents:
diff changeset
207 without extensions and DON'T have "#!" as their FIRST
Dave Love <fx@gnu.org>
parents:
diff changeset
208 TWO CHARACTERS, lose here. Sorry, folks. */
Dave Love <fx@gnu.org>
parents:
diff changeset
209 if ( (_djstat_flags & _STAT_EXEC_MAGIC) == 0 )
Dave Love <fx@gnu.org>
parents:
diff changeset
210 {
Dave Love <fx@gnu.org>
parents:
diff changeset
211 switch (_get_magic(filename, fhandle))
Dave Love <fx@gnu.org>
parents:
diff changeset
212 {
Dave Love <fx@gnu.org>
parents:
diff changeset
213 case 0x5a4d: /* "MZ" */
Dave Love <fx@gnu.org>
parents:
diff changeset
214 case 0x010b:
Dave Love <fx@gnu.org>
parents:
diff changeset
215 case 0x014c:
Dave Love <fx@gnu.org>
parents:
diff changeset
216 case 0x2123: /* "#!" */
Dave Love <fx@gnu.org>
parents:
diff changeset
217 return 1;
Dave Love <fx@gnu.org>
parents:
diff changeset
218 }
Dave Love <fx@gnu.org>
parents:
diff changeset
219 }
Dave Love <fx@gnu.org>
parents:
diff changeset
220
Dave Love <fx@gnu.org>
parents:
diff changeset
221 return 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
222 }