[tor-commits] [obfsproxy/master] Detached option parsing from {dummy, obfs2}_init().

nickm at torproject.org nickm at torproject.org
Thu Jun 9 21:05:17 UTC 2011


commit fb76953a54809479a9527213623526d1fdf0b763
Author: George Kadianakis <desnacked at gmail.com>
Date:   Thu Jun 9 19:13:33 2011 +0200

    Detached option parsing from {dummy,obfs2}_init().
    It's cleaner and it's easier to test.
---
 src/protocols/dummy.c |   47 +++++++++++++++++++++++++++------------------
 src/protocols/obfs2.c |   50 +++++++++++++++++++++++++++++-------------------
 2 files changed, 58 insertions(+), 39 deletions(-)

diff --git a/src/protocols/dummy.c b/src/protocols/dummy.c
index 5f6b8eb..71b3313 100644
--- a/src/protocols/dummy.c
+++ b/src/protocols/dummy.c
@@ -19,9 +19,10 @@ static int dummy_send(void *nothing,
 static enum recv_ret dummy_recv(void *nothing, struct evbuffer *source,
                                 struct evbuffer *dest);
 static void usage(void);
+static int parse_and_set_options(int n_options, char **options, 
+                                 struct protocol_params_t *params);
 
 static protocol_vtable *vtable=NULL;
-
 /**
    This function sets up the protocol and populates 'listner'
    according to 'options'.
@@ -33,12 +34,35 @@ int
 dummy_init(int n_options, char **options, 
            struct protocol_params_t *params)
 {
+  if (parse_and_set_options(n_options,options,params) < 0) {
+    usage();
+    return -1;
+  }
+
+  /* XXX memleak. */
+  vtable = calloc(1, sizeof(protocol_vtable));
+  if (!vtable)
+    return -1;
+
+  vtable->destroy = NULL;
+  vtable->create = dummy_new;
+  vtable->handshake = NULL;
+  vtable->send = dummy_send;
+  vtable->recv = dummy_recv;
+
+  return 1;
+}
+
+static int
+parse_and_set_options(int n_options, char **options, 
+                      struct protocol_params_t *params)
+{
   struct sockaddr_storage ss_listen;
   int sl_listen;
   const char* defport;
   
   if (n_options != 3)
-    goto err;
+    return -1;
 
   assert(!strcmp(options[0],"dummy"));
   params->proto = DUMMY_PROTOCOL;
@@ -53,12 +77,12 @@ dummy_init(int n_options, char **options,
     defport = "11253"; /* 2bf5 */
     params->mode = LSN_SIMPLE_SERVER;
   } else
-    goto err;
+    return -1;
 
   if (resolve_address_port(options[2], 1, 1, 
                            &ss_listen, &sl_listen, defport) < 0) {
     printf("addr\n");
-    goto err;
+    return -1;
   }
   assert(sl_listen <= sizeof(struct sockaddr_storage));
   struct sockaddr *sa_listen=NULL;
@@ -66,22 +90,7 @@ dummy_init(int n_options, char **options,
   memcpy(&params->on_address, sa_listen, sl_listen);
   params->on_address_len = sl_listen;
   
-  /* XXX memleak. */
-  vtable = calloc(1, sizeof(protocol_vtable));
-  if (!vtable)
-    return -1;
-
-  vtable->destroy = NULL;
-  vtable->create = dummy_new;
-  vtable->handshake = NULL;
-  vtable->send = dummy_send;
-  vtable->recv = dummy_recv;
-
   return 1;
-
- err:
-  usage();
-  return -1;
 }
 
 static void
diff --git a/src/protocols/obfs2.c b/src/protocols/obfs2.c
index d886594..2cb1089 100644
--- a/src/protocols/obfs2.c
+++ b/src/protocols/obfs2.c
@@ -34,6 +34,8 @@ static int obfs2_state_set_shared_secret(void *s,
                                          size_t secretlen);
 static int set_up_vtable(void);
 static void usage(void);
+static int parse_and_set_options(int n_options, char **options, 
+                                 struct protocol_params_t *params);
 
 
 static protocol_vtable *vtable=NULL;
@@ -49,6 +51,26 @@ int
 obfs2_init(int n_options, char **options, 
            struct protocol_params_t *params)
 {
+  if (parse_and_set_options(n_options,options,params) < 0) {
+    usage();
+    return -1;
+  }
+
+  if (set_up_vtable() < 0)
+    return -1;
+
+  if (initialize_crypto() < 0) {
+    fprintf(stderr, "Can't initialize crypto; failing\n");
+    return -1;
+  }
+
+  return 1;
+}
+
+static int
+parse_and_set_options(int n_options, char **options, 
+                      struct protocol_params_t *params)
+{
   struct sockaddr_storage ss_listen;
   int sl_listen;
   int got_dest=0;
@@ -57,7 +79,7 @@ obfs2_init(int n_options, char **options,
 
   if ((n_options < 3) || (n_options > 5)) {
     printf("wrong options number: %d\n", n_options);
-    goto err;
+    return -1;
   }
 
   assert(!strcmp(*options,"obfs2"));
@@ -68,13 +90,13 @@ obfs2_init(int n_options, char **options,
   while (!strncmp(*options,"--",2)) {
       if (!strncmp(*options,"--dest=",7)) {
         if (got_dest)
-          goto err;
+          return -1;
         struct sockaddr_storage ss_target;
         struct sockaddr *sa_target=NULL;
         int sl_target=0;
         if (resolve_address_port(*options+7, 1, 0, 
                                  &ss_target, &sl_target, NULL) < 0)
-          goto err;
+          return -1;
         assert(sl_target <= sizeof(struct sockaddr_storage));
         sa_target = (struct sockaddr *)&ss_target;
         memcpy(&params->target_address, sa_target, sl_target);
@@ -82,14 +104,14 @@ obfs2_init(int n_options, char **options,
         got_dest=1;
       } else if (!strncmp(*options,"--shared-secret=",16)) {
         if (got_ss)
-          goto err;
+          return -1;
         /* this is freed in protocol_params_free() */
         params->shared_secret = strdup(*options+16);
         params->shared_secret_len = strlen(*options+16);
         got_ss=1;
       } else {
         printf("Unknown argument.\n");
-        goto err;
+        return -1;
       }
       options++;
     }
@@ -105,7 +127,7 @@ obfs2_init(int n_options, char **options,
       params->mode = LSN_SIMPLE_SERVER;
     } else {
       printf("only client/socks/server modes supported.\n");
-      goto err;
+      return -1;
     }
     options++;
 
@@ -113,7 +135,7 @@ obfs2_init(int n_options, char **options,
 
     if (resolve_address_port(*options, 1, 1, 
                              &ss_listen, &sl_listen, defport) < 0)
-      goto err;
+      return -1;
     assert(sl_listen <= sizeof(struct sockaddr_storage));
     struct sockaddr *sa_listen=NULL;
     sa_listen = (struct sockaddr *)&ss_listen;
@@ -123,27 +145,15 @@ obfs2_init(int n_options, char **options,
     /* Validate option selection. */
     if (got_dest && (params->mode == LSN_SOCKS_CLIENT)) {
       printf("You can't be on socks mode and have --dest.\n");
-      goto err;
+      return -1;
     }
 
     if (!got_dest && (params->mode != LSN_SOCKS_CLIENT)) {
       printf("client/server mode needs --dest.\n");
-      goto err;
-    }
-  
-    if (set_up_vtable() < 0)
-      return -1;
-
-    if (initialize_crypto() < 0) {
-      fprintf(stderr, "Can't initialize crypto; failing\n");
       return -1;
     }
 
     return 1;
-
- err:
-    usage();
-    return -1;
 }
 
 /**





More information about the tor-commits mailing list