[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnunet] 09/17: Rewrite of examples/publish.scm, small bug fixes and typ
From: |
Rémi Birot-Delrue |
Subject: |
[gnunet] 09/17: Rewrite of examples/publish.scm, small bug fixes and typos. * examples/publish.scm: rewritten to correctly handle namespaces. * gnu/gnunet/binding-utils.scm: add `or%`. * gnu/gnunet/fs.scm: bug fix: `start-*` function throw an error instead of returning %null-pointer. * gnu/gnunet/identity.scm: typo. |
Date: |
Wed, 12 Aug 2015 18:24:39 +0000 |
remibd pushed a commit to branch master
in repository gnunet.
commit ff8e19b523de9514e48f9c1f136cd471660cad5d
Author: RĂ©mi Birot-Delrue <address@hidden>
Date: Mon Aug 3 12:38:31 2015 +0200
Rewrite of examples/publish.scm, small bug fixes and typos.
* examples/publish.scm: rewritten to correctly handle namespaces.
* gnu/gnunet/binding-utils.scm: add `or%`.
* gnu/gnunet/fs.scm: bug fix: `start-*` function throw an error instead of
returning %null-pointer.
* gnu/gnunet/identity.scm: typo.
---
examples/publish.scm | 189 +++++++++++++++++++++++------------------
gnu/gnunet/binding-utils.scm | 18 ++++-
gnu/gnunet/fs.scm | 37 +++++---
gnu/gnunet/identity.scm | 2 +-
4 files changed, 147 insertions(+), 99 deletions(-)
diff --git a/examples/publish.scm b/examples/publish.scm
index 1dd2192..7ff1e0a 100755
--- a/examples/publish.scm
+++ b/examples/publish.scm
@@ -28,119 +28,139 @@
#:use-module (gnu gnunet identity)
#:export (main))
-(define config-file "~/.gnunet/gnunet.conf")
+(define *index?* #t)
+(define *simulate?* #f)
-(define-syntax-rule (define-parameter name)
- (define name (make-parameter #f)))
+(define *config-file* "~/.gnunet/gnunet.conf")
+(define *config* #f)
-(define *index?* #t)
-(define *simulate?* #t)
+(define *binary-name* #f)
+(define *filename* #f)
+;;+TODO: add kill tasks everywhere!
+;;+TODO: each continuation shalt check its indirect arguments.
;; The kill task is the task that will end the program, either because it has
;; reached a timeout or because it has come to a normal or abnormal ending.
-(define-parameter kill-task)
+(define *kill-task* #f)
-(define-parameter binary-name)
-(define-parameter file-name)
-(define-parameter namespace-name)
-(define-parameter namespace-ego)
-(define-parameter file-identifier)
+(define *namespace-name* #f)
+(define *namespace-ego* #f)
+
+(define *file-identifier* #f)
+
+(define *fs-handle* #f)
+(define *identity-handle* #f)
+(define *publish-handle* #f)
+(define *dir-scanner* #f)
-(define-parameter config-handle)
-(define-parameter fs-handle)
-(define-parameter publish-handle)
-(define-parameter dir-scanner)
(define (main args)
"Entry point of the program."
- (config-handle (load-configuration config-file))
- (call-with-scheduler (config-handle) (first-task args)))
+ (set! *config* (load-configuration *config-file*))
+ (call-with-scheduler *config* (first-task args)))
(define (first-task args)
- "The initial task: parse the command line and call START-PUBLISH-FILE."
+ "The initial task: parse the command line and either find the
+demanded ego or call IDENTITY-CONTINUATION."
(lambda (_)
(match args
- ((binary file namespace identifier)
- (binary-name binary)
- (file-name file)
- (namespace-name namespace)
- (file-identifier identifier)
- (start-ego-lookup (config-handle) (namespace-name) ego-lookup-callback))
- ((binary file)
- (binary-name binary)
- (file-name file)
- (set-next-task! start-publish-file))
+ ((binary filename namespace identifier)
+ (set! *binary-name* binary)
+ (set! *filename* filename)
+ (set! *namespace-name* namespace)
+ (set! *file-identifier* identifier)
+ (set! *identity-handle*
+ (open-identity-service *config* identity-callback))
+ (set! *kill-task*
+ (add-task! (lambda (_)
+ (close-identity-service *identity-handle*))
+ #:delay (* 5 1000 1000))))
+ ((binary file-name)
+ (set! *binary-name* binary)
+ (set! *filename* file-name)
+ (identity-continuation))
((binary . _)
(simple-format #t "Usage: ~a filename [namespace identifier]\n"
- binary)))))
+ binary)
+ (schedule-shutdown!)))))
-(define (ego-lookup-callback ego)
- "The first callback, called once by the ego lookup tasks. Set NAMESPACE-EGO
to
-the right ego, then continue with START-PUBLISH-FILE."
- (cond (ego (namespace-ego ego)
- (set-next-task! start-publish-file))
- (else (simple-format #t "Error: no ego named ~a has been found!\n"
- (namespace-name)))))
+(define (identity-callback ego name)
+ "The first callback, called repeatedly by the identity service. Set
+NAMESPACE-EGO to the right ego, then continue with
+IDENTITY-CONTINUATION."
+ (display "IDENTITY-CALLBACK\n")
+ (cond ((and ego name (string= *namespace-name* name))
+ (set! *namespace-ego* ego))
+ ((and (not ego) (not name)) ; last call
+ (cancel-task! *kill-task*)
+ (identity-continuation))))
-(define (start-publish-file _)
- "The second task: open the filesharing service and start a directory scan on
-FILENAME."
- (fs-handle (open-filesharing-service (config-handle) (binary-name)
- progress-callback))
- (dir-scanner (start-directory-scan (file-name) scan-progress-callback))
- ;; We started a directory scan, need to add a timeout just in case.
- (kill-task (add-task! (lambda (_)
- (stop-directory-scan (dir-scanner))
- (simple-format #t "Stopped directory scanner.\n"))
- #:delay (* 5 1000 1000))))
+(define (identity-continuation)
+ "The second task: open the filesharing service and start a directory
+scan on *FILENAME*."
+ (display "IDENTITY-CONTINUATION\n")
+ (cond
+ ((or (and *namespace-name* *namespace-ego*)
+ (and (not *namespace-name*) (not *namespace-ego*)))
+ (if *namespace-name*
+ (simple-format #t " -> FILENAME ~a\tNAMESPACE ~a\n" *filename*
*namespace-name*)
+ (display " -> FILENAME ~a\n"))
+ (set! *fs-handle* (open-filesharing-service *config* *binary-name*
+ progress-callback))
+ (set! *dir-scanner* (start-directory-scan *filename* dirscan-callback))
+ (set! *kill-task* (add-task! (lambda (_)
+ (display "Stopping directory scan
(unexpected)\n")
+ (stop-directory-scan *dir-scanner*))
+ #:delay (* 5 1000 1000))))
+ (else
+ (simple-format #t "Error: no ego named ~a has been found!\n"
+ *namespace-name*)
+ ;; there’s an error, we must execute the killing task right now
+ (schedule-shutdown!))))
-(define (scan-progress-callback filename directory? reason)
- "The second callback, called repeatedly by the directory scanning tasks: wait
-until the scan is finished, interpret its results and start the publication."
+(define (dirscan-callback filename directory? reason)
+ "The second callback, called repeatedly by the directory scanning
+tasks: wait until the scan is finished, interpret its results and
+start the publication by calling DIRSCAN-CONTINUATION."
+ (simple-format #t "DIRSCAN-CALLBACK(~a ~a ~a)\n" filename directory? reason)
(case reason
((#:finished)
- (let* ((%share-tree (directory-scanner-result (fs-handle) (dir-scanner)))
- (file-info (share-tree->file-information (fs-handle) %share-tree
+ (cancel-task! *kill-task*)
+ (let* ((%share-tree (directory-scanner-result *fs-handle* *dir-scanner*))
+ (file-info (share-tree->file-information *fs-handle* %share-tree
*index?*)))
-
- (publish-handle
- (if (and (namespace-name) (namespace-ego))
- (start-publish (fs-handle)
- (unwrap-file-information file-info)
- #:simulate? *simulate?*
- #:namespace (namespace-ego)
- #:identifier (file-identifier))
- (start-publish (fs-handle)
- (unwrap-file-information file-info)
- #:simulate? *simulate?*)))
-
- ;; now that the scan is finished, we can cancel the previous timeout and
- ;; set a new one that will end the publication
- (cancel-task! (kill-task))
- (kill-task (add-task! (lambda (_)
- (stop-publish (publish-handle))
- (display "Stopped publication.\n"))
- #:delay (* 5 1000 1000)))))
+ (dirscan-continuation file-info)))
((#:internal-error)
- (display "scan-progress-callback: internal error.\n")
- ;; there’s an error, we must execute the killing task right now
- (cancel-task! (kill-task))
- (kill-task (set-next-task! (lambda (_)
- (stop-directory-scan (dir-scanner))
- (display "Stopped directory scanner.\n")))))))
+ (display "dirscan-callback: internal error.\n")
+ (schedule-shutdown!))))
+
+(define (dirscan-continuation file-info)
+ "Start the publication of FILE-INFO."
+ (display "DIRSCAN-CONTINUATION\n")
+ (set! *publish-handle*
+ (start-publish *fs-handle* file-info
+ #:namespace *namespace-ego*
+ #:identifier *file-identifier*
+ #:simulate? *simulate?*))
+ (set! *kill-task* (add-task! (lambda (_)
+ (display "Stopping publication (unexpected)\n")
+ (stop-publish *publish-handle*))
+ #:delay (* 5 1000 1000))))
(define (progress-callback %info)
"The third callback, called repeteadly by the publishing tasks once the
publication is engaged: when the publication starts, print a little something,
and when it’s complete print the published file’s URI and stop the
publication."
+ (display "PROGRESS-CALLBACK\n")
(let ((status (progress-info-status %info)))
(case (cadr status) ; status is of the form (#:publish <something>)
((#:start)
(match (parse-c-progress-info %info)
(((%context %file-info cctx pctx %filename . _) _ _)
- (simple-format #t "Publishing `~a'.\n"
- (pointer->string %filename)))))
+ (simple-format #t "Publishing `~a'.\n" (pointer->string %filename)))))
((#:completed)
+ (display "3\n")
+ (cancel-task! *kill-task*)
(match (parse-c-progress-info %info)
(((%context %file-info cctx pctx %filename _ _ _ _ _ (%chk-uri)) _ _)
(simple-format #t "Published `~a'.\n~a\n" (pointer->string %filename)
@@ -149,7 +169,10 @@ and when it’s complete print the published file’s URI and
stop the publicati
;; it frees the publish-handle that might still be used just after this
;; call to progress-callback ends. Therefore, we continue with a new
kill
;; task.
- (cancel-task! (kill-task))
- (kill-task (set-next-task! (lambda (_) (stop-publish
(publish-handle))))))
- (else
- (simple-format #t "Got status ~a\n" status)))))
+ (set! *kill-task*
+ (set-next-task! (lambda (_)
+ (display "Stopping publication\n")
+ (stop-publish *publish-handle*)))))
+ ((#:stopped)
+ (display "Publication stopped\n")
+ (schedule-shutdown!)))))
diff --git a/gnu/gnunet/binding-utils.scm b/gnu/gnunet/binding-utils.scm
index f82b328..0ab899f 100644
--- a/gnu/gnunet/binding-utils.scm
+++ b/gnu/gnunet/binding-utils.scm
@@ -32,7 +32,8 @@
string->pointer*
pointer->string*
- make-c-struct*))
+ make-c-struct*
+ or%))
(define (getf plist value)
(let ((entry (member value plist)))
@@ -77,3 +78,18 @@ if STRING is empty (\"\")."
(define (pointer->string* ptr)
(if (eq? %null-pointer ptr) #f (pointer->string ptr)))
+
+;; a variant of OR for foreign pointers.
+;; ex: (or% 'a 'b) → A
+;; (or% %null-pointer 'b) → B
+;; (or% %null-pointer %null-pointer) → #f
+(define-syntax or%
+ (syntax-rules ()
+ ((_ x) (let ((x* x))
+ (if (eq? %null-pointer x*)
+ #f
+ x*)))
+ ((_ x y ...) (let ((x* x))
+ (if (eq? %null-pointer x*)
+ (or% y ...)
+ x*)))))
diff --git a/gnu/gnunet/fs.scm b/gnu/gnunet/fs.scm
index 517b554..d32ef09 100644
--- a/gnu/gnunet/fs.scm
+++ b/gnu/gnunet/fs.scm
@@ -216,8 +216,10 @@ PROGRESS-CB must be a procedure of three arguments:
(let ((%filename (string->pointer filename))
(%disable-extractor? (if disable-extractor? gnunet-yes gnunet-no))
(%callback (scan-progress-callback->pointer progress-cb)))
- (%directory-scan-start %filename %disable-extractor? %null-pointer
- %callback %null-pointer)))
+ (or% (%directory-scan-start %filename %disable-extractor? %null-pointer
+ %callback %null-pointer)
+ (throw 'invalid-result "start-directory-scan" "%directory-scan-start"
+ %null-pointer))))
(define (stop-directory-scan scanner)
"Abort a scan.
@@ -238,7 +240,7 @@ callback."
;; is variadic and, hence, not currently handlable by Guile’s Dynamic FFI.
;;
;;+TODO: dynamically allocate the entire structure & client-name, so that we
can
-;; call GNUNET_FS_stop on the returned handle.
+;; call GNUNET_FS_stop on the returned handle.
;;
;;+TODO: replace value for avg_block_latency with a call to a function
;; akin `(time-relative #:minutes 1)`
@@ -273,22 +275,27 @@ GNUNET_FS_ProgressInfo`) that will be called every time
something happens in the
filesharing service (a search is started, a download is completed, etc.)."
(when (null? client-name)
(throw 'invalid-arg "open-filesharing-service" client-name))
- (%fs-start (unwrap-configuration config)
- (string->pointer client-name)
- (progress-callback->pointer progress-callback)))
+ (or% (%fs-start (unwrap-configuration config)
+ (string->pointer client-name)
+ (progress-callback->pointer progress-callback))
+ (throw 'invalid-result "open-filesharing-service" "%fs-start"
+ %null-pointer)))
(define (start-search filesharing-handle uri)
- (%search-start filesharing-handle
- (unwrap-uri uri)
- 0 0 %null-pointer))
+ (or% (%search-start filesharing-handle
+ (unwrap-uri uri)
+ 0 0 %null-pointer)
+ (throw 'invalid-result "start-search" "%search-start" %null-pointer)))
(define (stop-search search-handle)
(%search-stop search-handle))
(define (start-download filesharing-handle uri filename)
- (%download-start filesharing-handle (unwrap-uri uri) %null-pointer
- (string->pointer filename) %null-pointer 0
- (uri-file-size uri) 0 0 %null-pointer %null-pointer))
+ (or% (%download-start filesharing-handle (unwrap-uri uri) %null-pointer
+ (string->pointer filename) %null-pointer 0
+ (uri-file-size uri) 0 0 %null-pointer %null-pointer)
+ (throw 'invalid-result "start-download" "%download-start"
+ %null-pointer)))
(define* (stop-download download-handle #:key delete-incomplete?)
(%download-stop download-handle (if delete-incomplete? gnunet-yes
gnunet-no)))
@@ -315,8 +322,10 @@ identify the publication in place of the extracted
keywords)."
(%update-id (if update-identifier (string->pointer update-identifier)
%null-pointer))
(%simulate? (if simulate? gnunet-yes gnunet-no)))
- (%publish-start filesharing-handle file-information %priv %identifier
- %update-id %simulate?)))
+ (or% (%publish-start filesharing-handle (unwrap-file-information
+ file-information) %priv
%identifier
+ %update-id %simulate?)
+ (throw 'invalid-arg "start-publish" "%publish-start" %null-pointer))))
(define (stop-publish publish-handle)
"Stops a publication.
diff --git a/gnu/gnunet/identity.scm b/gnu/gnunet/identity.scm
index d453e2a..06cfe8c 100644
--- a/gnu/gnunet/identity.scm
+++ b/gnu/gnunet/identity.scm
@@ -116,7 +116,7 @@ IDENTITY-CALLBACK will also be called.
Returns a handle to the “ego retrieving operation” that can be used to
cancel it (see CANCEL-OPERATION!)."
(when (string-null? service)
- (throw 'invalid-arg "open-identity-service" service))
+ (throw 'invalid-arg "get-default-ego" service))
(%identity-get identity-handle (string->pointer service)
(identity-callback->pointer identity-callback) %null-pointer))
- [gnunet] 01/17: Corrects a small bug., (continued)
- [gnunet] 01/17: Corrects a small bug., Rémi Birot-Delrue, 2015/08/12
- [gnunet] 04/17: Add a few utility functions. * binding-utils.scm: add `pointer->string*`. * common.scm: add `bool->int` and `int->bool`, two functions to easily convert `gnunet-ok`, `gnunet-no`, `gnunet-syserror` values to booleans. * fs/uri.scm: export `keyword-list->string`. * tests/uri.scm: test `keyword-list->string`. * scheduler.scm: add `cancel-task!`., Rémi Birot-Delrue, 2015/08/12
- [gnunet] 02/17: API cleanup: separates search and URI, adds sks URIs. * examples/search.scm: echo changes in the API; * gnu/gnunet/common.scm: add ecdsa-public-key? and string->data-pointer; * gnu/gnunet/fs.scm: replace search-service-open with open-filesharing-service, replace start-ksk-search with start-search; * gnu/gnunet/fs/uri.scm: add make-sks-uri-pointer and make-sks-uri; * tests/uri.scm: add tests for make-sks-uri-pointer and make-sks-uri., Rémi Birot-Delrue, 2015/08/12
- [gnunet] 03/17: Bind basic download functionalities * examples/download.scm: a loose `gnunet-download' clone. * system/foreign/unions.scm: add the possibility to specify #f as a union variant to get a padding of the size of the union. * gnu/gnunet/fs/progress-info.scm: just adapted to the modification to unions.scm. * gnu/gnunet/fs/uri.scm: add a few utility functions: `parse-uri' and `uri-file-size'. * gnu/gnunet/fs/fs.scm: add `start-download` and `stop-download`., Rémi Birot-Delrue, 2015/08/12
- [gnunet] 06/17: Bind GNUNET_FS_IDENTITY_* functions and add support for publishing in namespaces. * identity.scm: complete bindings of GNUNET_FS_IDENTITY * fs.scm: add support for egos/namespaces to `start-publish` * binding-utils: remove the useless import of `assert`, Rémi Birot-Delrue, 2015/08/12
- [gnunet] 05/17: Add draft support for indexing/publication. * fs.scm: - add a `<file-information>` type and associated functions (`wrap-file-information`, `unwrap-file-information`, and `make-file-information`); - add incomplete bindings to `GNUNET_FS_directory_scan_*` functions (`start-directory-scan`, `stop-directory-scan`, `directory-scanner-result`) - add `share-tree->file-information` - add `start-publish` and `stop-publish` * examples/publish.scm: a very simple and ugly `gnunet-publish` clone., Rémi Birot-Delrue, 2015/08/12
- [gnunet] 12/17: Complete the container/metadata bindings., Rémi Birot-Delrue, 2015/08/12
- [gnunet] 13/17: Remove `set-next-task!`, as the corresponding functions have been removed from GNUnet., Rémi Birot-Delrue, 2015/08/12
- [gnunet] 07/17: Small bug fixes and add publishing in namespaces for examples/publish.scm * common.scm: add `gnunet-id-ffi` (FFI for libgnunetidentity). * identity.scm: replace `define-gnunet-fs` with `define-gnunet-id`. * fs.scm: corrects a bug in `start-publish` (gave `GNUNET_FS_publish_start` a pointer to the ego in place of a pointer to its private key). * examples/publish.scm: add handling of namespaces and replace simple global variables with parameters., Rémi Birot-Delrue, 2015/08/12
- [gnunet] 08/17: Add `examples/identity.scm`, `examples/identity-bis.scm`, `examples/search-ns.scm`, and a few minor modifications. * examples/search-ns.scm: a basic tool to search namespaces. * examples/identity.scm: a basic tool to list egos. * examples/identity-bis.scm: idem, but using `start-identity-lookup`. * fs/uri.scm: `wrap-uri` throws an `invalid-arg` exception when given a null pointer. * tests/uri.scm: c.f. ↑ * configuration.scm: add `configuration-value-set?`. * identity.scm: add `ecdsa-public-key->string`., Rémi Birot-Delrue, 2015/08/12
- [gnunet] 09/17: Rewrite of examples/publish.scm, small bug fixes and typos. * examples/publish.scm: rewritten to correctly handle namespaces. * gnu/gnunet/binding-utils.scm: add `or%`. * gnu/gnunet/fs.scm: bug fix: `start-*` function throw an error instead of returning %null-pointer. * gnu/gnunet/identity.scm: typo.,
Rémi Birot-Delrue <=
- [gnunet] 14/17: Code cleaning: various improvements and bug fixes. * identity.scm: `open-identity-service` now throws an exception on failure. * binding-utils.scm: just add `destructuring-bind`. * common.scm: `time-rel` now throws an exception instead of returning a meaningless negative result; add `setup-log`. * container/metadata.scm: `metadata-set!` now throws an exception on error. * tests/container-metadata.scm: add tests for `metadata-copy`, `metadata-clear`, `metadata-equal?` and `add-publication-date!`, Rémi Birot-Delrue, 2015/08/12
- [gnunet] 11/17: Add `close-filesharing-service` and dynamic allocation in `open-filesharing-handle`., Rémi Birot-Delrue, 2015/08/12
- [gnunet] 10/17: Add `time-rel` to replace all ad-hoc time calculations., Rémi Birot-Delrue, 2015/08/12
- [gnunet] 17/17: Minor modifications to get all examples working. * binding-utils.scm: add `and=>%` (`and=>` for foreign pointers). * fs/progress-info.scm: bug fix: on '(#:publish #:complete) do not assert any more there’s a SKS URI (we don’t always publish in a namespace). * examples/search.scm: add a one-line help message. * examples/search-ns.scm, examples/publish.scm: typos., Rémi Birot-Delrue, 2015/08/12
- [gnunet] 15/17: Small typo and improvements (add a few time management functions). * common.scm: - add `bool->int` and `int->bool`; - add `time-rel`, `current-time`, `time-absolute->string`, and `time-relative->absolute`. * uri.scm: minor typo and add LOC URIs to `uri-file-size`., Rémi Birot-Delrue, 2015/08/12
- [gnunet] 16/17: Add a record type for GNUNET_FS_ProgressInfo and a few tests. * progress-info.scm: add a record type for `GNUNET_FS_ProgressInfo` and alter `parse-c-progress-info` to handle it. * fs.scm: - correct `make-file-information`; - deprecate directory-scan (too many bugs to fix, `make-file-information will` do for now); - replace `*block-options*` with `make-block-options`; - update `procedure->*` functions to use `parse-c-progress-info`. * examples/*.scm: follow modifications on fs.scm. * tests/progress-info.scm: add a fake progress-info to test `parse-c-progress-info`. * tests/fs.scm: add a small test for `make-file-information`., Rémi Birot-Delrue, 2015/08/12
- Prev by Date:
[gnunet] 08/17: Add `examples/identity.scm`, `examples/identity-bis.scm`, `examples/search-ns.scm`, and a few minor modifications. * examples/search-ns.scm: a basic tool to search namespaces. * examples/identity.scm: a basic tool to list egos. * examples/identity-bis.scm: idem, but using `start-identity-lookup`. * fs/uri.scm: `wrap-uri` throws an `invalid-arg` exception when given a null pointer. * tests/uri.scm: c.f. ↑ * configuration.scm: add `configuration-value-set?`. * identity.scm: add `ecdsa-public-key->string`.
- Next by Date:
[gnunet] 14/17: Code cleaning: various improvements and bug fixes. * identity.scm: `open-identity-service` now throws an exception on failure. * binding-utils.scm: just add `destructuring-bind`. * common.scm: `time-rel` now throws an exception instead of returning a meaningless negative result; add `setup-log`. * container/metadata.scm: `metadata-set!` now throws an exception on error. * tests/container-metadata.scm: add tests for `metadata-copy`, `metadata-clear`, `metadata-equal?` and `add-publication-date!`
- Previous by thread:
[gnunet] 08/17: Add `examples/identity.scm`, `examples/identity-bis.scm`, `examples/search-ns.scm`, and a few minor modifications. * examples/search-ns.scm: a basic tool to search namespaces. * examples/identity.scm: a basic tool to list egos. * examples/identity-bis.scm: idem, but using `start-identity-lookup`. * fs/uri.scm: `wrap-uri` throws an `invalid-arg` exception when given a null pointer. * tests/uri.scm: c.f. ↑ * configuration.scm: add `configuration-value-set?`. * identity.scm: add `ecdsa-public-key->string`.
- Next by thread:
[gnunet] 14/17: Code cleaning: various improvements and bug fixes. * identity.scm: `open-identity-service` now throws an exception on failure. * binding-utils.scm: just add `destructuring-bind`. * common.scm: `time-rel` now throws an exception instead of returning a meaningless negative result; add `setup-log`. * container/metadata.scm: `metadata-set!` now throws an exception on error. * tests/container-metadata.scm: add tests for `metadata-copy`, `metadata-clear`, `metadata-equal?` and `add-publication-date!`
- Index(es):