aboutsummaryrefslogtreecommitdiff
path: root/src/testbed/testbed_api_peers.c
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2013-04-02 13:31:20 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2013-04-02 13:31:20 +0000
commitd723a288c2185671ef410a70d9113d1f19a5c36a (patch)
tree2aa1f4c7e0001bbe02d4e6fe465c4e12af060dd1 /src/testbed/testbed_api_peers.c
parenta59b9fbcf5f6d05501b1d0b403abe41e7ac0e60e (diff)
downloadgnunet-d723a288c2185671ef410a70d9113d1f19a5c36a.tar.gz
gnunet-d723a288c2185671ef410a70d9113d1f19a5c36a.zip
- manage services of peers (client API)
Diffstat (limited to 'src/testbed/testbed_api_peers.c')
-rw-r--r--src/testbed/testbed_api_peers.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/testbed/testbed_api_peers.c b/src/testbed/testbed_api_peers.c
index 8944ec776..252131313 100644
--- a/src/testbed/testbed_api_peers.c
+++ b/src/testbed/testbed_api_peers.c
@@ -774,5 +774,93 @@ GNUNET_TESTBED_overlay_connect (void *op_cls,
774} 774}
775 775
776 776
777static void
778opstart_manage_service (void *cls)
779{
780 struct OperationContext *opc = cls;
781 struct GNUNET_TESTBED_ManagePeerServiceMessage *msg;
782 struct ManageServiceData *data;
783
784 GNUNET_assert (NULL != (data = opc->data));
785 msg = GNUNET_malloc (data->msize);
786 msg->header.size = htons (data->msize);
787 msg->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_MANAGE_PEER_SERVICE);
788 msg->peer_id = htonl (data->peer->unique_id);
789 msg->operation_id = GNUNET_htonll (opc->id);
790 msg->start = (uint8_t) data->start;
791 (void) memcpy (&msg[1], data->service_name, data->msize
792 - sizeof (struct GNUNET_TESTBED_ManagePeerServiceMessage));
793 GNUNET_free (data->service_name);
794 data->service_name = NULL;
795 opc->state = OPC_STATE_STARTED;
796 GNUNET_CONTAINER_DLL_insert_tail (opc->c->ocq_head, opc->c->ocq_tail, opc);
797 GNUNET_TESTBED_queue_message_ (opc->c, &msg->header);
798}
799
800
801static void
802oprelease_manage_service (void *cls)
803{
804 struct OperationContext *opc = cls;
805 struct ManageServiceData *data;
806
807 data = opc->data;
808 switch (opc->state)
809 {
810 case OPC_STATE_STARTED:
811 GNUNET_CONTAINER_DLL_remove (opc->c->ocq_head, opc->c->ocq_tail, opc);
812 break;
813 case OPC_STATE_INIT:
814 GNUNET_assert (NULL != data);
815 GNUNET_free (data->service_name);
816 break;
817 case OPC_STATE_FINISHED:
818 break;
819 }
820 GNUNET_free_non_null (data);
821 GNUNET_free (opc);
822}
823
824
825struct GNUNET_TESTBED_Operation *
826GNUNET_TESTBED_peer_manage_service (void *op_cls,
827 struct GNUNET_TESTBED_Peer *peer,
828 const char *service_name,
829 GNUNET_TESTBED_OperationCompletionCallback cb,
830 void *cb_cls,
831 unsigned int start)
832{
833 struct ManageServiceData *data;
834 struct OperationContext *opc;
835 size_t msize;
836
837 GNUNET_assert (PS_STARTED == peer->state); /* peer is not running? */
838 msize = strlen (service_name) + 1;
839 msize += sizeof (struct GNUNET_TESTBED_ManagePeerServiceMessage);
840 if (GNUNET_SERVER_MAX_MESSAGE_SIZE < msize)
841 return NULL;
842 data = GNUNET_malloc (sizeof (struct ManageServiceData));
843 data->cb = cb;
844 data->cb_cls = cb_cls;
845 data->peer = peer;
846 data->service_name = GNUNET_strdup (service_name);
847 data->start = start;
848 data->msize = (uint16_t) msize;
849 opc = GNUNET_malloc (sizeof (struct OperationContext));
850 opc->data = data;
851 opc->c = peer->controller;
852 opc->id = GNUNET_TESTBED_get_next_op_id (opc->c);
853 opc->type = OP_MANAGE_SERVICE;
854 opc->op_cls = op_cls;
855 opc->op =
856 GNUNET_TESTBED_operation_create_ (opc, &opstart_manage_service,
857 &oprelease_manage_service);
858 GNUNET_TESTBED_operation_queue_insert_ (opc->c->opq_parallel_operations,
859 opc->op);
860 GNUNET_TESTBED_operation_begin_wait_ (opc->op);
861 return opc->op;
862}
863
864
777 865
778/* end of testbed_api_peers.c */ 866/* end of testbed_api_peers.c */