]> granicus.if.org Git - git/commitdiff
strbuf: add strbuf_getcwd()
authorRené Scharfe <l.s.r@web.de>
Mon, 28 Jul 2014 18:24:29 +0000 (20:24 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 28 Jul 2014 20:48:07 +0000 (13:48 -0700)
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 <karsten.blees@gmail.com>
Helped-by: Duy Nguyen <pclouds@gmail.com>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/technical/api-strbuf.txt
strbuf.c
strbuf.h

index 3350d97dda2408f92dc44c1e3216facc50257a50..834c406b3ba3943ccd193c8e62cbbc2d194c6d1f 100644 (file)
@@ -289,6 +289,10 @@ same behaviour as well.
        use it unless you need the correct position in the file
        descriptor.
 
+`strbuf_getcwd`::
+
+       Set the buffer to the path of the current working directory.
+
 `stripspace`::
 
        Strip whitespace from a buffer. The second parameter controls if
index ee96dcfb816625436582833d812a7156513d5d39..f3af203ec7ee5dab1f049118919250229576f559 100644 (file)
--- 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;
index 39c14cfa384c5154abd96899a7c02417295f8555..23b16c6cdf580984db5d5e9d3213bfcd473e95cf 100644 (file)
--- a/strbuf.h
+++ b/strbuf.h
@@ -163,6 +163,7 @@ extern size_t strbuf_fread(struct strbuf *, size_t, FILE *);
 extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint);
 extern int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint);
 extern int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint);
+extern int strbuf_getcwd(struct strbuf *sb);
 
 extern int strbuf_getwholeline(struct strbuf *, FILE *, int);
 extern int strbuf_getline(struct strbuf *, FILE *, int);