diff options
author | Chet Ramey <chet.ramey@case.edu> | 2014-02-26 09:36:43 -0500 |
---|---|---|
committer | Chet Ramey <chet.ramey@case.edu> | 2014-02-26 09:36:43 -0500 |
commit | ac50fbac377e32b98d2de396f016ea81e8ee9961 (patch) | |
tree | f71882366b98fedf1a88a063103219a4935de926 /general.c | |
parent | 4539d736f1aff232857a854fd2a68df0c98d9f34 (diff) | |
download | android_external_bash-ac50fbac377e32b98d2de396f016ea81e8ee9961.tar.gz android_external_bash-ac50fbac377e32b98d2de396f016ea81e8ee9961.tar.bz2 android_external_bash-ac50fbac377e32b98d2de396f016ea81e8ee9961.zip |
Bash-4.3 distribution sources and documentation
Diffstat (limited to 'general.c')
-rw-r--r-- | general.c | 29 |
1 files changed, 22 insertions, 7 deletions
@@ -1,6 +1,6 @@ /* general.c -- Stuff that is used by all files. */ -/* Copyright (C) 1987-2009 Free Software Foundation, Inc. +/* Copyright (C) 1987-2011 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -21,7 +21,7 @@ #include "config.h" #include "bashtypes.h" -#ifndef _MINIX +#if defined (HAVE_SYS_PARAM_H) # include <sys/param.h> #endif #include "posixstat.h" @@ -40,6 +40,7 @@ #include "shell.h" #include "test.h" +#include "trap.h" #include <tilde/tilde.h> @@ -171,6 +172,9 @@ legal_number (string, result) if (result) *result = 0; + if (string == 0) + return 0; + errno = 0; value = strtoimax (string, &ep, 10); if (errno || ep == string) @@ -182,7 +186,7 @@ legal_number (string, result) /* If *string is not '\0' but *ep is '\0' on return, the entire string is valid. */ - if (string && *string && *ep == '\0') + if (*string && *ep == '\0') { if (result) *result = value; @@ -398,7 +402,8 @@ check_dev_tty () return; tty_fd = open (tty, O_RDWR|O_NONBLOCK); } - close (tty_fd); + if (tty_fd >= 0) + close (tty_fd); } /* Return 1 if PATH1 and PATH2 are the same file. This is kind of @@ -562,7 +567,7 @@ file_iswdir (fn) /* Return 1 if STRING is "." or "..", optionally followed by a directory separator */ int -dot_or_dotdot (string) +path_dot_or_dotdot (string) const char *string; { if (string == 0 || *string == '\0' || *string != '.') @@ -766,7 +771,7 @@ trim_pathname (name, maxlen) *nbeg++ = '.'; nlen = nend - ntail; - memcpy (nbeg, ntail, nlen); + memmove (nbeg, ntail, nlen); nbeg[nlen] = '\0'; return name; @@ -980,7 +985,13 @@ bash_tilde_expand (s, assign_p) old_immed = interrupt_immediately; old_term = terminate_immediately; - interrupt_immediately = terminate_immediately = 1; + /* We want to be able to interrupt tilde expansion. Ordinarily, we can just + jump to top_level, but we don't want to run any trap commands in a signal + handler context. We might be able to get away with just checking for + things like SIGINT and SIGQUIT. */ + if (any_signals_trapped () < 0) + interrupt_immediately = 1; + terminate_immediately = 1; tilde_additional_prefixes = assign_p == 0 ? (char **)0 : (assign_p == 2 ? bash_tilde_prefixes2 : bash_tilde_prefixes); @@ -989,8 +1000,12 @@ bash_tilde_expand (s, assign_p) r = (*s == '~') ? unquoted_tilde_word (s) : 1; ret = r ? tilde_expand (s) : savestring (s); + interrupt_immediately = old_immed; terminate_immediately = old_term; + + QUIT; + return (ret); } |