diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c index 14189fea6..254c54341 100644 --- a/dirmngr/dirmngr.c +++ b/dirmngr/dirmngr.c @@ -328,6 +328,7 @@ static void cleanup (void); static ldap_server_t parse_ldapserver_file (const char* filename); #endif /*USE_LDAP*/ static fingerprint_list_t parse_ocsp_signer (const char *string); +static void netactivity_action (void); static void handle_connections (assuan_fd_t listen_fd); /* NPth wrapper function definitions. */ @@ -995,6 +996,7 @@ main (int argc, char **argv) #if USE_LDAP ldap_wrapper_launch_thread (); #endif /*USE_LDAP*/ + http_register_netactivity_cb (netactivity_action); start_command_handler (ASSUAN_INVALID_FD); shutdown_reaper (); } @@ -1032,6 +1034,7 @@ main (int argc, char **argv) #if USE_LDAP ldap_wrapper_launch_thread (); #endif /*USE_LDAP*/ + http_register_netactivity_cb (netactivity_action); handle_connections (3); assuan_sock_close (3); shutdown_reaper (); @@ -1232,6 +1235,7 @@ main (int argc, char **argv) #if USE_LDAP ldap_wrapper_launch_thread (); #endif /*USE_LDAP*/ + http_register_netactivity_cb (netactivity_action); handle_connections (fd); assuan_sock_close (fd); shutdown_reaper (); @@ -1702,6 +1706,16 @@ dirmngr_sighup_action (void) } +/* This function is called if some network activity was done. At this + * point we know the we have a network and we can decide whether to + * run scheduled background tasks soon. The function should return + * quickly and only trigger actions for another thread. */ +static void +netactivity_action (void) +{ + log_debug ("network activity seen\n"); +} + /* The signal handler. */ #ifndef HAVE_W32_SYSTEM diff --git a/dirmngr/http.c b/dirmngr/http.c index 5f5775b2f..b74a9ef9a 100644 --- a/dirmngr/http.c +++ b/dirmngr/http.c @@ -261,6 +261,9 @@ static gpg_error_t (*tls_callback) (http_t, http_session_t, int); /* The list of files with trusted CA certificates. */ static strlist_t tls_ca_certlist; +/* The global callback for net activity. */ +static void (*netactivity_cb)(void); + #if defined(HAVE_W32_SYSTEM) && !defined(HTTP_NO_WSASTARTUP) @@ -499,6 +502,25 @@ http_register_tls_ca (const char *fname) } +/* Register a callback which is called every time the HTTP mode has + * made a successful connection to some server. */ +void +http_register_netactivity_cb (void (*cb)(void)) +{ + netactivity_cb = cb; +} + + +/* Call the netactivity callback if any. */ +static void +notify_netactivity (void) +{ + if (netactivity_cb) + netactivity_cb (); +} + + + #ifdef USE_TLS /* Free the TLS session associated with SESS, if any. */ static void @@ -2279,6 +2301,8 @@ connect_server (const char *server, unsigned short port, *r_host_not_found = 1; log_error ("can't connect to '%s': %s\n", server, strerror (errno)); } + else + notify_netactivity (); return sock; #else /*!ASSUAN_SOCK_TOR*/ @@ -2371,7 +2395,10 @@ connect_server (const char *server, unsigned short port, if (ret) last_errno = errno; else - connected = 1; + { + connected = 1; + notify_netactivity (); + } } free_dns_addrinfo (aibuf); } diff --git a/dirmngr/http.h b/dirmngr/http.h index 4a70caf4f..2a36fdaa8 100644 --- a/dirmngr/http.h +++ b/dirmngr/http.h @@ -98,6 +98,8 @@ typedef struct http_context_s *http_t; void http_register_tls_callback (gpg_error_t (*cb)(http_t,http_session_t,int)); void http_register_tls_ca (const char *fname); +void http_register_netactivity_cb (void (*cb)(void)); + gpg_error_t http_session_new (http_session_t *r_session, const char *tls_priority,