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 int redirect_peer (int argc, char **argv) { char buf[1024]; GError *error = NULL; if (argc != 2) { fputs ("redirect-peer <peer_id> <to_id>\n", stderr); return -1; } if (!peer_id_valid(argv[0]) || !peer_id_valid(argv[1])) { fputs ("Invalid peer id\n", stderr); return -1; } snprintf (buf, 1024, "redirect-peer %s %s", argv[0], argv[1]); ccnet_client_send_cmd (client, buf, &error); if (error) { fprintf (stderr, "Error: %s\n", error->message); return -1; } return 0; }
int seaf_sync_manager_add_sync_task (SeafSyncManager *mgr, const char *repo_id, const char *dest_id, const char *token, gboolean is_sync_lan, GError **error) { SyncInfo *info = get_sync_info (mgr, repo_id); SeafRepo *repo; repo = seaf_repo_manager_get_repo (seaf->repo_mgr, repo_id); if (!repo) { seaf_warning ("[sync mgr] cannot find repo %s.\n", repo_id); g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_BAD_REPO, "Invalid repo"); return -1; } if (!peer_id_valid(dest_id)) { if (is_sync_lan) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_BAD_PEER_ID, "Dest ID is missing"); return -1; } else { if (repo->relay_id) dest_id = repo->relay_id; /* else if (seaf->session->base.relay_id) */ /* dest_id = seaf->session->base.relay_id; */ else { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_BAD_ARGS, "Unknown Destination"); return -1; } } } if (strlen(dest_id) != 40) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_BAD_PEER_ID, "Dest ID is invalid"); return -1; } if (seaf_repo_check_worktree (repo) < 0) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_NO_WORKTREE, "Worktree doesn't exist"); return -1; } if (info->in_sync) return 0; /* Run the sync task immediately, without adding to the queue. */ SyncTask *task = g_new0 (SyncTask, 1); task->info = info; task->mgr = mgr; task->dest_id = g_strdup (dest_id); task->force_upload = TRUE; task->is_sync_lan = is_sync_lan; task->need_commit = TRUE; if (task->is_sync_lan) { if (token) task->token = g_strdup (token); else task->token = g_strdup (DEFAULT_REPO_TOKEN); } else { if (token) task->token = g_strdup (token); else { task->token = g_strdup(repo->token); } } perform_sync_task (mgr, task); 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); }