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"
|
2017-02-22 16:48:42 +00:00
|
|
|
#include "libp2p/peer/peerstore.h"
|
2017-02-10 01:10:21 +00:00
|
|
|
#include "ipfs/core/daemon.h"
|
2017-02-22 15:56:11 +00:00
|
|
|
#include "ipfs/core/ipfs_node.h"
|
2017-03-09 17:50:08 +00:00
|
|
|
#include "ipfs/core/bootstrap.h"
|
2017-02-22 16:48:42 +00:00
|
|
|
#include "ipfs/repo/fsrepo/fs_repo.h"
|
2017-04-06 22:46:40 +00:00
|
|
|
#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) {
|
2017-04-17 16:58:47 +00:00
|
|
|
int count_pths = 0, retVal = 0;
|
2017-02-10 01:10:21 +00:00
|
|
|
pthread_t work_pths[MAX];
|
2017-02-22 15:56:11 +00:00
|
|
|
struct IpfsNodeListenParams listen_param;
|
2017-04-17 16:58:47 +00:00
|
|
|
struct MultiAddress* ma = NULL;
|
2017-02-10 01:10:21 +00:00
|
|
|
|
2017-04-04 01:54:03 +00:00
|
|
|
libp2p_logger_info("daemon", "Initializing daemon...\n");
|
2017-02-10 01:10:21 +00:00
|
|
|
|
2017-02-22 16:48:42 +00:00
|
|
|
// read the configuration
|
2017-04-17 16:58:47 +00:00
|
|
|
struct FSRepo* fs_repo = NULL;
|
2017-02-27 17:27:40 +00:00
|
|
|
if (!ipfs_repo_fsrepo_new(repo_path, NULL, &fs_repo))
|
2017-04-17 16:58:47 +00:00
|
|
|
goto exit;
|
2017-02-22 16:48:42 +00:00
|
|
|
|
|
|
|
// open the repository and read the file
|
|
|
|
if (!ipfs_repo_fsrepo_open(fs_repo)) {
|
2017-04-17 16:58:47 +00:00
|
|
|
goto exit;
|
2017-02-22 16:48:42 +00:00
|
|
|
}
|
|
|
|
|
2017-02-22 15:56:11 +00:00
|
|
|
// create a new IpfsNode
|
|
|
|
struct IpfsNode local_node;
|
|
|
|
local_node.mode = MODE_ONLINE;
|
2017-02-22 16:48:42 +00:00
|
|
|
local_node.peerstore = libp2p_peerstore_new();
|
2017-03-24 19:29:00 +00:00
|
|
|
local_node.providerstore = libp2p_providerstore_new();
|
2017-02-22 16:48:42 +00:00
|
|
|
local_node.repo = fs_repo;
|
|
|
|
local_node.identity = fs_repo->config->identity;
|
2017-02-22 15:56:11 +00:00
|
|
|
|
2017-02-10 01:10:21 +00:00
|
|
|
// Set null router param
|
2017-04-17 16:58:47 +00:00
|
|
|
ma = multiaddress_new_from_string(fs_repo->config->addresses->swarm_head->item);
|
2017-04-06 22:46:40 +00:00
|
|
|
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
|
2017-02-22 15:56:11 +00:00
|
|
|
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.
|
2017-02-10 01:10:21 +00:00
|
|
|
if (pthread_create(&work_pths[count_pths++], NULL, ipfs_null_listen, &listen_param)) {
|
2017-04-04 01:54:03 +00:00
|
|
|
libp2p_logger_error("daemon", "Error creating thread for ipfs null listen\n");
|
2017-04-17 16:58:47 +00:00
|
|
|
goto exit;
|
2017-02-10 01:10:21 +00:00
|
|
|
}
|
|
|
|
|
2017-04-03 16:55:36 +00:00
|
|
|
ipfs_bootstrap_routing(&local_node);
|
2017-03-09 17:50:08 +00:00
|
|
|
|
2017-04-04 01:54:03 +00:00
|
|
|
libp2p_logger_info("daemon", "Daemon is ready\n");
|
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");
|
2017-04-17 16:58:47 +00:00
|
|
|
goto exit;
|
2017-02-10 01:10:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-17 16:58:47 +00:00
|
|
|
retVal = 1;
|
|
|
|
exit:
|
|
|
|
fprintf(stderr, "Cleaning up daemon processes\n");
|
|
|
|
// clean up
|
|
|
|
if (fs_repo != NULL)
|
|
|
|
ipfs_repo_fsrepo_free(fs_repo);
|
|
|
|
if (local_node.peerstore != NULL)
|
|
|
|
libp2p_peerstore_free(local_node.peerstore);
|
|
|
|
if (local_node.providerstore != NULL)
|
|
|
|
libp2p_providerstore_free(local_node.providerstore);
|
|
|
|
if (ma != NULL)
|
|
|
|
multiaddress_free(ma);
|
|
|
|
if (local_node.routing != NULL) {
|
|
|
|
ipfs_routing_online_free(local_node.routing);
|
|
|
|
}
|
|
|
|
return retVal;
|
|
|
|
|
|
|
|
}
|
2017-02-27 17:27:40 +00:00
|
|
|
|
2017-04-17 16:58:47 +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)
|
|
|
|
{
|
2017-04-06 22:46:40 +00:00
|
|
|
char* repo_path = NULL;
|
|
|
|
|
|
|
|
if (!ipfs_repo_get_directory(argc, argv, &repo_path)) {
|
|
|
|
fprintf(stderr, "Unable to open repo: %s\n", repo_path);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-04-04 01:54:03 +00:00
|
|
|
libp2p_logger_add_class("peerstore");
|
|
|
|
libp2p_logger_add_class("providerstore");
|
|
|
|
libp2p_logger_add_class("daemon");
|
2017-04-04 03:02:44 +00:00
|
|
|
libp2p_logger_add_class("online");
|
2017-04-06 22:46:40 +00:00
|
|
|
|
|
|
|
return ipfs_daemon_start(repo_path);
|
2017-02-10 01:10:21 +00:00
|
|
|
}
|