GNUnet 0.26.2-106-g126384b46
 
Loading...
Searching...
No Matches
Service library

Start service processes. More...

Collaboration diagram for Service library:

Macros

#define GNUNET_SERVICE_MAIN(pd, service_name, service_options, init_cb, connect_cb, disconnect_cb, cls, ...)
 Creates the "main" function for a GNUnet service.
 

Typedefs

typedef void(* GNUNET_SERVICE_InitCallback) (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_SERVICE_Handle *sh)
 Callback to initialize a service, called exactly once when the service is run.
 
typedef void *(* GNUNET_SERVICE_ConnectHandler) (void *cls, struct GNUNET_SERVICE_Client *c, struct GNUNET_MQ_Handle *mq)
 Callback to be called when a client connects to the service.
 
typedef void(* GNUNET_SERVICE_DisconnectHandler) (void *cls, struct GNUNET_SERVICE_Client *c, void *internal_cls)
 Callback to be called when a client disconnected from the service.
 

Enumerations

enum  GNUNET_SERVICE_Options {
  GNUNET_SERVICE_OPTION_NONE = 0 , GNUNET_SERVICE_OPTION_MANUAL_SHUTDOWN = 1 , GNUNET_SERVICE_OPTION_SOFT_SHUTDOWN = 2 , GNUNET_SERVICE_OPTION_SHUTDOWN_BITMASK = 3 ,
  GNUNET_SERVICE_OPTION_CLOSE_LSOCKS = 4
}
 Options for the service (bitmask). More...
 

Functions

struct GNUNET_SERVICE_HandleGNUNET_SERVICE_start (const struct GNUNET_OS_ProjectData *pd, const char *service_name, const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_SERVICE_ConnectHandler connect_cb, GNUNET_SERVICE_DisconnectHandler disconnect_cb, void *cls, const struct GNUNET_MQ_MessageHandler *handlers)
 Low-level function to start a service if the scheduler is already running.
 
void GNUNET_SERVICE_stop (struct GNUNET_SERVICE_Handle *srv)
 Stops a service that was started with GNUNET_SERVICE_start().
 
int GNUNET_SERVICE_run_ (const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, const char *service_name, enum GNUNET_SERVICE_Options options, GNUNET_SERVICE_InitCallback service_init_cb, GNUNET_SERVICE_ConnectHandler connect_cb, GNUNET_SERVICE_DisconnectHandler disconnect_cb, void *cls, const struct GNUNET_MQ_MessageHandler *handlers)
 Creates the "main" function for a GNUnet service.
 
int GNUNET_SERVICE_register_ (const struct GNUNET_OS_ProjectData *pd, const char *service_name, enum GNUNET_SERVICE_Options options, GNUNET_SERVICE_InitCallback service_init_cb, GNUNET_SERVICE_ConnectHandler connect_cb, GNUNET_SERVICE_DisconnectHandler disconnect_cb, void *cls, const struct GNUNET_MQ_MessageHandler *handlers)
 Registers the GNUnet service to be scheduled as part of a monilithic libgnunet.
 
void GNUNET_SERVICE_main (const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, struct GNUNET_CONFIGURATION_Handle *cfg, enum GNUNET_GenericReturnValue with_scheduler)
 Run the mainloop in a monolithic libgnunet.
 
void GNUNET_SERVICE_suspend (struct GNUNET_SERVICE_Handle *sh)
 Suspend accepting connections from the listen socket temporarily.
 
void GNUNET_SERVICE_resume (struct GNUNET_SERVICE_Handle *sh)
 Resume accepting connections from the listen socket.
 
void GNUNET_SERVICE_client_continue (struct GNUNET_SERVICE_Client *c)
 Continue receiving further messages from the given client.
 
struct GNUNET_MQ_HandleGNUNET_SERVICE_client_get_mq (struct GNUNET_SERVICE_Client *c)
 Obtain the message queue of c.
 
void GNUNET_SERVICE_client_disable_continue_warning (struct GNUNET_SERVICE_Client *c)
 Disable the warning the server issues if a message is not acknowledged in a timely fashion.
 
void GNUNET_SERVICE_client_drop (struct GNUNET_SERVICE_Client *c)
 Ask the server to disconnect from the given client.
 
void GNUNET_SERVICE_shutdown (struct GNUNET_SERVICE_Handle *sh)
 Explicitly stops the service.
 
void GNUNET_SERVICE_client_mark_monitor (struct GNUNET_SERVICE_Client *c)
 Set the 'monitor' flag on this client.
 
void GNUNET_SERVICE_client_persist (struct GNUNET_SERVICE_Client *c)
 Set the persist option on this client.
 

Detailed Description

Start service processes.

See also
Documentation

Macro Definition Documentation

◆ GNUNET_SERVICE_MAIN

#define GNUNET_SERVICE_MAIN (   pd,
  service_name,
  service_options,
  init_cb,
  connect_cb,
  disconnect_cb,
  cls,
  ... 
)
Value:
int \
main (int argc, \
char *const *argv) \
{ \
__VA_ARGS__ \
}; \
return GNUNET_SERVICE_run_ (pd, \
argc, \
argv, \
service_options, \
cls, \
mh); \
}
static struct GNUNET_CADET_Handle * mh
Cadet handle.
static char * service_name
Option -s: service name (hash to get service descriptor)
Definition gnunet-vpn.c:50
void * cls
Closure for mv and cb.
int GNUNET_SERVICE_run_(const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, const char *service_name, enum GNUNET_SERVICE_Options options, GNUNET_SERVICE_InitCallback service_init_cb, GNUNET_SERVICE_ConnectHandler connect_cb, GNUNET_SERVICE_DisconnectHandler disconnect_cb, void *cls, const struct GNUNET_MQ_MessageHandler *handlers)
Creates the "main" function for a GNUnet service.
Definition service.c:2022
Message handler for a specific message type.
static void * connect_cb(void *cls, const struct GNUNET_PeerIdentity *peer_id, struct GNUNET_MQ_Handle *mq, enum GNUNET_CORE_PeerClass class)
static void init_cb(void *cls, const struct GNUNET_PeerIdentity *my_identity)
static void disconnect_cb(void *cls, const struct GNUNET_PeerIdentity *peer, void *peer_cls)

Creates the "main" function for a GNUnet service.

You MUST use this macro to define GNUnet services (except for ARM, which MUST NOT use the macro). The reason is the GNUnet-as-a-library project, where we will not define a main function anywhere but in ARM.

The macro will launch the service with the name service_name using the service_options to configure its shutdown behavior. Once the service is ready, the init_cb will be called for service-specific initialization. init_cb will be given the service handler which can be used to control the service's availability. When clients connect or disconnect, the respective connect_cb or disconnect_cb functions will be called. For messages received from the clients, the respective handlers will be invoked; for the closure of the handlers we use the return value from the connect_cb invocation of the respective client.

Each handler MUST call GNUNET_SERVICE_client_continue() after each message to receive further messages from this client. If GNUNET_SERVICE_client_continue() is not called within a short time, a warning will be logged. If delays are expected, services should call GNUNET_SERVICE_client_disable_continue_warning() to disable the warning.

Clients sending invalid messages (based on handlers) will be dropped. Additionally, clients can be dropped at any time using GNUNET_SERVICE_client_drop().

Parameters
service_namename of the service to run
service_optionsoptions controlling shutdown of the service
init_cbfunction to call once the service is ready
connect_cbfunction to call whenever a client connects
disconnect_cbfunction to call whenever a client disconnects
clsclosure argument for service_init_cb, connect_cb and disconnect_cb
...array of message handlers for the service, terminated by GNUNET_MQ_handler_end(); the closure will be set to the value returned by the connect_cb for the respective connection
Returns
0 on success, non-zero on error

Sample invocation: GNUNET_SERVICE_MAIN ("resolver", GNUNET_SERVICE_OPTION_NONE, &init_cb, &connect_cb, &disconnect_cb, closure_for_cb, GNUNET_MQ_hd_var_size (get, GNUNET_MESSAGE_TYPE_RESOLVER_REQUEST, struct GNUNET_RESOLVER_GetMessage, NULL), GNUNET_MQ_handler_end ());

Definition at line 373 of file gnunet_service_lib.h.

379 { \
380 struct GNUNET_MQ_MessageHandler mh[] = { \
381 __VA_ARGS__ \
382 }; \
383 return GNUNET_SERVICE_run_ (pd, \
384 argc, \
385 argv, \
386 service_name, \
387 service_options, \
388 init_cb, \
389 connect_cb, \
391 cls, \
392 mh); \
393 }

Typedef Documentation

◆ GNUNET_SERVICE_InitCallback

typedef void(* GNUNET_SERVICE_InitCallback) (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_SERVICE_Handle *sh)

Callback to initialize a service, called exactly once when the service is run.

Parameters
clsclosure passed to GNUNET_SERVICE_MAIN
cfgconfiguration to use for this service
shhandle to the newly create service

Definition at line 120 of file gnunet_service_lib.h.

◆ GNUNET_SERVICE_ConnectHandler

typedef void *(* GNUNET_SERVICE_ConnectHandler) (void *cls, struct GNUNET_SERVICE_Client *c, struct GNUNET_MQ_Handle *mq)

Callback to be called when a client connects to the service.

Parameters
clsclosure for the service
cthe new client that connected to the service
mqthe message queue used to send messages to the client
Returns
the client-specific (‘internal’) closure

Definition at line 134 of file gnunet_service_lib.h.

◆ GNUNET_SERVICE_DisconnectHandler

typedef void(* GNUNET_SERVICE_DisconnectHandler) (void *cls, struct GNUNET_SERVICE_Client *c, void *internal_cls)

Callback to be called when a client disconnected from the service.

Parameters
clsclosure for the service
cthe client that disconnected
internal_clsthe client-specific (‘internal’) closure

Definition at line 147 of file gnunet_service_lib.h.

Enumeration Type Documentation

◆ GNUNET_SERVICE_Options

Options for the service (bitmask).

Enumerator
GNUNET_SERVICE_OPTION_NONE 

Use defaults.

Terminates all client connections and the listen sockets immediately upon receiving the shutdown signal.

GNUNET_SERVICE_OPTION_MANUAL_SHUTDOWN 

Do not trigger server shutdown on signal at all; instead, allow for the user to terminate the server explicitly when needed by calling GNUNET_SERVICE_shutdown().

GNUNET_SERVICE_OPTION_SOFT_SHUTDOWN 

Trigger a SOFT server shutdown on signals, allowing active non-monitor clients to complete their transactions.

GNUNET_SERVICE_OPTION_SHUTDOWN_BITMASK 

Bitmask over the shutdown options.

GNUNET_SERVICE_OPTION_CLOSE_LSOCKS 

Instead of listening on lsocks passed by the parent, close them after opening our own listen socket(s).

Definition at line 65 of file gnunet_service_lib.h.

66{
72
79
85
90
96};
@ GNUNET_SERVICE_OPTION_MANUAL_SHUTDOWN
Do not trigger server shutdown on signal at all; instead, allow for the user to terminate the server ...
@ GNUNET_SERVICE_OPTION_SHUTDOWN_BITMASK
Bitmask over the shutdown options.
@ GNUNET_SERVICE_OPTION_CLOSE_LSOCKS
Instead of listening on lsocks passed by the parent, close them after opening our own listen socket(s...
@ GNUNET_SERVICE_OPTION_NONE
Use defaults.
@ GNUNET_SERVICE_OPTION_SOFT_SHUTDOWN
Trigger a SOFT server shutdown on signals, allowing active non-monitor clients to complete their tran...

Function Documentation

◆ GNUNET_SERVICE_start()

struct GNUNET_SERVICE_Handle * GNUNET_SERVICE_start ( const struct GNUNET_OS_ProjectData pd,
const char *  service_name,
const struct GNUNET_CONFIGURATION_Handle cfg,
GNUNET_SERVICE_ConnectHandler  connect_cb,
GNUNET_SERVICE_DisconnectHandler  disconnect_cb,
void *  cls,
const struct GNUNET_MQ_MessageHandler handlers 
)

Low-level function to start a service if the scheduler is already running.

Should only be used directly in special cases.

The function will launch the service with the name service_name using the service_options to configure its shutdown behavior. When clients connect or disconnect, the respective connect_cb or disconnect_cb functions will be called. For messages received from the clients, the respective handlers will be invoked; for the closure of the handlers we use the return value from the connect_cb invocation of the respective client.

Each handler MUST call GNUNET_SERVICE_client_continue() after each message to receive further messages from this client. If GNUNET_SERVICE_client_continue() is not called within a short time, a warning will be logged. If delays are expected, services should call GNUNET_SERVICE_client_disable_continue_warning() to disable the warning.

Clients sending invalid messages (based on handlers) will be dropped. Additionally, clients can be dropped at any time using GNUNET_SERVICE_client_drop().

The service must be stopped using GNUNET_SERVICE_stop().

Parameters
pdproject data for the service
service_namename of the service to run
cfgconfiguration to use
connect_cbfunction to call whenever a client connects
disconnect_cbfunction to call whenever a client disconnects
clsclosure argument for connect_cb and disconnect_cb
handlersNULL-terminated array of message handlers for the service, the closure will be set to the value returned by the connect_cb for the respective connection
Returns
NULL on error

Definition at line 1928 of file service.c.

1935{
1936 struct GNUNET_SERVICE_Handle *sh;
1937
1939 sh->pd = pd;
1940 sh->service_name = service_name;
1941 sh->cfg = cfg;
1942 sh->connect_cb = connect_cb;
1943 sh->disconnect_cb = disconnect_cb;
1944 sh->cb_cls = cls;
1946 &return_agpl,
1947 NULL);
1948 if (GNUNET_OK !=
1950 sh))
1951 {
1952 GNUNET_free (sh->handlers);
1953 GNUNET_free (sh);
1954 return NULL;
1955 }
1956 do_resume (sh,
1958 return sh;
1959}
struct GNUNET_MQ_MessageHandlers handlers[]
Definition 003.c:1
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition gnunet-arm.c:108
static struct GNUNET_IDENTITY_Handle * sh
Handle to IDENTITY service.
@ GNUNET_OK
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_MQ_MessageHandler * GNUNET_MQ_copy_handlers2(const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_MessageCallback agpl_handler, void *agpl_cls)
Copy an array of handlers, appending AGPL handler.
Definition mq.c:992
static void do_resume(struct GNUNET_SERVICE_Handle *sh, enum SuspendReason sr)
Resume accepting connections from the listen socket.
Definition service.c:880
static void return_agpl(void *cls, const struct GNUNET_MessageHeader *msg)
Function to return link to AGPL source upon request.
Definition service.c:1902
static enum GNUNET_GenericReturnValue setup_service(const struct GNUNET_OS_ProjectData *pd, struct GNUNET_SERVICE_Handle *sh)
Setup service handle.
Definition service.c:1476
@ SUSPEND_STATE_NONE
We are running normally.
Definition service.c:88
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration to use.
void * cb_cls
Closure for cb.
Handle to a service.
Definition service.c:116
const struct GNUNET_OS_ProjectData * pd
Project data of this service.
Definition service.c:125

References GNUNET_IDENTITY_Handle::cb_cls, cfg, GNUNET_IDENTITY_Handle::cfg, connect_cb(), disconnect_cb(), do_resume(), GNUNET_free, GNUNET_MQ_copy_handlers2(), GNUNET_new, GNUNET_OK, handlers, GNUNET_SERVICE_Handle::pd, return_agpl(), service_name, setup_service(), sh, and SUSPEND_STATE_NONE.

Referenced by transport_communicator_start().

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

◆ GNUNET_SERVICE_stop()

void GNUNET_SERVICE_stop ( struct GNUNET_SERVICE_Handle srv)

Stops a service that was started with GNUNET_SERVICE_start().

Parameters
srvservice to stop

Definition at line 2003 of file service.c.

2004{
2005 struct GNUNET_SERVICE_Client *client;
2006
2008 while (NULL != (client = srv->clients_head))
2009 {
2010 if (NULL == client->drop_task)
2013 finish_client_drop (client);
2014 }
2015 teardown_service (srv);
2016 GNUNET_free (srv->handlers);
2017 GNUNET_free (srv);
2018}
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition scheduler.c:986
void GNUNET_SERVICE_suspend(struct GNUNET_SERVICE_Handle *sh)
Suspend accepting connections from the listen socket temporarily.
Definition service.c:2381
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition service.c:2463
static void teardown_service(struct GNUNET_SERVICE_Handle *sh)
Tear down the service, closing the listen sockets and freeing the ACLs.
Definition service.c:1873
static void finish_client_drop(void *cls)
Asynchronously finish dropping the client.
Definition service.c:1968
Handle to a client that is connected to a service.
Definition service.c:249
struct GNUNET_SCHEDULER_Task * drop_task
Task run to finish dropping the client after the stack has properly unwound.
Definition service.c:290
struct GNUNET_MQ_MessageHandler * handlers
Message handlers to use for all clients.
Definition service.c:175
struct GNUNET_SERVICE_Client * clients_head
Our clients, kept in a DLL.
Definition service.c:165

References GNUNET_SERVICE_Handle::clients_head, GNUNET_SERVICE_Client::drop_task, finish_client_drop(), GNUNET_free, GNUNET_SCHEDULER_cancel(), GNUNET_SERVICE_client_drop(), GNUNET_SERVICE_suspend(), GNUNET_SERVICE_Handle::handlers, and teardown_service().

Referenced by shutdown_service().

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

◆ GNUNET_SERVICE_run_()

int GNUNET_SERVICE_run_ ( const struct GNUNET_OS_ProjectData pd,
int  argc,
char *const *  argv,
const char *  service_name,
enum GNUNET_SERVICE_Options  options,
GNUNET_SERVICE_InitCallback  service_init_cb,
GNUNET_SERVICE_ConnectHandler  connect_cb,
GNUNET_SERVICE_DisconnectHandler  disconnect_cb,
void *  cls,
const struct GNUNET_MQ_MessageHandler handlers 
)

Creates the "main" function for a GNUnet service.

You should almost always use the GNUNET_SERVICE_MAIN macro instead of calling this function directly (except for ARM, which should call this function directly).

The function will launch the service with the name service_name using the service_options to configure its shutdown behavior. Once the service is ready, the init_cb will be called for service-specific initialization. init_cb will be given the service handler which can be used to control the service's availability. When clients connect or disconnect, the respective connect_cb or disconnect_cb functions will be called. For messages received from the clients, the respective handlers will be invoked; for the closure of the handlers we use the return value from the connect_cb invocation of the respective client.

Each handler MUST call GNUNET_SERVICE_client_continue() after each message to receive further messages from this client. If GNUNET_SERVICE_client_continue() is not called within a short time, a warning will be logged. If delays are expected, services should call GNUNET_SERVICE_client_disable_continue_warning() to disable the warning.

Clients sending invalid messages (based on handlers) will be dropped. Additionally, clients can be dropped at any time using GNUNET_SERVICE_client_drop().

Parameters
pdproject data for the service
argcnumber of command-line arguments in argv
argvarray of command-line arguments
service_namename of the service to run
optionsoptions controlling shutdown of the service
service_init_cbfunction to call once the service is ready
connect_cbfunction to call whenever a client connects
disconnect_cbfunction to call whenever a client disconnects
clsclosure argument for service_init_cb, connect_cb and disconnect_cb
handlersNULL-terminated array of message handlers for the service, the closure will be set to the value returned by the connect_cb for the respective connection
Returns
0 on success, non-zero on error

Definition at line 2022 of file service.c.

2032{
2034
2035#if ENABLE_NLS
2036 char *path;
2037#endif
2038 char *cfg_filename;
2039 char *opt_cfg_filename;
2040 char *loglev;
2041 const char *xdg;
2042 char *logfile;
2043 int do_daemonize;
2044 unsigned long long skew_offset;
2045 unsigned long long skew_variance;
2046 long long clock_offset;
2048 int ret;
2049 int err;
2050 struct GNUNET_GETOPT_CommandLineOption service_options[] = {
2051 GNUNET_GETOPT_option_cfgfile (&opt_cfg_filename),
2053 "daemonize",
2054 gettext_noop (
2055 "do daemonize (detach from terminal)"),
2056 &do_daemonize),
2058 NULL),
2063 };
2064
2065 err = 1;
2066 memset (&sh, 0, sizeof(sh));
2067 xdg = getenv ("XDG_CONFIG_HOME");
2068 if (NULL != xdg)
2070 "%s%s%s",
2071 xdg,
2073 pd->config_file);
2074 else
2076 sh.pd = pd;
2077 sh.ready_confirm_fd = -1;
2078 sh.options = options;
2080 sh.service_init_cb = service_init_cb;
2081 sh.connect_cb = connect_cb;
2082 sh.disconnect_cb = disconnect_cb;
2083 sh.cb_cls = cls;
2084 sh.handlers = (NULL == pd->agpl_url)
2087 &return_agpl,
2088 NULL);
2089 sh.service_name = service_name;
2090 /* setup subsystems */
2091 loglev = NULL;
2092 logfile = NULL;
2093 opt_cfg_filename = NULL;
2094 do_daemonize = 0;
2095#if ENABLE_NLS
2096 if (NULL != pd->gettext_domain)
2097 {
2098 setlocale (LC_ALL, "");
2099 path = (NULL == pd->gettext_path)
2103 if (NULL != path)
2104 {
2105 bindtextdomain (pd->gettext_domain, path);
2106 GNUNET_free (path);
2107 }
2109 }
2110#endif
2112 service_options,
2113 argc,
2114 argv);
2115 if (GNUNET_SYSERR == ret)
2116 goto shutdown;
2117 if (GNUNET_NO == ret)
2118 {
2119 err = 0;
2120 goto shutdown;
2121 }
2123 loglev,
2124 logfile))
2125 {
2126 GNUNET_break (0);
2127 goto shutdown;
2128 }
2129 if (NULL != opt_cfg_filename)
2130 {
2131 if ((GNUNET_YES != GNUNET_DISK_file_test (opt_cfg_filename)) ||
2132 (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, opt_cfg_filename)))
2133 {
2135 _ ("Malformed configuration file `%s', exit ...\n"),
2136 opt_cfg_filename);
2137 goto shutdown;
2138 }
2139 }
2140 else
2141 {
2142 if (GNUNET_YES ==
2144 {
2145 if (GNUNET_SYSERR ==
2147 cfg_filename))
2148 {
2150 _ ("Malformed configuration file `%s', exit ...\n"),
2151 cfg_filename);
2152 goto shutdown;
2153 }
2154 }
2155 else
2156 {
2157 if (GNUNET_SYSERR ==
2159 NULL))
2160 {
2162 _ ("Malformed configuration, exit ...\n"));
2163 goto shutdown;
2164 }
2165 }
2166 }
2167 if (GNUNET_OK !=
2168 setup_service (pd,
2169 &sh))
2170 goto shutdown;
2171 if ( (1 == do_daemonize) &&
2172 (GNUNET_OK !=
2173 detach_terminal (&sh)) )
2174 {
2175 GNUNET_break (0);
2176 goto shutdown;
2177 }
2178 if (GNUNET_OK != set_user_id (&sh))
2179 goto shutdown;
2181 "Service `%s' runs with configuration from `%s'\n",
2183 (NULL != opt_cfg_filename) ? opt_cfg_filename : cfg_filename);
2184 if ( (GNUNET_OK ==
2186 "TESTING",
2187 "SKEW_OFFSET",
2188 &skew_offset)) &&
2189 (GNUNET_OK ==
2191 "TESTING",
2192 "SKEW_VARIANCE",
2193 &skew_variance)) )
2194 {
2195 clock_offset = skew_offset - skew_variance;
2196 GNUNET_TIME_set_offset (clock_offset);
2198 "Skewing clock by %lld ms\n",
2199 (long long) clock_offset);
2200 }
2202
2203 /* actually run service */
2204 err = 0;
2206 /* shutdown */
2207 if (1 == do_daemonize)
2209
2210shutdown:
2211 if (-1 != sh.ready_confirm_fd)
2212 {
2213 if (1 != write (sh.ready_confirm_fd, err ? "I" : "S", 1))
2215 GNUNET_break (0 == close (sh.ready_confirm_fd));
2216 }
2218 GNUNET_free (sh.handlers);
2221 GNUNET_free (logfile);
2222 GNUNET_free (loglev);
2224 GNUNET_free (opt_cfg_filename);
2225
2226 return err ? GNUNET_SYSERR : 0;
2227}
struct GNUNET_GETOPT_CommandLineOption options[]
Definition 002.c:5
char * getenv()
#define gettext_noop(String)
Definition gettext.h:74
#define textdomain(Domainname)
Definition gettext.h:61
#define bindtextdomain(Domainname, Dirname)
Definition gettext.h:62
static int ret
Final status code.
Definition gnunet-arm.c:93
static char * cfg_filename
Name of the configuration file.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(const struct GNUNET_OS_ProjectData *pd)
Create a new configuration object.
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.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_load(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Load configuration.
enum GNUNET_GenericReturnValue GNUNET_DISK_file_test(const char *fil)
Check that fil corresponds to a filename (of a file that exists and that is not a directory).
Definition disk.c:557
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_cfgfile(char **fn)
Allow user to specify configuration file name (-c option)
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_logfile(char **logfn)
Allow user to specify log file name (-l option)
int GNUNET_GETOPT_run(const char *binaryOptions, const struct GNUNET_GETOPT_CommandLineOption *allOptions, unsigned int argc, char *const *argv)
Parse the command line.
Definition getopt.c:884
#define GNUNET_GETOPT_OPTION_END
Marker for the end of the list of options.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_help(const struct GNUNET_OS_ProjectData *pd, const char *about)
Defining the option to print the command line help text (-h option).
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_loglevel(char **level)
Define the '-L' log level option.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_flag(char shortName, const char *name, const char *description, int *val)
Allow user to specify a flag (which internally means setting an integer to 1/GNUNET_YES/GNUNET_OK.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_version(const char *version)
Define the option to print the version of the application (-v option)
#define GNUNET_log(kind,...)
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
enum GNUNET_GenericReturnValue GNUNET_log_setup(const char *comp, const char *loglevel, const char *logfile)
Setup logging.
@ 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_strdup(a)
Wrapper around GNUNET_xstrdup_.
struct GNUNET_MQ_MessageHandler * GNUNET_MQ_copy_handlers(const struct GNUNET_MQ_MessageHandler *handlers)
Copy an array of handlers.
Definition mq.c:974
char * GNUNET_OS_installation_get_path(const struct GNUNET_OS_ProjectData *pd, enum GNUNET_OS_InstallationPathKind dirkind)
Get the path to a specific GNUnet installation directory or, with GNUNET_OS_IPK_SELF_PREFIX,...
@ GNUNET_OS_IPK_LOCALEDIR
Return the directory where translations are installed (share/locale/)
void GNUNET_RESOLVER_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Create the connection to the resolver service.
void GNUNET_SCHEDULER_run(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Initialize and run scheduler.
Definition scheduler.c:731
void GNUNET_TIME_set_offset(long long offset)
Set the timestamp offset for this instance.
Definition time.c:49
#define DIR_SEPARATOR_STR
Definition platform.h:167
#define _(String)
GNU gettext support macro.
Definition platform.h:179
static enum GNUNET_GenericReturnValue detach_terminal(struct GNUNET_SERVICE_Handle *sh)
Detach from terminal.
Definition service.c:1789
static void pid_file_delete(struct GNUNET_SERVICE_Handle *sh)
Delete the PID file that was created by our parent.
Definition service.c:1768
static enum GNUNET_GenericReturnValue set_user_id(struct GNUNET_SERVICE_Handle *sh)
Set user ID.
Definition service.c:1698
static void service_main(void *cls)
First task run by any service.
Definition service.c:909
#define LOG(kind,...)
Definition service.c:39
#define LOG_STRERROR(kind, syscall)
Definition service.c:41
void GNUNET_SPEEDUP_stop_()
Stop tasks that modify clock behavior.
Definition speedup.c:100
Definition of a command line option.
const char * gettext_path
Gettext directory, e.g.
const char * gettext_domain
Gettext domain for localisation, e.g.
const char * agpl_url
URL pointing to the source code of the application.
const char * user_config_file
Configuration file name to use (if $XDG_CONFIG_HOME is not set).
const char * config_file
Configuration file name (in $XDG_CONFIG_HOME) to use.
const char * version
String identifying the current project version.

References _, GNUNET_OS_ProjectData::agpl_url, bindtextdomain, GNUNET_IDENTITY_Handle::cb_cls, cfg, GNUNET_IDENTITY_Handle::cfg, cfg_filename, GNUNET_OS_ProjectData::config_file, connect_cb(), detach_terminal(), DIR_SEPARATOR_STR, disconnect_cb(), getenv(), GNUNET_OS_ProjectData::gettext_domain, gettext_noop, GNUNET_OS_ProjectData::gettext_path, GNUNET_asprintf(), GNUNET_break, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_load(), GNUNET_DISK_file_test(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_GETOPT_option_cfgfile(), GNUNET_GETOPT_OPTION_END, GNUNET_GETOPT_option_flag(), GNUNET_GETOPT_option_help(), GNUNET_GETOPT_option_logfile(), GNUNET_GETOPT_option_loglevel(), GNUNET_GETOPT_option_version(), GNUNET_GETOPT_run(), GNUNET_log, GNUNET_log_setup(), GNUNET_MQ_copy_handlers(), GNUNET_MQ_copy_handlers2(), GNUNET_NO, GNUNET_OK, GNUNET_OS_installation_get_path(), GNUNET_OS_IPK_LOCALEDIR, GNUNET_RESOLVER_connect(), GNUNET_SCHEDULER_run(), GNUNET_SPEEDUP_stop_(), GNUNET_strdup, GNUNET_SYSERR, GNUNET_TIME_set_offset(), GNUNET_YES, handlers, LOG, LOG_STRERROR, options, pid_file_delete(), ret, return_agpl(), service_main(), service_name, set_user_id(), setup_service(), sh, teardown_service(), textdomain, GNUNET_OS_ProjectData::user_config_file, and GNUNET_OS_ProjectData::version.

Referenced by main().

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

◆ GNUNET_SERVICE_register_()

int GNUNET_SERVICE_register_ ( const struct GNUNET_OS_ProjectData pd,
const char *  service_name,
enum GNUNET_SERVICE_Options  options,
GNUNET_SERVICE_InitCallback  service_init_cb,
GNUNET_SERVICE_ConnectHandler  connect_cb,
GNUNET_SERVICE_DisconnectHandler  disconnect_cb,
void *  cls,
const struct GNUNET_MQ_MessageHandler handlers 
)

Registers the GNUnet service to be scheduled as part of a monilithic libgnunet.

You should almost always use the GNUNET_SERVICE_MAIN macro instead of calling this function directly.

The function will launch the service with the name service_name using the service_options to configure its shutdown behavior. Once the service is ready, the init_cb will be called for service-specific initialization. init_cb will be given the service handler which can be used to control the service's availability. When clients connect or disconnect, the respective connect_cb or disconnect_cb functions will be called. For messages received from the clients, the respective handlers will be invoked; for the closure of the handlers we use the return value from the connect_cb invocation of the respective client.

Each handler MUST call GNUNET_SERVICE_client_continue() after each message to receive further messages from this client. If GNUNET_SERVICE_client_continue() is not called within a short time, a warning will be logged. If delays are expected, services should call GNUNET_SERVICE_client_disable_continue_warning() to disable the warning.

Clients sending invalid messages (based on handlers) will be dropped. Additionally, clients can be dropped at any time using GNUNET_SERVICE_client_drop().

Parameters
pdproject data for the service
service_namename of the service to run
optionsoptions controlling shutdown of the service
service_init_cbfunction to call once the service is ready
connect_cbfunction to call whenever a client connects
disconnect_cbfunction to call whenever a client disconnects
clsclosure argument for service_init_cb, connect_cb and disconnect_cb
handlersNULL-terminated array of message handlers for the service, the closure will be set to the value returned by the connect_cb for the respective connection
Returns
0 on success, non-zero on error

Definition at line 2254 of file service.c.

2262{
2263 struct ServiceHandleList *hle;
2265
2266 sh->pd = pd;
2267 sh->ready_confirm_fd = -1;
2268 sh->options = options;
2269 sh->service_init_cb = service_init_cb;
2270 sh->connect_cb = connect_cb;
2271 sh->disconnect_cb = disconnect_cb;
2272 sh->cb_cls = cls;
2273 sh->handlers = (NULL == pd->agpl_url)
2276 sh->service_name = service_name;
2277 hle = GNUNET_new (struct ServiceHandleList);
2278 hle->sh = sh;
2280 hll_tail,
2281 hle);
2282 return 0;
2283}
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
static struct ServiceHandleList * hll_head
Definition service.c:2247
static struct ServiceHandleList * hll_tail
Definition service.c:2250
GNUNET_SERVICE_InitCallback service_init_cb
Main service-specific task to run.
Definition service.c:135
A list of service to be launched when GNUNET_SERVICE_main() is called.
Definition service.c:2235
struct GNUNET_SERVICE_Handle * sh
Definition service.c:2243

References GNUNET_OS_ProjectData::agpl_url, GNUNET_IDENTITY_Handle::cb_cls, connect_cb(), disconnect_cb(), GNUNET_CONTAINER_DLL_insert, GNUNET_MQ_copy_handlers(), GNUNET_MQ_copy_handlers2(), GNUNET_new, handlers, hll_head, hll_tail, options, GNUNET_SERVICE_Handle::pd, return_agpl(), GNUNET_SERVICE_Handle::service_init_cb, service_name, sh, and ServiceHandleList::sh.

Here is the call graph for this function:

◆ GNUNET_SERVICE_main()

void GNUNET_SERVICE_main ( const struct GNUNET_OS_ProjectData pd,
int  argc,
char *const *  argv,
struct GNUNET_CONFIGURATION_Handle cfg,
enum GNUNET_GenericReturnValue  with_scheduler 
)

Run the mainloop in a monolithic libgnunet.

Must be called such that services are actually launched.

Definition at line 2348 of file service.c.

2353{
2354 struct LaunchContext lc = {
2355 .pd = pd,
2356 .cfg = cfg
2357 };
2358
2360 "Entering GNUNET_SERVICE_main\n");
2361 if (GNUNET_YES == with_scheduler)
2362 {
2363 if (GNUNET_YES !=
2365 argc,
2366 argv,
2367 cfg))
2368 return;
2370 &lc);
2371 }
2372 else
2373 {
2376 }
2377}
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_conf_and_options(const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, struct GNUNET_CONFIGURATION_Handle *cfg)
Create configuration handle from options and configuration file.
Definition program.c:429
static void launch_registered_services(void *cls)
Definition service.c:2321
const struct GNUNET_OS_ProjectData * pd
Definition service.c:2316

References cfg, GNUNET_ERROR_TYPE_DEBUG, GNUNET_PROGRAM_conf_and_options(), GNUNET_RESOLVER_connect(), GNUNET_SCHEDULER_run(), GNUNET_YES, launch_registered_services(), LOG, and LaunchContext::pd.

Referenced by monolith_main().

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

◆ GNUNET_SERVICE_suspend()

void GNUNET_SERVICE_suspend ( struct GNUNET_SERVICE_Handle sh)

Suspend accepting connections from the listen socket temporarily.

Resume activity using GNUNET_SERVICE_resume.

Parameters
shservice to stop accepting connections.

Definition at line 2381 of file service.c.

2382{
2383 do_suspend (sh,
2385}
static void do_suspend(struct GNUNET_SERVICE_Handle *sh, enum SuspendReason sr)
Suspend accepting connections from the listen socket temporarily.
Definition service.c:383
@ SUSPEND_STATE_APP
Application requested it.
Definition service.c:93

References do_suspend(), sh, and SUSPEND_STATE_APP.

Referenced by GNUNET_SERVICE_stop(), run(), and run().

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

◆ GNUNET_SERVICE_resume()

void GNUNET_SERVICE_resume ( struct GNUNET_SERVICE_Handle sh)

Resume accepting connections from the listen socket.

Parameters
shservice to resume accepting connections.

Definition at line 2389 of file service.c.

2390{
2391 do_resume (sh,
2393}

References do_resume(), sh, and SUSPEND_STATE_APP.

Referenced by begin_service(), and GSC_complete_initialization_cb().

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

◆ GNUNET_SERVICE_client_continue()

void GNUNET_SERVICE_client_continue ( struct GNUNET_SERVICE_Client c)

Continue receiving further messages from the given client.

Must be called after each message received.

Parameters
cthe client to continue receiving from

Definition at line 2434 of file service.c.

2435{
2436 GNUNET_assert (NULL == c->drop_task);
2438 GNUNET_assert (NULL == c->recv_task);
2439 c->needs_continue = false;
2440 if (NULL != c->warn_task)
2441 {
2443 c->warn_task = NULL;
2444 }
2446 c);
2447}
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
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:1310
static void resume_client_receive(void *cls)
Task run to resume receiving data from the client after the client called GNUNET_SERVICE_client_conti...
Definition service.c:2403
struct GNUNET_SCHEDULER_Task * warn_task
Task that warns about missing calls to GNUNET_SERVICE_client_continue().
Definition service.c:284
struct GNUNET_SCHEDULER_Task * recv_task
Task that receives data from the client to pass it to the handlers.
Definition service.c:296
bool needs_continue
Are we waiting for the application to call GNUNET_SERVICE_client_continue()?
Definition service.c:342

References GNUNET_SERVICE_Client::drop_task, GNUNET_assert, GNUNET_SCHEDULER_add_now(), GNUNET_SCHEDULER_cancel(), GNUNET_SERVICE_Client::needs_continue, GNUNET_SERVICE_Client::recv_task, resume_client_receive(), and GNUNET_SERVICE_Client::warn_task.

Referenced by conclude_autoconfig_request(), continue_store_activity(), finish_cmc_handling_with_continue(), handle_add_address(), handle_add_address(), handle_add_global_address(), handle_add_queue_message(), handle_add_queue_message(), handle_alice_client_message(), handle_alice_client_message(), handle_alice_client_message_multipart(), handle_alice_client_message_multipart(), handle_announce(), handle_attribute_delete_message(), handle_attribute_store_message(), handle_block_cache(), handle_bob_client_message(), handle_bob_client_message(), handle_bob_client_message_multipart(), handle_bob_client_message_multipart(), handle_channel_create(), handle_channel_destroy(), handle_client_accept(), handle_client_accept(), handle_client_accept(), handle_client_audio_message(), handle_client_call_message(), handle_client_cancel(), handle_client_cancel(), handle_client_cancel(), handle_client_conclude(), handle_client_copy_lazy_connect(), handle_client_copy_lazy_prepare(), handle_client_create_set(), handle_client_create_set(), handle_client_create_set(), handle_client_decrypt(), handle_client_evaluate(), handle_client_evaluate(), handle_client_evaluate(), handle_client_hangup_message(), handle_client_index_list_get(), handle_client_init(), handle_client_init(), handle_client_insert(), handle_client_iter_ack(), handle_client_iterate(), handle_client_join(), handle_client_keygen(), handle_client_listen(), handle_client_listen(), handle_client_listen(), handle_client_loc_sign(), handle_client_monitor_peers(), handle_client_mutation(), handle_client_pickup_message(), handle_client_recv_ok(), handle_client_redirect_to_ip(), handle_client_redirect_to_service(), handle_client_register_message(), handle_client_reject(), handle_client_reject(), handle_client_reject(), handle_client_response(), handle_client_resume_message(), handle_client_seed(), handle_client_send(), handle_client_send(), handle_client_send_request(), handle_client_set_add(), handle_client_set_add(), handle_client_start(), handle_client_start_search(), handle_client_start_sub(), handle_client_stop_sub(), handle_client_stream_cancel(), handle_client_stream_request(), handle_client_suspend_message(), handle_client_unindex(), handle_client_view_cancel(), handle_client_view_request(), handle_collect(), handle_communicator_available(), handle_communicator_available(), handle_communicator_backchannel(), handle_communicator_backchannel(), handle_consume_ticket_message(), handle_create(), handle_create(), handle_create_message(), handle_credential_delete_message(), handle_credential_iteration_next(), handle_credential_iteration_start(), handle_credential_iteration_stop(), handle_credential_store_message(), handle_decaps(), handle_del_address(), handle_del_queue_message(), handle_delete_message(), handle_dht_local_get(), handle_dht_local_get_stop(), handle_dht_local_hello_get(), handle_dht_local_hello_offer(), handle_dht_local_monitor(), handle_dht_local_monitor_stop(), handle_dht_local_put(), handle_disconnect(), handle_drop(), handle_drop_message(), handle_ecdh(), handle_edit_record_set(), handle_edit_record_set_cancel(), handle_feed_addresses(), handle_get(), handle_get(), handle_get(), handle_get_key(), handle_get_message(), handle_get_peers(), handle_get_replication(), handle_get_zero_anonymity(), handle_incoming_msg(), handle_info_tunnels(), handle_issue_ticket_message(), handle_iterate_stop(), handle_iteration_next(), handle_iteration_start(), handle_iteration_stop(), handle_iteration_stop(), handle_list(), handle_local_ack(), handle_local_data(), handle_lookup(), handle_lookup_block(), handle_lookup_by_suffix_message(), handle_lookup_message(), handle_monitor(), handle_monitor_next(), handle_monitor_next(), handle_monitor_start(), handle_monitor_start(), handle_monitor_start(), handle_port_close(), handle_port_open(), handle_put(), handle_query_message(), handle_queue_create_fail(), handle_queue_create_fail(), handle_queue_create_ok(), handle_queue_create_ok(), handle_record_lookup(), handle_record_store(), handle_register(), handle_release_reserve(), handle_remove(), handle_rename_message(), handle_request_connection_reversal(), handle_request_hello_validation(), handle_reserve(), handle_revoke_message(), handle_revoke_ticket_message(), handle_room_close(), handle_room_entry(), handle_room_open(), handle_room_sync(), handle_search(), handle_send_message(), handle_send_message_ack(), handle_send_message_ack(), handle_set(), handle_show_path(), handle_sign(), handle_start(), handle_start(), handle_start_message(), handle_stop(), handle_stun(), handle_suggest(), handle_suggest_cancel(), handle_test(), handle_ticket_iteration_next(), handle_ticket_iteration_start(), handle_ticket_iteration_stop(), handle_update_queue_message(), handle_update_queue_message(), handle_verify(), handle_watch(), handle_zone_to_name(), hash_for_index_val(), iteration_done_client_continue(), return_agpl(), return_agpl(), service_mq_error_handler(), signal_index_ok(), start_p2p_processing(), store_record_continuation(), and zone_iteration_done_client_continue().

Here is the call graph for this function:

◆ GNUNET_SERVICE_client_get_mq()

struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq ( struct GNUNET_SERVICE_Client c)

Obtain the message queue of c.

Convenience function.

Parameters
cthe client to continue receiving from
Returns
the message queue of c

Definition at line 2545 of file service.c.

2546{
2547 return c->mq;
2548}
struct GNUNET_MQ_Handle * mq
Message queue for the client.
Definition service.c:273

References GNUNET_SERVICE_Client::mq.

Referenced by broadcast_status(), handle_list(), handle_lookup_by_suffix_message(), handle_lookup_message(), handle_monitor(), handle_query_message(), handle_revoke_message(), handle_start(), handle_start_message(), handle_test(), return_agpl(), return_agpl(), send_client_reply(), send_end_msg(), send_intermediate_response(), send_lookup_response(), send_lookup_response(), send_reply(), send_result_code(), signal_result(), transmit_item(), and transmit_status().

Here is the caller graph for this function:

◆ GNUNET_SERVICE_client_disable_continue_warning()

void GNUNET_SERVICE_client_disable_continue_warning ( struct GNUNET_SERVICE_Client c)

Disable the warning the server issues if a message is not acknowledged in a timely fashion.

Use this call if a client is intentionally delayed for a while. Only applies to the current message.

Parameters
cclient for which to disable the warning

Definition at line 2451 of file service.c.

2452{
2453 GNUNET_break (NULL != c->warn_task);
2454 if (NULL != c->warn_task)
2455 {
2457 c->warn_task = NULL;
2458 }
2459}

References GNUNET_break, GNUNET_SCHEDULER_cancel(), and GNUNET_SERVICE_Client::warn_task.

Referenced by handle_start_message().

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

◆ GNUNET_SERVICE_client_drop()

void GNUNET_SERVICE_client_drop ( struct GNUNET_SERVICE_Client c)

Ask the server to disconnect from the given client.

This is the same as returning GNUNET_SYSERR within the check procedure when handling a message, except that it allows dropping of a client even when not handling a message from that client. The disconnect_cb will be called on c even if the application closes the connection using this function.

This function should be called (outside of util's internal logic) if (and usually only if) the client has violated the protocol. Otherwise, we should leave it to the client to disconnect from the service.

Parameters
cclient to disconnect now

Definition at line 2463 of file service.c.

2464{
2465 struct GNUNET_SERVICE_Handle *sh = c->sh;
2466
2468 "Client dropped: %p (MQ: %p)\n",
2469 c,
2470 c->mq);
2471#if EXECINFO
2472 {
2473 void *backtrace_array[MAX_TRACE_DEPTH];
2474 int num_backtrace_strings = backtrace (backtrace_array,
2475 MAX_TRACE_DEPTH);
2476 char **backtrace_strings =
2477 backtrace_symbols (backtrace_array,
2478 t->num_backtrace_strings);
2479 for (unsigned int i = 0; i < num_backtrace_strings; i++)
2481 "client drop trace %u: %s\n",
2482 i,
2483 backtrace_strings[i]);
2484 }
2485#endif
2486 GNUNET_assert (NULL == c->drop_task);
2487 if (NULL != sh->disconnect_cb)
2488 sh->disconnect_cb (sh->cb_cls,
2489 c,
2490 c->user_context);
2491 if (NULL != c->warn_task)
2492 {
2494 c->warn_task = NULL;
2495 }
2496 if (NULL != c->recv_task)
2497 {
2499 c->recv_task = NULL;
2500 }
2501 if (NULL != c->send_task)
2502 {
2504 c->send_task = NULL;
2505 }
2507 c);
2508}
static struct GNUNET_SCHEDULER_Task * t
Main task.
struct GNUNET_SCHEDULER_Task * send_task
Task that transmit data to the client.
Definition service.c:301
struct GNUNET_SERVICE_Handle * sh
Service that this client belongs to.
Definition service.c:263
void * user_context
User context value, value returned from the connect callback.
Definition service.c:312

References GNUNET_IDENTITY_Handle::cb_cls, GNUNET_SERVICE_Client::drop_task, finish_client_drop(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_SCHEDULER_add_now(), GNUNET_SCHEDULER_cancel(), LOG, GNUNET_SERVICE_Client::mq, GNUNET_SERVICE_Client::recv_task, GNUNET_SERVICE_Client::send_task, sh, GNUNET_SERVICE_Client::sh, t, GNUNET_SERVICE_Client::user_context, and GNUNET_SERVICE_Client::warn_task.

Referenced by check_client_seed(), demultiplex_with_cmc(), destroy_service_session(), destroy_service_session(), destroy_service_session(), destroy_service_session(), force_timeout(), GNUNET_SERVICE_shutdown(), GNUNET_SERVICE_stop(), GSC_CLIENTS_reject_request(), handle_add_queue_message(), handle_announce(), handle_attribute_delete_message(), handle_attribute_store_message(), handle_autoconfig_request(), handle_bob_client_message(), handle_bob_client_message(), handle_channel_create(), handle_client_accept(), handle_client_accept(), handle_client_accept(), handle_client_audio_message(), handle_client_call_message(), handle_client_cancel(), handle_client_cancel(), handle_client_cancel(), handle_client_conclude(), handle_client_copy_lazy_connect(), handle_client_copy_lazy_prepare(), handle_client_create_set(), handle_client_create_set(), handle_client_create_set(), handle_client_decrypt(), handle_client_evaluate(), handle_client_evaluate(), handle_client_evaluate(), handle_client_hangup_message(), handle_client_insert(), handle_client_iter_ack(), handle_client_iterate(), handle_client_keygen(), handle_client_listen(), handle_client_listen(), handle_client_listen(), handle_client_mutation(), handle_client_pickup_message(), handle_client_recv_ok(), handle_client_redirect_to_ip(), handle_client_redirect_to_service(), handle_client_register_message(), handle_client_response(), handle_client_resume_message(), handle_client_set_add(), handle_client_set_add(), handle_client_start(), handle_client_suspend_message(), handle_create_message(), handle_credential_delete_message(), handle_credential_iteration_next(), handle_credential_iteration_start(), handle_credential_iteration_stop(), handle_credential_store_message(), handle_del_address(), handle_del_queue_message(), handle_destroy(), handle_dht_local_get_result_seen(), handle_dht_local_hello_offer(), handle_edit_record_set(), handle_edit_record_set_cancel(), handle_fragment_box(), handle_get_zero_anonymity(), handle_issue_ticket_message(), handle_iterate_next(), handle_iteration_next(), handle_iteration_next(), handle_iteration_start(), handle_iteration_start(), handle_iteration_stop(), handle_iteration_stop(), handle_local_data(), handle_lookup_block(), handle_monitor_next(), handle_monitor_next(), handle_monitor_start(), handle_monitor_start(), handle_monitor_start(), handle_port_close(), handle_port_open(), handle_query_message(), handle_queue_create_fail(), handle_queue_create_ok(), handle_raw_message(), handle_record_lookup(), handle_record_store(), handle_register(), handle_request_connection_reversal(), handle_revoke_message(), handle_revoke_ticket_message(), handle_search(), handle_send_message_ack(), handle_store(), handle_stun(), handle_suggest(), handle_suggest_cancel(), handle_test(), handle_ticket_iteration_next(), handle_ticket_iteration_start(), handle_ticket_iteration_stop(), handle_watch(), handle_zone_to_name(), monitor_iteration_next(), monitor_iteration_next(), process_get(), resume_client_receive(), send_lookup_response(), send_lookup_response_with_filter(), service_client_recv(), service_mq_error_handler(), shutdown_task(), and shutdown_task().

Here is the call graph for this function:

◆ GNUNET_SERVICE_shutdown()

void GNUNET_SERVICE_shutdown ( struct GNUNET_SERVICE_Handle sh)

Explicitly stops the service.

Parameters
shserver to shutdown

Definition at line 2512 of file service.c.

2513{
2514 if (0 == (sh->suspend_state & SUSPEND_STATE_SHUTDOWN))
2515 do_suspend (sh,
2517 for (struct GNUNET_SERVICE_Client *client = sh->clients_head;
2518 NULL != client;
2519 client = client->next)
2520 {
2521 if (NULL == client->drop_task)
2523 }
2524}
@ SUSPEND_STATE_SHUTDOWN
Suspension because service was permanently shutdown.
Definition service.c:108

References do_suspend(), GNUNET_SERVICE_client_drop(), sh, and SUSPEND_STATE_SHUTDOWN.

Referenced by destroy_service(), do_shutdown(), finish_client_drop(), GNUNET_SERVICE_client_mark_monitor(), and service_shutdown().

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

◆ GNUNET_SERVICE_client_mark_monitor()

void GNUNET_SERVICE_client_mark_monitor ( struct GNUNET_SERVICE_Client c)

Set the 'monitor' flag on this client.

Clients which have been marked as 'monitors' won't prevent the server from shutting down once #GNUNET_SERVICE_stop_listening() has been invoked. The idea is that for "normal" clients we likely want to allow them to process their requests; however, monitor-clients are likely to 'never' disconnect during shutdown and thus will not be considered when determining if the server should continue to exist after shutdown has been triggered.

Parameters
cclient to mark as a monitor

Definition at line 2528 of file service.c.

2529{
2530 c->is_monitor = true;
2531 if (((0 != (SUSPEND_STATE_SHUTDOWN & c->sh->suspend_state)) &&
2532 (! have_non_monitor_clients (c->sh))))
2534}
void GNUNET_SERVICE_shutdown(struct GNUNET_SERVICE_Handle *sh)
Explicitly stops the service.
Definition service.c:2512
static enum GNUNET_GenericReturnValue have_non_monitor_clients(struct GNUNET_SERVICE_Handle *sh)
Check if any of the clients we have left are unrelated to monitoring.
Definition service.c:359
bool is_monitor
Is this client a 'monitor' client that should not be counted when deciding on destroying the server d...
Definition service.c:337
enum SuspendReason suspend_state
Are we suspended, and if so, why?
Definition service.c:223

References GNUNET_SERVICE_shutdown(), have_non_monitor_clients(), GNUNET_SERVICE_Client::is_monitor, GNUNET_SERVICE_Client::sh, GNUNET_SERVICE_Handle::suspend_state, and SUSPEND_STATE_SHUTDOWN.

Referenced by client_connect_cb(), handle_monitor_start(), handle_monitor_start(), handle_monitor_start(), handle_start_message(), and handle_watch().

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

◆ GNUNET_SERVICE_client_persist()

void GNUNET_SERVICE_client_persist ( struct GNUNET_SERVICE_Client c)

Set the persist option on this client.

Indicates that the underlying socket or fd should never really be closed. Used for indicating process death.

Parameters
cclient to persist the socket (never to be closed)

Definition at line 2538 of file service.c.

2539{
2540 c->persist = true;
2541}
bool persist
Persist the file handle for this client no matter what happens, force the OS to close once the proces...
Definition service.c:330

References GNUNET_SERVICE_Client::persist.

Referenced by handle_stop(), and handle_stop().

Here is the caller graph for this function: