示例#1
0
void
ccnet_conn_listen_init (CcnetConnManager *manager)
{
    evutil_socket_t socket;
    CcnetSession *session = manager->session;

    if (session->base.public_port == 0) {
        ccnet_message ("Do not listen for incoming peers\n");
        return;
    }

    socket = ccnet_net_bind_tcp (session->base.public_port, 1);
    if (socket >= 0) {
        ccnet_message ("Opened port %d to listen for "
                       "incoming peer connections\n", session->base.public_port);
        manager->bind_socket = socket;
        listen (manager->bind_socket, 5);
    } else {
        ccnet_error ("Couldn't open port %d to listen for "
                     "incoming peer connections (errno %d - %s)",
                     session->base.public_port, errno, strerror(errno) );
        exit (1);
    }

    manager->listen_timer = ccnet_timer_new (listen_pulse, manager,
                                             LISTEN_INTERVAL);
}
示例#2
0
static void
save_peerinfo (CcnetSession *session)
{
    FILE *fp;
    char *path;
    char filename[64];
    
    sprintf(filename, "%s%s", session->base.id, ".peer");
    path = g_build_filename (session->config_dir, "misc", filename, NULL);

    if ((fp = g_fopen(path, "wb")) == NULL) {
        ccnet_warning ("Open public info file %s error: %s\n",
                       path, strerror(errno));
        g_free (path);
        return;
    }
    g_free (path);

    ccnet_message ("Update pubinfo file\n");
    session->myself->public_port = session->base.public_port;

    GString *str = ccnet_peer_to_string (session->myself);
    fputs (str->str, fp);
    fclose (fp);
    g_string_free (str, TRUE);
}
示例#3
0
void
ccnet_session_on_exit (CcnetSession *session)
{
    time_t t;

    ccnet_peer_manager_on_exit (session->peer_mgr);
    ccnet_session_save (session);

    t = time(NULL);
    ccnet_message ("Exit at %s\n", ctime(&t));
    ccnet_session_free (session);
}
示例#4
0
static void listen_on_localhost (CcnetSession *session)
{
    int sockfd;

    if ( (sockfd = ccnet_net_bind_v4 ("127.0.0.1", &session->local_port)) < 0) {
        printf ("listen on localhost failed\n");
        exit (1);
    }
    ccnet_message ("Listen on 127.0.0.1 %d\n", session->local_port);

    listen (sockfd, 5);
    event_set (&session->local_event, sockfd, EV_READ | EV_PERSIST, 
               accept_local_client, session);
    event_add (&session->local_event, NULL);
}
示例#5
0
void
ccnet_session_save_config (CcnetSession *session)
{
    GError *error = NULL;
    char *str;
    FILE *fp;

    ccnet_message ("[Session] Saving configure file\n");
    if (session->saving_pub) {
        /* only update timestamp when pubinfo changes */
        save_pubinfo (session);
        session->saving_pub = 0;
    }

    g_key_file_set_string (session->keyf, "General", "NAME",
                           session->base.name);
    g_key_file_set_string (session->keyf, "General", "ID", 
                           session->base.id);
    g_key_file_set_string (session->keyf, "General", "USER_NAME", 
                           session->base.user_name);
#ifdef CCNET_SERVER
    g_key_file_set_string (session->keyf, "General", "SERVICE_URL",
                           session->base.service_url?session->base.service_url:"");
#endif
    g_key_file_set_integer (session->keyf, "Network", "PORT",
                            session->base.public_port);

    g_key_file_set_integer (session->keyf, "Client", "PORT", session->local_port);

    str = g_key_file_to_data (session->keyf, NULL, &error);
    if (error) {
        ccnet_warning ("Can't save unauth peer info: %s\n",
                       error->message);
        return;
    }

    if ((fp = g_fopen (session->config_file, "wb")) == NULL) {
        ccnet_warning ("Can't save session conf: %s\n", strerror(errno));
        g_free (str);
        return;
    }

    fputs (str, fp);
    fclose (fp);

    g_free (str);
    return;
}
示例#6
0
static void on_get_resolve_peer_pub_info_done (CcnetProcessor *processor,
                                               gboolean success, void *data)
{
    if (success) {
        gboolean should_continue;
        should_continue = ccnet_peer_manager_on_peer_resolved (
            processor->peer->manager, processor->peer);
        if (!should_continue)
            return;
        start_keepalive (processor->peer);
    } else {
        ccnet_message ("Get resolved peer pub info failed\n");
        ccnet_peer_manager_on_peer_resolve_failed (
            processor->peer->manager, processor->peer);
    }
}
示例#7
0
static void
handle_response (CcnetProcessor *processor,
                 char *code, char *code_msg,
                 char *content, int clen)
{
    if (g_strcmp0(code, SC_OK) == 0) {
        ccnet_message ("[Send Logout] Successfully send logout to relay %.10s\n",
                       processor->peer->id);
        processor->peer->logout_started = FALSE;
        /* processor->peer->bind_status = BIND_NO; */
        ccnet_processor_done (processor, TRUE);

    } else {
        ccnet_warning ("[Send Logout] Error: get repsonse: %s, %s.\n", code, code_msg);
        processor->peer->logout_started = FALSE;
        /* processor->peer->bind_status = BIND_YES; */
        ccnet_processor_done (processor, FALSE);
    }
}
示例#8
0
static void accept_local_client (int fd, short event, void *vsession)
{
    CcnetSession *session = vsession;
    CcnetPacketIO *io;
    int connfd;
    CcnetPeer *peer;
    static int local_id = 0;

    connfd = accept (fd, NULL, 0);

    ccnet_message ("Accepted a local client\n");

    io = ccnet_packet_io_new_incoming (session, NULL, connfd);
    peer = ccnet_peer_new (session->base.id);
    peer->name = g_strdup_printf("local-%d", local_id++);
    peer->is_local = TRUE;
    ccnet_peer_set_io (peer, io);
    ccnet_peer_set_net_state (peer, PEER_CONNECTED);
    ccnet_peer_manager_add_local_peer (session->peer_mgr, peer);
    g_object_unref (peer);
}
示例#9
0
static void handle_update (CcnetProcessor *processor,
                           char *code, char *code_msg,
                           char *content, int clen)
{
    CcnetMessage *msg;

    if (processor->peer->is_local) {
        msg = ccnet_message_from_string_local (content, clen);
        ccnet_send_message (processor->session, msg);
        ccnet_message_unref (msg);
    } else {
        msg = ccnet_message_from_string (content, clen);
        if (!msg) {
            g_warning ("Wrong message format.\n");
            ccnet_processor_done (processor, FALSE);
            return;
        }

        msg->rtime = time(NULL);
        ccnet_debug ("[msg] Received a message : %s - %.10s\n", 
                     msg->app, msg->body);

        int ret = ccnet_recv_message (processor->session, msg);
        if (ret == -1) {
            ccnet_message ("[msg] Message from %.8s permission error\n", 
                           msg->from);
            ccnet_processor_send_response (processor, SC_PERM_ERR,
                                           SS_PERM_ERR, NULL, 0);
            ccnet_processor_done (processor, TRUE);
            ccnet_message_unref (msg);
            return;
        }

        ccnet_message_unref (msg);
    }

    ccnet_processor_send_response (processor, "200", "OK", NULL, 0);
    ccnet_processor_done (processor, TRUE);
}
示例#10
0
文件: server.c 项目: bits4beats/ccnet
int
main (int argc, char **argv)
{
    int c;
    char *config_dir;
    char *cluster_config_dir = NULL;
    char *log_file = 0;
    const char *debug_str = 0;
    int daemon_mode = 0;
    int redirect = 0;
    const char *log_level_str = "debug";

    config_dir = DEFAULT_CONFIG_DIR;

#ifdef WIN32
    argv = get_argv_utf8 (&argc);
#endif

    while ((c = getopt_long (argc, argv, short_options, 
                             long_options, NULL)) != EOF) {
        switch (c) {
        case 'h':
            usage();
            exit(0);
            break;
        case 'v':
            exit (1);
            break;
        case 'c':
            config_dir = optarg;
            break;
        case 'C':
            cluster_config_dir = optarg;
            break;
        case 'f':
            log_file = optarg;
            break;
        case 'D':
            debug_str = optarg;
            break;
        case 'd':
            daemon_mode = 1;
            break;
        case 'P':
            pidfile = optarg;
            break;
        case 'r':
            redirect = 1;
            break;
        default:
            fprintf (stderr, "unknown option \"-%c\"\n", (char)c);
            usage();
            exit (1);
        }
    }

        
    argc -= optind;
    argv += optind;

    if (config_dir == NULL) {
        fprintf (stderr, "Missing config dir\n");
        exit (1);
    }

    if (cluster_config_dir == NULL) {
        fprintf (stderr, "Missing cluster config dir\n");
        exit (1);
    }

#ifndef WIN32
    if (daemon_mode)
        daemon (1, 0);
#endif
#if !GLIB_CHECK_VERSION(2, 36, 0)
    g_type_init ();
#endif

    /* log */
    if (!debug_str)
        debug_str = g_getenv("CCNET_DEBUG");
    ccnet_debug_set_flags_string (debug_str);

    config_dir = ccnet_expand_path (config_dir);

    if (!log_file) {
        char *logdir = g_build_filename (cluster_config_dir, "logs", NULL);
        checkdir_with_mkdir (logdir);
        g_free (logdir);
        log_file = g_build_filename (cluster_config_dir, "logs", "ccnet.log", NULL);
    }
    if (ccnet_log_init (log_file, log_level_str) < 0) {
        fprintf (stderr, "ccnet_log_init error: %s, %s\n", strerror(errno),
                 log_file);
        exit (1);
    }

    srand (time(NULL));

    session = (CcnetSession *)ccnet_outer_session_new ();
    if (!session) {
        fputs ("Error: failed to start ccnet session, "
               "see log file for the detail.\n", stderr);
        return -1;
    }

    inner_session = (CcnetSession *)ccnet_inner_session_new ();
    if (!inner_session) {
        fputs ("Error: failed to start cluster ccnet session, "
               "see log file for the detail.\n", stderr);
        return -1;
    }

    event_init ();
    evdns_init ();
    if (ccnet_session_prepare(session, config_dir) < 0) {
        fputs ("Error: failed to start ccnet session, "
               "see log file for the detail.\n", stderr);
        return -1;
    }
    if (ccnet_session_prepare(inner_session, cluster_config_dir) < 0) {
        fputs ("Error: failed to start cluster ccnet session, "
               "see log file for the detail.\n", stderr);
        return -1;
    }
    
    /* write pidfile after session_prepare success, if there is
     * another instance of ccnet session_prepare will failed.
     */
    if (pidfile) {
        if (write_pidfile (pidfile) < 0) {
            ccnet_message ("Failed to write pidfile\n");
            return -1;
        }
    }
    atexit (on_ccnet_exit);

#ifndef WIN32
    setSigHandlers();
#endif

    ccnet_session_start (session);
    ccnet_session_start (inner_session);
    ccnet_start_rpc(session);
    /* actually enter the event loop */

    cluster_mgr = ccnet_cluster_manager_new ();
    ccnet_cluster_manager_start (cluster_mgr);
    if (redirect)
        cluster_mgr->redirect = 1;

    event_dispatch ();

    return 0;
}
示例#11
0
/**
 * return %TRUE if an outgoing connection is started, %FALSE otherwise.
 *
 * When peer's ip address is not looked up yet, an dns request will be sent,
 * and when dns done, this function will be called again.
 */
gboolean
ccnet_conn_manager_connect_peer (CcnetConnManager *manager, CcnetPeer *peer)
{
    CcnetPacketIO *io;
    /* int interval; */
    const char *addr = NULL;
    int port = 0;

    if (peer->in_connection)
        return FALSE;

    /* time_t now = time(NULL); */
    
    if (peer->net_state == PEER_CONNECTED)
        return FALSE;

    if (peer->dns_addr)
        addr = peer->dns_addr;
    else if (!peer->redirected) {
        if (!peer->public_addr)
            goto err_connect;

        if (is_valid_ipaddr(peer->public_addr))
            addr = peer->public_addr;
        else {
            dns_lookup_peer (peer);
            return TRUE;        /* same as out going is started */
        }
    } else {
        if (!peer->redirect_addr)
            goto err_connect;

        if (is_valid_ipaddr(peer->redirect_addr))
            addr = peer->redirect_addr;
        else {
            dns_lookup_peer (peer);
            return TRUE;        /* same as out going is started */
        }
    }

    if (!addr)
        goto err_connect;

    if (!peer->redirected)
        port = peer->public_port;
    else
        port = peer->redirect_port;

    ccnet_peer_update_address (peer, addr, port);

    /* interval = get_reconnect_interval_secs (peer); */
    /* if (now - peer->last_try_time < interval) { */
        /* ccnet_debug ("[Conn] Less than interval: (%d - %d = %d, %d)\n", */
        /*              now, peer->last_try_time, now - peer->last_try_time, */
        /*              interval); */
    /*     return FALSE; */
    /* } */
    /* peer->last_try_time = now; */

    if (peer->num_fails == 0) {
        /* print log for the first time */
        ccnet_message ("[Conn] Start outgoing connect to %s(%.10s) %s:%d\n", 
                       peer->name, peer->id, addr, port);
    } else {
        ccnet_debug ("[Conn] Start outgoing connect to %s(%.10s) %s:%d\n", 
                     peer->name, peer->id, addr, port);
    }
    io = ccnet_packet_io_new_outgoing (manager->session, addr, port);
    
    if (io == NULL) {
        /* ccnet_warning ("Failed to create socket for peer %s (%.10s)\n", 
           peer->name, peer->id); */
        goto err_connect;
    } else {
        peer->in_connection = 1;
        ccnet_handshake_new (manager->session, peer, io, 
                             myHandshakeDoneCB, manager);
        return TRUE;
    }

err_connect:
    peer->num_fails++;
    return FALSE;
}
示例#12
0
int
main (int argc, char **argv)
{
    int c;
    char *config_dir;
    char *log_file = 0;
    const char *debug_str = 0;
    int daemon_mode = 0;
    const char *log_level_str = "debug";

    config_dir = DEFAULT_CONFIG_DIR;

#ifdef WIN32
    argv = get_argv_utf8 (&argc);
#endif
    
    while ((c = getopt_long (argc, argv, short_options, 
                             long_options, NULL)) != EOF) {
        switch (c) {
        case 'h':
            usage();
            exit(0);
            break;
        case 'v':
            exit (1);
            break;
        case 'c':
            config_dir = optarg;
            break;
        case 'f':
            log_file = optarg;
            break;
        case 'D':
            debug_str = optarg;
            break;
        case 'd':
            daemon_mode = 1;
            break;
        default:
            usage();
            exit (1);
        }
    }

        
    argc -= optind;
    argv += optind;

    if (config_dir == NULL) {
        fprintf (stderr, "Missing config dir\n");
        exit (1);
    }

#ifndef WIN32
#ifndef __APPLE__
    if (daemon_mode)
        daemon (1, 0);
#endif
#else
    WSADATA     wsadata;
    WSAStartup(0x0101, &wsadata);
#endif

    g_type_init ();

    /* log */
    if (!debug_str)
        debug_str = g_getenv("CCNET_DEBUG");
    ccnet_debug_set_flags_string (debug_str);

    config_dir = ccnet_expand_path (config_dir);

    if (!log_file) {
        char *logdir = g_build_filename (config_dir, "logs", NULL);
        checkdir_with_mkdir (logdir);
        g_free (logdir);
        log_file = g_build_filename (config_dir, "logs", "ccnet.log", NULL);
    }
    if (ccnet_log_init (log_file, log_level_str) < 0) {
        fprintf (stderr, "ccnet_log_init error: %s, %s\n", strerror(errno),
                 log_file);
        exit (1);
    }

    ccnet_message ("starting ccnet "PACKAGE_VERSION"\n");

    srand (time(NULL));

    session = (CcnetSession *)ccnet_daemon_session_new ();
    if (!session) {
        fputs ("Error: failed to start ccnet session, "
               "see log file for the detail.\n", stderr);
        return -1;
    }
    
    event_init ();
    evdns_init ();
    if (ccnet_session_prepare(session, config_dir) < 0) {
        fputs ("Error: failed to start ccnet session, "
               "see log file for the detail.\n", stderr);
        return -1;
    }


#ifndef WIN32
    setSigHandlers();
#endif
   
    ccnet_session_start (session);
    ccnet_start_rpc(session);

    /* actually enter the event loop */
    /* event_set_log_callback (logFunc); */
    event_dispatch ();

    return 0;
}
示例#13
0
int
main (int argc, char **argv)
{
    int c;
    char *config_dir = DEFAULT_CONFIG_DIR;
    char *seafile_dir = NULL;
    char *central_config_dir = NULL;
    char *logfile = NULL;
    const char *debug_str = NULL;
    int daemon_mode = 1;
    int is_master = 0;
    CcnetClient *client;
    char *ccnet_debug_level_str = "info";
    char *seafile_debug_level_str = "debug";
    int cloud_mode = 0;

#ifdef WIN32
    argv = get_argv_utf8 (&argc);
#endif

    while ((c = getopt_long (argc, argv, short_options, 
                             long_options, NULL)) != EOF)
    {
        switch (c) {
        case 'h':
            exit (1);
            break;
        case 'v':
            exit (1);
            break;
        case 'c':
            config_dir = optarg;
            break;
        case 'd':
            seafile_dir = g_strdup(optarg);
            break;
        case 'F':
            central_config_dir = g_strdup(optarg);
            break;
        case 'f':
            daemon_mode = 0;
            break;
        case 'l':
            logfile = g_strdup(optarg);
            break;
        case 'D':
            debug_str = optarg;
            break;
        case 'g':
            ccnet_debug_level_str = optarg;
            break;
        case 'G':
            seafile_debug_level_str = optarg;
            break;
        case 'm':
            is_master = 1;
            break;
        case 'P':
            pidfile = optarg;
            break;
        case 'C':
            cloud_mode = 1;
            break;
        default:
            usage ();
            exit (1);
        }
    }

    argc -= optind;
    argv += optind;

#ifndef WIN32
    if (daemon_mode) {
#ifndef __APPLE__
        daemon (1, 0);
#else   /* __APPLE */
        /* daemon is deprecated under APPLE
         * use fork() instead
         * */
        switch (fork ()) {
          case -1:
              seaf_warning ("Failed to daemonize");
              exit (-1);
              break;
          case 0:
              /* all good*/
              break;
          default:
              /* kill origin process */
              exit (0);
        }
#endif  /* __APPLE */
    }
#endif /* !WIN32 */

    cdc_init ();

#if !GLIB_CHECK_VERSION(2, 35, 0)
    g_type_init();
#endif
#if !GLIB_CHECK_VERSION(2,32,0)
    g_thread_init (NULL);
#endif

    if (!debug_str)
        debug_str = g_getenv("SEAFILE_DEBUG");
    seafile_debug_set_flags_string (debug_str);

    if (seafile_dir == NULL)
        seafile_dir = g_build_filename (config_dir, "seafile", NULL);
    if (logfile == NULL)
        logfile = g_build_filename (seafile_dir, "seafile.log", NULL);

    if (seafile_log_init (logfile, ccnet_debug_level_str,
                          seafile_debug_level_str) < 0) {
        seaf_warning ("Failed to init log.\n");
        exit (1);
    }

    client = ccnet_init (central_config_dir, config_dir);
    if (!client)
        exit (1);

    register_processors (client);

    start_rpc_service (client, cloud_mode);

    create_sync_rpc_clients (central_config_dir, config_dir);
    create_async_rpc_clients (client);

    seaf = seafile_session_new (central_config_dir, seafile_dir, client);
    if (!seaf) {
        seaf_warning ("Failed to create seafile session.\n");
        exit (1);
    }
    seaf->is_master = is_master;
    seaf->ccnetrpc_client = ccnetrpc_client;
    seaf->async_ccnetrpc_client = async_ccnetrpc_client;
    seaf->ccnetrpc_client_t = ccnetrpc_client_t;
    seaf->async_ccnetrpc_client_t = async_ccnetrpc_client_t;
    seaf->client_pool = ccnet_client_pool_new (central_config_dir, config_dir);
    seaf->cloud_mode = cloud_mode;

    load_history_config ();

    g_free (seafile_dir);
    g_free (logfile);

    set_signal_handlers (seaf);

    /* init seaf */
    if (seafile_session_init (seaf) < 0)
        exit (1);

    if (seafile_session_start (seaf) < 0)
        exit (1);

    if (pidfile) {
        if (write_pidfile (pidfile) < 0) {
            ccnet_message ("Failed to write pidfile\n");
            return -1;
        }
    }
    atexit (on_seaf_server_exit);

    /* Create a system default repo to contain the tutorial file. */
    schedule_create_system_default_repo (seaf);

    ccnet_main (client);

    return 0;
}
示例#14
0
int
main (int argc, char **argv)
{
    int c;
    char *config_dir = DEFAULT_CONFIG_DIR;
    char *seafile_dir = NULL;
    char *logfile = NULL;
    int daemon_mode = 1;
    CcnetClient *client;
    char *ccnet_debug_level_str = "info";
    char *monitor_debug_level_str = "debug";

#ifdef WIN32
    argv = get_argv_utf8 (&argc);
#endif

    while ((c = getopt_long (argc, argv, short_options,
                             long_options, NULL)) != EOF)
    {
        switch (c) {
        case 'h':
            exit (1);
            break;
        case 'v':
            exit (1);
            break;
        case 'c':
            config_dir = optarg;
            break;
        case 'd':
            seafile_dir = g_strdup(optarg);
            break;
        case 'f':
            daemon_mode = 0;
            break;
        case 'l':
            logfile = g_strdup(optarg);
            break;
        case 'g':
            ccnet_debug_level_str = optarg;
            break;
        case 'G':
            monitor_debug_level_str = optarg;
            break;
        case 'P':
            pidfile = optarg;
            break;
        default:
            usage ();
            exit (1);
        }
    }

    argc -= optind;
    argv += optind;

#ifndef WIN32
    if (daemon_mode)
        daemon (1, 0);
#endif
    g_type_init ();

    if (seafile_dir == NULL) {
        usage ();
        exit (1);
    }

    if (logfile == NULL)
        logfile = g_build_filename (seafile_dir, "monitor.log", NULL);

    if (seafile_log_init (logfile, ccnet_debug_level_str,
                          monitor_debug_level_str) < 0) {
        seaf_warning ("Failed to init log.\n");
        exit (1);
    }

    client = ccnet_init (config_dir);
    if (!client)
        exit (1);

    register_processors (client);

    start_rpc_service (client);

    seaf = seafile_session_new (seafile_dir, client);
    if (!seaf) {
        seaf_warning ("Failed to create seafile monitor.\n");
        exit (1);
    }

    if (seafile_session_init (seaf) < 0) {
        seaf_warning ("Failed to init seafile monitor.\n");
        exit (1);
    }

    g_free (seafile_dir);
    g_free (logfile);

    set_signal_handlers (seaf);

    seafile_session_start (seaf);

    if (pidfile) {
        if (write_pidfile (pidfile) < 0) {
            ccnet_message ("Failed to write pidfile\n");
            return -1;
        }
    }
    atexit (on_seaf_mon_exit);

    ccnet_main (client);

    return 0;
}
示例#15
0
int
main (int argc, char **argv)
{
    int c;
    char *config_dir = DEFAULT_CONFIG_DIR;
    char *seafile_dir = NULL;
    char *logfile = NULL;
    const char *debug_str = NULL;
    int daemon_mode = 1;
    int is_master = 0;
    CcnetClient *client;
    char *ccnet_debug_level_str = "info";
    char *seafile_debug_level_str = "debug";
    int cloud_mode = 0;

    while ((c = getopt_long (argc, argv, short_options, 
                             long_options, NULL)) != EOF)
    {
        switch (c) {
        case 'h':
            exit (1);
            break;
        case 'v':
            exit (1);
            break;
        case 'c':
            config_dir = optarg;
            break;
        case 'd':
            seafile_dir = g_strdup(optarg);
            break;
        case 'f':
            daemon_mode = 0;
            break;
        case 'l':
            logfile = g_strdup(optarg);
            break;
        case 'D':
            debug_str = optarg;
            break;
        case 'g':
            ccnet_debug_level_str = optarg;
            break;
        case 'G':
            seafile_debug_level_str = optarg;
            break;
        case 'm':
            is_master = 1;
        case 'P':
            pidfile = optarg;
            break;
        case 'C':
            cloud_mode = 1;
            break;
        default:
            usage ();
            exit (1);
        }
    }

    argc -= optind;
    argv += optind;

#ifndef WIN32
    if (daemon_mode)
        daemon (1, 0);
#endif

    g_type_init ();
#if !GLIB_CHECK_VERSION(2,32,0)
    g_thread_init (NULL);
#endif

    if (!debug_str)
        debug_str = g_getenv("SEAFILE_DEBUG");
    seafile_debug_set_flags_string (debug_str);

    client = ccnet_init (config_dir);
    if (!client)
        exit (1);

    register_processors (client);

    start_rpc_service (client, cloud_mode);

    create_sync_rpc_clients (config_dir);
    create_async_rpc_clients (client);

    if (seafile_dir == NULL)
        seafile_dir = g_build_filename (config_dir, "seafile", NULL);
    if (logfile == NULL)
        logfile = g_build_filename (seafile_dir, "seafile.log", NULL);

    seaf = seafile_session_new (seafile_dir, client);
    if (!seaf) {
        fprintf (stderr, "Failed to create seafile session.\n");
        exit (1);
    }
    seaf->is_master = is_master;
    seaf->ccnetrpc_client = ccnetrpc_client;
    seaf->async_ccnetrpc_client = async_ccnetrpc_client;
    seaf->ccnetrpc_client_t = ccnetrpc_client_t;
    seaf->async_ccnetrpc_client_t = async_ccnetrpc_client_t;
    seaf->client_pool = ccnet_client_pool_new (config_dir);
    seaf->cloud_mode = cloud_mode;

    load_history_config ();

    if (seafile_log_init (logfile, ccnet_debug_level_str,
                          seafile_debug_level_str) < 0) {
        fprintf (stderr, "Failed to init log.\n");
        exit (1);
    }

    g_free (seafile_dir);
    g_free (logfile);

    set_signal_handlers (seaf);

    /* init seaf */
    if (seafile_session_init (seaf) < 0)
        exit (1);

    if (seafile_session_start (seaf) < 0)
        exit (1);

    if (pidfile) {
        if (write_pidfile (pidfile) < 0) {
            ccnet_message ("Failed to write pidfile\n");
            return -1;
        }
    }
    atexit (on_seaf_server_exit);

    ccnet_main (client);

    return 0;
}
示例#16
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);
}
示例#17
0
int
main (int argc, char **argv)
{
    int c;
    char *config_dir;
    char *log_file = 0;
    const char *debug_str = 0;
    int daemon_mode = 0;
    int max_users = 0;
    const char *log_level_str = "debug";
    gboolean test_config = FALSE;

    config_dir = DEFAULT_CONFIG_DIR;

#ifdef WIN32
    argv = get_argv_utf8 (&argc);
#endif
    while ((c = getopt_long (argc, argv, short_options, 
                             long_options, NULL)) != EOF) {
        switch (c) {
        case 'h':
            usage();
            exit(0);
            break;
        case 'v':
            exit (1);
            break;
        case 'c':
            config_dir = optarg;
            break;
        case 'f':
            log_file = optarg;
            break;
        case 'D':
            debug_str = optarg;
            break;
        case 'd':
            daemon_mode = 1;
            break;
        case 'P':
            pidfile = optarg;
            break;
        case 'M':
            max_users = atoi(optarg);
            break;
        case 't':
            test_config = TRUE;
            break;
        default:
            fprintf (stderr, "unknown option \"-%c\"\n", (char)c);
            usage();
            exit (1);
        }
    }

        
    argc -= optind;
    argv += optind;

    if (config_dir == NULL) {
        fprintf (stderr, "Missing config dir\n");
        exit (1);
    }

    if (test_config) {
        /* test ccnet configuration and exit */
        return test_ccnet_config (config_dir, max_users);
    }

#ifndef WIN32
#ifndef __APPLE__
    if (daemon_mode)
        daemon (1, 0);
#endif
#else
    WSADATA     wsadata;
    WSAStartup(0x0101, &wsadata);
#endif

    g_type_init ();

    /* log */
    if (!debug_str)
        debug_str = g_getenv("CCNET_DEBUG");
    ccnet_debug_set_flags_string (debug_str);

    config_dir = ccnet_expand_path (config_dir);

    if (!log_file) {
        char *logdir = g_build_filename (config_dir, "logs", NULL);
        checkdir_with_mkdir (logdir);
        g_free (logdir);
        log_file = g_build_filename (config_dir, "logs", "ccnet.log", NULL);
    }
    if (ccnet_log_init (log_file, log_level_str) < 0) {
        fprintf (stderr, "ccnet_log_init error: %s, %s\n", strerror(errno),
                 log_file);
        exit (1);
    }

    srand (time(NULL));

    session = (CcnetSession *)ccnet_server_session_new ();
    if (!session) {
        fputs ("Error: failed to start ccnet session, "
               "see log file for the detail.\n", stderr);
        return -1;
    }

    event_init ();
    evdns_init ();
    ccnet_user_manager_set_max_users (((struct CcnetServerSession *)session)->user_mgr, max_users);
    if (ccnet_session_prepare(session, config_dir, FALSE) < 0) {
        fputs ("Error: failed to start ccnet session, "
               "see log file for the detail.\n", stderr);
        return -1;
    }
    
    /* write pidfile after session_prepare success, if there is
     * another instance of ccnet session_prepare will failed.
     */
    if (pidfile) {
        if (write_pidfile (pidfile) < 0) {
            ccnet_message ("Failed to write pidfile\n");
            return -1;
        }
    }
    atexit (on_ccnet_exit);

#ifndef WIN32
    setSigHandlers();
#endif

    ccnet_session_start (session);
    ccnet_start_rpc(session);

    /* actually enter the event loop */
    event_dispatch ();

    return 0;
}