implemented gmp_rsa_public_key.encrypt() method
[strongswan.git] / src / whack / whack.c
index 5e99bc5..4c3083b 100644 (file)
@@ -11,8 +11,6 @@
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  * for more details.
- *
- * RCSID $Id$
  */
 
 #include <stdio.h>
 
 #include <freeswan.h>
 
+#include <utils/optionsfrom.h>
+
 #include "constants.h"
 #include "defs.h"
 #include "whack.h"
 
-static void
-help(void)
+static void help(void)
 {
        fprintf(stderr
                , "Usage:\n\n"
@@ -239,26 +238,41 @@ static const char *label = NULL;        /* --label operand, saved for diagnostic
 
 static const char *name = NULL; /* --name operand, saved for diagnostics */
 
-/* print a string as a diagnostic, then exit whack unhappily */
-static void
-diag(const char *mess)
+/* options read by optionsfrom */
+options_t *options;
+
+/**
+ * exit whack after cleaning up
+ */
+static void whack_exit(int status)
+{
+       options->destroy(options);
+       exit(status);
+}
+
+/**
+ * print a string as a diagnostic, then exit whack unhappily
+ */
+static void diag(const char *mess)
 {
        if (mess != NULL)
        {
                fprintf(stderr, "whack error: ");
                if (label != NULL)
+               {
                        fprintf(stderr, "%s ", label);
+               }
                if (name != NULL)
+               {
                        fprintf(stderr, "\"%s\" ", name);
+               }
                fprintf(stderr, "%s\n", mess);
        }
-
-       exit(RC_WHACK_PROBLEM);
+       whack_exit(RC_WHACK_PROBLEM);
 }
 
 /* conditially calls diag; prints second arg, if non-NULL, as quoted string */
-static void
-diagq(err_t ugh, const char *this)
+static void diagq(err_t ugh, const char *this)
 {
        if (ugh != NULL)
        {
@@ -654,12 +668,9 @@ struct sockaddr_un ctl_addr = { AF_UNIX, DEFAULT_CTLBASE CTL_SUFFIX };
 
 /* helper variables and function to encode strings from whack message */
 
-static char
-       *next_str,
-       *str_roof;
+static char    *next_str,*str_roof;
 
-static bool
-pack_str(char **p)
+static bool pack_str(char **p)
 {
        const char *s = *p == NULL? "" : *p;        /* note: NULL becomes ""! */
        size_t len = strlen(s) + 1;
@@ -677,9 +688,8 @@ pack_str(char **p)
        }
 }
 
-static void
-check_life_time(time_t life, time_t limit, const char *which
-, const whack_message_t *msg)
+static void check_life_time(time_t life, time_t limit, const char *which,
+                                                       const whack_message_t *msg)
 {
        time_t mint = msg->sa_rekey_margin * (100 + msg->sa_rekey_fuzz) / 100;
 
@@ -708,8 +718,7 @@ check_life_time(time_t life, time_t limit, const char *which
        }
 }
 
-static void
-clear_end(whack_end_t *e)
+static void clear_end(whack_end_t *e)
 {
        zero(e);
        e->id = NULL;
@@ -719,8 +728,7 @@ clear_end(whack_end_t *e)
        e->host_port = IKE_UDP_PORT;
 }
 
-static void
-update_ports(whack_message_t *m)
+static void update_ports(whack_message_t *m)
 {
        int port;
 
@@ -736,9 +744,8 @@ update_ports(whack_message_t *m)
        }
 }
 
-static void
-check_end(whack_end_t *this, whack_end_t *that
-, bool default_nexthop, sa_family_t caf, sa_family_t taf)
+static void check_end(whack_end_t *this, whack_end_t *that,
+                                         bool default_nexthop, sa_family_t caf, sa_family_t taf)
 {
        if (caf != addrtypeof(&this->host_addr))
                diag("address family of host inconsistent");
@@ -776,8 +783,7 @@ check_end(whack_end_t *this, whack_end_t *that
                diag("the protocol for leftprotoport and rightprotoport must be the same");
 }
 
-static void
-get_secret(int sock)
+static void get_secret(int sock)
 {
        const char *buf, *secret;
        int len;
@@ -800,8 +806,7 @@ get_secret(int sock)
 
 /* This is a hack for initiating ISAKMP exchanges. */
 
-int
-main(int argc, char **argv)
+int main(int argc, char **argv)
 {
        whack_message_t msg;
        char esp_buf[256];  /* uses snprintf */
@@ -865,6 +870,8 @@ main(int argc, char **argv)
        msg.crluri2 = NULL;
        msg.ocspuri = NULL;
 
+       options = options_create();
+
        for (;;)
        {
                int long_index;
@@ -991,7 +998,7 @@ main(int argc, char **argv)
 
                case 'h' - OPTION_OFFSET:       /* --help */
                        help();
-                       return 0;   /* GNU coding standards say to stop here */
+                       whack_exit(0);              /* GNU coding standards say to stop here */
 
                case 'v' - OPTION_OFFSET:       /* --version */
                        {
@@ -1001,15 +1008,18 @@ main(int argc, char **argv)
                                for (; *sp != NULL; sp++)
                                        puts(*sp);
                        }
-                       return 0;   /* GNU coding standards say to stop here */
+                       whack_exit(0);   /* GNU coding standards say to stop here */
 
                case 'l' - OPTION_OFFSET:       /* --label <string> */
-                       label = optarg;     /* remember for diagnostics */
+                       label = optarg;             /* remember for diagnostics */
                        continue;
 
                case '+' - OPTION_OFFSET:       /* --optionsfrom <filename> */
-                       optionsfrom(optarg, &argc, &argv, optind, stderr);
-                       /* does not return on error */
+                       if (!options->from(options, optarg, &argc, &argv, optind))
+                       {
+                               fprintf(stderr, "optionsfrom failed");
+                               whack_exit(RC_WHACK_PROBLEM);                           
+                       }
                        continue;
 
                /* the rest of the options combine in complex ways */
@@ -1792,7 +1802,7 @@ main(int argc, char **argv)
                                , ctl_addr.sun_path, errno, strerror(e));
                        break;
                }
-               exit(RC_WHACK_PROBLEM);
+               whack_exit(RC_WHACK_PROBLEM);
        }
        else
        {
@@ -1805,7 +1815,7 @@ main(int argc, char **argv)
                        int e = errno;
 
                        fprintf(stderr, "whack: socket() failed (%d %s)\n", e, strerror(e));
-                       exit(RC_WHACK_PROBLEM);
+                       whack_exit(RC_WHACK_PROBLEM);
                }
 
                if (connect(sock, (struct sockaddr *)&ctl_addr
@@ -1816,7 +1826,7 @@ main(int argc, char **argv)
                        fprintf(stderr, "whack:%s connect() for \"%s\" failed (%d %s)\n"
                                , e == ECONNREFUSED? " is Pluto running? " : ""
                                , ctl_addr.sun_path, e, strerror(e));
-                       exit(RC_WHACK_PROBLEM);
+                       whack_exit(RC_WHACK_PROBLEM);
                }
 
                if (write(sock, &msg, len) != len)
@@ -1824,7 +1834,7 @@ main(int argc, char **argv)
                        int e = errno;
 
                        fprintf(stderr, "whack: write() failed (%d %s)\n", e, strerror(e));
-                       exit(RC_WHACK_PROBLEM);
+                       whack_exit(RC_WHACK_PROBLEM);
                }
 
                /* for now, just copy reply back to stdout */
@@ -1843,7 +1853,7 @@ main(int argc, char **argv)
                                        int e = errno;
 
                                        fprintf(stderr, "whack: read() failed (%d %s)\n", e, strerror(e));
-                                       exit(RC_WHACK_PROBLEM);
+                                       whack_exit(RC_WHACK_PROBLEM);
                                }
                                if (rl == 0)
                                {
@@ -1900,6 +1910,7 @@ main(int argc, char **argv)
                                }
                        }
                }
-               return exit_status;
+               whack_exit(exit_status);
        }
+       return -1; /* should never be reached */
 }