aboutsummaryrefslogtreecommitdiffstats
path: root/general.c
diff options
context:
space:
mode:
authorJari Aalto <jari.aalto@cante.net>2002-07-17 14:10:11 +0000
committerJari Aalto <jari.aalto@cante.net>2009-09-12 16:46:55 +0000
commit7117c2d221b2aed4ede8600f6a36b7c1454b4f55 (patch)
treeb792f26ecca68813c51ed5ba2e381790758ef31b /general.c
parentf73dda092b33638d2d5e9c35375f687a607b5403 (diff)
downloadandroid_external_bash-7117c2d221b2aed4ede8600f6a36b7c1454b4f55.tar.gz
android_external_bash-7117c2d221b2aed4ede8600f6a36b7c1454b4f55.tar.bz2
android_external_bash-7117c2d221b2aed4ede8600f6a36b7c1454b4f55.zip
Imported from ../bash-2.05b.tar.gz.
Diffstat (limited to 'general.c')
-rw-r--r--general.c110
1 files changed, 75 insertions, 35 deletions
diff --git a/general.c b/general.c
index 1d9cda0..446e42f 100644
--- a/general.c
+++ b/general.c
@@ -1,6 +1,6 @@
/* general.c -- Stuff that is used by all files. */
-/* Copyright (C) 1987-1999 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2002 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
@@ -50,6 +50,10 @@ extern int check_hashed_filenames;
extern int source_uses_path;
extern int source_searches_cwd;
+static char *bash_special_tilde_expansions __P((char *));
+static int unquoted_tilde_word __P((const char *));
+static void initialize_group_array __P((void));
+
/* A standard error message to use when getcwd() returns NULL. */
char *bash_getcwd_errstr = "getcwd: cannot access parent directories";
@@ -155,20 +159,20 @@ all_digits (string)
int
legal_number (string, result)
char *string;
- long *result;
+ intmax_t *result;
{
- long value;
+ intmax_t value;
char *ep;
if (result)
*result = 0;
errno = 0;
- value = strtol (string, &ep, 10);
+ value = strtoimax (string, &ep, 10);
if (errno)
return 0; /* errno is set on overflow or underflow */
- /* Skip any trailing whitespace, since strtol does not. */
+ /* Skip any trailing whitespace, since strtoimax does not. */
while (whitespace (*ep))
ep++;
@@ -232,6 +236,47 @@ check_identifier (word, check_word)
return (1);
}
+/* Returns non-zero if STRING is an assignment statement. The returned value
+ is the index of the `=' sign. */
+int
+assignment (string)
+ const char *string;
+{
+ register unsigned char c;
+ register int newi, indx;
+
+ c = string[indx = 0];
+
+ if (legal_variable_starter (c) == 0)
+ return (0);
+
+ while (c = string[indx])
+ {
+ /* The following is safe. Note that '=' at the start of a word
+ is not an assignment statement. */
+ if (c == '=')
+ return (indx);
+
+#if defined (ARRAY_VARS)
+ if (c == '[')
+ {
+ newi = skipsubscript (string, indx);
+ if (string[newi++] != ']')
+ return (0);
+ return ((string[newi] == '=') ? newi : 0);
+ }
+#endif /* ARRAY_VARS */
+
+ /* Variable names in assignment statements may contain only letters,
+ digits, and `_'. */
+ if (legal_variable_char (c) == 0)
+ return (0);
+
+ indx++;
+ }
+ return (0);
+}
+
/* **************************************************************** */
/* */
/* Functions to manage files and file descriptors */
@@ -279,6 +324,14 @@ sh_unset_nodelay_mode (fd)
return 0;
}
+/* Return 1 if file descriptor FD is valid; 0 otherwise. */
+int
+sh_validfd (fd)
+ int fd;
+{
+ return (fcntl (fd, F_GETFD, 0) >= 0);
+}
+
/* There is a bug in the NeXT 2.1 rlogind that causes opens
of /dev/tty to fail. */
@@ -352,8 +405,8 @@ move_to_high_fd (fd, check_new, maxfd)
nfds = getdtablesize ();
if (nfds <= 0)
nfds = 20;
- if (nfds > 256)
- nfds = 256;
+ if (nfds > HIGH_FD_MAX)
+ nfds = HIGH_FD_MAX; /* reasonable maximum */
}
else
nfds = maxfd;
@@ -362,13 +415,15 @@ move_to_high_fd (fd, check_new, maxfd)
if (fcntl (nfds, F_GETFD, &ignore) == -1)
break;
- if (nfds && fd != nfds && (script_fd = dup2 (fd, nfds)) != -1)
+ if (nfds > 3 && fd != nfds && (script_fd = dup2 (fd, nfds)) != -1)
{
if (check_new == 0 || fd != fileno (stderr)) /* don't close stderr */
close (fd);
return (script_fd);
}
+ /* OK, we didn't find one less than our artificial maximum; return the
+ original file descriptor. */
return (fd);
}
@@ -450,7 +505,7 @@ int
absolute_program (string)
const char *string;
{
- return ((char *)strchr (string, '/') != (char *)NULL);
+ return ((char *)xstrchr (string, '/') != (char *)NULL);
}
/* Return the `basename' of the pathname in STRING (the stuff after the
@@ -478,7 +533,7 @@ full_pathname (file)
{
char *ret;
- file = (*file == '~') ? bash_tilde_expand (file) : savestring (file);
+ file = (*file == '~') ? bash_tilde_expand (file, 0) : savestring (file);
if (ABSPATH(file))
return (file);
@@ -572,7 +627,6 @@ extract_colon_unit (string, p_index)
extern char *get_dirstack_from_string __P((char *));
#endif
-/* Reserved for post-bash-2.05a */
static char **bash_tilde_prefixes;
static char **bash_tilde_suffixes;
@@ -617,14 +671,14 @@ tilde_initialize ()
tilde_initialize () is called from within bashline_reinitialize (). */
if (times_called++ == 0)
{
- bash_tilde_prefixes = alloc_array (3);
+ bash_tilde_prefixes = strvec_create (3);
bash_tilde_prefixes[0] = "=~";
bash_tilde_prefixes[1] = ":~";
bash_tilde_prefixes[2] = (char *)NULL;
tilde_additional_prefixes = bash_tilde_prefixes;
- bash_tilde_suffixes = alloc_array (3);
+ bash_tilde_suffixes = strvec_create (3);
bash_tilde_suffixes[0] = ":";
bash_tilde_suffixes[1] = "=~"; /* XXX - ?? */
bash_tilde_suffixes[2] = (char *)NULL;
@@ -661,16 +715,20 @@ unquoted_tilde_word (s)
return 1;
}
-/* Tilde-expand S by running it through the tilde expansion library. */
+/* Tilde-expand S by running it through the tilde expansion library.
+ ASSIGN_P is 1 if this is a variable assignment, so the alternate
+ tilde prefixes should be enabled (`=~' and `:~', see above). */
char *
-bash_tilde_expand (s)
+bash_tilde_expand (s, assign_p)
const char *s;
+ int assign_p;
{
int old_immed, r;
char *ret;
old_immed = interrupt_immediately;
interrupt_immediately = 1;
+ tilde_additional_prefixes = assign_p ? bash_tilde_prefixes : (char **)0;
r = (*s == '~') ? unquoted_tilde_word (s) : 1;
ret = r ? tilde_expand (s) : savestring (s);
interrupt_immediately = old_immed;
@@ -692,20 +750,6 @@ static GETGROUPS_T *group_array = (GETGROUPS_T *)NULL;
# define NOGROUP (gid_t) -1
#endif
-#if defined (HAVE_SYSCONF) && defined (_SC_NGROUPS_MAX)
-# define getmaxgroups() sysconf(_SC_NGROUPS_MAX)
-#else
-# if defined (NGROUPS_MAX)
-# define getmaxgroups() NGROUPS_MAX
-# else /* !NGROUPS_MAX */
-# if defined (NGROUPS)
-# define getmaxgroups() NGROUPS
-# else /* !NGROUPS */
-# define getmaxgroups() 64
-# endif /* !NGROUPS */
-# endif /* !NGROUPS_MAX */
-#endif /* !HAVE_SYSCONF || !SC_NGROUPS_MAX */
-
static void
initialize_group_array ()
{
@@ -798,7 +842,6 @@ get_group_list (ngp)
{
static char **group_vector = (char **)NULL;
register int i;
- char *nbuf;
if (group_vector)
{
@@ -817,12 +860,9 @@ get_group_list (ngp)
return (char **)NULL;
}
- group_vector = alloc_array (ngroups);
+ group_vector = strvec_create (ngroups);
for (i = 0; i < ngroups; i++)
- {
- nbuf = itos (group_array[i]);
- group_vector[i] = nbuf;
- }
+ group_vector[i] = itos (group_array[i]);
if (ngp)
*ngp = ngroups;