Start server offering our hostlist.
758{
759 unsigned long long port;
760 char *hostname;
764 struct in_addr i4;
765 struct in6_addr i6;
766 struct sockaddr_in v4;
767 struct sockaddr_in6 v6;
768 const struct sockaddr *sa4;
769 const struct sockaddr *sa6;
770
774 {
776 "Advertising not enabled on this hostlist server\n");
777 }
778 else
779 {
781 "Advertising enabled on this hostlist server\n");
782 }
787 {
789 _ (
"Could not access PEERSTORE service. Exiting.\n"));
791 }
793 "HOSTLIST",
794 "HTTPPORT",
797 if ((0 ==
port) || (
port > UINT16_MAX))
798 {
800 _ (
"Invalid port number %llu. Exiting.\n"),
803 }
804
807 "HOSTLIST",
808 "EXTERNAL_DNS_NAME",
809 &hostname))
812 _ (
"Hostlist service starts on %s:%llu\n"),
813 hostname,
815 if (NULL != hostname)
816 {
817 size = strlen (hostname);
819 {
821 }
822 else
823 {
825 "http://%s:%u/",
826 hostname,
827 (
unsigned int)
port);
829 _ (
"Address to obtain hostlist: `%s'\n"),
831 }
833 }
834
836 {
838 "HOSTLIST",
839 "BINDTOIP",
841 {
844 _ (
"BINDTOIP does not a valid IPv4 address! Ignoring BINDTOIPV4.\n"));
845 }
846 }
847 else
850 {
852 "HOSTLIST",
853 "BINDTOIP",
855 {
858 _ (
"BINDTOIP does not a valid IPv4 address! Ignoring BINDTOIPV6.\n"));
859 }
860 }
861 else
863 sa4 = NULL;
865 {
866 if (1 == inet_pton (AF_INET,
ipv4, &i4))
867 {
868 memset (&v4, 0, sizeof(v4));
869 v4.sin_family = AF_INET;
870 v4.sin_addr = i4;
871 v4.sin_port = htons (
port);
872#if HAVE_SOCKADDR_IN_SIN_LEN
873 v4.sin_len = sizeof(v4);
874#endif
875 sa4 = (const struct sockaddr *) &v4;
876 }
877 else
880 "`%s' is not a valid IPv4 address! Ignoring BINDTOIPV4.\n"),
883 }
884 sa6 = NULL;
886 {
887 if (1 == inet_pton (AF_INET6,
ipv6, &i6))
888 {
889 memset (&v6, 0, sizeof(v6));
890 v6.sin6_family = AF_INET6;
891 v6.sin6_addr = i6;
892 v6.sin6_port = htons (
port);
893#if HAVE_SOCKADDR_IN_SIN_LEN
894 v6.sin6_len = sizeof(v6);
895#endif
896 sa6 = (const struct sockaddr *) &v6;
897 }
898 else
901 "`%s' is not a valid IPv6 address! Ignoring BINDTOIPV6.\n"),
904 }
905
909 NULL,
911 NULL,
912 MHD_OPTION_CONNECTION_LIMIT,
913 (unsigned int) 128,
914 MHD_OPTION_PER_IP_CONNECTION_LIMIT,
915 (unsigned int) 32,
916 MHD_OPTION_CONNECTION_TIMEOUT,
917 (unsigned int) 16,
918 MHD_OPTION_CONNECTION_MEMORY_LIMIT,
919 (size_t) (16 * 1024),
920 MHD_OPTION_SOCK_ADDR,
921 sa6,
922 MHD_OPTION_END);
926 NULL,
928 NULL,
929 MHD_OPTION_CONNECTION_LIMIT,
930 (unsigned int) 128,
931 MHD_OPTION_PER_IP_CONNECTION_LIMIT,
932 (unsigned int) 32,
933 MHD_OPTION_CONNECTION_TIMEOUT,
934 (unsigned int) 16,
935 MHD_OPTION_CONNECTION_MEMORY_LIMIT,
936 (size_t) (16 * 1024),
937 MHD_OPTION_SOCK_ADDR,
938 sa4,
939 MHD_OPTION_END);
940
942 {
944 _ (
"Could not start hostlist HTTP server on port %u\n"),
945 (
unsigned short)
port);
947 }
948
958 NULL);
960}
static uint16_t port
Port number.
static struct GNUNET_SCHEDULER_Task * st
The shutdown task.
static GNUNET_CORE_ConnectEventHandler server_ch
Handle to hostlist server's connect handler.
#define MAX_URL_LEN
How long can hostlist URLs be?
static struct MHD_Daemon * daemon_handle_v6
Handle to the HTTP server as provided by libmicrohttpd for IPv6.
static void * connect_handler(void *cls, const struct GNUNET_PeerIdentity *peer, struct GNUNET_MQ_Handle *mq, enum GNUNET_CORE_PeerClass class)
Method called whenever a given peer connects.
static struct MHD_Daemon * daemon_handle_v4
Handle to the HTTP server as provided by libmicrohttpd for IPv4.
static struct GNUNET_SCHEDULER_Task * hostlist_task_v4
Our primary task for IPv4.
static struct GNUNET_CORE_Handle * core
Handle to the core service (NULL until we've connected to it).
static int advertising
Set if we are allowed to advertise our hostlist to others.
static struct GNUNET_STATISTICS_Handle * stats
For keeping statistics.
struct GNUNET_CONTAINER_MultiPeerMap * hellos
Map with hellos we build the hostlist with.
static const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
static struct GNUNET_SCHEDULER_Task * hostlist_task_v6
Our primary task for IPv6.
static struct GNUNET_PEERSTORE_Handle * peerstore
Handle to the PEERSTORE service.
static struct GNUNET_SCHEDULER_Task * prepare_daemon(struct MHD_Daemon *daemon_handle)
Function that queries MHD's select sets and starts the task waiting for them.
static void start_notify(void *cls)
struct GNUNET_SCHEDULER_Task * peerstore_notify_task
The task to delayed start the notification process initially.
static MHD_RESULT access_handler_callback(void *cls, struct MHD_Connection *connection, const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls)
Main request handler.
static char * hostlist_uri
Buffer for the hostlist address.
static MHD_RESULT accept_policy_callback(void *cls, const struct sockaddr *addr, socklen_t addrlen)
Hostlist access policy (very permissive, allows everything).
static int ipv4
Option -4: IPv4 requested.
static int ipv6
Option -6: IPv6 requested.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_have_value(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option)
Test if we have a value for a particular option.
struct GNUNET_CONTAINER_MultiPeerMap * GNUNET_CONTAINER_multipeermap_create(unsigned int len, int do_not_copy_keys)
Create a multi peer map (hash map for public keys of peers).
#define GNUNET_log(kind,...)
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_PEERSTORE_Handle * GNUNET_PEERSTORE_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to the PEERSTORE service.
char * GNUNET_RESOLVER_local_fqdn_get(void)
Get local fully qualified domain name.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
#define GNUNET_TIME_UNIT_MINUTES
One minute.
static unsigned int size
Size of the "table".