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); }
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); } } }
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); }
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); }
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); }