コード例 #1
0
ファイル: peer.c プロジェクト: andrey-str/ccnet
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;
}
コード例 #2
0
ファイル: ccnet-servtool.c プロジェクト: ezhangle/ccnet
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;
}
コード例 #3
0
ファイル: sync-mgr.c プロジェクト: break123/seafile
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;
}
コード例 #4
0
ファイル: connect-mgr.c プロジェクト: F0rth/seafile-obsd-wip
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);
}