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

[FYI/PATCH] vcs-svn: give control over temporary file names

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Jan 22, 2011, 06:42 UTC
Message-ID
<20110122064235.GA10304@burratino>
In-Reply-To
<20110103031059.GE10143@burratino>

Allow users of the line_buffer library to specify what directory and filename to use for temporary files. For example:

	struct line_buffer tmp = LINE_BUFFER_INIT;
	if (buffer_tmpfile_init(&tmp, ".git", "svnfe_blob.XXXXXX"))
		die_errno("opening temporary file");
	...
	if (buffer_deinit(&tmp))
		die_errno("removing temporary file");

On Windows, something like this is needed if users without write permission to the root directory are to be able to use temporary files.

Unlike the implementation using tmpfile, this would not take care of automatically removing the temporary file on exit. The user is responsible for now for installing appropriate signal and atexit handlers to take care of that.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
I have an odd feeling this will be necessary at some point but I'm not
sure if it's a good idea or not.  Although tmpfile(3) is a limited
interface, it's pretty much exactly what we want.
See [1] for tmpfile on Windows.

This is just to get the idea out there. I don't think this patch's moment has come (though I'd be interested in your thoughts either way).

[1] http://msdn.microsoft.com/en-us/library/x8x7sakw.aspx
 vcs-svn/line_buffer.c |   35 ++++++++++++++++++++++++++++++-----
 vcs-svn/line_buffer.h |    6 ++++--
 2 files changed, 34 insertions(+), 7 deletions(-)
diff --git a/vcs-svn/line_buffer.c b/vcs-svn/line_buffer.c
index aedf105..4131e08 100644
--- a/vcs-svn/line_buffer.c
+++ b/vcs-svn/line_buffer.c
@@ -3,7 +3,7 @@
  * See LICENSE for details.
  */
 
-#include "git-compat-util.h"
+#include "cache.h"
 #include "line_buffer.h"
 #include "strbuf.h"
 
@@ -25,12 +25,33 @@ int buffer_fdinit(struct line_buffer *buf, int fd)
 	return 0;
 }
 
-int buffer_tmpfile_init(struct line_buffer *buf)
+int buffer_tmpfile_init(struct line_buffer *buf,
+			const char *dirname, const char *pattern)
 {
-	buf->infile = tmpfile();
-	if (!buf->infile)
-		return -1;
+	int fd, saved_errno;
+	int mode = 0444;	/* just remove write permission. */
+	strbuf_addstr(&buf->temp_filename, dirname);
+	strbuf_addch(&buf->temp_filename, '/');
+	strbuf_addstr(&buf->temp_filename, pattern);
+
+	fd = git_mkstemp_mode(buf->temp_filename.buf, mode);
+	if (fd < 0) {
+		saved_errno = errno;
+		goto fail_mktemp;
+	}
+	buf->infile = fdopen(fd, "r+");
+	if (!buf->infile) {
+		saved_errno = errno;
+		goto fail_fdopen;
+	}
 	return 0;
+
+fail_fdopen:
+	close(fd);
+fail_mktemp:
+	strbuf_reset(&buf->temp_filename);
+	errno = saved_errno;
+	return -1;
 }
 
 int buffer_deinit(struct line_buffer *buf)
@@ -40,6 +61,9 @@ int buffer_deinit(struct line_buffer *buf)
 		return ferror(buf->infile);
 	err = ferror(buf->infile);
 	err |= fclose(buf->infile);
+	if (buf->temp_filename.len)
+		err |= unlink_or_warn(buf->temp_filename.buf);
+	strbuf_reset(&buf->temp_filename);
 	return err;
 }
 
@@ -129,4 +153,5 @@ void buffer_skip_bytes(struct line_buffer *buf, uint32_t len)
 void buffer_reset(struct line_buffer *buf)
 {
 	strbuf_release(&buf->blob_buffer);
+	strbuf_release(&buf->temp_filename);
 }
diff --git a/vcs-svn/line_buffer.h b/vcs-svn/line_buffer.h
index 96ce966..bd1a621 100644
--- a/vcs-svn/line_buffer.h
+++ b/vcs-svn/line_buffer.h
@@ -9,15 +9,17 @@ struct line_buffer {
 	char line_buffer[LINE_BUFFER_LEN];
 	struct strbuf blob_buffer;
 	FILE *infile;
+	struct strbuf temp_filename;
 };
-#define LINE_BUFFER_INIT {"", STRBUF_INIT, NULL}
+#define LINE_BUFFER_INIT {"", STRBUF_INIT, NULL, STRBUF_INIT}
 
 int buffer_init(struct line_buffer *buf, const char *filename);
 int buffer_fdinit(struct line_buffer *buf, int fd);
 int buffer_deinit(struct line_buffer *buf);
 void buffer_reset(struct line_buffer *buf);
 
-int buffer_tmpfile_init(struct line_buffer *buf);
+int buffer_tmpfile_init(struct line_buffer *buf,
+		const char *directory, const char *pattern);
 FILE *buffer_tmpfile_rewind(struct line_buffer *buf);	/* prepare to write. */
 long buffer_tmpfile_prepare_to_read(struct line_buffer *buf);
 
-- 
1.7.4.rc2
Previous: Jonathan NiederNext: Jonathan Nieder
Message 17 of 25 in “teach vcs-svn/line_buffer to handle multiple input files”
  1. 0/4 teach vcs-svn/line_buffer to handle multiple input filesJonathan Nieder, Dec 24, 2010
  2. 1/4 vcs-svn: eliminate global byte_bufferJonathan Nieder, Dec 24, 2010
  3. 2/4 vcs-svn: replace buffer_read_string memory pool with a strbufJonathan Nieder, Dec 24, 2010
  4. 3/4 vcs-svn: collect line_buffer data in a structJonathan Nieder, Dec 24, 2010
  5. 4/4 vcs-svn: teach line_buffer to handle multiple input filesJonathan Nieder, Dec 24, 2010
  6. Jonathan NiederJan 3, 2011
  7. 5/8 vcs-svn: make test-line-buffer input format more flexibleJonathan Nieder, Jan 3, 2011
  8. 6/8 tests: give vcs-svn/line_buffer its own test scriptJonathan Nieder, Jan 3, 2011
  9. 7/8 vcs-svn: tweak test-line-buffer to not assume line-oriented inputJonathan Nieder, Jan 3, 2011
  10. 8/8 t0081 (line-buffer): add buffering testsJonathan Nieder, Jan 3, 2011
  11. Jonathan NiederJan 3, 2011
  12. 12/12 line_buffer: more wrappers around stdio functionsJonathan Nieder, Jan 3, 2011
  13. 09/12 vcs-svn: add binary-safe read functionJonathan Nieder, Jan 3, 2011
  14. 10/12 vcs-svn: allow character-oriented inputJonathan Nieder, Jan 3, 2011
  15. 11/12 vcs-svn: allow input from file descriptorJonathan Nieder, Jan 3, 2011
  16. 12/12 vcs-svn: teach line_buffer about temporary filesJonathan Nieder, Jan 3, 2011
  17. vcs-svn: give control over temporary file namesJonathan Nieder, Jan 22, 2011
  18. [PULL svn-fe] fast-import 'ls', line-buffer changesJonathan Nieder, Feb 26, 2011
  19. David Michael BarrFeb 26, 2011
  20. Junio C HamanoFeb 28, 2011
  21. fast-import: make code "-Wpointer-arith" cleanJonathan Nieder, Feb 28, 2011
  22. Sverre RabbelierFeb 28, 2011
  23. Junio C HamanoFeb 28, 2011
  24. Jonathan NiederFeb 28, 2011
  25. Junio C HamanoMar 1, 2011

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.