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?= 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