Use TSD to improve logging.
authorWerner Koch <wk@gnupg.org>
Fri, 13 Jun 2014 17:20:56 +0000 (19:20 +0200)
committerWerner Koch <wk@gnupg.org>
Fri, 13 Jun 2014 17:20:56 +0000 (19:20 +0200)
* src/payprocd.c (my_tsd_key): New.
(pid_suffix_callback): New.
(main): Setup TSD.
(connection_thread): Store connection ID in the TSD.
* src/paypal-ipn.c (paypal_proc_ipn): Remove arg IDNO.
--

This allows us to print an identifier for the thread with the log
messages.  To further improve on that we may want to move that all to
logging and keep some logging specific information in the TSD.  For
example this could help to decide whether a LF needs to be printed if
a log message from a second thread is to be printed after an
incomplete log message from the first thread.

src/connection.c
src/paypal-ipn.c
src/paypal.h
src/payprocd.c

index 7ba6358..6de21f3 100644 (file)
@@ -922,7 +922,7 @@ connection_handler (conn_t conn)
          socket, and only then process the IPN.  */
       es_fputs ("OK\n\n", conn->stream);
       shutdown_connection_obj (conn);
-      paypal_proc_ipn (conn->idno, &conn->dataitems);
+      paypal_proc_ipn (&conn->dataitems);
     }
   else if ((cmdargs = has_leading_keyword (conn->command, "GETINFO")))
     err = cmd_getinfo (conn, cmdargs);
index 77afbd3..b5b6d52 100644 (file)
@@ -130,10 +130,9 @@ call_verify (int live, const char *request)
 /* The connection has already been shutdown but the request has been
    stored in the dictionary DICT.  We extract the original full
    request, validate it with Paypal and then do something with the
-   received notification.  IDNO is the original connection id for
-   logging.  */
+   received notification.  */
 void
-paypal_proc_ipn (unsigned int idno, keyvalue_t *dict)
+paypal_proc_ipn (keyvalue_t *dict)
 {
   gpg_error_t err;
   keyvalue_t kv;
@@ -145,19 +144,19 @@ paypal_proc_ipn (unsigned int idno, keyvalue_t *dict)
   request = keyvalue_snatch (*dict, "Request");
   if (!request || !*request)
     {
-      log_error ("ppipnhd %u: no request given\n", idno);
+      log_error ("ppipnhd: no request given\n");
       xfree (request);
       return;
     }
 
-  log_info ("ppipnhd %u: length of request=%zu\n", idno, strlen (request));
+  log_info ("ppipnhd: length of request=%zu\n", strlen (request));
 
   /* Parse it into a dictionary.  */
   err = parse_www_form_urlencoded (&form, request);
   if (err)
     {
-      log_error ("ppipnhd %u: error parsing request: %s\n",
-                 idno, gpg_strerror (err));
+      log_error ("ppipnhd: error parsing request: %s\n",
+                 gpg_strerror (err));
       goto leave;
     }
 
@@ -169,18 +168,18 @@ paypal_proc_ipn (unsigned int idno, keyvalue_t *dict)
   if (strcmp (keyvalue_get_string (form, "receiver_email"),
               "paypal-test@g10code.com"))
     {
-      log_error ("ppipnhd %u: wrong receiver_email\n", idno);
+      log_error ("ppipnhd: wrong receiver_email\n");
       log_printval ("  mail=", keyvalue_get_string (form, "receiver_email"));
       goto leave;
     }
 
   if (call_verify (!keyvalue_get_int (form, "test_ipn"), request))
     {
-      log_error ("ppipnhd %u: IPN is not authentic\n", idno);
+      log_error ("ppipnhd: IPN is not authentic\n");
       goto leave;
     }
 
-  log_info ("ppipnhd %u: IPN is okay\n", idno);
+  log_info ("ppipnhd: IPN accepted\n");
 
   /* Check for duplicates.  */
 
index e41887a..ef8a3c0 100644 (file)
@@ -21,7 +21,7 @@
 #define PAYPAL_H
 
 /*-- paypal-ipn.c --*/
-void paypal_proc_ipn (unsigned int idno, keyvalue_t *dict);
+void paypal_proc_ipn (keyvalue_t *dict);
 
 
 #endif /*PAYPAL_H*/
index 689bd43..e3d9655 100644 (file)
@@ -60,6 +60,10 @@ static int shutdown_pending;
 /* Number of active connections.  */
 static int active_connections;
 
+/* The thread specific data key.  */
+static npth_key_t my_tsd_key;
+
+
 /* Constants to identify the options. */
 enum opt_values
   {
@@ -160,6 +164,24 @@ set_stripe_key (const char *fname)
 }
 
 
+/* This callback is used by the log functions to return an identifier
+   for the current thread.  */
+static int
+pid_suffix_callback (unsigned long *r_suffix)
+{
+  unsigned int *idnop;
+
+  idnop = npth_getspecific (my_tsd_key);
+  if (!idnop)
+    {
+      *r_suffix = 0;
+      return 0; /* No suffix.  */
+    }
+  *r_suffix = *idnop;
+  return 2; /* Print the suffix in hex format.  */
+}
+
+
 int
 main (int argc, char **argv)
 {
@@ -191,6 +213,11 @@ main (int argc, char **argv)
       exit (1);
     }
 
+  if (!npth_key_create (&my_tsd_key, NULL))
+    if (!npth_setspecific (my_tsd_key, NULL))
+      log_set_pid_suffix_cb (pid_suffix_callback);
+
+
   /* Check that Libgcrypt is suitable.  */
   gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
   if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) )
@@ -749,28 +776,31 @@ static void *
 connection_thread (void *arg)
 {
   conn_t conn = arg;
+  unsigned int idno;
   pid_t pid;
   uid_t uid;
   gid_t gid;
 
+  idno = id_from_connection_obj (conn);
+  npth_setspecific (my_tsd_key, &idno);
+
   if (credentials_from_socket (fd_from_connection_obj (conn), &pid, &uid, &gid))
     {
-      log_error ("connection %u: credentials missing - closing\n",
-                 id_from_connection_obj (conn));
+      log_error ("credentials missing - closing\n");
       goto leave;
     }
 
   if (opt.verbose)
-    log_info ("connection %u: started - pid=%u uid=%u gid=%u\n",
-              id_from_connection_obj (conn),
+    log_info ("new connection - pid=%u uid=%u gid=%u\n",
               (unsigned int)pid, (unsigned int)uid, (unsigned int)gid);
 
   connection_handler (conn);
 
   if (opt.verbose)
-    log_info ("connection %u: terminated\n", id_from_connection_obj (conn));
+    log_info ("connection terminated\n");
 
  leave:
   release_connection_obj (conn);
+  npth_setspecific (my_tsd_key, NULL);  /* To be safe.  */
   return NULL;
 }