GNUnet 0.21.1
Client library

Generic client-side communication with services. More...

Collaboration diagram for Client library:

Functions

int GNUNET_CLIENT_test (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name)
 Test if the port or UNIXPATH of the given service_name is in use and thus (most likely) the respective service is up. More...
 
struct GNUNET_MQ_HandleGNUNET_CLIENT_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
 Create a message queue to connect to a GNUnet service. More...
 

Detailed Description

Generic client-side communication with services.

See also
Documentation

Function Documentation

◆ GNUNET_CLIENT_test()

int GNUNET_CLIENT_test ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  service_name 
)

Test if the port or UNIXPATH of the given service_name is in use and thus (most likely) the respective service is up.

Parameters
cfgour configuration
service_namename of the service to connect to
Returns
GNUNET_YES if the service is (likely) up (or running remotely), GNUNET_NO if the service is (definitively) down, GNUNET_SYSERR if the configuration does not give us the necessary information about the service, or if we could not check (e.g. socket() failed)
Parameters
cfgour configuration
service_namename of the service to connect to
Returns
GNUNET_YES if the service is (likely) up, GNUNET_NO if the service is (definitively) down, GNUNET_SYSERR if the configuration does not give us the necessary information about the service, or if we could not check (e.g. socket() failed)

Definition at line 903 of file client.c.

905{
906 char *hostname = NULL;
907 unsigned long long port;
908 int ret;
909
910#if AF_UNIX
911 {
912 char *unixpath = NULL;
913
914 if (GNUNET_OK ==
917 "UNIXPATH",
918 &unixpath))
919 {
920 if (0 == strlen (unixpath))
921 {
922 GNUNET_free (unixpath);
923 return GNUNET_SYSERR; /* empty string not OK */
924 }
925 if (0 == access (unixpath,
926 F_OK))
927 {
928 GNUNET_free (unixpath);
929 return GNUNET_OK; /* file exists, we assume service is running */
930 }
931 GNUNET_free (unixpath);
932 }
933 else if (GNUNET_OK ==
936 "UNIXPATH"))
937 {
938 /* UNIXPATH specified but not a valid path! */
941 "UNIXPATH",
942 _ ("not a valid filename"));
943 return GNUNET_SYSERR;
944 }
945 }
946#endif
947
948 if ( (GNUNET_OK !=
951 "PORT",
952 &port)) ||
953 (port > 65535) ||
954 (0 == port) )
955 {
956 return GNUNET_SYSERR;
957 }
958 if (GNUNET_OK ==
961 "HOSTNAME",
962 &hostname))
963 {
964 /* We always assume remotes are up */
965 ret = GNUNET_YES;
966 }
967 else
968 {
969 /* We look for evidence the service is up */
970 ret = GNUNET_NO;
971 }
972 if ( (NULL == hostname) ||
973 (0 == strcasecmp (hostname,
974 "localhost")) ||
975 (0 == strcasecmp (hostname,
976 "ip6-localnet")) )
977 {
978 /* service runs on loopback */
979 struct sockaddr_in v4;
980 struct sockaddr_in6 v6;
981 int sock;
982
983 memset (&v4, 0, sizeof (v4));
984 memset (&v6, 0, sizeof (v6));
985 v4.sin_family = AF_INET;
986 v4.sin_port = htons ((uint16_t) port);
987#if HAVE_SOCKADDR_IN_SUN_LEN
988 v4.sin_len = (u_char) sizeof(struct sockaddr_in);
989#endif
990 GNUNET_assert (1 == inet_pton (AF_INET,
991 "127.0.0.1",
992 &v4.sin_addr));
993 ret = GNUNET_NO;
994 sock = socket (AF_INET,
995 SOCK_STREAM,
996 0);
997 if (-1 != sock)
998 {
999 if (0 != bind (sock,
1000 (struct sockaddr *) &v4,
1001 sizeof (v4)))
1002 {
1003 /* bind failed, so someone is listening! */
1004 ret = GNUNET_YES;
1005 }
1006 (void) close (sock);
1007 }
1008 else
1009 {
1011 "socket");
1012 if (GNUNET_NO == ret)
1014 }
1015 v6.sin6_family = AF_INET6;
1016 v6.sin6_port = htons ((uint16_t) port);
1017#if HAVE_SOCKADDR_IN_SUN_LEN
1018 v6.sin6_len = (u_char) sizeof(struct sockaddr_in6);
1019#endif
1020 inet_pton (AF_INET6,
1021 "::1",
1022 &v6.sin6_addr);
1023 sock = socket (AF_INET6,
1024 SOCK_STREAM,
1025 0);
1026 if (-1 != sock)
1027 {
1028 if (0 != bind (sock,
1029 (struct sockaddr *) &v6,
1030 sizeof (v6)))
1031 {
1032 /* bind failed, so someone is listening! */
1033 ret = GNUNET_YES;
1034 }
1035 (void) close (sock);
1036 }
1037 else
1038 {
1040 "socket");
1041 /* not changing 'ret' intentionally here, as
1042 v4 succeeding and v6 failing just means we
1043 should use v4 */
1044 }
1045 }
1046 else
1047 {
1048 /* service running remotely */
1049 ret = GNUNET_OK;
1050 }
1051 GNUNET_free (hostname);
1052 return ret;
1053}
static int ret
Final status code.
Definition: gnunet-arm.c:94
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:109
static uint16_t port
Port number.
Definition: gnunet-bcd.c:147
static char * service_name
Option -s: service name (hash to get service descriptor)
Definition: gnunet-vpn.c:50
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_filename(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be the name of a file or directory.
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.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
void GNUNET_log_config_invalid(enum GNUNET_ErrorType kind, const char *section, const char *option, const char *required)
Log error message about invalid configuration option value.
#define GNUNET_log_strerror(level, cmd)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_ERROR
#define GNUNET_free(ptr)
Wrapper around free.
#define _(String)
GNU gettext support macro.
Definition: platform.h:178

References _, cfg, GNUNET_assert, GNUNET_CONFIGURATION_get_value_filename(), GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_have_value(), GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log_config_invalid(), GNUNET_log_strerror, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, GNUNET_YES, ClientState::hostname, port, ret, and service_name.

Referenced by action_loop(), and run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CLIENT_connect()

struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  service_name,
const struct GNUNET_MQ_MessageHandler handlers,
GNUNET_MQ_ErrorHandler  error_handler,
void *  error_handler_cls 
)

Create a message queue to connect to a GNUnet service.

If handlers are specified, receive messages from the connection.

Parameters
cfgour configuration
service_namename of the service to connect to
handlershandlers for receiving messages, can be NULL
error_handlererror handler
error_handler_clsclosure for the error_handler
Returns
the message queue, NULL on error

Definition at line 1057 of file client.c.

1062{
1063 struct ClientState *cstate;
1064
1065 if (GNUNET_OK !=
1067 cfg))
1068 return NULL;
1069 cstate = GNUNET_new (struct ClientState);
1071 cstate->cfg = cfg;
1073 cstate);
1075 cstate);
1076 if (GNUNET_YES ==
1079 "PORT"))
1080 {
1081 if (! ((GNUNET_OK !=
1084 "PORT",
1085 &cstate->port)) ||
1086 (cstate->port > 65535) ||
1087 (GNUNET_OK !=
1090 "HOSTNAME",
1091 &cstate->hostname))) &&
1092 (0 == strlen (cstate->hostname)))
1093 {
1094 GNUNET_free (cstate->hostname);
1095 cstate->hostname = NULL;
1097 _ ("Need a non-empty hostname for service `%s'.\n"),
1098 service_name);
1099 }
1100 }
1104 cstate,
1105 handlers,
1107 error_handler_cls);
1108 return cstate->mq;
1109}
struct GNUNET_MQ_MessageHandlers handlers[]
Definition: 003.c:1
static void error_handler(void *cls, enum GNUNET_MQ_Error error)
Function called on connection trouble.
static void connection_client_cancel_impl(struct GNUNET_MQ_Handle *mq, void *impl_state)
Cancel the currently sent message.
Definition: client.c:873
static void connection_client_send_impl(struct GNUNET_MQ_Handle *mq, const struct GNUNET_MessageHeader *msg, void *impl_state)
Implements the transmission functionality of a message queue.
Definition: client.c:841
static void start_connect(void *cls)
Try to connect to the service.
Definition: client.c:787
static enum GNUNET_GenericReturnValue recv_message(void *cls, const struct GNUNET_MessageHeader *msg)
We have received a full message, pass to the MQ dispatcher.
Definition: client.c:335
static void connection_client_destroy_impl(struct GNUNET_MQ_Handle *mq, void *impl_state)
Implement the destruction of a message queue.
Definition: client.c:386
static int test_service_configuration(const char *service_name, const struct GNUNET_CONFIGURATION_Handle *cfg)
Test whether the configuration has proper values for connection (UNIXPATH || (PORT && HOSTNAME)).
Definition: client.c:726
#define LOG(kind,...)
Definition: client.c:37
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct GNUNET_MQ_Handle * GNUNET_MQ_queue_for_callbacks(GNUNET_MQ_SendImpl send, GNUNET_MQ_DestroyImpl destroy, GNUNET_MQ_CancelImpl cancel, void *impl_state, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *cls)
Create a message queue for the specified handlers.
Definition: mq.c:465
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1305
struct GNUNET_MessageStreamTokenizer * GNUNET_MST_create(GNUNET_MessageTokenizerCallback cb, void *cb_cls)
Create a message stream tokenizer.
Definition: mst.c:86
State we keep per client.
struct GNUNET_MQ_Handle * mq
MQ to talk to client.
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: client.c:116
struct GNUNET_MessageStreamTokenizer * mst
Tokenizer for inbound messages.
Definition: client.c:163
struct GNUNET_SCHEDULER_Task * retry_task
Task for trying to connect to the service.
Definition: client.c:148
char * hostname
Hostname, if any.
Definition: client.c:138
unsigned long long port
TCP port (0 for disabled).
Definition: client.c:184
char * service_name
Name of the service we interact with.
Definition: client.c:133

References _, cfg, ClientState::cfg, connection_client_cancel_impl(), connection_client_destroy_impl(), connection_client_send_impl(), error_handler(), GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_have_value(), GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_MQ_queue_for_callbacks(), GNUNET_MST_create(), GNUNET_new, GNUNET_OK, GNUNET_SCHEDULER_add_now(), GNUNET_strdup, GNUNET_YES, handlers, ClientState::hostname, LOG, ClientState::mq, ClientState::mst, ClientState::port, recv_message(), ClientState::retry_task, service_name, ClientState::service_name, start_connect(), and test_service_configuration().

Referenced by addr_cb(), announce_reconnect(), connect_task(), create_internal(), create_loc_uri(), do_connect(), do_reconnect(), GNUNET_CONSENSUS_create(), GNUNET_CONVERSATION_call_start(), GNUNET_DATASTORE_disconnect(), GNUNET_FS_get_indexed_files(), GNUNET_IDENTITY_ego_lookup(), GNUNET_IDENTITY_ego_lookup_by_suffix(), GNUNET_NAT_AUTO_autoconfig_start(), GNUNET_REVOCATION_query(), GNUNET_REVOCATION_revoke(), GNUNET_SCALARPRODUCT_accept_computation(), GNUNET_SCALARPRODUCT_start_computation(), GNUNET_SECRETSHARING_create_session(), GNUNET_SECRETSHARING_decrypt(), GNUNET_SETI_create(), GNUNET_SETU_create(), hash_for_index_cb(), listen_connect(), reconnect(), reconnect_arm(), reconnect_arm_monitor(), reconnect_phone(), reconnect_task(), search_reconnect(), test_nat_punched(), try_connect(), try_reconnect(), and unindex_finish().

Here is the call graph for this function:
Here is the caller graph for this function: