X-Recipient: archive-cygwin AT delorie DOT com X-SWARE-Spam-Status: No, hits=-1.4 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Message-Id: <20101102205000.782395100@gmail.com> User-Agent: quilt/0.48-1 Date: Tue, 02 Nov 2010 13:48:56 -0700 From: dan DOT colascione AT gmail DOT com To: cygwin AT cygwin DOT com Subject: [patch 1/8] Add EXECIGNORE special variable References: <20101102204855 DOT 153395100 AT gmail DOT com> Content-Disposition: inline; filename=execignore X-IsSubscribed: yes Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Index: bash-3.2/findcmd.c =================================================================== --- bash-3.2.orig/findcmd.c +++ bash-3.2/findcmd.c @@ -44,6 +44,8 @@ #include "hashcmd.h" #include "findcmd.h" /* matching prototypes and declarations */ +#include + extern int posixly_correct; /* Static functions defined and used in this file. */ @@ -72,6 +74,40 @@ int check_hashed_filenames; containing the file of interest. */ int dot_found_in_search = 0; +static struct ignorevar execignore = +{ + "EXECIGNORE", + (struct ign *)0, + 0, + (char *)0, + (sh_iv_item_func_t *)0, +}; + +void +setup_exec_ignore (varname) + char *varname; +{ + setup_ignore_patterns (&execignore); +} + +/* Return whether we should never consider file executable + * even if the system tells us it is. */ +static int +is_on_exec_blacklist (name) + char *name; +{ + struct ign *p; + int flags = FNM_EXTMATCH | FNM_CASEFOLD; + + for (p = execignore.ignores; p && p->val; p++) + { + if (strmatch (p->val, (char *)name, flags) != FNM_NOMATCH) + return (1); + } + + return (0); +} + /* Return some flags based on information about this file. The EXISTS bit is non-zero if the file is found. The EXECABLE bit is non-zero the file is executble. @@ -98,7 +134,7 @@ file_status (name) /* We have to use access(2) to determine access because AFS does not support Unix file system semantics. This may produce wrong answers for non-AFS files when ruid != euid. I hate AFS. */ - if (access (name, X_OK) == 0) + if (is_on_exec_blacklist (name) == 0 && access (name, X_OK) == 0) r |= FS_EXECABLE; if (access (name, R_OK) == 0) r |= FS_READABLE; @@ -147,6 +183,9 @@ file_status (name) r |= FS_READABLE; } + if (is_on_exec_blacklist (name)) + r &= ~FS_EXECABLE; + return r; #endif /* !AFS */ } Index: bash-3.2/findcmd.h =================================================================== --- bash-3.2.orig/findcmd.h +++ bash-3.2/findcmd.h @@ -31,5 +31,6 @@ extern char *find_user_command __P((cons extern char *find_path_file __P((const char *)); extern char *search_for_command __P((const char *)); extern char *user_command_matches __P((const char *, int, int)); +extern void setup_exec_ignore __P((char *)); #endif /* _FINDCMD_H_ */ Index: bash-3.2/pathexp.h =================================================================== --- bash-3.2.orig/pathexp.h +++ bash-3.2/pathexp.h @@ -68,7 +68,7 @@ extern char *quote_globbing_chars __P((c extern char **shell_glob_filename __P((const char *)); /* Filename completion ignore. Used to implement the "fignore" facility of - tcsh and GLOBIGNORE (like ksh-93 FIGNORE). + tcsh and GLOBIGNORE (like ksh-93 FIGNORE) and EXECIGNORE. It is passed a NULL-terminated array of (char *)'s that must be free()'d if they are deleted. The first element (names[0]) is the @@ -84,7 +84,7 @@ struct ign { typedef int sh_iv_item_func_t __P((struct ign *)); struct ignorevar { - char *varname; /* FIGNORE or GLOBIGNORE */ + char *varname; /* FIGNORE or GLOBIGNORE or EXECIGNORE */ struct ign *ignores; /* Store the ignore strings here */ int num_ignores; /* How many are there? */ char *last_ignoreval; /* Last value of variable - cached for speed */ Index: bash-3.2/variables.c =================================================================== --- bash-3.2.orig/variables.c +++ bash-3.2/variables.c @@ -3749,6 +3749,8 @@ static struct name_and_function special_ { "GLOBIGNORE", sv_globignore }, + { "EXECIGNORE", sv_execignore }, + #if defined (HISTORY) { "HISTCONTROL", sv_history_control }, { "HISTFILESIZE", sv_histsize }, @@ -3914,6 +3916,14 @@ sv_globignore (name) setup_glob_ignore (name); } +/* What to do when EXECIGNORE changes. */ +void +sv_execignore (name) + char *name; +{ + setup_exec_ignore (name); +} + #if defined (READLINE) void sv_comp_wordbreaks (name) Index: bash-3.2/variables.h =================================================================== --- bash-3.2.orig/variables.h +++ bash-3.2/variables.h @@ -331,6 +331,7 @@ extern void sv_ifs __P((char *)); extern void sv_path __P((char *)); extern void sv_mail __P((char *)); extern void sv_globignore __P((char *)); +extern void sv_execignore __P((char *)); extern void sv_ignoreeof __P((char *)); extern void sv_strict_posix __P((char *)); extern void sv_optind __P((char *)); -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple