c-ipfs/core/daemon.c

81 lines
2.3 KiB
C
Raw Normal View History

2017-02-10 01:10:21 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <pthread.h>
#include "libp2p/net/p2pnet.h"
#include "libp2p/peer/peerstore.h"
2017-02-10 01:10:21 +00:00
#include "ipfs/core/daemon.h"
2017-07-17 18:05:56 +00:00
#include "ipfs/core/null.h" // for ipfs_null_shutdown
#include "ipfs/core/ipfs_node.h"
2017-03-09 17:50:08 +00:00
#include "ipfs/core/bootstrap.h"
#include "ipfs/repo/fsrepo/fs_repo.h"
#include "ipfs/repo/init.h"
2017-04-04 01:54:03 +00:00
#include "libp2p/utils/logger.h"
2017-02-10 01:10:21 +00:00
2017-02-27 17:27:40 +00:00
int ipfs_daemon_start(char* repo_path) {
int count_pths = 0, retVal = 0;
2017-09-25 13:55:42 +00:00
pthread_t work_pths[MAX];
struct IpfsNodeListenParams listen_param;
struct MultiAddress* ma = NULL;
2017-02-10 01:10:21 +00:00
2017-07-27 19:33:19 +00:00
libp2p_logger_info("daemon", "Initializing daemon for %s...\n", repo_path);
2017-02-10 01:10:21 +00:00
struct IpfsNode* local_node = NULL;
2017-09-25 13:55:42 +00:00
if (!ipfs_node_online_new(repo_path, &local_node))
goto exit;
2017-02-10 01:10:21 +00:00
// Set null router param
ma = multiaddress_new_from_string(local_node->repo->config->addresses->swarm_head->item);
listen_param.port = multiaddress_get_ip_port(ma);
2017-02-10 01:10:21 +00:00
listen_param.ipv4 = 0; // ip 0.0.0.0, all interfaces
listen_param.local_node = local_node;
2017-02-10 01:10:21 +00:00
2017-03-09 23:03:21 +00:00
// Create pthread for swarm listener.
if (pthread_create(&work_pths[count_pths++], NULL, local_node->routing->Listen, &listen_param)) {
2017-08-03 16:16:58 +00:00
libp2p_logger_error("daemon", "Error creating thread for ipfs null listen\n");
goto exit;
2017-02-10 01:10:21 +00:00
}
2017-07-27 19:33:19 +00:00
local_node->routing->Bootstrap(local_node->routing);
2017-03-09 17:50:08 +00:00
2017-07-31 17:50:12 +00:00
libp2p_logger_info("daemon", "Daemon for %s is ready on port %d\n", listen_param.local_node->identity->peer->id, listen_param.port);
2017-02-10 01:10:21 +00:00
// Wait for pthreads to finish.
while (count_pths) {
if (pthread_join(work_pths[--count_pths], NULL)) {
2017-04-04 01:54:03 +00:00
libp2p_logger_error("daemon", "Error joining thread\n");
goto exit;
2017-02-10 01:10:21 +00:00
}
}
retVal = 1;
exit:
2017-07-27 19:33:19 +00:00
libp2p_logger_debug("daemon", "Cleaning up daemon processes for %s\n", repo_path);
// clean up
if (ma != NULL)
multiaddress_free(ma);
if (local_node != NULL) {
2017-09-25 13:55:42 +00:00
ipfs_node_free(local_node);
}
return retVal;
}
2017-02-27 17:27:40 +00:00
int ipfs_daemon_stop() {
return ipfs_null_shutdown();
2017-02-27 17:27:40 +00:00
}
int ipfs_daemon (int argc, char **argv)
{
char* repo_path = NULL;
libp2p_logger_add_class("daemon");
if (!ipfs_repo_get_directory(argc, argv, &repo_path)) {
libp2p_logger_error("daemon", "Unable to open repo: %s\n", repo_path);
return 0;
}
return ipfs_daemon_start(repo_path);
2017-02-10 01:10:21 +00:00
}