GNUnet  0.16.x
Functions
Client library

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

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 901 of file client.c.

903 {
904  char *hostname = NULL;
905  unsigned long long port;
906  int ret;
907 
908 #if AF_UNIX
909  {
910  char *unixpath = NULL;
911 
912  if (GNUNET_OK ==
914  service_name,
915  "UNIXPATH",
916  &unixpath))
917  {
918  if (0 == strlen (unixpath))
919  {
920  GNUNET_free (unixpath);
921  return GNUNET_SYSERR; /* empty string not OK */
922  }
923  if (0 == access (unixpath,
924  F_OK))
925  {
926  GNUNET_free (unixpath);
927  return GNUNET_OK; /* file exists, we assume service is running */
928  }
929  GNUNET_free (unixpath);
930  }
931  else if (GNUNET_OK ==
933  service_name,
934  "UNIXPATH"))
935  {
936  /* UNIXPATH specified but not a valid path! */
938  service_name,
939  "UNIXPATH",
940  _ ("not a valid filename"));
941  return GNUNET_SYSERR;
942  }
943  }
944 #endif
945 
946  if ( (GNUNET_OK !=
948  service_name,
949  "PORT",
950  &port)) ||
951  (port > 65535) ||
952  (0 == port) )
953  {
954  return GNUNET_SYSERR;
955  }
956  if (GNUNET_OK ==
958  service_name,
959  "HOSTNAME",
960  &hostname))
961  {
962  /* We always assume remotes are up */
963  ret = GNUNET_YES;
964  }
965  else
966  {
967  /* We look for evidence the service is up */
968  ret = GNUNET_NO;
969  }
970  if ( (NULL == hostname) ||
971  (0 == strcasecmp (hostname,
972  "localhost")) ||
973  (0 == strcasecmp (hostname,
974  "ip6-localnet")) )
975  {
976  /* service runs on loopback */
977  struct sockaddr_in v4;
978  struct sockaddr_in6 v6;
979  int sock;
980 
981  memset (&v4, 0, sizeof (v4));
982  memset (&v6, 0, sizeof (v6));
983  v4.sin_family = AF_INET;
984  v4.sin_port = htons ((uint16_t) port);
985 #if HAVE_SOCKADDR_IN_SUN_LEN
986  v4.sin_len = (u_char) sizeof(struct sockaddr_in);
987 #endif
988  inet_pton (AF_INET,
989  "127.0.0.1",
990  &v4.sin_addr);
991  ret = GNUNET_NO;
992  sock = socket (AF_INET,
993  SOCK_STREAM,
994  0);
995  if (-1 != sock)
996  {
997  if (0 != bind (sock,
998  (struct sockaddr *) &v4,
999  sizeof (v4)))
1000  {
1001  /* bind failed, so someone is listening! */
1002  ret = GNUNET_YES;
1003  }
1004  (void) close (sock);
1005  }
1006  else
1007  {
1009  "socket");
1010  if (GNUNET_NO == ret)
1011  ret = GNUNET_SYSERR;
1012  }
1013  v6.sin6_family = AF_INET6;
1014  v6.sin6_port = htons ((uint16_t) port);
1015 #if HAVE_SOCKADDR_IN_SUN_LEN
1016  v6.sin6_len = (u_char) sizeof(struct sockaddr_in6);
1017 #endif
1018  inet_pton (AF_INET6,
1019  "::1",
1020  &v6.sin6_addr);
1021  sock = socket (AF_INET6,
1022  SOCK_STREAM,
1023  0);
1024  if (-1 != sock)
1025  {
1026  if (0 != bind (sock,
1027  (struct sockaddr *) &v6,
1028  sizeof (v6)))
1029  {
1030  /* bind failed, so someone is listening! */
1031  ret = GNUNET_YES;
1032  }
1033  (void) close (sock);
1034  }
1035  else
1036  {
1038  "socket");
1039  /* not changing 'ret' intentionally here, as
1040  v4 succeeding and v6 failing just means we
1041  should use v4 */
1042  }
1043  }
1044  else
1045  {
1046  /* service running remotely */
1047  ret = GNUNET_OK;
1048  }
1050  return ret;
1051 }
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-abd.c:36
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
static uint16_t port
Port number.
Definition: gnunet-bcd.c:147
static char * hostname
Our hostname; we give this to all the peers we start.
static char * service_name
Option -s: service name (hash to get service descriptor)
Definition: gnunet-vpn.c:51
@ GNUNET_OK
Definition: gnunet_common.h:95
@ GNUNET_YES
Definition: gnunet_common.h:97
@ GNUNET_NO
Definition: gnunet_common.h:94
@ GNUNET_SYSERR
Definition: gnunet_common.h:93
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.
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:177

References _, cfg, 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, 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
connectionthe client connection
handlershandlers for receiving messages, can be NULL
error_handlererror handler
error_handler_clsclosure for the error_handler
Returns
the message queue, NULL on error

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 1066 of file client.c.

1071 {
1072  struct ClientState *cstate;
1073 
1074  if (GNUNET_OK !=
1076  cfg))
1077  return NULL;
1078  cstate = GNUNET_new (struct ClientState);
1080  cstate->cfg = cfg;
1082  cstate);
1083  cstate->mst = GNUNET_MST_create (&recv_message,
1084  cstate);
1085  if (GNUNET_YES ==
1087  service_name,
1088  "PORT"))
1089  {
1090  if (! ((GNUNET_OK !=
1092  service_name,
1093  "PORT",
1094  &cstate->port)) ||
1095  (cstate->port > 65535) ||
1096  (GNUNET_OK !=
1098  service_name,
1099  "HOSTNAME",
1100  &cstate->hostname))) &&
1101  (0 == strlen (cstate->hostname)))
1102  {
1103  GNUNET_free (cstate->hostname);
1104  cstate->hostname = NULL;
1106  _ ("Need a non-empty hostname for service `%s'.\n"),
1107  service_name);
1108  }
1109  }
1113  cstate,
1114  handlers,
1115  error_handler,
1116  error_handler_cls);
1117  return cstate->mq;
1118 }
static void error_handler(void *cls, enum GNUNET_MQ_Error error)
We encountered an error handling the MQ to the ATS service.
static void connection_client_cancel_impl(struct GNUNET_MQ_Handle *mq, void *impl_state)
Cancel the currently sent message.
Definition: client.c:871
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:839
static void start_connect(void *cls)
Try to connect to the service.
Definition: client.c:785
static int recv_message(void *cls, const struct GNUNET_MessageHeader *msg)
We have received a full message, pass to the MQ dispatcher.
Definition: client.c:334
static void connection_client_destroy_impl(struct GNUNET_MQ_Handle *mq, void *impl_state)
Implement the destruction of a message queue.
Definition: client.c:385
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:724
#define LOG(kind,...)
Definition: client.c:36
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
#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:467
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:1281
struct GNUNET_MessageStreamTokenizer * GNUNET_MST_create(GNUNET_MessageTokenizerCallback cb, void *cb_cls)
Create a message stream tokenizer.
Definition: mst.c:85
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:115
struct GNUNET_MessageStreamTokenizer * mst
Tokenizer for inbound messages.
Definition: client.c:162
struct GNUNET_SCHEDULER_Task * retry_task
Task for trying to connect to the service.
Definition: client.c:147
char * hostname
Hostname, if any.
Definition: client.c:137
unsigned long long port
TCP port (0 for disabled).
Definition: client.c:183
char * service_name
Name of the service we interact with.
Definition: client.c:132

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, ClientState::service_name, service_name, start_connect(), and test_service_configuration().

Referenced by addr_cb(), announce_reconnect(), connect_task(), create_internal(), create_loc_uri(), do_connect(), do_peer_connect(), do_plugin_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(), GNUNET_TESTBED_barrier_wait(), GNUNET_TESTBED_controller_connect(), GNUNET_TESTBED_LOGGER_connect(), GNUNET_TRANSPORT_address_to_string(), GNUNET_TRANSPORT_offer_hello(), 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: