| iMatix home page | << | < | > | >> |
SFL Version 2.11 |
#include "sflfile.h" Bool file_is_executable ( const char *filename)
Returns TRUE if the current process can execute the specified file. Directories are _not_ considered to be executable. Under DOS, Windows, appends ".com", ".exe", and ".bat" to the filename, in that order, to build a possible executable filename. If this fails, opens the file (if it exists) and examines the first few bytes of the file: if these are "#!", or '/'*! or "MZ" then the file is assumed to be executable. #! is a standard mechanism under Unix for indicating executable files. Note that process create() uses a compatible mechanism to launch the correct interpreter for such 'executable' scripts. NOTE: '/'*! is provided for REXX. [XXX] Under OS/2 appends ".exe" and ".cmd" to the filename, in that order, to be a possible executable filename. If this fails, it opens the file (if it exists) and examines the first few bytes of the file: if these are "#!" then the file is assumed to be executable. NOTE: REXX scripts MUST be in files named script.cmd in order to be found. BAT files are not considered, nor are COM files, since at present process_create does not support launching DOS processes. Under VMS, appends .exe and .com, in that order to build a possible executable filename. Does not search the PATH symbol; the filename must be specified with a path if necessary.
{ #if (defined (__UNIX__)) ASSERT (filename); return ((file_mode (filename) & S_IEXEC) != 0 && (file_mode (filename) & S_IFDIR) == 0); #elif (defined (MSDOS_FILESYSTEM)) Bool executable; /* Return code */ FILE *stream; /* Opened file stream */ char input_char = 0, /* First and second bytes of file */ *extension; /* File extension, if any */ ASSERT (filename); /* Find file extension; if not found, set extension to empty string */ extension = strrchr (filename, '.'); if (extension == NULL || strchr (extension, '/') /* If last '.' is part of the path */ || strchr (extension, '\\')) /* then the filename has no ext. */ extension = ""; /* Windows: If extension is .exe/.com/.bat, the file is an executable */ /* OS/2: If the extension is .exe/.cmd, the file is an executable */ #if (defined ( __OS2__)) if (lexcmp (extension, ".exe") == 0 || lexcmp (extension, ".cmd") == 0) #else /* DOS, WINDOWS */ if (lexcmp (extension, ".com") == 0 || lexcmp (extension, ".exe") == 0 || lexcmp (extension, ".bat") == 0) #endif executable = file exists (filename); else /* Windows: If the extension is empty, try .com, .exe, .bat */ /* OS/2: If the extension is empty, try .exe, .cmd */ if (strnull (extension) #if (defined( __OS2__)) && (file exists (default extension (work_name, filename, "exe")) || file exists (default extension (work_name, filename, "cmd")))) #else /* DOS, WINDOWS */ && (file exists (default extension (work_name, filename, "com")) || file exists (default extension (work_name, filename, "exe")) || file exists (default extension (work_name, filename, "bat")))) #endif executable = TRUE; /* Executable file found */ else { /* Look for magic header at start of file */ stream = file open (filename, 'r'); if (stream) { input_char = fgetc (stream); executable = ((input_char == '#' && fgetc (stream) == '!') # if (defined (__WINDOWS__)) || (input_char == '/' && fgetc (stream) == '*' && fgetc (stream) == '!') || (input_char == 'M' && fgetc (stream) == 'Z') # endif ); file close (stream); } else executable = FALSE; } return (executable); #elif (defined (__VMS__)) Bool executable; /* Return code */ char *extension; /* File extension, if any */ ASSERT (filename); /* Find file extension, if any */ extension = strrchr (filename, '.'); if ((file_mode (filename) & S_IEXEC) != 0) executable = TRUE; else /* If the extension is empty, try .exe and .com */ if (!extension) { default extension (work_name, filename, "exe"); if ((file_mode (work_name) & S_IEXEC) != 0) executable = TRUE; else { default extension (work_name, filename, "com"); if ((file_mode (work_name) & S_IEXEC) != 0) executable = TRUE; else executable = FALSE; } } else executable = FALSE; return (executable); #else return (FALSE); /* Not supported on this system */ #endif }
| << | < | > | >> | Copyright © 1996-2000 iMatix Corporation |