X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fsocial%2Fgnunet-service-social.c;h=e6ee24a4fd5dbc2b5ef462b969590b5ea1b6f892;hb=2105059516320800eaa8fff1196b58f29a50ba7c;hp=ede1b0104434c1ec62c5d9c79d27f88822f74bad;hpb=b402cb83245e4c62b1bb62c2915c67bf7d2465f2;p=oweals%2Fgnunet.git diff --git a/src/social/gnunet-service-social.c b/src/social/gnunet-service-social.c index ede1b0104..e6ee24a4f 100644 --- a/src/social/gnunet-service-social.c +++ b/src/social/gnunet-service-social.c @@ -31,7 +31,6 @@ #include "gnunet_util_lib.h" #include "gnunet_constants.h" #include "gnunet_protocols.h" -#include "gnunet_core_service.h" #include "gnunet_identity_service.h" #include "gnunet_namestore_service.h" #include "gnunet_gns_service.h" @@ -47,8 +46,12 @@ */ static const struct GNUNET_CONFIGURATION_Handle *cfg; +/** + * Service handle. + */ +static struct GNUNET_SERVICE_Handle *service; + /* Handles to other services */ -static struct GNUNET_CORE_Handle *core; static struct GNUNET_IDENTITY_Handle *id; static struct GNUNET_GNS_Handle *gns; static struct GNUNET_NAMESTORE_Handle *namestore; @@ -59,11 +62,6 @@ static struct GNUNET_STATISTICS_Handle *stats; */ static struct GNUNET_PeerIdentity this_peer; -/** - * Notification context, simplifies client broadcasts. - */ -static struct GNUNET_SERVER_NotificationContext *nc; - /** * All connected hosts. * H(place_pub_key) -> struct Host @@ -139,7 +137,7 @@ struct FragmentTransmitQueue struct FragmentTransmitQueue *prev; struct FragmentTransmitQueue *next; - struct GNUNET_SERVER_Client *client; + struct GNUNET_SERVICE_Client *client; /** * Pointer to the next message part inside the data after this struct. @@ -171,7 +169,7 @@ struct MessageTransmitQueue struct FragmentTransmitQueue *frags_head; struct FragmentTransmitQueue *frags_tail; - struct GNUNET_SERVER_Client *client; + struct GNUNET_SERVICE_Client *client; }; /** @@ -182,7 +180,7 @@ struct ClientListItem struct ClientListItem *prev; struct ClientListItem *next; - struct GNUNET_SERVER_Client *client; + struct GNUNET_SERVICE_Client *client; }; @@ -250,11 +248,6 @@ struct Place */ uint8_t file_save; - /** - * Is this a host (#GNUNET_YES), or guest (#GNUNET_NO)? - */ - uint8_t is_host; - /** * Is this place ready to receive messages from client? * #GNUNET_YES or #GNUNET_NO @@ -266,6 +259,16 @@ struct Place * #GNUNET_YES or #GNUNET_NO */ uint8_t is_disconnected; + + /** + * Is this a host (#GNUNET_YES), or guest (#GNUNET_NO)? + */ + uint8_t is_host; + + union { + struct Host *host; + struct Guest *guest; + }; }; @@ -277,7 +280,7 @@ struct Host /** * Place struct common for Host and Guest */ - struct Place plc; + struct Place place; /** * Handle for the multicast origin. @@ -315,7 +318,7 @@ struct Guest /** * Place struct common for Host and Guest. */ - struct Place plc; + struct Place place; /** * Handle for the PSYC slave. @@ -364,10 +367,15 @@ struct Guest */ struct Client { + /** + * Client handle. + */ + struct GNUNET_SERVICE_Client *client; + /** * Place where the client entered. */ - struct Place *plc; + struct Place *place; /** * Message queue for the message currently being transmitted @@ -397,8 +405,7 @@ struct Ego { struct OperationClosure { - struct GNUNET_SERVER_Client *client; - struct Place *plc; + struct Client *client; uint64_t op_id; uint32_t flags; }; @@ -419,7 +426,7 @@ cleanup_place (void *cls); static struct MessageTransmitQueue * psyc_transmit_queue_message (struct Place *plc, - struct GNUNET_SERVER_Client *client, + struct GNUNET_SERVICE_Client *client, size_t data_size, const void *data, uint16_t first_ptype, uint16_t last_ptype, @@ -449,16 +456,6 @@ shutdown_task (void *cls) GNUNET_CONTAINER_multihashmap_iterate (hosts, place_entry_cleanup, NULL); GNUNET_CONTAINER_multihashmap_iterate (guests, place_entry_cleanup, NULL); - if (NULL != nc) - { - GNUNET_SERVER_notification_context_destroy (nc); - nc = NULL; - } - if (NULL != core) - { - GNUNET_CORE_disconnect (core); - core = NULL; - } if (NULL != id) { GNUNET_IDENTITY_disconnect (id); @@ -488,7 +485,7 @@ shutdown_task (void *cls) static void cleanup_host (struct Host *hst) { - struct Place *plc = &hst->plc; + struct Place *plc = &hst->place; if (NULL != hst->master) GNUNET_PSYC_master_stop (hst->master, GNUNET_NO, NULL, NULL); // FIXME @@ -504,10 +501,10 @@ cleanup_host (struct Host *hst) static void cleanup_guest (struct Guest *gst) { - struct Place *plc = &gst->plc; + struct Place *plc = &gst->place; struct GNUNET_CONTAINER_MultiHashMap * plc_gst = GNUNET_CONTAINER_multihashmap_get (place_guests, - &plc->pub_key_hash); + &plc->pub_key_hash); GNUNET_assert (NULL != plc_gst); // FIXME GNUNET_CONTAINER_multihashmap_remove (plc_gst, &plc->ego_pub_hash, gst); @@ -556,30 +553,22 @@ cleanup_place (void *cls) * Called whenever a client is disconnected. * Frees our resources associated with that client. * - * @param cls Closure. - * @param client Identification of the client. + * @param cls closure + * @param client identification of the client + * @param app_ctx must match @a client */ static void -client_disconnect (void *cls, struct GNUNET_SERVER_Client *client) +client_notify_disconnect (void *cls, + struct GNUNET_SERVICE_Client *client, + void *app_ctx) { - if (NULL == client) - return; - - struct Client * - ctx = GNUNET_SERVER_client_get_user_context (client, struct Client); - if (NULL == ctx) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%p User context is NULL in client_disconnect()\n", ctx); - return; - } - - struct Place *plc = ctx->plc; + struct Client *c = app_ctx; + struct Place *plc = c->place; - if (NULL != ctx->app_id) - GNUNET_free (ctx->app_id); + if (NULL != c->app_id) + GNUNET_free (c->app_id); - GNUNET_free (ctx); + GNUNET_free (c); if (NULL == plc) return; // application client, nothing to do @@ -603,15 +592,40 @@ client_disconnect (void *cls, struct GNUNET_SERVER_Client *client) } +/** + * A new client connected. + * + * @param cls NULL + * @param client client to add + * @param mq message queue for @a client + * @return @a client + */ +static void * +client_notify_connect (void *cls, + struct GNUNET_SERVICE_Client *client, + struct GNUNET_MQ_Handle *mq) +{ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client connected: %p\n", client); + + struct Client *c = GNUNET_malloc (sizeof (*c)); + c->client = client; + + return c; +} + + /** * Send message to a client. */ static inline void -client_send_msg (struct GNUNET_SERVER_Client *client, +client_send_msg (struct GNUNET_SERVICE_Client *client, const struct GNUNET_MessageHeader *msg) { - GNUNET_SERVER_notification_context_add (nc, client); - GNUNET_SERVER_notification_context_unicast (nc, client, msg, GNUNET_NO); + struct GNUNET_MQ_Envelope * + env = GNUNET_MQ_msg_copy (msg); + + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); } @@ -649,7 +663,7 @@ place_send_msg (const struct Place *plc, * Size of @a data. */ static void -client_send_result (struct GNUNET_SERVER_Client *client, uint64_t op_id, +client_send_result (struct GNUNET_SERVICE_Client *client, uint64_t op_id, int64_t result_code, const void *data, uint16_t data_size) { struct GNUNET_OperationResultMessage *res; @@ -660,7 +674,7 @@ client_send_result (struct GNUNET_SERVER_Client *client, uint64_t op_id, res->result_code = GNUNET_htonll (result_code); res->op_id = op_id; if (0 < data_size) - memcpy (&res[1], data, data_size); + GNUNET_memcpy (&res[1], data, data_size); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Sending result to client for operation #%" PRIu64 ": " @@ -673,10 +687,10 @@ client_send_result (struct GNUNET_SERVER_Client *client, uint64_t op_id, static void -client_send_host_enter_ack (struct GNUNET_SERVER_Client *client, +client_send_host_enter_ack (struct GNUNET_SERVICE_Client *client, struct Host *hst, uint32_t result) { - struct Place *plc = &hst->plc; + struct Place *plc = &hst->place; struct HostEnterAck hack; hack.header.type = htons (GNUNET_MESSAGE_TYPE_SOCIAL_HOST_ENTER_ACK); @@ -699,7 +713,7 @@ static void psyc_master_started (void *cls, int result, uint64_t max_message_id) { struct Host *hst = cls; - struct Place *plc = &hst->plc; + struct Place *plc = &hst->place; plc->max_message_id = max_message_id; plc->is_ready = GNUNET_YES; @@ -722,7 +736,7 @@ psyc_recv_join_request (void *cls, GNUNET_CRYPTO_hash (slave_key, sizeof (*slave_key), &slave_key_hash); GNUNET_CONTAINER_multihashmap_put (hst->join_reqs, &slave_key_hash, jh, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); - place_send_msg (&hst->plc, &req->header); + place_send_msg (&hst->place, &req->header); } @@ -733,7 +747,7 @@ static void psyc_slave_connected (void *cls, int result, uint64_t max_message_id) { struct Guest *gst = cls; - struct Place *plc = &gst->plc; + struct Place *plc = &gst->place; plc->max_message_id = max_message_id; plc->is_ready = GNUNET_YES; @@ -757,7 +771,7 @@ psyc_recv_join_dcsn (void *cls, const struct GNUNET_PSYC_Message *join_msg) { struct Guest *gst = cls; - place_send_msg (&gst->plc, &dcsn->header); + place_send_msg (&gst->place, &dcsn->header); } @@ -809,20 +823,24 @@ host_relay_message_part (struct Host *hst, if (GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD == ptype) { /* FIXME: last message was unfinished, cancel & remove from queue */ + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "FIXME: last message was unfinished.\n"); } - tmit_msg = psyc_transmit_queue_message (&hst->plc, NULL, ntohs (pmsg->size), + tmit_msg = psyc_transmit_queue_message (&hst->place, NULL, ntohs (pmsg->size), pmsg, ptype, ptype, tmit_msg); switch (ptype) { case GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD: - GNUNET_CONTAINER_multihashmap_put (hst->relay_msgs, &nym_pub_hash, tmit_msg, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); + GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multihashmap_put + (hst->relay_msgs, &nym_pub_hash, tmit_msg, + GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); break; case GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_END: case GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_CANCEL: - GNUNET_CONTAINER_multihashmap_remove (hst->relay_msgs, &nym_pub_hash, tmit_msg); + GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove + (hst->relay_msgs, &nym_pub_hash, tmit_msg)); break; } } @@ -841,7 +859,7 @@ place_recv_relay_method (void *cls, struct Place *plc = cls; if (GNUNET_PSYC_MESSAGE_REQUEST & ntohs (msg->flags) - && GNUNET_YES == plc->is_host); + && GNUNET_YES == plc->is_host) { struct Host *hst = cls; host_relay_message_part (hst, &meth->header, &msg->slave_pub_key); @@ -866,7 +884,7 @@ place_recv_relay_modifier (void *cls, struct Place *plc = cls; if (GNUNET_PSYC_MESSAGE_REQUEST & ntohs (msg->flags) - && GNUNET_YES == plc->is_host); + && GNUNET_YES == plc->is_host) { struct Host *hst = cls; host_relay_message_part (hst, pmsg, &msg->slave_pub_key); @@ -887,7 +905,7 @@ place_recv_relay_data (void *cls, struct Place *plc = cls; if (GNUNET_PSYC_MESSAGE_REQUEST & ntohs (msg->flags) - && GNUNET_YES == plc->is_host); + && GNUNET_YES == plc->is_host) { struct Host *hst = cls; host_relay_message_part (hst, pmsg, &msg->slave_pub_key); @@ -908,7 +926,7 @@ place_recv_relay_eom (void *cls, struct Place *plc = cls; if (GNUNET_PSYC_MESSAGE_REQUEST & ntohs (msg->flags) - && GNUNET_YES == plc->is_host); + && GNUNET_YES == plc->is_host) { struct Host *hst = cls; host_relay_message_part (hst, pmsg, &msg->slave_pub_key); @@ -933,16 +951,14 @@ place_recv_save_method (void *cls, plc->file_offset = 0; plc->file_save = GNUNET_NO; - struct GNUNET_CRYPTO_HashAsciiEncoded place_pub_hash_ascii; - memcpy (&place_pub_hash_ascii.encoding, - GNUNET_h2s_full (&plc->pub_key_hash), sizeof (place_pub_hash_ascii)); - + char *place_pub_str = GNUNET_CRYPTO_eddsa_public_key_to_string (&plc->pub_key); char *filename = NULL; GNUNET_asprintf (&filename, "%s%c" "%s%c" "%s%c" "%" PRIu64 ".part", dir_social, DIR_SEPARATOR, "files", DIR_SEPARATOR, - place_pub_hash_ascii.encoding, DIR_SEPARATOR, + place_pub_str, DIR_SEPARATOR, GNUNET_ntohll (msg->message_id)); + GNUNET_free (place_pub_str); /* save if does not already exist */ if (GNUNET_YES != GNUNET_DISK_file_test (filename)) @@ -979,33 +995,42 @@ place_recv_save_data (void *cls, if (GNUNET_YES != plc->file_save) return; - struct GNUNET_CRYPTO_HashAsciiEncoded place_pub_hash_ascii; - memcpy (&place_pub_hash_ascii.encoding, - GNUNET_h2s_full (&plc->pub_key_hash), sizeof (place_pub_hash_ascii)); - + char *place_pub_str = GNUNET_CRYPTO_eddsa_public_key_to_string (&plc->pub_key); char *filename = NULL; GNUNET_asprintf (&filename, "%s%c" "%s%c" "%s%c" "%" PRIu64 ".part", dir_social, DIR_SEPARATOR, "files", DIR_SEPARATOR, - place_pub_hash_ascii.encoding, DIR_SEPARATOR, + place_pub_str, DIR_SEPARATOR, GNUNET_ntohll (msg->message_id)); - GNUNET_DISK_directory_create_for_file (filename); + GNUNET_free (place_pub_str); + if (GNUNET_SYSERR == GNUNET_DISK_directory_create_for_file (filename)) + { + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "create", filename); + GNUNET_free (filename); + return; + } + struct GNUNET_DISK_FileHandle * fh = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_WRITE, GNUNET_DISK_PERM_NONE); - GNUNET_free (filename); - if (NULL != fh) { - GNUNET_DISK_file_seek (fh, plc->file_offset, GNUNET_DISK_SEEK_SET); + if (plc->file_offset != GNUNET_DISK_file_seek + (fh, plc->file_offset, GNUNET_DISK_SEEK_SET)) { + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "seek", filename); + GNUNET_DISK_file_close (fh); + GNUNET_free (filename); + return; + } GNUNET_DISK_file_write (fh, data, data_size); GNUNET_DISK_file_close (fh); + GNUNET_free (filename); } else { + GNUNET_free (filename); GNUNET_break (0); } - plc->file_offset += data_size; } @@ -1026,20 +1051,22 @@ place_recv_save_eom (void *cls, if (GNUNET_YES != plc->file_save) return; - struct GNUNET_CRYPTO_HashAsciiEncoded place_pub_hash_ascii; - memcpy (&place_pub_hash_ascii.encoding, - GNUNET_h2s_full (&plc->pub_key_hash), sizeof (place_pub_hash_ascii)); - + char *place_pub_str = GNUNET_CRYPTO_eddsa_public_key_to_string (&plc->pub_key); char *fn = NULL; GNUNET_asprintf (&fn, "%s%c%s%c%s%c%" PRIu64, dir_social, DIR_SEPARATOR, "files", DIR_SEPARATOR, - place_pub_hash_ascii.encoding, DIR_SEPARATOR, + place_pub_str, DIR_SEPARATOR, GNUNET_ntohll (msg->message_id)); + GNUNET_free (place_pub_str); char *fn_part = NULL; GNUNET_asprintf (&fn_part, "%s.part", fn); - rename (fn_part, fn); + if (rename (fn_part, fn)) { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Failed to rename %s into %s: %s (%d)\n", + fn_part, fn, strerror (errno), errno); + } GNUNET_free (fn); GNUNET_free (fn_part); @@ -1104,8 +1131,8 @@ place_add (const struct PlaceEnterRequest *ereq) * * @param app_id * Application ID. - * @param msg - * Entry message. + * @param ereq + * Entry request. * * @return #GNUNET_OK if the place was added * #GNUNET_NO if the place already exists in the hash map @@ -1172,7 +1199,7 @@ app_place_add (const char *app_id, size_t app_id_size = strlen (app_id) + 1; void *app_id_value = GNUNET_malloc (app_id_size); - memcpy (app_id_value, app_id, app_id_size); + GNUNET_memcpy (app_id_value, app_id, app_id_size); if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (place_apps, &app_id_hash, app_id_value, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)) @@ -1189,8 +1216,8 @@ app_place_add (const char *app_id, * * @param app_id * Application ID. - * @param msg - * Entry message. + * @param ereq + * Entry request message. */ static int app_place_save (const char *app_id, @@ -1201,26 +1228,14 @@ app_place_save (const char *app_id, if (NULL == dir_places) return GNUNET_SYSERR; - struct GNUNET_HashCode ego_pub_hash; - struct GNUNET_HashCode place_pub_hash; - GNUNET_CRYPTO_hash (&ereq->ego_pub_key, sizeof (ereq->ego_pub_key), - &ego_pub_hash); - GNUNET_CRYPTO_hash (&ereq->place_pub_key, sizeof (ereq->place_pub_key), - &place_pub_hash); - - struct GNUNET_CRYPTO_HashAsciiEncoded ego_pub_hash_ascii; - struct GNUNET_CRYPTO_HashAsciiEncoded place_pub_hash_ascii; - memcpy (&ego_pub_hash_ascii.encoding, - GNUNET_h2s_full (&ego_pub_hash), sizeof (ego_pub_hash_ascii)); - memcpy (&place_pub_hash_ascii.encoding, - GNUNET_h2s_full (&place_pub_hash), sizeof (place_pub_hash_ascii)); - + char *ego_pub_str = GNUNET_CRYPTO_ecdsa_public_key_to_string (&ereq->ego_pub_key); + char *place_pub_str = GNUNET_CRYPTO_eddsa_public_key_to_string (&ereq->place_pub_key); char *filename = NULL; GNUNET_asprintf (&filename, "%s%c" "%s%c" "%s%c" "%s", dir_social, DIR_SEPARATOR, "places", DIR_SEPARATOR, - ego_pub_hash_ascii.encoding, DIR_SEPARATOR, - place_pub_hash_ascii.encoding); + ego_pub_str, DIR_SEPARATOR, + place_pub_str); int ret = GNUNET_DISK_directory_create_for_file (filename); if (GNUNET_OK != ret || 0 > GNUNET_DISK_fn_write (filename, ereq, ntohs (ereq->header.size), @@ -1238,8 +1253,8 @@ app_place_save (const char *app_id, dir_social, DIR_SEPARATOR, "apps", DIR_SEPARATOR, app_id, DIR_SEPARATOR, - ego_pub_hash_ascii.encoding, DIR_SEPARATOR, - place_pub_hash_ascii.encoding); + ego_pub_str, DIR_SEPARATOR, + place_pub_str); ret = GNUNET_DISK_directory_create_for_file (filename); if (GNUNET_OK != ret || 0 > GNUNET_DISK_fn_write (filename, "", 0, @@ -1251,6 +1266,8 @@ app_place_save (const char *app_id, } GNUNET_free (filename); } + GNUNET_free (ego_pub_str); + GNUNET_free (place_pub_str); return ret; } @@ -1265,21 +1282,18 @@ app_place_remove (const char *app_id, GNUNET_CRYPTO_hash (ego_pub_key, sizeof (*ego_pub_key), &ego_pub_hash); GNUNET_CRYPTO_hash (place_pub_key, sizeof (*place_pub_key), &place_pub_hash); - struct GNUNET_CRYPTO_HashAsciiEncoded ego_pub_hash_ascii; - struct GNUNET_CRYPTO_HashAsciiEncoded place_pub_hash_ascii; - memcpy (&ego_pub_hash_ascii.encoding, - GNUNET_h2s_full (&ego_pub_hash), sizeof (ego_pub_hash_ascii)); - memcpy (&place_pub_hash_ascii.encoding, - GNUNET_h2s_full (&place_pub_hash), sizeof (place_pub_hash_ascii)); - + char *ego_pub_str = GNUNET_CRYPTO_ecdsa_public_key_to_string (ego_pub_key); + char *place_pub_str = GNUNET_CRYPTO_eddsa_public_key_to_string (place_pub_key); char *app_place_filename = NULL; GNUNET_asprintf (&app_place_filename, "%s%c" "%s%c" "%s%c" "%s%c" "%s", dir_social, DIR_SEPARATOR, "apps", DIR_SEPARATOR, app_id, DIR_SEPARATOR, - ego_pub_hash_ascii.encoding, DIR_SEPARATOR, - place_pub_hash_ascii.encoding); + ego_pub_str, DIR_SEPARATOR, + place_pub_str); + GNUNET_free (ego_pub_str); + GNUNET_free (place_pub_str); struct GNUNET_HashCode app_id_hash; GNUNET_CRYPTO_hash (app_id, strlen (app_id) + 1, &app_id_hash); @@ -1321,8 +1335,8 @@ app_place_remove (const char *app_id, /** * Enter place as host. * - * @param req - * Entry request. + * @param hreq + * Host entry request. * @param[out] ret_hst * Returned Host struct. * @@ -1347,7 +1361,7 @@ host_enter (const struct HostEnterRequest *hreq, struct Host **ret_hst) hst->join_reqs = GNUNET_CONTAINER_multihashmap_create (1, GNUNET_NO); hst->relay_msgs = GNUNET_CONTAINER_multihashmap_create (1, GNUNET_NO); - struct Place *plc = &hst->plc; + struct Place *plc = &hst->place; place_init (plc); plc->is_host = GNUNET_YES; plc->pub_key = hreq->place_pub_key; @@ -1369,13 +1383,12 @@ host_enter (const struct HostEnterRequest *hreq, struct Host **ret_hst) } -const struct MsgProcRequest * -msg_proc_parse (const struct GNUNET_MessageHeader *msg, +static int +msg_proc_parse (const struct MsgProcRequest *mpreq, uint32_t *flags, const char **method_prefix, struct GNUNET_HashCode *method_hash) { - const struct MsgProcRequest *mpreq = (const struct MsgProcRequest *) msg; uint8_t method_size = ntohs (mpreq->header.size) - sizeof (*mpreq); uint16_t offset = GNUNET_STRINGS_buffer_tokenize ((const char *) &mpreq[1], method_size, 1, method_prefix); @@ -1385,12 +1398,20 @@ msg_proc_parse (const struct GNUNET_MessageHeader *msg, GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "offset = %u, method_size = %u, method_name = %s\n", offset, method_size, *method_prefix); - return NULL; + return GNUNET_SYSERR; } GNUNET_CRYPTO_hash (*method_prefix, method_size, method_hash); *flags = ntohl (mpreq->flags); - return mpreq; + return GNUNET_OK; +} + + +static int +check_client_msg_proc_set (void *cls, + const struct MsgProcRequest *mpreq) +{ + return GNUNET_OK; } @@ -1398,23 +1419,28 @@ msg_proc_parse (const struct GNUNET_MessageHeader *msg, * Handle a client setting message proccesing flags for a method prefix. */ static void -client_recv_msg_proc_set (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_msg_proc_set (void *cls, + const struct MsgProcRequest *mpreq) { - struct Client * - ctx = GNUNET_SERVER_client_get_user_context (client, struct Client); - GNUNET_assert (NULL != ctx); - struct Place *plc = ctx->plc; + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; + struct Place *plc = c->place; + if (NULL == plc) + { + GNUNET_break (0); + GNUNET_SERVICE_client_drop (client); + return; + } const char *method_prefix = NULL; uint32_t flags = 0; struct GNUNET_HashCode method_hash; - const struct MsgProcRequest * - mpreq = msg_proc_parse (msg, &flags, &method_prefix, &method_hash); - if (NULL == mpreq) { + if (GNUNET_OK != + msg_proc_parse (mpreq, &flags, &method_prefix, &method_hash)) + { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } #if 0 @@ -1450,7 +1476,7 @@ client_recv_msg_proc_set (void *cls, struct GNUNET_SERVER_Client *client, /** @todo Save flags to be able to resume relaying/saving after restart */ - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (client); } @@ -1458,23 +1484,30 @@ client_recv_msg_proc_set (void *cls, struct GNUNET_SERVER_Client *client, * Handle a connecting client requesting to clear all relay rules. */ static void -client_recv_msg_proc_clear (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_msg_proc_clear (void *cls, + const struct GNUNET_MessageHeader *msg) { - struct Client * - ctx = GNUNET_SERVER_client_get_user_context (client, struct Client); - GNUNET_assert (NULL != ctx); - struct Place *plc = ctx->plc; - if (GNUNET_YES != plc->is_host) { + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; + struct Place *plc = c->place; + if (NULL == plc) + { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } - struct Host *hst = (struct Host *) plc; GNUNET_PSYC_slicer_clear (plc->slicer); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (client); +} + + +static int +check_client_host_enter (void *cls, + const struct HostEnterRequest *hr) +{ + return GNUNET_OK; } @@ -1482,11 +1515,14 @@ client_recv_msg_proc_clear (void *cls, struct GNUNET_SERVER_Client *client, * Handle a connecting client entering a place as host. */ static void -client_recv_host_enter (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_host_enter (void *cls, + const struct HostEnterRequest *hr) { - struct HostEnterRequest *hreq - = (struct HostEnterRequest *) GNUNET_copy_message (msg); + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; + + struct HostEnterRequest * + hreq = (struct HostEnterRequest *) GNUNET_copy_message (&hr->header); uint8_t app_id_size = ntohs (hreq->header.size) - sizeof (*hreq); const char *app_id = NULL; @@ -1498,7 +1534,7 @@ client_recv_host_enter (void *cls, struct GNUNET_SERVER_Client *client, "offset = %u, app_id_size = %u, app_id = %s\n", offset, app_id_size, app_id); GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } @@ -1524,12 +1560,14 @@ client_recv_host_enter (void *cls, struct GNUNET_SERVER_Client *client, switch (host_enter (hreq, &hst)) { case GNUNET_YES: - plc = &hst->plc; + plc = c->place = &hst->place; + plc->host = hst; break; case GNUNET_NO: { - plc = &hst->plc; + plc = c->place = &hst->place; + plc->host = hst; client_send_host_enter_ack (client, hst, GNUNET_OK); break; } @@ -1547,23 +1585,24 @@ client_recv_host_enter (void *cls, struct GNUNET_SERVER_Client *client, struct ClientListItem *cli = GNUNET_new (struct ClientListItem); cli->client = client; GNUNET_CONTAINER_DLL_insert (plc->clients_head, plc->clients_tail, cli); - - struct Client *ctx = GNUNET_new (struct Client); - ctx->plc = plc; - GNUNET_SERVER_client_set_user_context (client, ctx); + c->place = plc; } GNUNET_CRYPTO_eddsa_key_clear (&hreq->place_key); GNUNET_free (hreq); - GNUNET_SERVER_receive_done (client, ret); + + if (GNUNET_OK == ret) + GNUNET_SERVICE_client_continue (client); + else + GNUNET_SERVICE_client_drop (client); } /** * Enter place as guest. * - * @param req - * Entry request. + * @param greq + * Guest entry request. * @param[out] ret_gst * Returned Guest struct. * @@ -1610,6 +1649,7 @@ guest_enter (const struct GuestEnterRequest *greq, struct Guest **ret_gst) len = strnlen (app_id, remaining); if (len == remaining) { + GNUNET_free (gst); GNUNET_break (0); return GNUNET_SYSERR; } @@ -1620,6 +1660,7 @@ guest_enter (const struct GuestEnterRequest *greq, struct Guest **ret_gst) uint16_t relay_size = gst->relay_count * sizeof (*relays); if (remaining < relay_size) { + GNUNET_free (gst); GNUNET_break (0); return GNUNET_SYSERR; } @@ -1643,19 +1684,19 @@ guest_enter (const struct GuestEnterRequest *greq, struct Guest **ret_gst) GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%zu + %u + %u != %u\n", sizeof (*greq), relay_size, join_msg_size, greq_size); - GNUNET_break (0); GNUNET_free (gst); + GNUNET_break (0); return GNUNET_SYSERR; } if (0 < relay_size) { gst->relays = GNUNET_malloc (relay_size); - memcpy (gst->relays, relays, relay_size); + GNUNET_memcpy (gst->relays, relays, relay_size); } gst->join_flags = ntohl (greq->flags); - struct Place *plc = &gst->plc; + struct Place *plc = &gst->place; place_init (plc); plc->is_host = GNUNET_NO; plc->pub_key = greq->place_pub_key; @@ -1692,15 +1733,23 @@ guest_enter (const struct GuestEnterRequest *greq, struct Guest **ret_gst) } +static int +check_client_guest_enter (void *cls, + const struct GuestEnterRequest *greq) +{ + return GNUNET_OK; +} + + /** * Handle a connecting client entering a place as guest. */ static void -client_recv_guest_enter (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_guest_enter (void *cls, + const struct GuestEnterRequest *greq) { - const struct GuestEnterRequest * - greq = (const struct GuestEnterRequest *) msg; + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; uint16_t remaining = ntohs (greq->header.size) - sizeof (*greq); const char *app_id = NULL; @@ -1709,7 +1758,7 @@ client_recv_guest_enter (void *cls, struct GNUNET_SERVER_Client *client, if (0 == offset) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } @@ -1719,13 +1768,15 @@ client_recv_guest_enter (void *cls, struct GNUNET_SERVER_Client *client, switch (guest_enter (greq, &gst)) { case GNUNET_YES: - plc = &gst->plc; + plc = c->place = &gst->place; + plc->guest = gst; app_place_save (app_id, (const struct PlaceEnterRequest *) greq); break; case GNUNET_NO: { - plc = &gst->plc; + plc = c->place = &gst->place; + plc->guest = gst; struct GNUNET_PSYC_CountersResultMessage res; res.header.type = htons (GNUNET_MESSAGE_TYPE_SOCIAL_GUEST_ENTER_ACK); @@ -1741,7 +1792,7 @@ client_recv_guest_enter (void *cls, struct GNUNET_SERVER_Client *client, } case GNUNET_SYSERR: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } @@ -1753,16 +1804,14 @@ client_recv_guest_enter (void *cls, struct GNUNET_SERVER_Client *client, cli->client = client; GNUNET_CONTAINER_DLL_insert (plc->clients_head, plc->clients_tail, cli); - struct Client *ctx = GNUNET_new (struct Client); - ctx->plc = plc; - GNUNET_SERVER_client_set_user_context (client, ctx); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + c->place = plc; + GNUNET_SERVICE_client_continue (client); } struct GuestEnterByNameClosure { - struct GNUNET_SERVER_Client *client; + struct Client *client; char *app_id; char *password; struct GNUNET_CRYPTO_EcdsaPublicKey ego_pub_key; @@ -1780,8 +1829,10 @@ gns_result_guest_enter (void *cls, uint32_t rd_count, const struct GNUNET_GNSRECORD_Data *rd) { struct GuestEnterByNameClosure *gcls = cls; + struct Client *c = gcls->client; GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "%p GNS result: %u records.\n", gcls->client, rd_count); + "%p GNS result: %u records.\n", + c, rd_count); const struct GNUNET_GNSRECORD_PlaceData * rec = (const struct GNUNET_GNSRECORD_PlaceData *) rd->data; @@ -1789,7 +1840,7 @@ gns_result_guest_enter (void *cls, uint32_t rd_count, if (0 == rd_count || rd->data_size < sizeof (*rec)) { GNUNET_break (0); - GNUNET_SERVER_receive_done (gcls->client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (c->client); return; } @@ -1825,13 +1876,13 @@ gns_result_guest_enter (void *cls, uint32_t rd_count, greq->relay_count = rec->relay_count; void *p = &greq[1]; - memcpy (p, gcls->app_id, app_id_size); + GNUNET_memcpy (p, gcls->app_id, app_id_size); p += app_id_size; - memcpy (p, relays, relay_size); + GNUNET_memcpy (p, relays, relay_size); p += relay_size; - memcpy (p, gcls->join_msg, join_msg_size); + GNUNET_memcpy (p, gcls->join_msg, join_msg_size); - client_recv_guest_enter (NULL, gcls->client, &greq->header); + handle_client_guest_enter (c, greq); GNUNET_free (gcls->app_id); if (NULL != gcls->password) @@ -1843,20 +1894,28 @@ gns_result_guest_enter (void *cls, uint32_t rd_count, } +static int +check_client_guest_enter_by_name (void *cls, + const struct GuestEnterByNameRequest *greq) +{ + return GNUNET_OK; +} + + /** * Handle a connecting client entering a place as guest using a GNS address. * * Look up GNS address and generate a GuestEnterRequest from that. */ static void -client_recv_guest_enter_by_name (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_guest_enter_by_name (void *cls, + const struct GuestEnterByNameRequest *greq) { - const struct GuestEnterByNameRequest * - greq = (const struct GuestEnterByNameRequest *) msg; + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; struct GuestEnterByNameClosure *gcls = GNUNET_malloc (sizeof (*gcls)); - gcls->client = client; + gcls->client = c; gcls->ego_pub_key = greq->ego_pub_key; const char *p = (const char *) &greq[1]; @@ -1879,20 +1938,21 @@ client_recv_guest_enter_by_name (void *cls, struct GNUNET_SERVER_Client *client, { if (NULL != gcls->join_msg) GNUNET_free (gcls->join_msg); + GNUNET_free (gcls); GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } uint16_t app_id_size = strlen (app_id) + 1; gcls->app_id = GNUNET_malloc (app_id_size); - memcpy (gcls->app_id, app_id, app_id_size); + GNUNET_memcpy (gcls->app_id, app_id, app_id_size); uint16_t password_size = strlen (password); if (0 < password_size++) { gcls->password = GNUNET_malloc (password_size); - memcpy (gcls->password, password, password_size); + GNUNET_memcpy (gcls->password, password, password_size); } GNUNET_GNS_lookup (gns, gns_name, &greq->ego_pub_key, @@ -1903,7 +1963,7 @@ client_recv_guest_enter_by_name (void *cls, struct GNUNET_SERVER_Client *client, void app_notify_place (struct GNUNET_MessageHeader *msg, - struct GNUNET_SERVER_Client *client) + struct GNUNET_SERVICE_Client *client) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Sending place notification of type %u to client.\n", @@ -1945,7 +2005,7 @@ app_notify_place (struct GNUNET_MessageHeader *msg, void -app_notify_place_end (struct GNUNET_SERVER_Client *client) +app_notify_place_end (struct GNUNET_SERVICE_Client *client) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Sending end of place list notification to client\n", @@ -1960,7 +2020,7 @@ app_notify_place_end (struct GNUNET_SERVER_Client *client) void -app_notify_ego (struct Ego *ego, struct GNUNET_SERVER_Client *client) +app_notify_ego (struct Ego *ego, struct GNUNET_SERVICE_Client *client) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Sending ego notification to client: %s\n", @@ -1972,7 +2032,7 @@ app_notify_ego (struct Ego *ego, struct GNUNET_SERVER_Client *client) emsg->header.size = htons (sizeof (*emsg) + name_size); GNUNET_CRYPTO_ecdsa_key_get_public (&ego->key, &emsg->ego_pub_key); - memcpy (&emsg[1], ego->name, name_size); + GNUNET_memcpy (&emsg[1], ego->name, name_size); client_send_msg (client, &emsg->header); GNUNET_free (emsg); @@ -1980,7 +2040,7 @@ app_notify_ego (struct Ego *ego, struct GNUNET_SERVER_Client *client) void -app_notify_ego_end (struct GNUNET_SERVER_Client *client) +app_notify_ego_end (struct GNUNET_SERVICE_Client *client) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Sending end of ego list notification to client\n", @@ -2013,15 +2073,23 @@ ego_entry (void *cls, const struct GNUNET_HashCode *key, void *value) } +static int +check_client_app_connect (void *cls, + const struct AppConnectRequest *creq) +{ + return GNUNET_OK; +} + + /** * Handle application connection. */ static void -client_recv_app_connect (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_app_connect (void *cls, + const struct AppConnectRequest *creq) { - const struct AppConnectRequest *creq - = (const struct AppConnectRequest *) msg; + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; uint8_t app_id_size = ntohs (creq->header.size) - sizeof (*creq); const char *app_id = NULL; @@ -2030,7 +2098,7 @@ client_recv_app_connect (void *cls, struct GNUNET_SERVER_Client *client, if (0 == offset || offset != app_id_size) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } @@ -2060,12 +2128,10 @@ client_recv_app_connect (void *cls, struct GNUNET_SERVER_Client *client, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Application %s connected.\n", app, app_id); - struct Client *ctx = GNUNET_new (struct Client); - ctx->app_id = GNUNET_malloc (app_id_size); - memcpy (ctx->app_id, app_id, app_id_size); + c->app_id = GNUNET_malloc (app_id_size); + GNUNET_memcpy (c->app_id, app_id, app_id_size); - GNUNET_SERVER_client_set_user_context (client, ctx); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (client); } @@ -2073,22 +2139,16 @@ client_recv_app_connect (void *cls, struct GNUNET_SERVER_Client *client, * Handle application detach request. */ static void -client_recv_app_detach (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_app_detach (void *cls, + const struct AppDetachRequest *req) { - struct Client * - ctx = GNUNET_SERVER_client_get_user_context (client, struct Client); - GNUNET_assert (NULL != ctx); - - struct Place *plc = ctx->plc; + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; - const struct AppDetachRequest *req - = (const struct AppDetachRequest *) msg; - - int ret = app_place_remove (ctx->app_id, &plc->ego_pub_key, &req->place_pub_key); + int ret = app_place_remove (c->app_id, &req->ego_pub_key, &req->place_pub_key); client_send_result (client, req->op_id, ret, NULL, 0); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (client); } @@ -2103,16 +2163,21 @@ app_places_entry_remove (void *cls, const struct GNUNET_HashCode *key, void *val /** - * Handle application detach request. + * Handle application leave request. */ static void -client_recv_place_leave (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_place_leave (void *cls, + const struct GNUNET_MessageHeader *msg) { - struct Client * - ctx = GNUNET_SERVER_client_get_user_context (client, struct Client); - GNUNET_assert (NULL != ctx); - struct Place *plc = ctx->plc; + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; + struct Place *plc = c->place; + if (NULL == plc) + { + GNUNET_break (0); + GNUNET_SERVICE_client_drop (client); + return; + } /* FIXME: remove all app subscriptions and leave this place */ @@ -2130,7 +2195,7 @@ client_recv_place_leave (void *cls, struct GNUNET_SERVER_Client *client, while (NULL != cli) { GNUNET_CONTAINER_DLL_remove (plc->clients_head, plc->clients_tail, cli); - GNUNET_SERVER_client_disconnect (cli->client); + GNUNET_SERVICE_client_drop (cli->client); next = cli->next; GNUNET_free (cli); cli = next; @@ -2173,30 +2238,36 @@ psyc_send_join_decision (void *cls, const struct GNUNET_HashCode *pub_key_hash, } +static int +check_client_join_decision (void *cls, + const struct GNUNET_PSYC_JoinDecisionMessage *dcsn) +{ + return GNUNET_OK; +} + + /** * Handle an entry decision from a host client. */ static void -client_recv_join_decision (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_join_decision (void *cls, + const struct GNUNET_PSYC_JoinDecisionMessage *dcsn) { - struct Client * - ctx = GNUNET_SERVER_client_get_user_context (client, struct Client); - GNUNET_assert (NULL != ctx); - struct Place *plc = ctx->plc; - if (GNUNET_YES != plc->is_host) { + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; + struct Place *plc = c->place; + if (NULL == plc || GNUNET_YES != plc->is_host) + { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } - struct Host *hst = (struct Host *) plc; + struct Host *hst = plc->host; - struct GNUNET_PSYC_JoinDecisionMessage * - dcsn = (struct GNUNET_PSYC_JoinDecisionMessage *) msg; struct JoinDecisionClosure jcls; jcls.is_admitted = ntohl (dcsn->is_admitted); jcls.msg - = (sizeof (*dcsn) + sizeof (*jcls.msg) <= ntohs (msg->size)) + = (sizeof (*dcsn) + sizeof (*jcls.msg) <= ntohs (dcsn->header.size)) ? (struct GNUNET_PSYC_Message *) &dcsn[1] : NULL; @@ -2214,7 +2285,8 @@ client_recv_join_decision (void *cls, struct GNUNET_SERVER_Client *client, GNUNET_CONTAINER_multihashmap_get_multiple (hst->join_reqs, &slave_pub_hash, &psyc_send_join_decision, &jcls); GNUNET_CONTAINER_multihashmap_remove_all (hst->join_reqs, &slave_pub_hash); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + + GNUNET_SERVICE_client_continue (client); } @@ -2226,7 +2298,7 @@ client_recv_join_decision (void *cls, struct GNUNET_SERVER_Client *client, * @param plc The place struct for the client. */ static void -send_message_ack (struct Place *plc, struct GNUNET_SERVER_Client *client) +send_message_ack (struct Place *plc, struct GNUNET_SERVICE_Client *client) { struct GNUNET_MessageHeader res; res.size = htons (sizeof (res)); @@ -2338,7 +2410,7 @@ psyc_transmit_notify_data (void *cls, uint16_t *data_size, void *data) plc, pdata_size); *data_size = pdata_size; - memcpy (data, &pmsg[1], *data_size); + GNUNET_memcpy (data, &pmsg[1], *data_size); ret = GNUNET_NO; break; @@ -2364,7 +2436,7 @@ psyc_transmit_notify_data (void *cls, uint16_t *data_size, void *data) *data_size = 0; tmit_msg = psyc_transmit_queue_next_msg (plc, tmit_msg); plc->is_disconnected = GNUNET_YES; - GNUNET_SERVER_client_disconnect (tmit_frag->client); + GNUNET_SERVICE_client_drop (tmit_frag->client); GNUNET_SCHEDULER_add_now (&cleanup_place, plc); return ret; } @@ -2473,7 +2545,7 @@ psyc_transmit_notify_mod (void *cls, uint16_t *data_size, void *data, *full_value_size = ntohl (pmod->value_size); *oper = pmod->oper; *data_size = mod_size; - memcpy (data, &pmod[1], mod_size); + GNUNET_memcpy (data, &pmod[1], mod_size); ret = GNUNET_NO; break; } @@ -2499,7 +2571,7 @@ psyc_transmit_notify_mod (void *cls, uint16_t *data_size, void *data, "%p psyc_transmit_notify_mod: sending %u bytes.\n", plc, mod_size); *data_size = mod_size; - memcpy (data, &pmsg[1], *data_size); + GNUNET_memcpy (data, &pmsg[1], *data_size); ret = GNUNET_NO; break; } @@ -2524,7 +2596,7 @@ psyc_transmit_notify_mod (void *cls, uint16_t *data_size, void *data, ret = GNUNET_SYSERR; tmit_msg = psyc_transmit_queue_next_msg (plc, tmit_msg); plc->is_disconnected = GNUNET_YES; - GNUNET_SERVER_client_disconnect (tmit_frag->client); + GNUNET_SERVICE_client_drop (tmit_frag->client); GNUNET_SCHEDULER_add_now (&cleanup_place, plc); } else @@ -2614,10 +2686,8 @@ guest_transmit_notify_mod (void *cls, uint16_t *data_size, void *data, /** * Get method part of next message from transmission queue. * - * @param tmit_msg - * Next item in message transmission queue. - * @param[out] pmeth - * The malloc'd message method is returned here. + * @param plc + * Place * * @return #GNUNET_OK on success * #GNUNET_NO if there are no more messages in queue. @@ -2676,7 +2746,7 @@ psyc_transmit_queue_next_method (struct Place *plc) static int psyc_master_transmit_message (struct Host *hst) { - struct Place *plc = &hst->plc; + struct Place *plc = &hst->place; if (NULL == hst->tmit_handle) { @@ -2685,11 +2755,14 @@ psyc_master_transmit_message (struct Host *hst) if (NULL == pmeth) return GNUNET_SYSERR; - hst->tmit_handle - = GNUNET_PSYC_master_transmit (hst->master, (const char *) &pmeth[1], - &host_transmit_notify_mod, - &host_transmit_notify_data, hst, - pmeth->flags); + hst->tmit_handle = (void *) &hst->tmit_handle; + struct GNUNET_PSYC_MasterTransmitHandle * + tmit_handle = GNUNET_PSYC_master_transmit (hst->master, (const char *) &pmeth[1], + &host_transmit_notify_mod, + &host_transmit_notify_data, hst, + pmeth->flags); + if (NULL != hst->tmit_handle) + hst->tmit_handle = tmit_handle; GNUNET_free (pmeth); } else @@ -2706,7 +2779,7 @@ psyc_master_transmit_message (struct Host *hst) static int psyc_slave_transmit_message (struct Guest *gst) { - struct Place *plc = &gst->plc; + struct Place *plc = &gst->place; if (NULL == gst->tmit_handle) { @@ -2715,11 +2788,14 @@ psyc_slave_transmit_message (struct Guest *gst) if (NULL == pmeth) return GNUNET_SYSERR; - gst->tmit_handle - = GNUNET_PSYC_slave_transmit (gst->slave, (const char *) &pmeth[1], - &guest_transmit_notify_mod, - &guest_transmit_notify_data, gst, - pmeth->flags); + gst->tmit_handle = (void *) &gst->tmit_handle; + struct GNUNET_PSYC_SlaveTransmitHandle * + tmit_handle = GNUNET_PSYC_slave_transmit (gst->slave, (const char *) &pmeth[1], + &guest_transmit_notify_mod, + &guest_transmit_notify_data, gst, + pmeth->flags); + if (NULL != gst->tmit_handle) + gst->tmit_handle = tmit_handle; GNUNET_free (pmeth); } else @@ -2755,7 +2831,7 @@ psyc_transmit_message (struct Place *plc) */ static struct MessageTransmitQueue * psyc_transmit_queue_message (struct Place *plc, - struct GNUNET_SERVER_Client *client, + struct GNUNET_SERVICE_Client *client, size_t data_size, const void *data, uint16_t first_ptype, uint16_t last_ptype, @@ -2773,7 +2849,7 @@ psyc_transmit_queue_message (struct Place *plc, struct FragmentTransmitQueue * tmit_frag = GNUNET_malloc (sizeof (*tmit_frag) + data_size); - memcpy (&tmit_frag[1], data, data_size); + GNUNET_memcpy (&tmit_frag[1], data, data_size); tmit_frag->next_part = (struct GNUNET_MessageHeader *) &tmit_frag[1]; tmit_frag->client = client; tmit_frag->size = data_size; @@ -2791,7 +2867,7 @@ psyc_transmit_queue_message (struct Place *plc, * @param client Client the message originates from. */ static void -psyc_transmit_cancel (struct Place *plc, struct GNUNET_SERVER_Client *client) +psyc_transmit_cancel (struct Place *plc, struct GNUNET_SERVICE_Client *client) { uint16_t type = GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_CANCEL; @@ -2806,17 +2882,31 @@ psyc_transmit_cancel (struct Place *plc, struct GNUNET_SERVER_Client *client) } +static int +check_client_psyc_message (void *cls, + const struct GNUNET_MessageHeader *msg) +{ + return GNUNET_OK; +} + + /** * Handle an incoming message from a client, to be transmitted to the place. */ static void -client_recv_psyc_message (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_psyc_message (void *cls, + const struct GNUNET_MessageHeader *msg) { - struct Client * - ctx = GNUNET_SERVER_client_get_user_context (client, struct Client); - GNUNET_assert (NULL != ctx); - struct Place *plc = ctx->plc; + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; + struct Place *plc = c->place; + if (NULL == plc) + { + GNUNET_break (0); + GNUNET_SERVICE_client_drop (client); + return; + } + int ret = GNUNET_SYSERR; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -2828,7 +2918,7 @@ client_recv_psyc_message (void *cls, struct GNUNET_SERVER_Client *client, GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "%p Place is not ready yet, disconnecting client.\n", plc); GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } @@ -2842,7 +2932,7 @@ client_recv_psyc_message (void *cls, struct GNUNET_SERVER_Client *client, plc, psize); GNUNET_break (0); psyc_transmit_cancel (plc, client); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } @@ -2855,20 +2945,20 @@ client_recv_psyc_message (void *cls, struct GNUNET_SERVER_Client *client, "%p Received invalid message part from client.\n", plc); GNUNET_break (0); psyc_transmit_cancel (plc, client); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Received message with first part type %u and last part type %u.\n", plc, first_ptype, last_ptype); - ctx->tmit_msg + c->tmit_msg = psyc_transmit_queue_message (plc, client, psize, &msg[1], - first_ptype, last_ptype, ctx->tmit_msg); - if (NULL != ctx->tmit_msg) + first_ptype, last_ptype, c->tmit_msg); + if (NULL != c->tmit_msg) { if (GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_END <= last_ptype) - ctx->tmit_msg = NULL; + c->tmit_msg = NULL; ret = psyc_transmit_message (plc); } @@ -2880,7 +2970,11 @@ client_recv_psyc_message (void *cls, struct GNUNET_SERVER_Client *client, psyc_transmit_cancel (plc, client); ret = GNUNET_SYSERR; } - GNUNET_SERVER_receive_done (client, ret); + + if (GNUNET_OK == ret) + GNUNET_SERVICE_client_continue (client); + else + GNUNET_SERVICE_client_drop (client); } @@ -2891,7 +2985,8 @@ static void psyc_recv_history_message (void *cls, const struct GNUNET_PSYC_MessageHeader *msg) { struct OperationClosure *opcls = cls; - struct Place *plc = opcls->plc; + struct Client *c = opcls->client; + struct Place *plc = c->place; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Received historic message #%" PRId64 " (flags: %x)\n", @@ -2906,10 +3001,12 @@ psyc_recv_history_message (void *cls, const struct GNUNET_PSYC_MessageHeader *ms res->op_id = opcls->op_id; res->result_code = GNUNET_htonll (GNUNET_OK); - memcpy (&res[1], msg, size); + GNUNET_memcpy (&res[1], msg, size); /** @todo FIXME: send only to requesting client */ place_send_msg (plc, &res->header); + + GNUNET_free (res); } @@ -2921,14 +3018,25 @@ psyc_recv_history_result (void *cls, int64_t result, const void *err_msg, uint16_t err_msg_size) { struct OperationClosure *opcls = cls; + struct Client *c = opcls->client; + struct Place *plc = c->place; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p History replay #%" PRIu64 ": " "PSYCstore returned %" PRId64 " (%.*s)\n", - opcls->plc, GNUNET_ntohll (opcls->op_id), result, + plc, GNUNET_ntohll (opcls->op_id), result, err_msg_size, (const char *) err_msg); // FIXME: place might have been destroyed - client_send_result (opcls->client, opcls->op_id, result, err_msg, err_msg_size); + client_send_result (c->client, opcls->op_id, result, err_msg, err_msg_size); +} + + +static int +check_client_history_replay (void *cls, + const struct GNUNET_PSYC_HistoryRequestMessage *req) +{ + return GNUNET_OK; } @@ -2936,17 +3044,20 @@ psyc_recv_history_result (void *cls, int64_t result, * Client requests channel history. */ static void -client_recv_history_replay (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_history_replay (void *cls, + const struct GNUNET_PSYC_HistoryRequestMessage *req) { - struct Client * - ctx = GNUNET_SERVER_client_get_user_context (client, struct Client); - GNUNET_assert (NULL != ctx); - struct Place *plc = ctx->plc; + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; + struct Place *plc = c->place; + if (NULL == plc) + { + GNUNET_break (0); + GNUNET_SERVICE_client_drop (client); + return; + } - const struct GNUNET_PSYC_HistoryRequestMessage * - req = (const struct GNUNET_PSYC_HistoryRequestMessage *) msg; - uint16_t size = ntohs (msg->size); + uint16_t size = ntohs (req->header.size); const char *method_prefix = (const char *) &req[1]; if (size < sizeof (*req) + 1 @@ -2957,13 +3068,12 @@ client_recv_history_replay (void *cls, struct GNUNET_SERVER_Client *client, "invalid method prefix. size: %u < %zu?\n", plc, GNUNET_ntohll (req->op_id), size, sizeof (*req) + 1); GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } struct OperationClosure *opcls = GNUNET_malloc (sizeof (*opcls)); - opcls->client = client; - opcls->plc = plc; + opcls->client = c; opcls->op_id = req->op_id; opcls->flags = ntohl (req->flags); @@ -2981,7 +3091,7 @@ client_recv_history_replay (void *cls, struct GNUNET_SERVER_Client *client, psyc_recv_history_message, NULL, psyc_recv_history_result, opcls); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (client); } @@ -2997,7 +3107,8 @@ psyc_recv_state_var (void *cls, uint32_t full_value_size) { struct OperationClosure *opcls = cls; - struct Place *plc = opcls->plc; + struct Client *c = opcls->client; + struct Place *plc = c->place; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p Received state variable %s from PSYC\n", @@ -3012,10 +3123,12 @@ psyc_recv_state_var (void *cls, res->op_id = opcls->op_id; res->result_code = GNUNET_htonll (GNUNET_OK); - memcpy (&res[1], mod, size); + GNUNET_memcpy (&res[1], mod, size); /** @todo FIXME: send only to requesting client */ place_send_msg (plc, &res->header); + + GNUNET_free (res); } @@ -3027,14 +3140,25 @@ psyc_recv_state_result (void *cls, int64_t result, const void *err_msg, uint16_t err_msg_size) { struct OperationClosure *opcls = cls; + struct Client *c = opcls->client; + struct Place *plc = c->place; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%p State get #%" PRIu64 ": " "PSYCstore returned %" PRId64 " (%.*s)\n", - opcls->plc, GNUNET_ntohll (opcls->op_id), result, + plc, GNUNET_ntohll (opcls->op_id), result, err_msg_size, (const char *) err_msg); // FIXME: place might have been destroyed - client_send_result (opcls->client, opcls->op_id, result, err_msg, err_msg_size); + client_send_result (c->client, opcls->op_id, result, err_msg, err_msg_size); +} + + +static int +check_client_state_get (void *cls, + const struct GNUNET_PSYC_StateRequestMessage *req) +{ + return GNUNET_OK; } @@ -3042,17 +3166,20 @@ psyc_recv_state_result (void *cls, int64_t result, * Client requests channel history. */ static void -client_recv_state_get (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_state_get (void *cls, + const struct GNUNET_PSYC_StateRequestMessage *req) { - struct Client * - ctx = GNUNET_SERVER_client_get_user_context (client, struct Client); - GNUNET_assert (NULL != ctx); - struct Place *plc = ctx->plc; + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; + struct Place *plc = c->place; + if (NULL == plc) + { + GNUNET_break (0); + GNUNET_SERVICE_client_drop (client); + return; + } - const struct GNUNET_PSYC_StateRequestMessage * - req = (const struct GNUNET_PSYC_StateRequestMessage *) msg; - uint16_t size = ntohs (msg->size); + uint16_t size = ntohs (req->header.size); const char *name = (const char *) &req[1]; GNUNET_log (GNUNET_ERROR_TYPE_WARNING, @@ -3067,16 +3194,15 @@ client_recv_state_get (void *cls, struct GNUNET_SERVER_Client *client, "invalid name. size: %u < %zu?\n", plc, GNUNET_ntohll (req->op_id), size, sizeof (*req) + 1); GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } struct OperationClosure *opcls = GNUNET_malloc (sizeof (*opcls)); - opcls->client = client; - opcls->plc = plc; + opcls->client = c; opcls->op_id = req->op_id; - switch (ntohs (msg->type)) + switch (ntohs (req->header.type)) { case GNUNET_MESSAGE_TYPE_PSYC_STATE_GET: GNUNET_PSYC_channel_state_get (plc->channel, name, @@ -3094,18 +3220,33 @@ client_recv_state_get (void *cls, struct GNUNET_SERVER_Client *client, GNUNET_assert (0); } - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (client); } +#define check_client_state_get_prefix check_client_state_get +#define handle_client_state_get_prefix handle_client_state_get + + static void namestore_recv_records_store_result (void *cls, int32_t result, const char *err_msg) { - struct OperationClosure *ocls = cls; - client_send_result (ocls->client, ocls->op_id, result, err_msg, + struct OperationClosure *opcls = cls; + struct Client *c = opcls->client; + + // FIXME: client might have been disconnected + client_send_result (c->client, opcls->op_id, result, err_msg, (NULL != err_msg) ? strlen (err_msg) : 0); - GNUNET_free (ocls); + GNUNET_free (opcls); +} + + +static int +check_client_zone_add_place (void *cls, + const struct ZoneAddPlaceRequest *preq) +{ + return GNUNET_OK; } @@ -3113,11 +3254,11 @@ namestore_recv_records_store_result (void *cls, int32_t result, * Handle request to add PLACE record to GNS zone. */ static void -client_recv_zone_add_place (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_zone_add_place (void *cls, + const struct ZoneAddPlaceRequest *preq) { - const struct ZoneAddPlaceRequest *preq - = (const struct ZoneAddPlaceRequest *) msg; + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; uint16_t remaining = ntohs (preq->header.size) - sizeof (*preq); const char *p = (const char *) &preq[1]; @@ -3134,7 +3275,7 @@ client_recv_zone_add_place (void *cls, struct GNUNET_SERVER_Client *client, { GNUNET_break (0); client_send_result (client, preq->op_id, GNUNET_SYSERR, NULL, 0); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_drop (client); return; } @@ -3148,7 +3289,7 @@ client_recv_zone_add_place (void *cls, struct GNUNET_SERVER_Client *client, rec->place_pub_key = preq->place_pub_key; rec->origin = this_peer; rec->relay_count = preq->relay_count; - memcpy (&rec[1], relays, relay_size); + GNUNET_memcpy (&rec[1], relays, relay_size); rd.data = rec; rd.data_size = sizeof (*rec) + relay_size; @@ -3162,15 +3303,23 @@ client_recv_zone_add_place (void *cls, struct GNUNET_SERVER_Client *client, } else { - struct OperationClosure *ocls = GNUNET_malloc (sizeof (*ocls)); - ocls->client = client; - ocls->op_id = preq->op_id; + struct OperationClosure *opcls = GNUNET_malloc (sizeof (*opcls)); + opcls->client = c; + opcls->op_id = preq->op_id; GNUNET_NAMESTORE_records_store (namestore, &ego->key, name, 1, &rd, - namestore_recv_records_store_result, ocls); + namestore_recv_records_store_result, opcls); /** @todo refresh stored records later */ } - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (client); +} + + +static int +check_client_zone_add_nym (void *cls, + const struct ZoneAddNymRequest *nreq) +{ + return GNUNET_OK; } @@ -3178,11 +3327,11 @@ client_recv_zone_add_place (void *cls, struct GNUNET_SERVER_Client *client, * Handle request to add PLACE record to GNS zone. */ static void -client_recv_zone_add_nym (void *cls, struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *msg) +handle_client_zone_add_nym (void *cls, + const struct ZoneAddNymRequest *nreq) { - const struct ZoneAddNymRequest *nreq - = (const struct ZoneAddNymRequest *) msg; + struct Client *c = cls; + struct GNUNET_SERVICE_Client *client = c->client; uint16_t name_size = ntohs (nreq->header.size) - sizeof (*nreq); const char *name = NULL; @@ -3192,7 +3341,7 @@ client_recv_zone_add_nym (void *cls, struct GNUNET_SERVER_Client *client, { GNUNET_break (0); client_send_result (client, nreq->op_id, GNUNET_SYSERR, NULL, 0); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (client); return; } @@ -3212,68 +3361,18 @@ client_recv_zone_add_nym (void *cls, struct GNUNET_SERVER_Client *client, } else { - struct OperationClosure *ocls = GNUNET_malloc (sizeof (*ocls)); - ocls->client = client; - ocls->op_id = nreq->op_id; + struct OperationClosure *opcls = GNUNET_malloc (sizeof (*opcls)); + opcls->client = c; + opcls->op_id = nreq->op_id; GNUNET_NAMESTORE_records_store (namestore, &ego->key, name, 1, &rd, - namestore_recv_records_store_result, ocls); + namestore_recv_records_store_result, opcls); /** @todo refresh stored records later */ } - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (client); } -static const struct GNUNET_SERVER_MessageHandler handlers[] = { - { client_recv_host_enter, NULL, - GNUNET_MESSAGE_TYPE_SOCIAL_HOST_ENTER, 0 }, - - { client_recv_guest_enter, NULL, - GNUNET_MESSAGE_TYPE_SOCIAL_GUEST_ENTER, 0 }, - - { client_recv_guest_enter_by_name, NULL, - GNUNET_MESSAGE_TYPE_SOCIAL_GUEST_ENTER_BY_NAME, 0 }, - - { client_recv_join_decision, NULL, - GNUNET_MESSAGE_TYPE_PSYC_JOIN_DECISION, 0 }, - - { client_recv_psyc_message, NULL, - GNUNET_MESSAGE_TYPE_PSYC_MESSAGE, 0 }, - - { client_recv_history_replay, NULL, - GNUNET_MESSAGE_TYPE_PSYC_HISTORY_REPLAY, 0 }, - - { client_recv_state_get, NULL, - GNUNET_MESSAGE_TYPE_PSYC_STATE_GET, 0 }, - - { client_recv_state_get, NULL, - GNUNET_MESSAGE_TYPE_PSYC_STATE_GET_PREFIX, 0 }, - - { client_recv_zone_add_place, NULL, - GNUNET_MESSAGE_TYPE_SOCIAL_ZONE_ADD_PLACE, 0 }, - - { client_recv_zone_add_nym, NULL, - GNUNET_MESSAGE_TYPE_SOCIAL_ZONE_ADD_NYM, 0 }, - - { client_recv_app_connect, NULL, - GNUNET_MESSAGE_TYPE_SOCIAL_APP_CONNECT, 0 }, - - { client_recv_app_detach, NULL, - GNUNET_MESSAGE_TYPE_SOCIAL_APP_DETACH, 0 }, - - { client_recv_place_leave, NULL, - GNUNET_MESSAGE_TYPE_SOCIAL_PLACE_LEAVE, 0 }, - - { client_recv_msg_proc_set, NULL, - GNUNET_MESSAGE_TYPE_SOCIAL_MSG_PROC_SET, 0 }, - - { client_recv_msg_proc_clear, NULL, - GNUNET_MESSAGE_TYPE_SOCIAL_MSG_PROC_CLEAR, 0 }, - - { NULL, NULL, 0, 0 } -}; - - const char * path_basename (const char *path) { @@ -3291,110 +3390,109 @@ path_basename (const char *path) struct PlaceLoadClosure { const char *app_id; - const char *ego_pub_hash_str; + const char *ego_pub_str; }; /** Load a place file */ int -file_place_load (void *cls, const char *filename) +file_place_load (void *cls, const char *place_filename) { - char *app_id = cls; + struct PlaceLoadClosure *plcls = cls; + + const char *place_pub_str = path_basename (place_filename); + if (NULL == place_pub_str) + { + GNUNET_break (0); + return GNUNET_OK; + } + + char *filename = NULL; + GNUNET_asprintf (&filename, "%s%c" "%s%c" "%s%c" "%s", + dir_social, DIR_SEPARATOR, + "places", DIR_SEPARATOR, + plcls->ego_pub_str, DIR_SEPARATOR, + place_pub_str); + uint64_t file_size = 0; if (GNUNET_OK != GNUNET_DISK_file_size (filename, &file_size, GNUNET_YES, GNUNET_YES) - || file_size < sizeof (struct HostEnterRequest)) + || file_size < sizeof (struct PlaceEnterRequest)) + { + GNUNET_free (filename); return GNUNET_OK; + } struct PlaceEnterRequest *ereq = GNUNET_malloc (file_size); ssize_t read_size = GNUNET_DISK_fn_read (filename, ereq, file_size); + GNUNET_free (filename); if (read_size < 0 || read_size < sizeof (*ereq)) + { + GNUNET_free (ereq); return GNUNET_OK; + } uint16_t ereq_size = ntohs (ereq->header.size); if (read_size != ereq_size) + { + GNUNET_free (ereq); return GNUNET_OK; + } switch (ntohs (ereq->header.type)) { case GNUNET_MESSAGE_TYPE_SOCIAL_HOST_ENTER: if (ereq_size < sizeof (struct HostEnterRequest)) + { + GNUNET_free (ereq); return GNUNET_OK; + } struct HostEnterRequest *hreq = (struct HostEnterRequest *) ereq; host_enter (hreq, NULL); break; case GNUNET_MESSAGE_TYPE_SOCIAL_GUEST_ENTER: if (ereq_size < sizeof (struct GuestEnterRequest)) + { + GNUNET_free (ereq); return GNUNET_OK; + } struct GuestEnterRequest *greq = (struct GuestEnterRequest *) ereq; guest_enter (greq, NULL); break; default: + GNUNET_free (ereq); return GNUNET_OK; } - app_place_add (app_id, ereq); - return GNUNET_OK; -} - - -/** Load an ego place file */ -int -file_ego_place_load (void *cls, const char *place_filename) -{ - struct PlaceLoadClosure *plcls = cls; - - const char *place_pub_hash_str = path_basename (place_filename); - if (NULL == place_pub_hash_str) - { - GNUNET_break (0); - return GNUNET_OK; - } - - char *filename = NULL; - GNUNET_asprintf (&filename, "%s%c" "%s%c" "%s%c" "%s", - dir_social, DIR_SEPARATOR, - "places", DIR_SEPARATOR, - plcls->ego_pub_hash_str, DIR_SEPARATOR, - place_pub_hash_str); - - struct PlaceEnterRequest ereq[GNUNET_SERVER_MAX_MESSAGE_SIZE]; - - int read_size = GNUNET_DISK_fn_read (filename, &ereq, - GNUNET_SERVER_MAX_MESSAGE_SIZE); - GNUNET_free (filename); - - if (read_size < (ssize_t) sizeof (ereq)) - return GNUNET_OK; - app_place_add (plcls->app_id, ereq); + GNUNET_free (ereq); return GNUNET_OK; } /** - * Read @e place_pub_hash_str entries in @a dir_ego + * Read @e place_pub_str entries in @a dir_ego * * @param dir_ego * Data directory of an application ego. - * $GNUNET_DATA_HOME/social/apps/$app_id/$ego_pub_hash_str/ + * $GNUNET_DATA_HOME/social/apps/$app_id/$ego_pub_str/ */ int scan_app_ego_dir (void *cls, const char *dir_ego) { struct PlaceLoadClosure *plcls = cls; - plcls->ego_pub_hash_str = path_basename (dir_ego); + plcls->ego_pub_str = path_basename (dir_ego); - if (NULL != plcls->ego_pub_hash_str) - GNUNET_DISK_directory_scan (dir_ego, file_ego_place_load, plcls); + if (NULL != plcls->ego_pub_str) + GNUNET_DISK_directory_scan (dir_ego, file_place_load, plcls); return GNUNET_OK; } /** - * Read @e ego_pub_hash_str entries in @a dir_app + * Read @e ego_pub_str entries in @a dir_app * * @param dir_app * Data directory of an application. @@ -3449,7 +3547,7 @@ identity_recv_ego (void *cls, struct GNUNET_IDENTITY_Ego *id_ego, ego->key = *(GNUNET_IDENTITY_ego_get_private_key (id_ego)); size_t name_size = strlen (name) + 1; ego->name = GNUNET_malloc (name_size); - memcpy (ego->name, name, name_size); + GNUNET_memcpy (ego->name, name, name_size); GNUNET_CONTAINER_multihashmap_put (egos, &ego_pub_hash, ego, GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE); @@ -3459,16 +3557,6 @@ identity_recv_ego (void *cls, struct GNUNET_IDENTITY_Ego *id_ego, } -/** - * Connected to core service. - */ -static void -core_connected (void *cls, const struct GNUNET_PeerIdentity *my_identity) -{ - this_peer = *my_identity; -} - - /** * Initialize the PSYC service. * @@ -3477,10 +3565,13 @@ core_connected (void *cls, const struct GNUNET_PeerIdentity *my_identity) * @param c Configuration to use. */ static void -run (void *cls, struct GNUNET_SERVER_Handle *server, - const struct GNUNET_CONFIGURATION_Handle *c) +run (void *cls, + const struct GNUNET_CONFIGURATION_Handle *c, + struct GNUNET_SERVICE_Handle *svc) { cfg = c; + service = svc; + GNUNET_CRYPTO_get_peer_identity (cfg, &this_peer); hosts = GNUNET_CONTAINER_multihashmap_create (1, GNUNET_YES); guests = GNUNET_CONTAINER_multihashmap_create (1, GNUNET_YES); @@ -3492,8 +3583,6 @@ run (void *cls, struct GNUNET_SERVER_Handle *server, apps_places = GNUNET_CONTAINER_multihashmap_create(1, GNUNET_NO); places_apps = GNUNET_CONTAINER_multihashmap_create(1, GNUNET_NO); - core = GNUNET_CORE_connect (cfg, NULL, core_connected, NULL, NULL, - NULL, GNUNET_NO, NULL, GNUNET_NO, NULL); id = GNUNET_IDENTITY_connect (cfg, &identity_recv_ego, NULL); gns = GNUNET_GNS_connect (cfg); namestore = GNUNET_NAMESTORE_connect (cfg); @@ -3515,27 +3604,79 @@ run (void *cls, struct GNUNET_SERVER_Handle *server, GNUNET_DISK_directory_scan (dir_apps, scan_app_dir, NULL); - nc = GNUNET_SERVER_notification_context_create (server, 1); - GNUNET_SERVER_add_handlers (server, handlers); - GNUNET_SERVER_disconnect_notify (server, &client_disconnect, NULL); - GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); -} - - -/** - * The main function for the service. - * - * @param argc number of arguments from the command line - * @param argv command line arguments - * @return 0 ok, 1 on error - */ -int -main (int argc, char *const *argv) -{ - return (GNUNET_OK == - GNUNET_SERVICE_run (argc, argv, "social", - GNUNET_SERVICE_OPTION_NONE, - &run, NULL)) ? 0 : 1; -} + GNUNET_SCHEDULER_add_shutdown (shutdown_task, NULL); +} + + +/** + * Define "main" method using service macro. + */ +GNUNET_SERVICE_MAIN +("social", + GNUNET_SERVICE_OPTION_NONE, + run, + client_notify_connect, + client_notify_disconnect, + NULL, + GNUNET_MQ_hd_var_size (client_host_enter, + GNUNET_MESSAGE_TYPE_SOCIAL_HOST_ENTER, + struct HostEnterRequest, + NULL), + GNUNET_MQ_hd_var_size (client_guest_enter, + GNUNET_MESSAGE_TYPE_SOCIAL_GUEST_ENTER, + struct GuestEnterRequest, + NULL), + GNUNET_MQ_hd_var_size (client_guest_enter_by_name, + GNUNET_MESSAGE_TYPE_SOCIAL_GUEST_ENTER_BY_NAME, + struct GuestEnterByNameRequest, + NULL), + GNUNET_MQ_hd_var_size (client_join_decision, + GNUNET_MESSAGE_TYPE_PSYC_JOIN_DECISION, + struct GNUNET_PSYC_JoinDecisionMessage, + NULL), + GNUNET_MQ_hd_var_size (client_psyc_message, + GNUNET_MESSAGE_TYPE_PSYC_MESSAGE, + struct GNUNET_MessageHeader, + NULL), + GNUNET_MQ_hd_var_size (client_history_replay, + GNUNET_MESSAGE_TYPE_PSYC_HISTORY_REPLAY, + struct GNUNET_PSYC_HistoryRequestMessage, + NULL), + GNUNET_MQ_hd_var_size (client_state_get, + GNUNET_MESSAGE_TYPE_PSYC_STATE_GET, + struct GNUNET_PSYC_StateRequestMessage, + NULL), + GNUNET_MQ_hd_var_size (client_state_get_prefix, + GNUNET_MESSAGE_TYPE_PSYC_STATE_GET_PREFIX, + struct GNUNET_PSYC_StateRequestMessage, + NULL), + GNUNET_MQ_hd_var_size (client_zone_add_place, + GNUNET_MESSAGE_TYPE_SOCIAL_ZONE_ADD_PLACE, + struct ZoneAddPlaceRequest, + NULL), + GNUNET_MQ_hd_var_size (client_zone_add_nym, + GNUNET_MESSAGE_TYPE_SOCIAL_ZONE_ADD_NYM, + struct ZoneAddNymRequest, + NULL), + GNUNET_MQ_hd_var_size (client_app_connect, + GNUNET_MESSAGE_TYPE_SOCIAL_APP_CONNECT, + struct AppConnectRequest, + NULL), + GNUNET_MQ_hd_fixed_size (client_app_detach, + GNUNET_MESSAGE_TYPE_SOCIAL_APP_DETACH, + struct AppDetachRequest, + NULL), + GNUNET_MQ_hd_fixed_size (client_place_leave, + GNUNET_MESSAGE_TYPE_SOCIAL_PLACE_LEAVE, + struct GNUNET_MessageHeader, + NULL), + GNUNET_MQ_hd_var_size (client_msg_proc_set, + GNUNET_MESSAGE_TYPE_SOCIAL_MSG_PROC_SET, + struct MsgProcRequest, + NULL), + GNUNET_MQ_hd_fixed_size (client_msg_proc_clear, + GNUNET_MESSAGE_TYPE_SOCIAL_MSG_PROC_CLEAR, + struct GNUNET_MessageHeader, + NULL)); /* end of gnunet-service-social.c */