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

[PATCH 05/12] Customizable error handlers

From
Petr Baudis <pasky@suse.cz>
Date
Jun 24, 2006, 02:34 UTC
Message-ID
<20060624023438.32751.46867.stgit@machine.or.cz>
In-Reply-To
<20060624023429.32751.80619.stgit@machine.or.cz>

This patch makes the usage(), die() and error() handlers customizable. Nothing in the git code itself uses that but many other libgit users (like Git.pm) will.

This is implemented using the mutator functions primarily because you cannot directly modifying global variables of libgit from a program that dlopen()ed it, apparently. But having functions for that is a better API anyway.

Signed-off-by: Petr Baudis <pasky@suse.cz>
---
 git-compat-util.h |    4 ++++
 usage.c           |   46 ++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/git-compat-util.h b/git-compat-util.h
index 5d543d2..b3d4cf5 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -40,6 +40,10 @@ extern void usage(const char *err) NORET
 extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
 extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
 
+extern void set_usage_routine(void (*routine)(const char *err) NORETURN);
+extern void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN);
+extern void set_error_routine(void (*routine)(const char *err, va_list params));
+
 #ifdef NO_MMAP
 
 #ifndef PROT_READ
diff --git a/usage.c b/usage.c
index 1fa924c..b781b00 100644
--- a/usage.c
+++ b/usage.c
@@ -12,20 +12,58 @@ static void report(const char *prefix, c
 	fputs("\n", stderr);
 }
 
-void usage(const char *err)
+void usage_builtin(const char *err)
 {
 	fprintf(stderr, "usage: %s\n", err);
 	exit(129);
 }
 
+void die_builtin(const char *err, va_list params)
+{
+	report("fatal: ", err, params);
+	exit(128);
+}
+
+void error_builtin(const char *err, va_list params)
+{
+	report("error: ", err, params);
+}
+
+
+/* If we are in a dlopen()ed .so write to a global variable would segfault
+ * (ugh), so keep things static. */
+static void (*usage_routine)(const char *err) NORETURN = usage_builtin;
+static void (*die_routine)(const char *err, va_list params) NORETURN = die_builtin;
+static void (*error_routine)(const char *err, va_list params) = error_builtin;
+
+void set_usage_routine(void (*routine)(const char *err) NORETURN)
+{
+	usage_routine = routine;
+}
+
+void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN)
+{
+	die_routine = routine;
+}
+
+void set_error_routine(void (*routine)(const char *err, va_list params))
+{
+	error_routine = routine;
+}
+
+
+void usage(const char *err)
+{
+	usage_routine(err);
+}
+
 void die(const char *err, ...)
 {
 	va_list params;
 
 	va_start(params, err);
-	report("fatal: ", err, params);
+	die_routine(err, params);
 	va_end(params);
-	exit(128);
 }
 
 int error(const char *err, ...)
@@ -33,7 +71,7 @@ int error(const char *err, ...)
 	va_list params;
 
 	va_start(params, err);
-	report("error: ", err, params);
+	error_routine(err, params);
 	va_end(params);
 	return -1;
 }
Previous: Petr BaudisNext: Petr Baudis
Message 5 of 25 in “Introduce Git.pm (v4)”
  1. 01/12 Introduce Git.pm (v4)Petr Baudis, Jun 24, 2006
  2. 02/12 Git.pm: Implement Git::exec_path()Petr Baudis, Jun 24, 2006
  3. 03/12 Git.pm: Call external commands using execv_git_cmd()Petr Baudis, Jun 24, 2006
  4. 04/12 Git.pm: Implement Git::version()Petr Baudis, Jun 24, 2006
  5. 05/12 Customizable error handlersPetr Baudis, Jun 24, 2006
  6. 06/12 Add Error.pm to the distributionPetr Baudis, Jun 24, 2006
  7. 07/12 Git.pm: Better error handlingPetr Baudis, Jun 24, 2006
  8. Junio C HamanoJun 24, 2006
  9. Petr BaudisJun 24, 2006
  10. Petr BaudisJun 25, 2006
  11. Junio C HamanoJun 25, 2006
  12. 08/12 Git.pm: Handle failed commands' outputPetr Baudis, Jun 24, 2006
  13. 09/12 Git.pm: Enhance the command_pipe() mechanismPetr Baudis, Jun 24, 2006
  14. 10/12 Git.pm: Implement options for the command interfacePetr Baudis, Jun 24, 2006
  15. 11/12 Git.pm: Add support for subdirectories inside of working copiesPetr Baudis, Jun 24, 2006
  16. 12/12 Convert git-mv to use Git.pmPetr Baudis, Jun 24, 2006
  17. Petr BaudisJun 24, 2006
  18. Junio C HamanoJun 24, 2006
  19. Petr BaudisJun 24, 2006
  20. Junio C HamanoJun 24, 2006
  21. Petr BaudisJun 24, 2006
  22. Petr BaudisJun 24, 2006
  23. Junio C HamanoJun 24, 2006
  24. Petr BaudisJun 24, 2006
  25. Junio C HamanoJun 25, 2006

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.