[tor-commits] [obfsproxy/master] Implement --version and put git revision on top of log.

asn at torproject.org asn at torproject.org
Mon Mar 19 20:00:09 UTC 2012


commit 4f3d208352cada4bd3f31696e1d19f5061ed2692
Author: George Kadianakis <desnacked at riseup.net>
Date:   Mon Mar 19 12:55:34 2012 -0700

    Implement --version and put git revision on top of log.
    
    Also, implement --help.
---
 .gitignore  |    1 +
 ChangeLog   |    7 +++++++
 Makefile.am |   27 ++++++++++++++++++++++++++-
 src/main.c  |   51 +++++++++++++++++++++++++++++++++++++++++++++++++--
 4 files changed, 83 insertions(+), 3 deletions(-)

diff --git a/.gitignore b/.gitignore
index 848c2b5..590ceed 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,6 +25,7 @@ Makefile.in
 /obfsproxy
 /unittests
 /tester.py
+/micro-revision.i
 
 # /doc/
 /doc/doxygen
diff --git a/ChangeLog b/ChangeLog
index 1bdab1a..fc055b5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Changes in version 0.1.2 - <not yet released>
+ - Display git revision when we start logging. Fixes part of bug
+   #5157.
+ - Implement obfsproxy --version. Fixes the rest of bug #5157.
+ - Implement obfsproxy --help.
+
+
 Changes in version 0.1.1 - 2012-03-09
  - Add trailing slash to the torproject URL in the man page. Fixes
    bug #5311. Patch by Peter Palfrader.
diff --git a/Makefile.am b/Makefile.am
index f7c9c11..6b2731f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -54,7 +54,8 @@ noinst_HEADERS = \
 	src/protocols/dummy.h \
 	src/protocols/obfs2.h \
 	src/test/tinytest.h \
-	src/test/tinytest_macros.h
+	src/test/tinytest_macros.h \
+	micro-revision.i
 
 EXTRA_DIST = \
 	ChangeLog \
@@ -99,3 +100,27 @@ version:
 	   echo -n "git: " ;\
 	   (cd "$(top_srcdir)" && git rev-parse --short=16 HEAD); \
 	fi
+
+all: micro-revision.i
+
+micro-revision.i: FORCE
+	@rm -f micro-revision.tmp;					\
+	if test -d "$(top_srcdir)/.git" &&				\
+	  test -x "`which git 2>&1;true`"; then				\
+	  HASH="`cd "$(top_srcdir)" && git rev-parse --short=16 HEAD`"; 	\
+	  echo \"$$HASH\" > micro-revision.tmp; 			\
+        fi;								\
+	if test ! -f micro-revision.tmp ; then				\
+	  if test ! -f micro-revision.i ; then				\
+	    echo '""' > micro-revision.i;				\
+	  fi;								\
+	elif test ! -f micro-revision.i ||				\
+	  test x"`cat micro-revision.tmp`" != x"`cat micro-revision.i`"; then \
+	  mv micro-revision.tmp micro-revision.i;			\
+	fi; true
+	@rm -f micro-revision.tmp;
+
+CLEANFILES = micro-revision.i
+
+#Dummy target to ensure that micro-revision.i _always_ gets built.
+FORCE:
diff --git a/src/main.c b/src/main.c
index 0d690b7..30210f1 100644
--- a/src/main.c
+++ b/src/main.c
@@ -31,6 +31,16 @@
 #include <event2/event.h>
 #include <event2/dns.h>
 
+/** String describing which obfsproxy git repository version the
+ * source was built from.  This string is generated by a bit of shell
+ * kludging in Makefile.am, and is usually right.
+ */
+const char obfs_git_revision[] =
+#ifndef _MSC_VER
+#include "micro-revision.i"
+#endif
+  "";
+
 static struct event_base *the_event_base;
 static struct event *sig_int;
 static struct event *sig_term;
@@ -41,6 +51,22 @@ static int is_external_proxy=1;
 /* Whether to scrub connection addresses -- on by default */
 int safe_logging=1;
 
+static char *the_obfsproxy_version = NULL;
+
+/** Return the current obfsproxy version. */
+static const char *
+get_version(void)
+{
+  if (!the_obfsproxy_version) {
+    if (strlen(obfs_git_revision))
+      obfs_asprintf(&the_obfsproxy_version, "git-%s", obfs_git_revision);
+    else
+      obfs_asprintf(&the_obfsproxy_version, "git");
+  }
+
+  return the_obfsproxy_version;
+}
+
 /**
    Prints the obfsproxy usage instructions then exits.
 */
@@ -61,6 +87,21 @@ usage(void)
           "--no-log ~ disable logging\n"
           "--no-safe-logging ~ disable safe (scrubbed address) logging\n");
 
+  if (the_obfsproxy_version)
+    free(the_obfsproxy_version);
+
+  exit(1);
+}
+
+/** Prints the obfsproxy version then exits. */
+static void ATTR_NORETURN
+version(void)
+{
+  printf("obfsproxy %s\n", get_version());
+
+  if (the_obfsproxy_version)
+    free(the_obfsproxy_version);
+
   exit(1);
 }
 
@@ -175,6 +216,10 @@ handle_obfsproxy_args(const char *const *argv)
       safe_logging=0;
     } else if (!strncmp(argv[i], "--managed", 10)) {
       is_external_proxy=0;
+    } else if (!strncmp(argv[i], "--version", 10)) {
+      version();
+    } else if (!strncmp(argv[i], "--help", 7)) {
+      usage();
     } else {
       log_error("Unrecognizable obfsproxy argument '%s'", argv[i]);
     }
@@ -279,8 +324,10 @@ obfsproxy_cleanup()
   cleanup_crypto();
   status_connections_cleanup();
   close_obfsproxy_logfile();
-}
 
+  if (the_obfsproxy_version)
+    free(the_obfsproxy_version);
+}
 
 /** Entry point */
 int
@@ -290,7 +337,7 @@ obfs_main(int argc, const char *const *argv)
 
   /* Handle optional obfsproxy arguments. */
   begin = argv + handle_obfsproxy_args(argv);
-  log_notice("Starting.");
+  log_notice("Starting (%s).", get_version());
 
   if (is_external_proxy) {
     if (launch_external_proxy(begin) < 0)



More information about the tor-commits mailing list