From cfd2f3e50e7077e83d9b7e06d48f12253d188b3b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Mon, 6 Dec 2010 19:55:01 +0300
Subject: [PATCH] Fix unique named pipe generation

---
 src/util/disk.c |   27 ++++++++++++++++++++++++---
 1 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/src/util/disk.c b/src/util/disk.c
index b8bc946..b0a86a9 100644
--- a/src/util/disk.c
+++ b/src/util/disk.c
@@ -34,6 +34,7 @@
 #include "gnunet_crypto_lib.h"
 #include "disk.h"
 
+#define DEBUG_NPIPE GNUNET_YES
 
 /**
  * Block size for IO for copying files.
@@ -1912,10 +1913,14 @@ GNUNET_DISK_npipe_open (char **fn,
 
   while (h == NULL)
     {
+      DWORD error_code;
       name = NULL;
       if (*fn != NULL)
         {
           GNUNET_asprintf(&name, "\\\\.\\pipe\\%.246s", fn);
+#if DEBUG_NPIPE
+          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Trying to create an instance of named pipe `%s'\n", name);
+#endif
           h = CreateNamedPipe (name, openMode | FILE_FLAG_OVERLAPPED,
               PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 2, 1, 1, 0, NULL);
         }
@@ -1923,21 +1928,37 @@ GNUNET_DISK_npipe_open (char **fn,
         {
           GNUNET_asprintf(fn, "\\\\.\\pipe\\gnunet-%llu",
               GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX));
-          h = CreateNamedPipe (*fn, openMode | FILE_FLAG_OVERLAPPED,
+#if DEBUG_NPIPE
+          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Trying to create unique named pipe `%s'\n", *fn);
+#endif
+          h = CreateNamedPipe (*fn, openMode | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE,
               PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 2, 1, 1, 0, NULL);
         }
+      error_code = GetLastError ();
       if (name)
           GNUNET_free(name);
       /* don't re-set name to NULL yet */
       if (h == INVALID_HANDLE_VALUE)
         {
-          SetErrnoFromWinError(GetLastError());
+          SetErrnoFromWinError(error_code);
+#if DEBUG_NPIPE
+          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Pipe creation have failed because of %d, errno is %d\n", error_code, errno);
+#endif
           if (name == NULL)
             {
+#if DEBUG_NPIPE
+              GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Pipe was to be unique, considering re-creation\n");
+#endif
               GNUNET_free (*fn);
               *fn = NULL;
-              if (errno != EEXIST)
+              if (error_code != ERROR_ACCESS_DENIED && error_code != ERROR_PIPE_BUSY)
+                {
                   return NULL;
+                }
+#if DEBUG_NPIPE
+              GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Pipe name was not unique, trying again\n");
+#endif
+              h = NULL;
             }
           else
               return NULL;
-- 
1.7.3.1.msysgit.0

