[22698] | 1 | #! /bin/sh -e |
---|
| 2 | |
---|
| 3 | if [ $# -eq 3 -a "$2" = '-d' ]; then |
---|
| 4 | pdir="-d $3" |
---|
| 5 | elif [ $# -ne 1 ]; then |
---|
| 6 | echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" |
---|
| 7 | exit 1 |
---|
| 8 | fi |
---|
| 9 | case "$1" in |
---|
| 10 | -patch) patch $pdir -f --no-backup-if-mismatch -p1 < $0;; |
---|
| 11 | -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p1 < $0;; |
---|
| 12 | *) |
---|
| 13 | echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" |
---|
| 14 | exit 1 |
---|
| 15 | esac |
---|
| 16 | exit 0 |
---|
| 17 | |
---|
| 18 | # DP: Support Hesiod-based ~ expansion; from Athena 9.4 bash. |
---|
| 19 | |
---|
| 20 | diff -ur bash-3.0.16.orig/general.c bash-3.0.16/general.c |
---|
| 21 | --- bash-3.0.16.orig/general.c 2004-10-26 17:13:29.000000000 -0400 |
---|
| 22 | +++ bash-3.0.16/general.c 2005-04-15 02:01:50.000000000 -0400 |
---|
| 23 | @@ -56,6 +56,11 @@ |
---|
| 24 | static int unquoted_tilde_word __P((const char *)); |
---|
| 25 | static void initialize_group_array __P((void)); |
---|
| 26 | |
---|
| 27 | +#ifdef HESIOD |
---|
| 28 | +#include <hesiod.h> |
---|
| 29 | +static char *hes_gethomedir __P((char *)); |
---|
| 30 | +#endif |
---|
| 31 | + |
---|
| 32 | /* A standard error message to use when getcwd() returns NULL. */ |
---|
| 33 | char *bash_getcwd_errstr = N_("getcwd: cannot access parent directories"); |
---|
| 34 | |
---|
| 35 | @@ -706,10 +711,78 @@ |
---|
| 36 | else if (DIGIT (*text) || ((*text == '+' || *text == '-') && DIGIT (text[1]))) |
---|
| 37 | result = get_dirstack_from_string (text); |
---|
| 38 | #endif |
---|
| 39 | +#ifdef HESIOD |
---|
| 40 | + /* Always use hesiod for ~~username. */ |
---|
| 41 | + else if (*text == '~') |
---|
| 42 | + { |
---|
| 43 | + *text++; |
---|
| 44 | + result = hes_gethomedir(text); |
---|
| 45 | + } |
---|
| 46 | +#endif |
---|
| 47 | |
---|
| 48 | return (result ? savestring (result) : (char *)NULL); |
---|
| 49 | } |
---|
| 50 | |
---|
| 51 | +#ifdef HESIOD |
---|
| 52 | +static char * |
---|
| 53 | +hes_gethomedir (us) |
---|
| 54 | + char *us; |
---|
| 55 | +{ |
---|
| 56 | + char **res, **res1, *cp, *rp; |
---|
| 57 | + int which; |
---|
| 58 | + |
---|
| 59 | + res = hes_resolve(us, "filsys"); |
---|
| 60 | + rp = 0; |
---|
| 61 | + if (res != 0) { |
---|
| 62 | + extern char *strtok(); |
---|
| 63 | + if ((*res) != 0) { |
---|
| 64 | + int i, lowest, new; |
---|
| 65 | + |
---|
| 66 | + /* Use the first filesys if there's an ordered list */ |
---|
| 67 | + lowest = -1; |
---|
| 68 | + which = 0; |
---|
| 69 | + if (res[1]) { |
---|
| 70 | + for (i = 0; res[i]; i++) { |
---|
| 71 | + cp = strrchr(res[i], ' '); |
---|
| 72 | + if (!cp) |
---|
| 73 | + return NULL; |
---|
| 74 | + new = atoi(cp + 1); |
---|
| 75 | + if (lowest == -1 || new < lowest) { |
---|
| 76 | + lowest = new; |
---|
| 77 | + which = i; |
---|
| 78 | + } |
---|
| 79 | + } |
---|
| 80 | + } |
---|
| 81 | + /* |
---|
| 82 | + * Look at the first token to determine how to interpret |
---|
| 83 | + * the rest of it. |
---|
| 84 | + * Yes, strtok is evil (it's not thread-safe), but it's also |
---|
| 85 | + * easy to use. |
---|
| 86 | + */ |
---|
| 87 | + cp = strtok(res[which], " "); |
---|
| 88 | + if (strcmp(cp, "AFS") == 0) { |
---|
| 89 | + /* next token is AFS pathname.. */ |
---|
| 90 | + cp = strtok(NULL, " "); |
---|
| 91 | + if (cp != NULL) |
---|
| 92 | + rp = savestring(cp); |
---|
| 93 | + } else if (strcmp(cp, "NFS") == 0) { |
---|
| 94 | + cp = NULL; |
---|
| 95 | + if ((strtok(NULL, " ")) && /* skip remote pathname */ |
---|
| 96 | + (strtok(NULL, " ")) && /* skip host */ |
---|
| 97 | + (strtok(NULL, " ")) && /* skip mode */ |
---|
| 98 | + (cp = strtok(NULL, " "))) { |
---|
| 99 | + rp = savestring(cp); |
---|
| 100 | + } |
---|
| 101 | + } |
---|
| 102 | + } |
---|
| 103 | + for (res1 = res; *res1; res1++) |
---|
| 104 | + free(*res1); |
---|
| 105 | + return rp; |
---|
| 106 | + } |
---|
| 107 | + return NULL; |
---|
| 108 | +} |
---|
| 109 | +#endif /* HESIOD */ |
---|
| 110 | + |
---|
| 111 | /* Initialize the tilde expander. In Bash, we handle `~-' and `~+', as |
---|
| 112 | well as handling special tilde prefixes; `:~" and `=~' are indications |
---|
| 113 | that we should do tilde expansion. */ |
---|
| 114 | @@ -721,6 +794,11 @@ |
---|
| 115 | /* Tell the tilde expander that we want a crack first. */ |
---|
| 116 | tilde_expansion_preexpansion_hook = bash_special_tilde_expansions; |
---|
| 117 | |
---|
| 118 | +#ifdef HESIOD |
---|
| 119 | + /* Fall back to hesiod if the default behavior fails. */ |
---|
| 120 | + tilde_expansion_failure_hook = hes_gethomedir; |
---|
| 121 | +#endif |
---|
| 122 | + |
---|
| 123 | /* Tell the tilde expander about special strings which start a tilde |
---|
| 124 | expansion, and the special strings that end one. Only do this once. |
---|
| 125 | tilde_initialize () is called from within bashline_reinitialize (). */ |
---|