mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-21 00:01:26 +01:00
25755/25756: Jörg Sommer: improved handling of module arguments
25759: fix dynamic named directory crash, static named directory consistency
This commit is contained in:
parent
4ba03217ca
commit
4a34c96289
5 changed files with 48 additions and 16 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
2008-09-27 Peter Stephenson <p.w.stephenson@ntlworld.com>
|
||||
|
||||
* Jörg Sommer: 25755, with tweak from 25756:
|
||||
Completion/Linux/Command/_modutils (args): improved handling
|
||||
of module arguments.
|
||||
|
||||
* 25759: Doc/Zsh/expn.yo, Src/builtin.c, Src/subst.c: fix crash
|
||||
after failed dynamic named directory expansion; clarify the
|
||||
fact that static named directories can contain only
|
||||
alphanumerics, `_', `-' or `.'.
|
||||
|
||||
2008-09-26 Clint Adams <clint@zsh.org>
|
||||
|
||||
* Mikael Magnusson: 25617: Completion/Unix/Command/_vim:
|
||||
|
|
|
@ -36,7 +36,7 @@ case "$service" in
|
|||
'(-C --config)'{-C,--config}'[specify config file]:config file:_files' \
|
||||
"(-r --remove -l --list -t --type -a --all $ign)"{-r,--remove}'[remove module (stacks)]' \
|
||||
"(* -l --list -r --remove $ign)"{-l,--list}'[list matching modules]' \
|
||||
"(-c $ign)1:modules:->all_modules" \
|
||||
"(-c $ign)1:modules:->loadable_modules" \
|
||||
"(-c -l --list -t --type $ign)*:params:->params" && ret=0
|
||||
|
||||
[[ -n $state ]] && (( $+opt_args[-r] )) && state=loaded_modules
|
||||
|
@ -60,23 +60,31 @@ case "$service" in
|
|||
esac
|
||||
|
||||
case "$state" in
|
||||
loaded_modules)
|
||||
loaded_modules|loadable_modules)
|
||||
if [[ -r /proc/modules ]]; then
|
||||
modules=(${${(f)"$(</proc/modules)"}%% *})
|
||||
loaded_modules=(${${(f)"$(</proc/modules)"}%% *})
|
||||
elif [[ -x /sbin/lsmod ]]; then
|
||||
modules=(${${(f)"$(/sbin/lsmod)"}[2,-1]%% *})
|
||||
loaded_modules=(${${(f)"$(/sbin/lsmod)"}[2,-1]%% *})
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
|
||||
_wanted modules expl 'loaded module' compadd -a modules && return
|
||||
;;
|
||||
|
||||
if [[ $state = loaded_modules ]]; then
|
||||
_wanted modules expl 'loaded module' compadd -a loaded_modules && return
|
||||
return ret
|
||||
fi
|
||||
;&
|
||||
|
||||
all_modules)
|
||||
modules=( ${${${${(f)"$(_call_program modules ${(M)words[1]##*/}modprobe -l 2>/dev/null)"}:#}##*/}%%.*} )
|
||||
|
||||
if [[ $state = loadable_modules ]]; then
|
||||
modules=( ${modules:#(${(j:|:)~${=loaded_modules//_/-}})} )
|
||||
fi
|
||||
|
||||
_tags files modules
|
||||
while _tags; do
|
||||
_requested files expl "module file" _files && ret=0
|
||||
_requested files expl "module file" _files -g '*.ko' && ret=0
|
||||
_requested modules expl module compadd -a modules && ret=0
|
||||
done
|
||||
;;
|
||||
|
|
|
@ -1375,13 +1375,16 @@ subsect(Static named directories)
|
|||
cindex(directories, named, static)
|
||||
cindex(named directories, static)
|
||||
cindex(static named directories)
|
||||
A `tt(~)' followed by anything not already covered is looked up as a
|
||||
A `tt(~)' followed by anything not already covered consisting
|
||||
of any number of alphanumeric characters or underscore (`tt(_)'),
|
||||
hyphen (`tt(-)'), or dot (`tt(.)') is looked up as a
|
||||
named directory, and replaced by the value of that named directory if found.
|
||||
Named directories are typically home directories for users on the system.
|
||||
They may also be defined if the text after the `tt(~)' is the name
|
||||
of a string shell parameter whose value begins with a `tt(/)'.
|
||||
Note that trailing slashes will be removed from the path to the directory
|
||||
(though the original parameter is not modified).
|
||||
|
||||
It is also possible to define directory names using the tt(-d) option to the
|
||||
tt(hash) builtin.
|
||||
|
||||
|
|
|
@ -3262,9 +3262,19 @@ bin_hash(char *name, char **argv, Options ops, UNUSED(int func))
|
|||
/* The argument is of the form foo=bar, *
|
||||
* so define an entry for the table. */
|
||||
if(OPT_ISSET(ops,'d')) {
|
||||
Nameddir nd = hn = zshcalloc(sizeof *nd);
|
||||
nd->node.flags = 0;
|
||||
nd->dir = ztrdup(asg->value);
|
||||
/* shouldn't return NULL if asg->name is not NULL */
|
||||
if (*itype_end(asg->name, IUSER, 0)) {
|
||||
zwarnnam(name,
|
||||
"invalid character in directory name: %s",
|
||||
asg->name);
|
||||
returnval = 1;
|
||||
argv++;
|
||||
continue;
|
||||
} else {
|
||||
Nameddir nd = hn = zshcalloc(sizeof *nd);
|
||||
nd->node.flags = 0;
|
||||
nd->dir = ztrdup(asg->value);
|
||||
}
|
||||
} else {
|
||||
Cmdnam cn = hn = zshcalloc(sizeof *cn);
|
||||
cn->node.flags = HASHED;
|
||||
|
|
|
@ -529,7 +529,7 @@ filesubstr(char **namptr, int assign)
|
|||
|
||||
if (*str == Tilde && str[1] != '=' && str[1] != Equals) {
|
||||
Shfunc dirfunc;
|
||||
char *ptr, *tmp, *res;
|
||||
char *ptr, *tmp, *res, *ptr2;
|
||||
int val;
|
||||
|
||||
val = zstrtol(str + 1, &ptr, 10);
|
||||
|
@ -544,14 +544,14 @@ filesubstr(char **namptr, int assign)
|
|||
return 1;
|
||||
} else if (str[1] == Inbrack &&
|
||||
(dirfunc = getshfunc("zsh_directory_name")) &&
|
||||
(ptr = strchr(str+2, Outbrack))) {
|
||||
(ptr2 = strchr(str+2, Outbrack))) {
|
||||
char **arr;
|
||||
untokenize(tmp = dupstrpfx(str+2, ptr - (str+2)));
|
||||
untokenize(tmp = dupstrpfx(str+2, ptr2 - (str+2)));
|
||||
remnulargs(tmp);
|
||||
arr = subst_string_by_func(dirfunc, "n", tmp);
|
||||
res = arr ? *arr : NULL;
|
||||
if (res) {
|
||||
*namptr = dyncat(res, ptr+1);
|
||||
*namptr = dyncat(res, ptr2+1);
|
||||
return 1;
|
||||
}
|
||||
if (isset(NOMATCH))
|
||||
|
|
Loading…
Reference in a new issue