Esempio n. 1
0
static void
handle_request (CcnetPeer *peer, int req_id, char *data, int len)
{
    char *msg;
    gchar **commands;
    gchar **pcmd;
    int  i, perm;

    /* TODO: remove string copy */
    if (len < 1)
        return;
    msg = g_malloc (len+1);
    memcpy (msg, data, len);
    msg[len] = '\0';

    commands = g_strsplit_set (msg, " \t", 10);
    for (i=0, pcmd = commands; *pcmd; pcmd++)
        i++;
    if (i <= 0) return;
    g_free (msg);

    /* permission checking */
    if (!peer->is_local) {
        perm = ccnet_perm_manager_check_permission(peer->manager->session->perm_mgr,
                                                   peer, commands[0],
                                                   req_id,
                                                   i, commands);
        if (perm == PERM_CHECK_ERROR) {
            ccnet_peer_send_response (peer, req_id, SC_PERM_ERR, SS_PERM_ERR,
                                      NULL, 0);
            goto ret;
        } else if (perm == PERM_CHECK_DELAY) {
            ccnet_peer_send_response (peer, req_id, SC_PERM_ERR, SS_PERM_ERR,
                                      NULL, 0);
            goto ret;
        } else if (perm == PERM_CHECK_NOSERVICE) {
            ccnet_peer_send_response (peer, req_id, SC_UNKNOWN_SERVICE_IN_PERM,
                                      SS_UNKNOWN_SERVICE_IN_PERM, NULL, 0);
            goto ret;
        }
    }

    /* check duplication request */
    CcnetProcessor *processor;
    processor = ccnet_peer_get_processor (peer, SLAVE_ID(req_id));
    if (processor != NULL) {
        ccnet_warning ("Received duplication request, id is %d\n", req_id);
        goto ret;
    }

    create_processor (peer, req_id, i, commands);

ret:
    g_strfreev (commands);
}
Esempio n. 2
0
static void
create_local_processor (CcnetPeer *peer, int req_id, int argc, char **argv)
{
    CcnetProcessor *processor;
    CcnetProcFactory *factory = peer->manager->session->proc_factory;

    processor = ccnet_proc_factory_create_slave_processor (
        factory, argv[0], peer, req_id);

    if (processor) {
        ccnet_processor_start (processor, argc-1, argv+1);
    } else {
        CcnetService *service;

        service = ccnet_session_get_service (peer->manager->session, argv[0]);
        if (service != NULL) {
            processor = ccnet_proc_factory_create_slave_processor (
                factory, "service-proxy", peer, req_id);
            ccnet_processor_start (processor, 0, NULL);
            ccnet_service_proxy_invoke_local (processor, service->provider,
                                              argc, argv);
        } else {
            ccnet_peer_send_response (peer, req_id, SC_UNKNOWN_SERVICE,
                                    SS_UNKNOWN_SERVICE,
                                    NULL, 0);
            ccnet_debug ("Unknown service %s invoke by %s(%.8s)\n",
                           argv[0], peer->name, peer->id);
        }
    }
}
Esempio n. 3
0
void
ccnet_processor_send_response (CcnetProcessor *processor,
                             const char *code,
                             const char *code_msg,
                             const char *content, int clen)
{
    ccnet_peer_send_response (processor->peer, RESPONSE_ID (processor->id), 
                              code, code_msg, content, clen);
}
Esempio n. 4
0
static void create_processor (CcnetPeer *peer, int req_id,
                             int argc, char **argv)
{
    CcnetSession *session = peer->manager->session;

    if (strcmp(argv[0], "remote") == 0) {
        /* we have check this before (in permission checking) */
        g_assert (peer->is_local);

        CcnetPeer *remote_peer;

        remote_peer = ccnet_peer_manager_get_peer (peer->manager, argv[1]);
        if (!remote_peer) {
            ccnet_peer_send_response (peer, req_id, SC_UNKNOWN_PEER,
                                    SS_UNKNOWN_PEER, NULL, 0);
            ccnet_warning ("Unknown remote peer in invoking remote service\n");
            return;
        }
        /* if (remote_peer->net_state == PEER_DOWN) { */
        /*     ccnet_peerSendResponse (peer, req_id, SC_PEER_UNREACHABLE, */
        /*                             SS_PEER_UNREACHABLE, NULL, 0); */
        /*     ccnet_warning ("Unreachable remote peer in invoking remote service\n"); */
        /*     return; */
        /* } */

        /* To simplify caller's logic, we allow starting a remote processor to
         * local host. Translate this call into a local one.
         */
        if (session->myself == remote_peer) {
            create_local_processor (peer, req_id, argc-2, argv+2);
            g_object_unref (remote_peer);
            return;
        }
        
        create_remote_processor (peer, remote_peer, req_id, argc-2, argv+2);
        g_object_unref (remote_peer);
        return;
    }

    create_local_processor (peer, req_id, argc, argv);
}
Esempio n. 5
0
static void
handle_update (CcnetPeer *peer, int req_id, char *data, int len)
{
    CcnetProcessor *processor;
    char *code, *code_msg = 0, *content = 0;
    int clen;
    char *ptr, *end;

    if (len < 4)
        goto error;
    
    code = data;
    
    ptr = data + 3;
    if (*ptr == '\n') {
        /* no code_msg */
        *ptr++ = '\0';
        content = ptr;
        clen = len - (ptr - data);
        goto parsed;
    }
    
    if (*ptr != ' ')
        goto error;
    
    *ptr++ = '\0';
    code_msg = ptr;

    end = data + len;
    for (ptr = data; *ptr != '\n' && ptr != end; ptr++) ;

    if (ptr == end)             /* must end with '\n' */
        goto error;

    /* if (*(ptr-1) == '\r') */
    /*     *(ptr-1) = '\0'; */
    *ptr++ = '\0';
    content = ptr;
    clen = len - (ptr - data);
    
parsed:
    processor = ccnet_peer_get_processor (peer, SLAVE_ID(req_id));
    if (processor == NULL) {
        if (memcmp(code, SC_PROC_DEAD, 3) != 0 
            && memcmp(code, SC_PROC_DONE, 3) != 0) {
            ccnet_debug ("Delayed update from %s(%.8s), id is %d, %s %s\n",
                         peer->name, peer->id, req_id, code, code_msg);
            ccnet_peer_send_response (peer, req_id,
                                      SC_PROC_DEAD, SS_PROC_DEAD,
                                      NULL, 0);
        }
        return;
    }

    /* if (!peer->is_local) */
    /*     ccnet_debug ("[RECV] handle_update %s id is %d, %s %s\n", */
    /*                  GET_PNAME(processor), PRINT_ID(processor->id), */
    /*                  code, code_msg); */
    peer->in_processor_call = 1;
    ccnet_processor_handle_update (processor, code, code_msg, content, clen);
    peer->in_processor_call = 0;
    return;

error:
    ccnet_warning ("Bad update format from %s\n", peer->id);
}