2017-09-20 14:11:01 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/socket.h>
|
|
|
|
#include <netinet/in.h>
|
|
|
|
#include <netdb.h>
|
2017-09-20 17:39:26 +00:00
|
|
|
#include <pthread.h>
|
2017-09-20 14:11:01 +00:00
|
|
|
|
|
|
|
#include "ipfs/core/client_api.h"
|
|
|
|
#include "multiaddr/multiaddr.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine if the API is running (by attempting to connect to the port)
|
|
|
|
* @param local_node the context
|
|
|
|
* @returns true(1) on success, false(0) otherwise
|
|
|
|
*/
|
|
|
|
int api_running(struct IpfsNode* local_node) {
|
|
|
|
struct MultiAddress* my_multiaddress = multiaddress_new_from_string(local_node->repo->config->addresses->api);
|
|
|
|
char* ip = NULL;
|
|
|
|
int portno = 0;
|
|
|
|
|
|
|
|
if (my_multiaddress == NULL) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
portno = multiaddress_get_ip_port(my_multiaddress);
|
|
|
|
multiaddress_get_ip_address(my_multiaddress, &ip);
|
|
|
|
|
2017-09-28 20:43:03 +00:00
|
|
|
multiaddress_free(my_multiaddress);
|
|
|
|
|
2017-09-28 19:44:55 +00:00
|
|
|
if (ip == NULL)
|
|
|
|
return 0;
|
|
|
|
|
2017-09-20 14:11:01 +00:00
|
|
|
int sockfd;
|
|
|
|
struct sockaddr_in serv_addr;
|
|
|
|
struct hostent *server;
|
|
|
|
|
|
|
|
sockfd = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
|
if (sockfd < 0) {
|
2017-09-28 19:44:55 +00:00
|
|
|
free(ip);
|
2017-09-20 14:11:01 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
server = gethostbyname(ip);
|
2017-09-28 19:44:55 +00:00
|
|
|
free(ip);
|
2017-09-20 14:11:01 +00:00
|
|
|
|
|
|
|
if (server == NULL) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-09-20 15:50:32 +00:00
|
|
|
memset(&serv_addr, 0, sizeof(struct sockaddr_in));
|
2017-09-20 14:11:01 +00:00
|
|
|
serv_addr.sin_family = AF_INET;
|
2017-09-20 15:50:32 +00:00
|
|
|
memmove(&serv_addr.sin_addr.s_addr, server->h_addr_list[0], server->h_length);
|
2017-09-20 14:11:01 +00:00
|
|
|
serv_addr.sin_port = htons(portno);
|
|
|
|
int retVal = connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr));
|
|
|
|
close(sockfd);
|
|
|
|
return retVal >= 0;
|
|
|
|
}
|