From f22a76e9110e8e31efa3781b1a3cf2b4565d9e8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scharfe?= Date: Mon, 28 Jul 2014 20:24:29 +0200 Subject: strbuf: add strbuf_getcwd() Add strbuf_getcwd(), which puts the current working directory into a strbuf. Because it doesn't use a fixed-size buffer it supports arbitrarily long paths, provided the platform's getcwd() does as well. At least on Linux and FreeBSD it handles paths longer than PATH_MAX just fine. Suggested-by: Karsten Blees Helped-by: Duy Nguyen Signed-off-by: Rene Scharfe Signed-off-by: Junio C Hamano --- strbuf.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'strbuf.c') diff --git a/strbuf.c b/strbuf.c index ee96dcfb81..f3af203ec7 100644 --- a/strbuf.c +++ b/strbuf.c @@ -398,6 +398,27 @@ int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint) return -1; } +int strbuf_getcwd(struct strbuf *sb) +{ + size_t oldalloc = sb->alloc; + size_t guessed_len = 128; + + for (;; guessed_len *= 2) { + strbuf_grow(sb, guessed_len); + if (getcwd(sb->buf, sb->alloc)) { + strbuf_setlen(sb, strlen(sb->buf)); + return 0; + } + if (errno != ERANGE) + break; + } + if (oldalloc == 0) + strbuf_release(sb); + else + strbuf_reset(sb); + return -1; +} + int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term) { int ch; -- cgit v1.2.1