diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-12-17 09:47:27 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-12-17 13:36:34 -0800 |
commit | a60272b38e548f46c5e1d7127cf18a469fefa237 (patch) | |
tree | c10a84b73cbe068e48277a41686fcc1887bfe8fd /read-cache.c | |
parent | b11b7e13f48ee283738e21fea9f775cd40ca0562 (diff) | |
download | git-a60272b38e548f46c5e1d7127cf18a469fefa237.tar.gz |
Make 'ce_compare_link()' use the new 'strbuf_readlink()'
This simplifies the code, and also makes ce_compare_link now able to
handle filesystems with odd 'st_size' return values for symlinks.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'read-cache.c')
-rw-r--r-- | read-cache.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/read-cache.c b/read-cache.c index c14b562313..b1475ffa09 100644 --- a/read-cache.c +++ b/read-cache.c @@ -99,27 +99,21 @@ static int ce_compare_data(struct cache_entry *ce, struct stat *st) static int ce_compare_link(struct cache_entry *ce, size_t expected_size) { int match = -1; - char *target; void *buffer; unsigned long size; enum object_type type; - int len; + struct strbuf sb = STRBUF_INIT; - target = xmalloc(expected_size); - len = readlink(ce->name, target, expected_size); - if (len != expected_size) { - free(target); + if (strbuf_readlink(&sb, ce->name, expected_size)) return -1; - } + buffer = read_sha1_file(ce->sha1, &type, &size); - if (!buffer) { - free(target); - return -1; + if (buffer) { + if (size == sb.len) + match = memcmp(buffer, sb.buf, size); + free(buffer); } - if (size == expected_size) - match = memcmp(buffer, target, size); - free(buffer); - free(target); + strbuf_release(&sb); return match; } |