Link libgnunetblockgroup to libgnunetblock
[oweals/gnunet.git] / src / util / gnunet-scrypt.c
index cbfcc691756ccd70e86a9572692c3cc78d9fff82..ab0cf92e03cdfee4c2bf13e287dbe27506453749 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2014 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2014 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
-
 /**
  * @file util/gnunet-scrypt.c
  * @brief tool to manipulate SCRYPT proofs of work.
- *        largely stolen from gnunet-peerinfo.c and gnunet-service-nse.c
  * @author Bart Polot
  */
 #include "platform.h"
@@ -39,24 +37,35 @@ static unsigned long long nse_work_required;
 static struct GNUNET_TIME_Relative proof_find_delay;
 
 static struct GNUNET_CRYPTO_EddsaPublicKey pub;
-uint64_t proof;
-GNUNET_SCHEDULER_TaskIdentifier proof_task;
-const struct GNUNET_CONFIGURATION_Handle *cfg;
 
-char *pkfn;
-char *pwfn;
+static uint64_t proof;
+
+static struct GNUNET_SCHEDULER_Task *proof_task;
+
+static const struct GNUNET_CONFIGURATION_Handle *cfg;
+
+static char *pkfn;
+
+static char *pwfn;
+
 
 /**
  * Write our current proof to disk.
+ *
+ * @param cls closure
  */
 static void
-write_proof ()
+shutdown_task (void *cls)
 {
   if (sizeof (proof) !=
-      GNUNET_DISK_fn_write (pwfn, &proof, sizeof (proof),
+      GNUNET_DISK_fn_write (pwfn,
+                           &proof,
+                           sizeof (proof),
                             GNUNET_DISK_PERM_USER_READ |
                             GNUNET_DISK_PERM_USER_WRITE))
-    GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "write", proof);
+    GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
+                             "write",
+                             pwfn);
 }
 
 
@@ -82,7 +91,6 @@ pow_hash (const void *buf,
 }
 
 
-
 /**
  * Count the leading zeroes in hash.
  *
@@ -108,8 +116,7 @@ count_leading_zeroes (const struct GNUNET_HashCode *hash)
  * @param tc task context
  */
 static void
-find_proof (void *cls,
-            const struct GNUNET_SCHEDULER_TaskContext *tc)
+find_proof (void *cls)
 {
   #define ROUND_SIZE 10
   uint64_t counter;
@@ -120,28 +127,25 @@ find_proof (void *cls,
   struct GNUNET_TIME_Absolute timestamp;
   struct GNUNET_TIME_Relative elapsed;
 
-  if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
-  {
-    write_proof ();
-    return;
-  }
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Got Proof of Work %llu\n", proof);
-  proof_task = GNUNET_SCHEDULER_NO_TASK;
-  memcpy (&buf[sizeof (uint64_t)], &pub,
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+             "Got Proof of Work %llu\n",
+             (unsigned long long) proof);
+  proof_task = NULL;
+  GNUNET_memcpy (&buf[sizeof (uint64_t)], &pub,
           sizeof (struct GNUNET_CRYPTO_EddsaPublicKey));
   i = 0;
   counter = proof;
   timestamp = GNUNET_TIME_absolute_get ();
   while ((counter != UINT64_MAX) && (i < ROUND_SIZE))
   {
-    memcpy (buf, &counter, sizeof (uint64_t));
+    GNUNET_memcpy (buf, &counter, sizeof (uint64_t));
     pow_hash (buf, sizeof (buf), &result);
     if (nse_work_required <= count_leading_zeroes (&result))
     {
       proof = counter;
       FPRINTF (stdout, "Proof of work found: %llu!\n",
                (unsigned long long) proof);
-      write_proof ();
+      GNUNET_SCHEDULER_shutdown ();
       return;
     }
     counter++;
@@ -159,16 +163,16 @@ find_proof (void *cls,
                 (unsigned long long) counter);
     /* remember progress every 100 rounds */
     proof = counter;
-    write_proof ();
+    shutdown_task (NULL);
   }
   else
   {
     proof = counter;
   }
   proof_task =
-  GNUNET_SCHEDULER_add_delayed_with_priority (proof_find_delay,
-                                              GNUNET_SCHEDULER_PRIORITY_IDLE,
-                                              &find_proof, NULL);
+    GNUNET_SCHEDULER_add_delayed_with_priority (proof_find_delay,
+                                               GNUNET_SCHEDULER_PRIORITY_IDLE,
+                                               &find_proof, NULL);
 }
 
 
@@ -181,86 +185,117 @@ find_proof (void *cls,
  * @param cfg configuration
  */
 static void
-run (void *cls, char *const *args, const char *cfgfile,
+run (void *cls,
+     char *const *args,
+     const char *cfgfile,
      const struct GNUNET_CONFIGURATION_Handle *config)
 {
   struct GNUNET_CRYPTO_EddsaPrivateKey *pk;
+  char *pids;
 
   cfg = config;
-
   /* load proof of work */
   if (NULL == pwfn)
   {
-    if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "NSE",
-                                                              "PROOFFILE",
-                                                              &pwfn))
+    if (GNUNET_OK !=
+        GNUNET_CONFIGURATION_get_value_filename (cfg,
+                                                "NSE",
+                                                 "PROOFFILE",
+                                                 &pwfn))
     {
       GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
-                                 "NSE", "PROOFFILE");
+                                 "NSE",
+                                "PROOFFILE");
       GNUNET_SCHEDULER_shutdown ();
       return;
     }
   }
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Proof of Work file: %s\n", pwfn);
-  if (GNUNET_YES != GNUNET_DISK_file_test (pwfn) ||
-      sizeof (proof) != GNUNET_DISK_fn_read (pwfn, &proof, sizeof (proof)))
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Proof of Work file: %s\n",
+              pwfn);
+  if ( (GNUNET_YES != GNUNET_DISK_file_test (pwfn)) ||
+       (sizeof (proof) !=
+        GNUNET_DISK_fn_read (pwfn, &proof, sizeof (proof))))
     proof = 0;
 
   /* load private key */
   if (NULL == pkfn)
   {
-    if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "PEER",
-                                                              "PRIVATE_KEY",
-                                                              &pkfn))
+    if (GNUNET_OK !=
+       GNUNET_CONFIGURATION_get_value_filename (cfg,
+                                                "PEER",
+                                                "PRIVATE_KEY",
+                                                &pkfn))
     {
       GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
-                                 "PEER", "PRIVATE_KEY");
+                                 "PEER",
+                                "PRIVATE_KEY");
       return;
     }
   }
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Private Key file: %s\n", pkfn);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+             "Private Key file: %s\n",
+             pkfn);
   if (NULL == (pk = GNUNET_CRYPTO_eddsa_key_create_from_file (pkfn)))
   {
-    FPRINTF (stderr, _("Loading hostkey from `%s' failed.\n"), pkfn);
+    FPRINTF (stderr,
+            _("Loading hostkey from `%s' failed.\n"),
+            pkfn);
     GNUNET_free (pkfn);
     return;
   }
   GNUNET_free (pkfn);
   GNUNET_CRYPTO_eddsa_key_get_public (pk, &pub);
   GNUNET_free (pk);
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Peer ID: %s\n",
-              GNUNET_CRYPTO_eddsa_public_key_to_string (&pub));
+  pids = GNUNET_CRYPTO_eddsa_public_key_to_string (&pub);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Peer ID: %s\n",
+              pids);
+  GNUNET_free (pids);
 
   /* get target bit amount */
   if (0 == nse_work_required)
   {
     if (GNUNET_OK !=
-        GNUNET_CONFIGURATION_get_value_number (cfg, "NSE", "WORKBITS",
+        GNUNET_CONFIGURATION_get_value_number (cfg,
+                                              "NSE",
+                                              "WORKBITS",
                                                &nse_work_required))
     {
-      GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, "NSE", "WORKBITS");
+      GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                                "NSE",
+                                "WORKBITS");
       GNUNET_SCHEDULER_shutdown ();
       return;
     }
     if (nse_work_required >= sizeof (struct GNUNET_HashCode) * 8)
     {
-      GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR, "NSE", "WORKBITS",
+      GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
+                                "NSE",
+                                "WORKBITS",
                                 _("Value is too large.\n"));
       GNUNET_SCHEDULER_shutdown ();
       return;
-    } else if (0 == nse_work_required)
+    }
+    else if (0 == nse_work_required)
     {
-      write_proof ();
       GNUNET_SCHEDULER_shutdown ();
       return;
     }
   }
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO,  "Bits: %llu\n", nse_work_required);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Bits: %llu\n",
+              nse_work_required);
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Delay between tries: %s\n",
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Delay between tries: %s\n",
               GNUNET_STRINGS_relative_time_to_string (proof_find_delay, 1));
-  GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_IDLE,
-                                      &find_proof, NULL);
+  proof_task =
+    GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_IDLE,
+                                       &find_proof,
+                                       NULL);
+  GNUNET_SCHEDULER_add_shutdown (&shutdown_task,
+                                NULL);
 }
 
 
@@ -291,11 +326,13 @@ main (int argc, char *const *argv)
   };
   int ret;
 
-  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+  if (GNUNET_OK !=
+      GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
     return 2;
 
   ret = (GNUNET_OK ==
-         GNUNET_PROGRAM_run (argc, argv, "gnunet-scrypt [OPTIONS] prooffile",
+         GNUNET_PROGRAM_run (argc, argv,
+                             "gnunet-scrypt [OPTIONS] prooffile",
                              gettext_noop ("Manipulate GNUnet proof of work files"),
                              options, &run, NULL)) ? 0 : 1;
   GNUNET_free ((void*) argv);
@@ -303,4 +340,4 @@ main (int argc, char *const *argv)
   return ret;
 }
 
-/* end of gnunet-ecc.c */
+/* end of gnunet-scrypt.c */