add ctgit_git_open/ctgit_git_close functionality
authorChristian Thaeter <ct@pipapo.org>
Sun, 30 Dec 2007 20:55:39 +0000 (21:55 +0100)
committerChristian Thaeter <ct@pipapo.org>
Sun, 30 Dec 2007 20:55:39 +0000 (21:55 +0100)
These functions can be used to fork non reentrant git commands

src/ctgit.c
src/ctgit.h

index 1bd96f945b1f193be5e2aa7d4637aa12bad07088..6b3b9e79889ad33fd78f7087ea17eb1a7271e763 100644 (file)
@@ -35,6 +35,7 @@
 #include <cwa.h>
 
 #include <stdio.h>
+#include <stdarg.h>
 #include <string.h>
 #include <time.h>
 #include <setjmp.h>
@@ -65,6 +66,42 @@ ctgit_setup (void)
 }
 
 
+FILE*
+ctgit_git_open_vargs (const char* fmt, va_list args)
+{
+  /* note: its dangerous to call this function with user supplied data, always use validated data */
+  char buf[256] = "git ";
+  char cmd[1024];
+
+  strncat (buf, fmt, 255);
+  if (vsnprintf (cmd, 1024, buf, args) >= 1024)
+    return NULL;
+
+  return popen (cmd, "r");
+}
+
+
+FILE*
+ctgit_git_open (const char* fmt, ...)
+{
+  FILE* ret = NULL;
+  va_list args;
+
+  va_start (args, fmt);
+  ret = ctgit_git_open_vargs (fmt, args);
+  va_end (args);
+
+  return ret;
+}
+
+void
+ctgit_git_close (FILE* handle)
+{
+  if (handle)
+    pclose (handle);
+}
+
+
 int
 main (int argc, char**argv)
 {
index f273727126b46422c4c74b2933dcea6ad069a09e..ce11871b638fbdee38335a839ad34deab11ad7f6 100644 (file)
@@ -63,6 +63,15 @@ struct ctgit_query
   llist repos;
 };
 
+
+
+FILE*
+ctgit_git_open (const char* fmt, ...);
+
+
+void
+ctgit_git_close (FILE* handle);
+
 /*
   libgit api
 */