git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 01/10] strbuf: add strbuf_getcwd()

From
René Scharfe <l.s.r@web.de>
Date
Jul 28, 2014, 18:24 UTC
Message-ID
<53D6955D.4030008@web.de>
In-Reply-To
<53D694A2.8030007@web.de>

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>
---
 Documentation/technical/api-strbuf.txt |  4 ++++
 strbuf.c                               | 21 +++++++++++++++++++++
 strbuf.h                               |  1 +
 3 files changed, 26 insertions(+)
diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt
index f9c06a7..49e477d 100644
--- a/Documentation/technical/api-strbuf.txt
+++ b/Documentation/technical/api-strbuf.txt
@@ -307,6 +307,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
diff --git a/strbuf.c b/strbuf.c
index 33018d8..2bf4dfa 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -406,6 +406,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;
diff --git a/strbuf.h b/strbuf.h
index a7c0192..bc38bb9 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_getcwd(struct strbuf *sb);
 
 extern int strbuf_getwholeline(struct strbuf *, FILE *, int);
 extern int strbuf_getline(struct strbuf *, FILE *, int);
-- 
2.0.2
Previous: René ScharfeNext: René Scharfe
Message 2 of 28 in “getcwd without PATH_MAX”
  1. 0/10 getcwd without PATH_MAXRené Scharfe, Jul 28, 2014
  2. 01/10 strbuf: add strbuf_getcwd()René Scharfe, Jul 28, 2014
  3. 02/10 unix-sockets: use strbuf_getcwd()René Scharfe, Jul 28, 2014
  4. Jeff KingJul 28, 2014
  5. 03/10 setup: convert setup_git_directory_gently_1 et al. to strbufRené Scharfe, Jul 28, 2014
  6. Eric SunshineJul 28, 2014
  7. Torsten BögershausenAug 16, 2014
  8. René ScharfeAug 16, 2014
  9. Junio C HamanoAug 18, 2014
  10. 04/10 abspath: use strbuf_getcwd() to remember original working directoryRené Scharfe, Jul 28, 2014
  11. 05/10 abspath: convert real_path_internal() to strbufRené Scharfe, Jul 28, 2014
  12. Jeff KingJul 28, 2014
  13. René ScharfeJul 28, 2014
  14. Jeff KingJul 28, 2014
  15. Junio C HamanoJul 28, 2014
  16. René ScharfeJul 29, 2014
  17. Junio C HamanoJul 29, 2014
  18. fixup for 05/10: plug leakRené Scharfe, Jul 29, 2014
  19. 06/10 wrapper: add xgetcwd()René Scharfe, Jul 28, 2014
  20. 07/10 use xgetcwd() to get the current directory or dieRené Scharfe, Jul 28, 2014
  21. 08/10 use xgetcwd() to set $GIT_DIRRené Scharfe, Jul 28, 2014
  22. 09/10 abspath: convert absolute_path() to strbufRené Scharfe, Jul 28, 2014
  23. Jeff KingJul 28, 2014
  24. René ScharfeJul 28, 2014
  25. fixup for 09/10: plug leakRené Scharfe, Jul 29, 2014
  26. 10/10 use strbuf_add_absolute_path() to add absolute pathsRené Scharfe, Jul 28, 2014
  27. 04/10 abspath: use strbuf_getcwd() to remember original working directoryRené Scharfe, Jul 28, 2014
  28. Jeff KingJul 28, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.