[PATCH 1/3] strbuf: add strbuf_add_cwd()
From: René Scharfe <hidden>
Date: 2016-06-15 23:01:59
Subsystem:
documentation, the rest · Maintainers:
Jonathan Corbet, Linus Torvalds
Add strbuf_add_cwd(), which adds the current working directory to a strbuf. Because it doesn't use a fixed-size buffer it supports arbitrarily long paths, as long as 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 <redacted> Signed-off-by: Rene Scharfe <redacted> --- Documentation/technical/api-strbuf.txt | 4 ++++ strbuf.c | 22 ++++++++++++++++++++++ strbuf.h | 1 + 3 files changed, 27 insertions(+)
diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt
index f9c06a7..b96b78c 100644
--- a/Documentation/technical/api-strbuf.txt
+++ b/Documentation/technical/api-strbuf.txt@@ -257,6 +257,10 @@ which can be used by the programmer of the callback as she sees fit. Add a formatted string to the buffer. +`strbuf_add_cwd`:: + + Add the current working directory to the buffer. + `strbuf_commented_addf`:: Add a formatted string prepended by a comment character and a
diff --git a/strbuf.c b/strbuf.c
index 33018d8..4e44773 100644
--- a/strbuf.c
+++ b/strbuf.c@@ -406,6 +406,28 @@ int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint) return -1; } +int strbuf_add_cwd(struct strbuf *sb) +{ + size_t oldalloc = sb->alloc; + size_t guessed_len = 32; + + for (;; guessed_len *= 2) { + char *cwd; + + strbuf_grow(sb, guessed_len); + cwd = getcwd(sb->buf + sb->len, sb->alloc - sb->len); + if (cwd) { + strbuf_setlen(sb, sb->len + strlen(cwd)); + return 0; + } + if (errno != ERANGE) + break; + } + if (oldalloc == 0) + strbuf_release(sb); + return -1; +} + int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term) { int ch;
diff --git a/strbuf.h b/strbuf.h
index a7c0192..ba95cd6 100644
--- a/strbuf.h
+++ b/strbuf.h@@ -174,6 +174,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_add_cwd(struct strbuf *sb); extern int strbuf_getwholeline(struct strbuf *, FILE *, int); extern int strbuf_getline(struct strbuf *, FILE *, int);
--
2.0.2