From: Mikael Magnusson <mikachu@gmail.com>
To: zsh-workers@zsh.org
Subject: PATCH: Fix some minor problems in zattr module
Date: Thu, 6 Nov 2014 16:13:32 +0100 [thread overview]
Message-ID: <1415286812-15462-1-git-send-email-mikachu@gmail.com> (raw)
Remove the listattr call in zgetattr, it only caused no error to be output
when trying to retrieve an xattr from a file with no xattrs. When a file
had xattrs, it would just add an extra syscall for no good reason.
Always set an array parameter in zlistattr, this makes the returned value
much easier to use; in fact the _zattr completer didn't account for this
and zlistattr foo <tab> on a file with only one attribute did not work.
Almost all of the patch is only reindent, the only modification that's
not a pure deletions is:
- ret = 1 + (attr_len > val_len || attr_len < 0);
+ ret = 1 + ((val_len > 0 && attr_len > val_len) || attr_len < 0);
which makes sure we return the correct error in the new path due to the
removed listattr call. (If val_len is -1 due to no attribute existing,
it doesn't mean the user should retry the call because the attribute
grew in size).
---
Src/Modules/attr.c | 67 ++++++++++++++++++++++++------------------------------
1 file changed, 30 insertions(+), 37 deletions(-)
diff --git a/Src/Modules/attr.c b/Src/Modules/attr.c
index 6e08b10..78c1104 100644
--- a/Src/Modules/attr.c
+++ b/Src/Modules/attr.c
@@ -98,36 +98,33 @@ static int
bin_getattr(char *nam, char **argv, Options ops, UNUSED(int func))
{
int ret = 0;
- int list_len, val_len = 0, attr_len = 0, slen;
+ int val_len = 0, attr_len = 0, slen;
char *value, *file = argv[0], *attr = argv[1], *param = argv[2];
int symlink = OPT_ISSET(ops, 'h');
unmetafy(file, &slen);
unmetafy(attr, NULL);
- list_len = xlistxattr(file, NULL, 0, symlink);
- if (list_len > 0) {
- val_len = xgetxattr(file, attr, NULL, 0, symlink);
- if (val_len == 0) {
+ val_len = xgetxattr(file, attr, NULL, 0, symlink);
+ if (val_len == 0) {
+ if (param)
+ unsetparam(param);
+ return 0;
+ }
+ if (val_len > 0) {
+ value = (char *)zalloc(val_len+1);
+ attr_len = xgetxattr(file, attr, value, val_len, symlink);
+ if (attr_len > 0 && attr_len <= val_len) {
+ value[attr_len] = '\0';
if (param)
- unsetparam(param);
- return 0;
- }
- if (val_len > 0) {
- value = (char *)zalloc(val_len+1);
- attr_len = xgetxattr(file, attr, value, val_len, symlink);
- if (attr_len > 0 && attr_len <= val_len) {
- value[attr_len] = '\0';
- if (param)
- setsparam(param, metafy(value, attr_len, META_DUP));
- else
- printf("%s\n", value);
- }
- zfree(value, val_len+1);
+ setsparam(param, metafy(value, attr_len, META_DUP));
+ else
+ printf("%s\n", value);
}
+ zfree(value, val_len+1);
}
- if (list_len < 0 || val_len < 0 || attr_len < 0 || attr_len > val_len) {
+ if (val_len < 0 || attr_len < 0 || attr_len > val_len) {
zwarnnam(nam, "%s: %e", metafy(file, slen, META_NOALLOC), errno);
- ret = 1 + (attr_len > val_len || attr_len < 0);
+ ret = 1 + ((val_len > 0 && attr_len > val_len) || attr_len < 0);
}
return ret;
}
@@ -189,24 +186,20 @@ bin_listattr(char *nam, char **argv, Options ops, UNUSED(int func))
if (list_len > 0 && list_len <= val_len) {
char *p = value;
if (param) {
- if (strlen(value) + 1 == list_len)
- setsparam(param, metafy(value, list_len-1, META_DUP));
- else {
- int arrlen = 0;
- char **array = NULL, **arrptr = NULL;
+ int arrlen = 0;
+ char **array = NULL, **arrptr = NULL;
- while (p < &value[list_len]) {
- arrlen++;
- p += strlen(p) + 1;
- }
- arrptr = array = (char **)zshcalloc((arrlen+1) * sizeof(char *));
- p = value;
- while (p < &value[list_len]) {
- *arrptr++ = metafy(p, -1, META_DUP);
- p += strlen(p) + 1;
- }
- setaparam(param, array);
+ while (p < &value[list_len]) {
+ arrlen++;
+ p += strlen(p) + 1;
+ }
+ arrptr = array = (char **)zshcalloc((arrlen+1) * sizeof(char *));
+ p = value;
+ while (p < &value[list_len]) {
+ *arrptr++ = metafy(p, -1, META_DUP);
+ p += strlen(p) + 1;
}
+ setaparam(param, array);
} else while (p < &value[list_len]) {
printf("%s\n", p);
p += strlen(p) + 1;
--
2.2.0-rc0
reply other threads:[~2014-11-06 15:13 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1415286812-15462-1-git-send-email-mikachu@gmail.com \
--to=mikachu@gmail.com \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).