Mercurial > emacs
view msdos/is_exec.c @ 106168:83924fb4f59c
2009-11-20 Carsten Dominik <carsten.dominik@gmail.com>
* org-agenda.el (org-agenda-diary-entry-in-org-file): Rebuild
agenda after adding new entry.
* org-datetree.el (org-datetree-find-day-create): Fix regular
expression.
* org.el (org-display-outline-path): Use a format specifier for
message, to avoid problems with heading containing `%'.
* org-agenda.el (org-agenda-hide-tags-regexp): New option.
(org-format-agenda-item): Call `org-agenda-fix-displayed-tags'.
(org-agenda-fix-displayed-tags): New function.
(org-agenda-do-context-action): Just call
`org-display-outline-path', without piping the result through
`message'.
* org-latex.el (org-export-latex-preprocess): Protect secondary
footnote references.
* org-indent.el (org-indent-initialize): Avoid empty strings as
line prefixes.
* org-agenda.el (org-agenda-diary-entry-in-org-file): Make sure
hat checking for the mark does not throw an error.
(org-agenda-diary-entry-in-org-file): Catch the case that there is
not `day' text property in the cursor line.
* org.el (org-sort-entries-or-items): Make sure that the final
entry has a newline before doing the sorting.
* org-agenda.el (org-agenda-diary-entry-in-org-file): Get the text
property at the beginning of the line.
* org.el (org-make-link-string): Don't allow a description with
only white space.
* org-agenda.el (org-agenda-insert-diary-strategy): New variable.
(org-agenda-insert-diary-as-top-level): New function.
(org-agenda-add-entry-to-org-agenda-diary-file): Call
`org-agenda-insert-diary-as-top-level'.
* org.el (org-occur-in-agenda-files): Make sure none of the
buffers is narrowed.
(org-activate-plain-links): Add the face property here.
(org-set-font-lock-defaults): Do not add the face to plain links,
the activator function does this.
* org-habit.el (org-is-habit-p): Add doc string.
* org-archive.el (org-archive-subtree-default-with-confirmation):
Autoload.
* org-latex.el (org-export-latex-fontify): Fix regexp to make char
after match optional (happens at the end of a line...).
* org.el (org-fontify-meta-lines-and-blocks): Apply special faces
for special blocks.
* org-faces.el (org-copy-face): Set lisp indentation.
(org-quote, org-verse): New faces.
* org-agenda.el (org-agenda-remove-date): Remove variable.
* org-freemind.el (org-freemind-escape-str-from-org): Fix encoding.
* org-html.el (org-export-as-html): Move the home/up link into
the content div.
* org.el (org-export-latex-packages-alist): Option definition
moved here from org-latex.el.
* org-html.el (org-export-html-home/up-format): Add an ID to the
up/home div.
* org-wl.el (org-wl-store-link): Handle the case that
`wl-use-petname' is set.
* org.el (org-set-effort): Improve prompt.
(org-get-outline-path): Widen to get full path.
(org-compact-display-after-subtree-move): Function removed.
2009-11-20 Eric Schulte <schulte.eric@gmail.com>
* org-exp-blocks.el (org-export-blocks-format-ditaa): Use sha1
hash keys to cache and re-use images generated by the
org-exp-blocks interface to ditaa and dot.
* org.el (org-format-latex): Latex images are now saved to files
named by the sha1 hash of the latex source text avoiding
regeneration of identical images.
author | Carsten Dominik <dominik@science.uva.nl> |
---|---|
date | Fri, 20 Nov 2009 20:50:32 +0000 |
parents | fa41f74280f5 |
children | ef719132ddfa |
line wrap: on
line source
/* IS_EXEC.C * * Copyright (C) 1995 DJ Delorie * Copyright (C) 1994 Eli Zaretskii <eliz@is.elta.co.il> * * (See the README file in this directory for the copyright and license * history of this file.) * * This file is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this file. If not, see <http://www.gnu.org/licenses/>. * * Commentary: * * Given a filename or a file handle, and the extension of the file, * determine if the file is executable. * First, the file extension is checked in case it uniquely identifies * the file as either an executable or not. Failing this, the first * two bytes of the file are tested for known signatures of executable * files. * */ #include <libc/stubs.h> #include <stdio.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <dpmi.h> #include <go32.h> #include <io.h> #include <libc/farptrgs.h> #include <libc/dosio.h> extern unsigned short _djstat_flags; unsigned short _get_magic(const char *, int); int _is_executable(const char *, int, const char *); /* * Read a MAGIC NUMBER from a given file. These are the first * two bytes of the file, if we look at them as an unsigned short. */ #define _STAT_EXEC_EXT 2 /* get execute bits from file extension? */ #define _STAT_EXEC_MAGIC 4 /* get execute bits from magic signature? */ unsigned short _get_magic(const char *s, int fh) { __dpmi_regs regs; unsigned short retval; unsigned short fpos_high = 0, fpos_low = 0; int read_fail = 0; /* If given a pathname, open the file. */ if (s) { int handle; if((handle = _open(s,0)) == -1) return 0; regs.x.bx = handle; } /* Else file already open. Remember its current file position and move to beginning of file. */ else { regs.x.ax = 0x4201; /* set pointer from current position */ regs.x.bx = fh; regs.x.cx = regs.x.dx = 0; /* move 0 bytes (i.e., stay put) */ __dpmi_int(0x21, ®s); if (regs.x.flags & 1) { errno = __doserr_to_errno(regs.x.ax); return 0; } fpos_high = regs.x.dx; /* got current position */ fpos_low = regs.x.ax; regs.x.ax = 0x4200; /* set pointer from the beginning of file */ regs.x.cx = regs.x.dx = 0; /* move to beginning of file */ __dpmi_int(0x21, ®s); if (regs.x.flags & 1) { errno = __doserr_to_errno(regs.x.ax); return 0; } } regs.x.ds = __tb_segment; regs.x.dx = __tb_offset; /* Read 2 bytes from the file. */ regs.x.ax = 0x3f00; regs.x.cx = 2; __dpmi_int(0x21, ®s); /* We can either (1) succeed, (2) read less than 2 bytes, or (3) fail to read at all. */ if (regs.x.ax != 2) read_fail = (regs.x.flags & 1) ? regs.x.ax : -1; /* If called with filename, close the file. */ if (s) { regs.x.ax = 0x3e00; __dpmi_int(0x21, ®s); if (regs.x.flags & 1) errno = __doserr_to_errno(regs.x.ax); } /* Else leave file pointer where we found it. */ else { regs.x.ax = 0x4200; /* set pointer from the beginning of file */ regs.x.bx = fh; regs.x.cx = fpos_high; regs.x.dx = fpos_low; __dpmi_int(0x21, ®s); if (regs.x.flags & 1) { errno = __doserr_to_errno(regs.x.ax); return 0; } } if (read_fail == 0) retval = _farpeekw(_dos_ds, __tb); else { /* The file couldn't be read: assume non-executable. If the file *is* executable, but was passed as a file-handle, and the user opened it in write-only mode, they lose... */ retval = 0; if (read_fail != -1) errno = __doserr_to_errno(read_fail); } return retval; } /* A list of extensions which designate executable files. These are NOT tested for the magic number. */ static char executables[] = "|EXE|COM|BAT|BTM|DLL|VXD|"; /* A list of extensions which belong to files known to NEVER be executables. These exist to minimize read()'ing files while detecting executables by magic number. You are welcome to add to this list, but remember: only extensions which could NEVER be present in executables should go here. */ static char non_executables[] = "\ |A|A01|A02|A03|A04|A05|ADL|ARC|ARJ|ASC|ASM|AUX|AWK\ |BAS|BIB|BGI|BMP\ |C|CC|CFG|CGZ|CH3|CHR|CI|CLP|CMF|CPI|CPP|CXX\ |DAT|DBF|DIZ|DOC|DVI\ |E|EL|ELC\ |F77|FN3\ |GIF|GZ\ |H|HLP|HPP|HXX\ |ICO|IN|INC|INF|INI\ |JPG\ |L|LEX|LF|LIB|LOG|LST|LZH\ |M|MAK|MAP|MF|MID|MPG\ |O|OBJ\ |PAK|PAS|PBM|PCD|PCX|PDS|PIC|PIF|PN3|PRJ|PS\ |RAS|RGB|RLE\ |S|SND|SY3\ |TAR|TAZ|TEX|TGA|TGZ|TIF|TXH|TXI|TXT\ |VOC\ |WAV|WK1|WK3|WKB|WQ1|WQ3|WQ4|WQ5|WQ6|WQ!\ |XBM\ |Y\ |ZIP|ZOO|"; int _is_executable(const char *filename, int fhandle, const char *extension) { if (!extension && filename) { const char *cp, *ep=0; for (cp=filename; *cp; cp++) { if (*cp == '.') ep = cp; if (*cp == '/' || *cp == '\\' || *cp == ':') ep = 0; } extension = ep; } if ((_djstat_flags & _STAT_EXEC_EXT) == 0 && extension && *extension && strlen(extension) <= ((extension[0]=='.') ? 4 : 3)) { /* Search the list of extensions in executables[]. */ char tmp_buf[6], *tp = tmp_buf; *tp++ = '|'; if (*extension == '.') extension++; while (*extension) *tp++ = toupper (*extension++); *tp++ = '|'; *tp = '\0'; if (strstr(non_executables, tmp_buf)) return 0; else if (strstr(executables, tmp_buf)) return 1; } /* No extension, or extension doesn't define execute bits unambiguously. We are in for some dirty work. Read the first two bytes of the file and see if they are any of the known magic numbers which designate executable files. Unix-like shells, which have executable shell scripts without extensions and DON'T have "#!" as their FIRST TWO CHARACTERS, lose here. Sorry, folks. */ if ( (_djstat_flags & _STAT_EXEC_MAGIC) == 0 ) { switch (_get_magic(filename, fhandle)) { case 0x5a4d: /* "MZ" */ case 0x010b: case 0x014c: case 0x2123: /* "#!" */ return 1; } } return 0; } /* arch-tag: b0965811-8c3e-4bc4-8d81-4447a3594785 (do not change this comment) */