CcnetPeer* ccnet_peer_from_string (char *content) { CcnetPeer *peer = NULL; char *ptr, *start = content; if ( !(ptr = strchr(start, '\n')) ) return NULL; *ptr = '\0'; char *object_id = start; start = ptr + 1; char *object_type = ccnet_object_type_from_id (object_id); if (g_strcmp0(object_type, OBJECT_TYPE_STRING) != 0) goto out; char *pure_id = object_id + strlen(object_type) + 1; if (!peer_id_valid(pure_id)) { ccnet_warning ("Wrong peer id %s\n", pure_id); goto out; } peer = ccnet_peer_new (pure_id); parse_key_value_pairs ( start, (KeyValueFunc)parse_field, peer); out: g_free (object_type); return peer; }
static void accept_local_client (int fd, short event, void *vsession) { CcnetSession *session = vsession; CcnetPacketIO *io; int connfd; CcnetPeer *peer; static int local_id = 0; connfd = accept (fd, NULL, 0); ccnet_message ("Accepted a local client\n"); io = ccnet_packet_io_new_incoming (session, NULL, connfd); peer = ccnet_peer_new (session->base.id); peer->name = g_strdup_printf("local-%d", local_id++); peer->is_local = TRUE; ccnet_peer_set_io (peer, io); ccnet_peer_set_net_state (peer, PEER_CONNECTED); ccnet_peer_manager_add_local_peer (session->peer_mgr, peer); g_object_unref (peer); }
int ccnet_rpc_add_client(const char *peer_id, GError **error) { CcnetPeerManager *mgr = session->peer_mgr; CcnetPeer *peer; if (strlen(peer_id) != 40) { g_set_error(error, CCNET_DOMAIN, CCNET_ERR_INTERNAL, "Peer ID must be of length 40"); return -1; } peer = ccnet_peer_manager_get_peer (mgr, peer_id); if (!peer) { peer = ccnet_peer_new (peer_id); ccnet_peer_manager_add_peer (mgr, peer); } ccnet_peer_manager_add_role (mgr, peer, "MyClient"); g_object_unref (peer); return 0; }
static void myHandshakeDoneCB (CcnetHandshake *handshake, CcnetPacketIO *io, int is_connected, const char *peer_id, void *vmanager) { CcnetConnManager *manager = vmanager; CcnetPeerManager *peerMgr = manager->session->peer_mgr; CcnetPeer *peer; if (!is_connected) { if (ccnet_packet_io_is_incoming (io)) { ccnet_warning ("[conn] incoming handshake fails.\n"); ccnet_packet_io_free (io); return; } /* temporally use peer, so don't need to increase the reference */ peer = handshake->peer; if (peer->num_fails == 0) { /* print error for the first time */ ccnet_message ("[Conn] peer %s(%.10s) connection fails\n", peer->name, peer->id); } else { ccnet_debug ("[Conn] peer %s(%.10s) connection fails\n", peer->name, peer->id); } if (peer->net_state == PEER_CONNECTED) { ccnet_debug ("[Conn] But Peer %s(%.10s) is already connected me.\n", peer->name, peer->id); } else if (peer->net_state == PEER_DOWN){ ccnet_peer_shutdown(peer); } ccnet_packet_io_free (io); peer->num_fails++; peer->in_connection = 0; return; } if (!ccnet_packet_io_is_incoming (io)) { peer = handshake->peer; peer->in_connection = 0; if (peer->to_resolve) { if (!peer_id_valid(peer_id)) { /* TODO: Remove the peer */ ccnet_warning ("[Conn] Resolving: Received invalid peer id\n"); return; } ccnet_debug ("[Conn] Resolving: Peer %.8s is resolved\n", peer_id); memcpy (peer->id, peer_id, 40); peer->id[40] = '\0'; on_resolve_peer_connected (peer, io); return; } /* ref for using the peer below */ g_object_ref (peer); } else { /* incoming */ if (peer_id == NULL) { ccnet_warning ("Unknown peer (no-id) connecting\n"); ccnet_packet_io_free (io); return; } peer = ccnet_peer_manager_get_peer (peerMgr, peer_id); if (!peer) { ccnet_message ("Unknown peer %s connecting\n", peer_id); peer = ccnet_peer_new (peer_id); ccnet_peer_manager_add_peer (peerMgr, peer); set_peer_address_from_socket(peer, io); peer->last_up = time(NULL); on_unauthed_peer_connected (peer, io); g_object_unref (peer); return; } set_peer_address_from_socket(peer, io); peer->last_up = time(NULL); } /* hold a reference on the peer */ if (peer->net_state == PEER_CONNECTED) { ccnet_message ("[Conn] Peer %s (%.10s) is already connected. " "Discarding this handshake.\n", peer->name, peer->id); ccnet_packet_io_free (io); g_object_unref (peer); return; } ccnet_message ("[Conn] Peer %s (%.10s) connected\n", peer->name, peer->id); peer->num_fails = 0; on_peer_connected (peer, io); g_object_unref (peer); }