1
0
mirror of https://github.com/haiwen/ccnet-server.git synced 2025-04-27 18:25:06 +00:00
ccnet-server/lib/mainloop.c
2016-08-19 13:54:34 +08:00

161 lines
4.2 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
#include "include.h"
#include <ccnet.h>
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
#include <event2/event.h>
#include <event2/event_compat.h>
#include <event2/event_struct.h>
#else
#include <event.h>
#endif
static int
cmdrsp_cb (const char *code, char *content, int clen, void *data)
{
RegisterServiceCB cb = data;
if (clen != 0)
ccnet_debug ("Receive cmd response {\n%s}\n", content);
else
ccnet_debug ("Receive cmd response null\n");
if (cb) {
if (memcmp (SC_SERV_EXISTED, code, 3) == 0)
cb (FALSE);
else
cb (TRUE);
}
return 0;
}
void
ccnet_register_service (CcnetClient *client,
const char *service,
const char *group,
GType proc_type,
RegisterServiceCB cb)
{
char buf[512];
g_return_if_fail (group);
ccnet_proc_factory_register_processor (client->proc_factory,
service,
proc_type);
snprintf (buf, 512, "register-service %s %s", service, group);
ccnet_send_command (client, buf, cmdrsp_cb, cb);
}
gboolean
ccnet_register_service_sync (CcnetClient *client,
const char *service,
const char *group)
{
char buf[512];
GError *error = NULL;
snprintf (buf, 512, "register-service %s %s", service, group);
ccnet_client_send_cmd (client, buf, &error);
if (error) {
ccnet_warning ("Bad response for register service %s: %d %s",
service, error->code, error->message);
return FALSE;
}
return TRUE;
}
static void read_cb (evutil_socket_t fd, short event, void *vclient)
{
CcnetClient *client = vclient;
if (ccnet_client_read_input (client) <= 0) {
ccnet_client_disconnect_daemon (client);
exit (1);
}
}
/**
* Inititialize ccnet client structure, connect daemon and initialize
* event loop.
*/
CcnetClient *
ccnet_init (const char *central_config_dir, const char *confdir)
{
CcnetClient *client;
client = ccnet_client_new ();
if ( (ccnet_client_load_confdir(client, central_config_dir, confdir)) < 0 ) {
ccnet_warning ("Read config dir error\n");
return NULL;
}
if (ccnet_client_connect_daemon (client, CCNET_CLIENT_ASYNC) < 0) {
ccnet_warning ("Connect to ccnet daemon error\n");
exit(1);
}
ccnet_client_run_synchronizer (client);
event_init ();
return client;
}
void
ccnet_main (CcnetClient *client)
{
struct event ev;
event_set (&ev, client->connfd, EV_READ | EV_PERSIST, read_cb, client);
event_add (&ev, NULL);
event_dispatch ();
}
void ccnet_send_command (CcnetClient *client, const char *command,
SendcmdProcRcvrspCallback cmd_cb, void *cbdata)
{
CcnetSendcmdProc *sendcmd_proc = (CcnetSendcmdProc *)
ccnet_proc_factory_create_master_processor (client->proc_factory,
"send-cmd");
ccnet_sendcmd_proc_set_rcvrsp_cb (sendcmd_proc, cmd_cb, cbdata);
ccnet_processor_start (CCNET_PROCESSOR(sendcmd_proc), 0, NULL);
ccnet_sendcmd_proc_send_command (sendcmd_proc, command);
}
/* add-peer [--id <peer-id>] [--addr <peer-addr:port>]
*/
void ccnet_add_peer (CcnetClient *client, const char *id, const char *addr)
{
char buf[256];
if (id == NULL || strlen(id) != 40 || addr == NULL)
return;
snprintf (buf, 256, "add-peer --id %s --addr %s", id, addr);
ccnet_send_command (client, buf, NULL, NULL);
}
void ccnet_connect_peer (CcnetClient *client, const char *id)
{
char buf[256];
if (id == NULL || strlen(id) != 40)
return;
snprintf (buf, 256, "connect %s", id);
ccnet_send_command (client, buf, NULL, NULL);
}
void ccnet_disconnect_peer (CcnetClient *client, const char *id)
{
char buf[256];
if (id == NULL || strlen(id) != 40)
return;
snprintf (buf, 256, "disconnect %s", id);
ccnet_send_command (client, buf, NULL, NULL);
}