[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r28643 - gnunet/src/include
From: |
gnunet |
Subject: |
[GNUnet-SVN] r28643 - gnunet/src/include |
Date: |
Thu, 15 Aug 2013 12:09:33 +0200 |
Author: tg
Date: 2013-08-15 12:09:33 +0200 (Thu, 15 Aug 2013)
New Revision: 28643
Modified:
gnunet/src/include/gnunet_env_lib.h
gnunet/src/include/gnunet_multicast_service.h
gnunet/src/include/gnunet_psyc_service.h
gnunet/src/include/gnunet_psycstore_service.h
gnunet/src/include/gnunet_social_service.h
Log:
psycstore: added state_hash_update() and counters_get(); psyc: async
state_get*(); multicast: membership test & replay params
Modified: gnunet/src/include/gnunet_env_lib.h
===================================================================
--- gnunet/src/include/gnunet_env_lib.h 2013-08-15 09:34:28 UTC (rev 28642)
+++ gnunet/src/include/gnunet_env_lib.h 2013-08-15 10:09:33 UTC (rev 28643)
@@ -40,8 +40,6 @@
* Assign value for a persistent state variable.
*
* If an assigned value is NULL, the variable is deleted.
- * If the variable name that comes with thi operator is empty,
- * it means a full state reset, the channel state is zeroed.
*/
GNUNET_ENV_OP_ASSIGN = '=',
Modified: gnunet/src/include/gnunet_multicast_service.h
===================================================================
--- gnunet/src/include/gnunet_multicast_service.h 2013-08-15 09:34:28 UTC
(rev 28642)
+++ gnunet/src/include/gnunet_multicast_service.h 2013-08-15 10:09:33 UTC
(rev 28643)
@@ -394,7 +394,7 @@
/**
- * Call informing multicast about the decision taken for membership test.
+ * Call informing multicast about the decision taken for a membership test.
*
* @param mth Handle that was given for the query.
* @param result #GNUNET_YES if peer was a member, #GNUNET_NO if peer was not
a member,
@@ -412,14 +412,18 @@
* message can be replayed.
*
* @param cls Closure.
- * @param member_id Identity of the member that we want to test.
- * @param fragment_id Message fragment ID for which we want to do the test.
+ * @param member_key Identity of the member that we want to test.
+ * @param message_id Message ID for which to perform the test.
+ * @param group_generation Group generation of the message. It has relevance if
+ * the message consists of multiple fragments with different group
+ * generations.
* @param mth Handle to give to GNUNET_MULTICAST_membership_test_answer().
*/
typedef void
(*GNUNET_MULTICAST_MembershipTestCallback) (void *cls,
const struct
GNUNET_CRYPTO_EccPublicKey *member_key,
- uint64_t fragment_id,
+ uint64_t message_id,
+ uint64_t group_generation,
struct
GNUNET_MULTICAST_MembershipTestHandle *mth);
@@ -472,13 +476,17 @@
* group is left, the replay handle must no longer be used.
*
* @param cls Closure (set from GNUNET_MULTICAST_origin_start()
- * or GNUNET_MULTICAST_member_join()).
+ * or GNUNET_MULTICAST_member_join()).
* @param fragment_id Which message fragment should be replayed.
+ * @param message_id Which message should be replayed.
+ * @param flags Flags for the replay.
* @param rh Handle to pass to message transmit function.
*/
typedef void
(*GNUNET_MULTICAST_ReplayCallback) (void *cls,
uint64_t fragment_id,
+ uint64_t message_id,
+ uint64_t flags,
struct GNUNET_MULTICAST_ReplayHandle *rh);
@@ -517,6 +525,9 @@
/**
* Replay a message from the multicast group.
*
+ * FIXME: use notify callbacks here too (or in a replay2() function),
+ * to be able to use the replay functionality for state sync as well.
+ *
* @param rh Replay handle identifying which replay operation was requested.
* @param msg Replayed message fragment, NULL if unknown/error.
* @param ec Error code.
@@ -545,6 +556,9 @@
* FIXME: we'll likely want to use NOT the p521 curve here, but a
cheaper
* one in the future.
* @param policy Group policy specifying join and history restrictions.
+ * FIXME: needed? Ít would be enough to have this on the PSYC layer, as
+ * access control to enforce the policy is done by the membership test
+ * and join request callbacks of the API.
* @param last_fragment_id Last fragment ID to continue counting fragments from
* when restarting the origin. 0 for a new group.
* @param join_cb Function called to approve / disapprove joining of a peer.
@@ -689,14 +703,25 @@
* needed and not known to the client.
*
* @param member Membership handle.
- * @param message_id ID of a message that this client would like to see
replayed.
+ * @param fragment_id ID of a message fragment that this client would like to
+ see replayed.
+ * @param message_id ID of a message that this client would like to see
+ * replayed. Typically only one of the @a fragment_id and @a message_id
+ * is given. Specifying a @a message_id would return the last fragment
+ * of the message, which allows requesting the preceding fragments of
the
+ * message by looking at the @e fragment_delta header field.
+ * @param flags Additional flags for the replay request. It is used & defined
+ * by the replay callback. E.g. the PSYC service would use this to
+ * implement state synchronization.
* @param message_cb Function to be called for the replayed message.
* @param message_cb_cls Closure for @a message_cb.
* @return Replay request handle, NULL on error.
*/
struct GNUNET_MULTICAST_MemberReplayHandle *
GNUNET_MULTICAST_member_request_replay (struct GNUNET_MULTICAST_Member *member,
+ uint64_t fragment_id,
uint64_t message_id,
+ uint64_t flags,
GNUNET_MULTICAST_MessageCallback
message_cb,
void *message_cb_cls);
Modified: gnunet/src/include/gnunet_psyc_service.h
===================================================================
--- gnunet/src/include/gnunet_psyc_service.h 2013-08-15 09:34:28 UTC (rev
28642)
+++ gnunet/src/include/gnunet_psyc_service.h 2013-08-15 10:09:33 UTC (rev
28643)
@@ -304,6 +304,11 @@
* transmitting this message.
*/
GNUNET_PSYC_MASTER_TRANSMIT_INC_GROUP_GEN = 1 << 1,
+
+ /**
+ * Add PSYC header variable with the hash of the current channel state.
+ */
+ GNUNET_PSYC_MASTER_TRANSMIT_ADD_STATE_HASH = 1 << 2
};
@@ -564,9 +569,10 @@
* Function called to inform a member about stored state values for a channel.
*
* @param cls Closure.
- * @param name Name of the state variable.
+ * @param name Name of the state variable. A NULL value indicates that there
+ * are no more state variables to be returned.
+ * @param value_size Number of bytes in @a value.
* @param value Value of the state variable.
- * @param value_size Number of bytes in @a value.
*/
typedef void
(*GNUNET_PSYC_StateCallback) (void *cls,
@@ -575,6 +581,15 @@
const void *value);
+/**
+ * Function called when a requested operation has finished.
+ *
+ * @param cls Closure.
+ */
+typedef void
+(*GNUNET_PSYC_FinishCallback) (void *cls);
+
+
/**
* Handle to a story telling operation.
*/
@@ -593,14 +608,13 @@
* @param start_message_id Earliest interesting point in history.
* @param end_message_id Last (exclusive) interesting point in history.
* @param method Function to invoke on messages received from the story.
- * @param method_cls Closure for @a method.
* @param finish_cb Function to call when the requested story has been fully
* told (counting message IDs might not suffice, as some messages
* might be secret and thus the listener would not know the story is
* finished without being told explicitly); once this function
* has been called, the client must not call
* GNUNET_PSYC_channel_story_tell_cancel() anymore.
- * @param finish_cb_cls Closure to finish_cb.
+ * @param cls Closure for the callbacks.
* @return Handle to cancel story telling operation.
*/
struct GNUNET_PSYC_Story *
@@ -608,9 +622,8 @@
uint64_t start_message_id,
uint64_t end_message_id,
GNUNET_PSYC_Method method,
- void *method_cls,
- void (*finish_cb)(void *),
- void *finish_cb_cls);
+ GNUNET_PSYC_FinishCallback *finish_cb,
+ void *cls);
/**
@@ -624,59 +637,63 @@
void
GNUNET_PSYC_channel_story_tell_cancel (struct GNUNET_PSYC_Story *story);
+struct GNUNET_PSYC_StateQuery;
+
/**
- * Call the given callback on all matching values (including variables) in the
- * channel state.
+ * Return all channel state variables whose name matches a given prefix.
*
- * The callback is invoked synchronously on all matching states (as the state
is
- * fully replicated in the library in this process; channel states should be
- * small, large data is to be passed as streaming data to methods).
- *
- * A name matches if it includes the @a state_name prefix, thus requesting the
- * empty state ("") will match all values; requesting "_a_b" will also return
+ * A name matches if it starts with the given @a name_prefix, thus requesting
the
+ * empty prefix ("") will match all values; requesting "_a_b" will also return
* values stored under "_a_b_c".
*
+ * The @a state_cb is invoked on all matching state variables asynchronously,
as
+ * the state is stored in and retrieved from the PSYCstore,
+ *
* @param channel Channel handle.
- * @param state_name Name of the state to query (full name
- * might be longer, this is only the prefix that must match).
- * @param cb Function to call on the matching state values.
- * @param cb_cls Closure for @a cb.
- * @return Message ID for which the state was returned (last seen
- * message ID).
+ * @param name_prefix Prefix of the state variable name to match.
+ * @param cb Function to call with the matching state variables.
+ * @param cb_cls Closure for the callbacks.
+ * @return Handle that can be used to cancel the query operation.
*/
-uint64_t
+struct GNUNET_PSYC_StateQuery *
GNUNET_PSYC_channel_state_get_all (struct GNUNET_PSYC_Channel *channel,
- const char *state_name,
+ const char *name_prefix,
GNUNET_PSYC_StateCallback cb,
void *cb_cls);
/**
- * Obtain the current value of the best-matching value in the state
- * (including variables).
+ * Retrieve the best matching channel state variable.
*
- * Note that variables are only valid during a #GNUNET_PSYC_Method invocation,
as
- * variables are only valid for the duration of a method invocation.
+ * If the requested variable name is not present in the state, the nearest
+ * less-specific name is matched; for example, requesting "_a_b" will match
"_a"
+ * if "_a_b" does not exist.
*
- * If the requested variable name does not have an exact state in
- * the state, the nearest less-specific name is matched; for example,
- * requesting "_a_b" will match "_a" if "_a_b" does not exist.
- *
* @param channel Channel handle.
- * @param variable_name Name of the variable to query.
- * @param[out] return_value_size Set to number of bytes in variable,
- * needed as variables might contain binary data and
- * might also not be 0-terminated; set to 0 on errors.
- * @return NULL on error (no matching state or variable), pointer
- * to the respective value otherwise.
+ * @param full_name Full name of the requested variable, the actual variable
+ * returned might have a shorter name..
+ * @param cb Function called once when a matching state variable is found.
+ * Not called if there's no matching state variable.
+ * @param cb_cls Closure for the callbacks.
+ * @return Handle that can be used to cancel the query operation.
*/
-const void *
+struct GNUNET_PSYC_StateQuery *
GNUNET_PSYC_channel_state_get (struct GNUNET_PSYC_Channel *channel,
- const char *variable_name,
- size_t *return_value_size);
+ const char *full_name,
+ GNUNET_PSYC_StateCallback cb,
+ void *cb_cls);
+/**
+ * Cancel a state query operation.
+ *
+ * @param query Handle for the operation to cancel.
+ */
+void
+GNUNET_PSYC_channel_state_get_cancel (struct GNUNET_PSYC_StateQuery *query);
+
+
#if 0 /* keep Emacsens' auto-indent happy */
{
#endif
Modified: gnunet/src/include/gnunet_psycstore_service.h
===================================================================
--- gnunet/src/include/gnunet_psycstore_service.h 2013-08-15 09:34:28 UTC
(rev 28642)
+++ gnunet/src/include/gnunet_psycstore_service.h 2013-08-15 10:09:33 UTC
(rev 28643)
@@ -76,15 +76,54 @@
/**
+ * Callback used to return the latest value of counters of a channel.
+ *
+ * @see GNUNET_PSYCSTORE_counters_get()
+ *
+ * @param *cls Closure.
+ * @param fragment_id Latest message fragment ID, used by multicast.
+ * @param message_id Latest message ID, used by PSYC.
+ * @param group_generation Latest group generation, used by PSYC.
+ */
+typedef void
+(*GNUNET_PSYCSTORE_CountersCallback) (void *cls,
+ uint64_t fragment_id,
+ uint64_t message_id,
+ uint64_t group_generation);
+
+
+/**
+ * Retrieve latest values of counters for a channel.
+ *
+ * The current value of counters are needed when a channel master is restarted,
+ * so that it can continue incrementing the counters from their last value.
+ *
+ * @param h Handle for the PSYCstore.
+ * @param channel_key Public key that identifies the channel.
+ * @param cb Callback to call with the result.
+ * @param cb_cls Closure for the callback.
+ *
+ * @return
+ */
+struct GNUNET_PSYCSTORE_OperationHandle *
+GNUNET_PSYCSTORE_counters_get (struct GNUNET_PSYCSTORE_Handle *h,
+ GNUNET_CRYPTO_EccPublicKey *channel_key,
+ GNUNET_PSYCSTORE_CountersCallback *cb,
+ void *cb_cls);
+
+
+/**
* Function called with the result of an asynchronous operation.
*
* @param result #GNUNET_SYSERR on error,
* #GNUNET_YES on success or if the peer was a member,
* #GNUNET_NO if the peer was not a member
*/
-typedef void (*GNUNET_PSYCSTORE_ResultCallback)(void *cls,
- int result);
+typedef void
+(*GNUNET_PSYCSTORE_ResultCallback) (void *cls,
+ int result);
+
/**
* Store join/leave events for a PSYC channel in order to be able to answer
* membership test queries later.
@@ -92,9 +131,12 @@
* @param h Handle for the PSYCstore.
* @param channel_key The channel where the event happened.
* @param slave_key Public key of joining/leaving slave.
+ * @param did_join #GNUNET_YES on join, #GNUNET_NO on part.
* @param announced_at ID of the message that announced the membership change.
* @param effective_since Message ID this membership change is in effect since.
- * @param did_join #GNUNET_YES on join, #GNUNET_NO on part.
+ * @param group_generation In case of a part, the last group generation the
+ * slave has access to. It has relevance when a larger message have
+ * fragments with different group generations.
* @param rcb Callback to call with the result of the storage operation.
* @param rcb_cls Closure for the callback.
*
@@ -104,24 +146,26 @@
GNUNET_PSYCSTORE_membership_store (struct GNUNET_PSYCSTORE_Handle *h,
const struct GNUNET_CRYPTO_EccPublicKey
*channel_key,
const struct GNUNET_CRYPTO_EccPublicKey
*slave_key,
+ int did_join,
uint64_t announced_at,
uint64_t effective_since,
- int did_join,
+ uint64_t group_generation,
GNUNET_PSYCSTORE_ResultCallback rcb,
void *rcb_cls);
/**
- * Test if a peer was a member of the channel when the message fragment with
the
- * specified ID was sent to the channel.
+ * Test if a peer was a member of the channel during the given period
specified by the group generation.
*
- * This is useful in case of retransmissions to check if the peer was
authorized
- * to see the requested message.
+ * This is useful when relaying and replaying messages to check if a
particular slave has access to the message fragment with a given group
generation. It is also used when handling join requests to determine whether
the slave is currently admitted to the channel.
*
* @param h Handle for the PSYCstore.
* @param channel_key The channel we are interested in.
* @param slave_key Public key of slave whose membership to check.
- * @param fragment_id Message fragment ID to check.
+ * @param message_id Message ID for which to do the membership test.
+ * @param group_generation Group generation of the fragment of the message to
+ * test. It has relevance if the message consists of multiple fragments
+ * with different group generations.
* @param rcb Callback to call with the test result.
* @param rcb_cls Closure for the callback.
*
@@ -131,7 +175,8 @@
GNUNET_PSYCSTORE_membership_test (struct GNUNET_PSYCSTORE_Handle *h,
const struct GNUNET_CRYPTO_EccPublicKey
*channel_key,
const struct GNUNET_CRYPTO_EccPublicKey
*slave_key,
- uint64_t fragment_id,
+ uint64_t message_id,
+ uint64_t group_generation,
GNUNET_PSYCSTORE_ResultCallback rcb,
void *rcb_cls);
@@ -160,12 +205,14 @@
* GNUNET_PSYCSTORE_fragment_get() or GNUNET_PSYCSTORE_message_get() call.
*
* @param cls Closure.
- * @param message The retrieved message fragment.
+ * @param message The retrieved message fragment. A NULL value indicates that
+ * there are no more results to be returned.
* @param flags Message flags indicating fragmentation status.
*/
-typedef void (*GNUNET_PSYCSTORE_FragmentResultCallback)(void *cls,
- const struct
GNUNET_MULTICAST_MessageHeader *message,
- enum
GNUNET_PSYC_MessageFlags flags);
+typedef void
+(*GNUNET_PSYCSTORE_FragmentCallback) (void *cls,
+ const struct
GNUNET_MULTICAST_MessageHeader *message,
+ enum GNUNET_PSYC_MessageFlags flags);
/**
@@ -174,8 +221,8 @@
* @param h Handle for the PSYCstore.
* @param channel_key The channel we are interested in.
* @param fragment_id Fragment ID to check. Use 0 to get the latest message
fragment.
- * @param rcb Callback to call with the result of the operation.
- * @param rcb_cls Closure for the callback.
+ * @param cb Callback to call with the retrieved fragment.
+ * @param cb_cls Closure for the callback.
*
* @return Handle that can be used to cancel the operation.
*/
@@ -183,8 +230,8 @@
GNUNET_PSYCSTORE_fragment_get (struct GNUNET_PSYCSTORE_Handle *h,
const struct GNUNET_CRYPTO_EccPublicKey
*channel_key,
uint64_t fragment_id,
- GNUNET_PSYCSTORE_FragmentResultCallback rcb,
- void *rcb_cls);
+ GNUNET_PSYCSTORE_FragmentCallback cb,
+ void *cb_cls);
/**
@@ -193,8 +240,8 @@
* @param h Handle for the PSYCstore.
* @param channel_key The channel we are interested in.
* @param message_id Message ID to check. Use 0 to get the latest message.
- * @param rcb Callback to call with the result of the operation.
- * @param rcb_cls Closure for the callback.
+ * @param cb Callback to call with the retrieved fragments.
+ * @param cb_cls Closure for the callback.
*
* @return Handle that can be used to cancel the operation.
*/
@@ -202,25 +249,22 @@
GNUNET_PSYCSTORE_message_get (struct GNUNET_PSYCSTORE_Handle *h,
const struct GNUNET_CRYPTO_EccPublicKey
*channel_key,
uint64_t message_id,
- GNUNET_PSYCSTORE_FragmentResultCallback rcb,
- void *rcb_cls);
+ GNUNET_PSYCSTORE_FragmentCallback cb,
+ void *cb_cls);
/**
- * Modify the channel state.
+ * Apply modifiers of a message to the current channel state.
*
- * Applies the operation to the current channel state.
- *
* An error is returned if there are missing messages containing state
* operations before the current one.
*
* @param h Handle for the PSYCstore.
* @param channel_key The channel we are interested in.
- * @param message_id ID of the message that contains this state modifier.
- * @param oper Operation to perform.
- * @param name Name of variable.
- * @param value_size Size of @a value.
- * @param value Value of variable.
+ * @param message_id ID of the message that contains the @a modifiers.
+ * @param state_delta Value of the _state_delta PSYC header variable of the
message.
+ * @param modifier_count Number of elements in the @a modifiers array.
+ * @param modifiers List of modifiers to apply.
* @param rcb Callback to call with the result of the operation.
* @param rcb_cls Closure for the callback.
*
@@ -230,37 +274,58 @@
GNUNET_PSYCSTORE_state_modify (struct GNUNET_PSYCSTORE_Handle *h,
const struct GNUNET_CRYPTO_EccPublicKey
*channel_key,
uint64_t message_id,
- enum GNUNET_ENV_Operator *oper,
- const char *name,
- size_t value_size,
- const void *value,
+ uint64_t state_delta,
+ size_t modifier_count,
+ const struct GNUNET_ENV_Modifier *modifiers,
GNUNET_PSYCSTORE_ResultCallback rcb,
void *rcb_cls);
/**
+ * Update signed values of state variables in the state store.
+ *
+ * @param h Handle for the PSYCstore.
+ * @param channel_key The channel we are interested in.
+ * @param message_id Message ID that contained the state @a hash.
+ * @param hash Hash of the serialized full state.
+ * @param rcb Callback to call with the result of the operation.
+ * @param rcb_cls Closure for the callback.
+ *
+ */
+struct GNUNET_PSYCSTORE_OperationHandle *
+GNUNET_PSYCSTORE_state_hash_update (struct GNUNET_PSYCSTORE_Handle *h,
+ const struct GNUNET_CRYPTO_EccPublicKey
*channel_key,
+ uint64_t message_id,
+ const struct GNUNET_HashCode *hash,
+ GNUNET_PSYCSTORE_ResultCallback rcb,
+ void *rcb_cls);
+
+
+/**
* Function called with the value of a state variable.
*
* @param cls Closure.
- * @param name Name of variable.
- * @param size Size of @a value.
- * @param value Value of variable.
+ * @param name Name of the state variable. A NULL value indicates that there
are no more
+ * state variables to be returned.
+ * @param value_size Number of bytes in @a value.
+ * @param value Value of the state variable.
t *
*/
-typedef void (*GNUNET_PSYCSTORE_StateResultCallback)(void *cls,
- const char *name,
- size_t size,
- const void *value);
+typedef void
+(*GNUNET_PSYCSTORE_StateCallback) (void *cls,
+ const char *name,
+ size_t value_size,
+ const void *value);
/**
- * Retrieve the given state variable for a channel.
+ * Retrieve the best matching state variable.
*
* @param h Handle for the PSYCstore.
* @param channel_key The channel we are interested in.
- * @param name Name of variable to get.
- * @param rcb Callback to call with the result.
- * @param rcb_cls Closure for the callback.
+ * @param name Name of variable to match, the returned variable might be less
specific.
+ * @param cb Callback to return matching state variables.
+ * @param cb_cls Closure for the callback.
*
* @return Handle that can be used to cancel the operation.
*/
@@ -268,25 +333,27 @@
GNUNET_PSYCSTORE_state_get (struct GNUNET_PSYCSTORE_Handle *h,
const struct GNUNET_CRYPTO_EccPublicKey
*channel_key,
const char *name,
- GNUNET_PSYCSTORE_StateResultCallback rcb,
- void *rcb_cls);
+ GNUNET_PSYCSTORE_StateCallback cb,
+ void *cb_cls);
/**
- * Retrieve all state variables for a channel.
+ * Retrieve all state variables for a channel with the given prefix.
*
* @param h Handle for the PSYCstore.
* @param channel_key The channel we are interested in.
- * @param rcb Callback to call with the result.
- * @param rcb_cls Closure for the callback.
+ * @param name_prefix Prefix of state variable names to match.
+ * @param cb Callback to return matching state variables.
+ * @param cb_cls Closure for the callback.
*
* @return Handle that can be used to cancel the operation.
*/
struct GNUNET_PSYCSTORE_OperationHandle *
GNUNET_PSYCSTORE_state_get_all (struct GNUNET_PSYCSTORE_Handle *h,
const struct GNUNET_CRYPTO_EccPublicKey
*channel_key,
- GNUNET_PSYCSTORE_StateResultCallback rcb,
- void *rcb_cls);
+ const char *name_prefix,
+ GNUNET_PSYCSTORE_StateCallback cb,
+ void *cb_cls);
/**
Modified: gnunet/src/include/gnunet_social_service.h
===================================================================
--- gnunet/src/include/gnunet_social_service.h 2013-08-15 09:34:28 UTC (rev
28642)
+++ gnunet/src/include/gnunet_social_service.h 2013-08-15 10:09:33 UTC (rev
28643)
@@ -300,7 +300,7 @@
* Suitable, for example, to be used with GNUNET_NAMESTORE_zone_to_name().
*
* @param nym Pseudonym to map to a cryptographic identifier.
- * @param[out] identity Set to the public key of the nym.
+ * @param[out] nym_key Set to the public key of the nym.
*/
void
GNUNET_SOCIAL_nym_get_key (struct GNUNET_SOCIAL_Nym *nym,
@@ -342,7 +342,7 @@
* New objects can be still added to the now empty home using the @e env
* parameter of the same announcement.
*/
- GNUNET_SOCIAL_ANNOUNCEMENT_CLEAR_OBJECTS = 1 << 0,
+ GNUNET_SOCIAL_ANNOUNCEMENT_CLEAR_OBJECTS = 1 << 0
};
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r28643 - gnunet/src/include,
gnunet <=