diff options
Diffstat (limited to 'src/util/disk.c')
-rw-r--r-- | src/util/disk.c | 1437 |
1 files changed, 715 insertions, 722 deletions
diff --git a/src/util/disk.c b/src/util/disk.c index 12f985791b..2bdcf3262a 100644 --- a/src/util/disk.c +++ b/src/util/disk.c @@ -67,8 +67,8 @@ #define PIPE_BUF 512 ULONG PipeSerialNumber; #endif -#define _IFMT 0170000 /* type of file */ -#define _IFLNK 0120000 /* symbolic link */ +#define _IFMT 0170000 /* type of file */ +#define _IFLNK 0120000 /* symbolic link */ #define S_ISLNK(m) (((m)&_IFMT) == _IFLNK) #else #error PORT-ME: need to port statfs (how much space is left on the drive?) @@ -165,25 +165,25 @@ getSizeRec (void *cls, const char *fn) #ifdef HAVE_STAT64 if (0 != STAT64 (fn, &buf)) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "stat64", fn); - return GNUNET_SYSERR; - } + { + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "stat64", fn); + return GNUNET_SYSERR; + } #else if (0 != STAT (fn, &buf)) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "stat", fn); - return GNUNET_SYSERR; - } + { + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "stat", fn); + return GNUNET_SYSERR; + } #endif if ((!S_ISLNK (buf.st_mode)) || (gfsd->include_sym_links == GNUNET_YES)) gfsd->total += buf.st_size; if ((S_ISDIR (buf.st_mode)) && (0 == ACCESS (fn, X_OK)) && ((!S_ISLNK (buf.st_mode)) || (gfsd->include_sym_links == GNUNET_YES))) - { - if (GNUNET_SYSERR == GNUNET_DISK_directory_scan (fn, &getSizeRec, gfsd)) - return GNUNET_SYSERR; - } + { + if (GNUNET_SYSERR == GNUNET_DISK_directory_scan (fn, &getSizeRec, gfsd)) + return GNUNET_SYSERR; + } return GNUNET_OK; } @@ -215,13 +215,13 @@ GNUNET_DISK_handle_invalid (const struct GNUNET_DISK_FileHandle *h) */ off_t GNUNET_DISK_file_seek (const struct GNUNET_DISK_FileHandle * h, off_t offset, - enum GNUNET_DISK_Seek whence) + enum GNUNET_DISK_Seek whence) { if (h == NULL) - { - errno = EINVAL; - return GNUNET_SYSERR; - } + { + errno = EINVAL; + return GNUNET_SYSERR; + } #ifdef MINGW DWORD ret; @@ -232,10 +232,10 @@ GNUNET_DISK_file_seek (const struct GNUNET_DISK_FileHandle * h, off_t offset, ret = SetFilePointer (h->h, offset, NULL, t[whence]); if (ret == INVALID_SET_FILE_POINTER) - { - SetErrnoFromWinError (GetLastError ()); - return GNUNET_SYSERR; - } + { + SetErrnoFromWinError (GetLastError ()); + return GNUNET_SYSERR; + } return ret; #else static int t[] = {[GNUNET_DISK_SEEK_SET] = SEEK_SET, @@ -261,7 +261,7 @@ GNUNET_DISK_file_seek (const struct GNUNET_DISK_FileHandle * h, off_t offset, */ int GNUNET_DISK_file_size (const char *filename, uint64_t * size, - int includeSymLinks) + int includeSymLinks) { struct GetFileSizeData gfsd; int ret; @@ -292,29 +292,29 @@ GNUNET_DISK_file_size (const char *filename, uint64_t * size, */ int GNUNET_DISK_file_get_identifiers (const char *filename, uint64_t * dev, - uint64_t * ino) + uint64_t * ino) { #if LINUX struct stat sbuf; struct statvfs fbuf; if ((0 == stat (filename, &sbuf)) && (0 == statvfs (filename, &fbuf))) - { - *dev = (uint64_t) fbuf.f_fsid; - *ino = (uint64_t) sbuf.st_ino; - return GNUNET_OK; - } + { + *dev = (uint64_t) fbuf.f_fsid; + *ino = (uint64_t) sbuf.st_ino; + return GNUNET_OK; + } #elif SOMEBSD struct stat sbuf; struct statfs fbuf; if ((0 == stat (filename, &sbuf)) && (0 == statfs (filename, &fbuf))) - { - *dev = ((uint64_t) fbuf.f_fsid.val[0]) << 32 || - ((uint64_t) fbuf.f_fsid.val[1]); - *ino = (uint64_t) sbuf.st_ino; - return GNUNET_OK; - } + { + *dev = ((uint64_t) fbuf.f_fsid.val[0]) << 32 || + ((uint64_t) fbuf.f_fsid.val[1]); + *ino = (uint64_t) sbuf.st_ino; + return GNUNET_OK; + } #elif WINDOWS // FIXME NILS: test this struct GNUNET_DISK_FileHandle *fh; @@ -327,11 +327,11 @@ GNUNET_DISK_file_get_identifiers (const char *filename, uint64_t * dev, succ = GetFileInformationByHandle (fh->h, &info); GNUNET_DISK_file_close (fh); if (succ) - { - *dev = info.dwVolumeSerialNumber; - *ino = ((info.nFileIndexHigh << sizeof (DWORD)) | info.nFileIndexLow); - return GNUNET_OK; - } + { + *dev = info.dwVolumeSerialNumber; + *ino = ((info.nFileIndexHigh << sizeof (DWORD)) | info.nFileIndexLow); + return GNUNET_OK; + } else return GNUNET_SYSERR; @@ -363,35 +363,35 @@ GNUNET_DISK_mktemp (const char *t) #if WINDOWS && !(isalpha ((int) t[0]) && (t[0] != '\0') && (t[1] == ':')) #endif - ) - { - tmpdir = getenv ("TMPDIR"); - tmpdir = tmpdir ? tmpdir : "/tmp"; - GNUNET_asprintf (&tmpl, "%s/%s%s", tmpdir, t, "XXXXXX"); - } + ) + { + tmpdir = getenv ("TMPDIR"); + tmpdir = tmpdir ? tmpdir : "/tmp"; + GNUNET_asprintf (&tmpl, "%s/%s%s", tmpdir, t, "XXXXXX"); + } else - { - GNUNET_asprintf (&tmpl, "%s%s", t, "XXXXXX"); - } + { + GNUNET_asprintf (&tmpl, "%s%s", t, "XXXXXX"); + } #ifdef MINGW fn = (char *) GNUNET_malloc (MAX_PATH + 1); if (ERROR_SUCCESS != plibc_conv_to_win_path (tmpl, fn)) - { - GNUNET_free (fn); - GNUNET_free (tmpl); - return NULL; - } + { + GNUNET_free (fn); + GNUNET_free (tmpl); + return NULL; + } GNUNET_free (tmpl); #else fn = tmpl; #endif fd = mkstemp (fn); if (fd == -1) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_ERROR, "mkstemp", fn); - GNUNET_free (fn); - return NULL; - } + { + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_ERROR, "mkstemp", fn); + GNUNET_free (fn); + return NULL; + } if (0 != CLOSE (fd)) LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "close", fn); return fn; @@ -412,10 +412,10 @@ GNUNET_DISK_get_blocks_available (const char *part) struct statvfs buf; if (0 != statvfs (part, &buf)) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "statfs", part); - return -1; - } + { + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "statfs", part); + return -1; + } return buf.f_bavail; #elif MINGW DWORD dwDummy; @@ -430,22 +430,21 @@ GNUNET_DISK_get_blocks_available (const char *part) GNUNET_free (path); szDrive[3] = 0; if (!GetDiskFreeSpace (szDrive, &dwDummy, &dwDummy, &dwBlocks, &dwDummy)) - { - LOG (GNUNET_ERROR_TYPE_WARNING, - _("`%s' failed for drive `%s': %u\n"), "GetDiskFreeSpace", - szDrive, GetLastError ()); + { + LOG (GNUNET_ERROR_TYPE_WARNING, _("`%s' failed for drive `%s': %u\n"), + "GetDiskFreeSpace", szDrive, GetLastError ()); - return -1; - } + return -1; + } return dwBlocks; #else struct statfs s; if (0 != statfs (part, &s)) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "statfs", part); - return -1; - } + { + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "statfs", part); + return -1; + } return s.f_bavail; #endif } @@ -469,21 +468,21 @@ GNUNET_DISK_directory_test (const char *fil) ret = STAT (fil, &filestat); if (ret != 0) + { + if (errno != ENOENT) { - if (errno != ENOENT) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "stat", fil); - return GNUNET_SYSERR; - } - return GNUNET_NO; + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "stat", fil); + return GNUNET_SYSERR; } + return GNUNET_NO; + } if (!S_ISDIR (filestat.st_mode)) return GNUNET_NO; if (ACCESS (fil, R_OK | X_OK) < 0) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "access", fil); - return GNUNET_SYSERR; - } + { + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "access", fil); + return GNUNET_SYSERR; + } return GNUNET_YES; } @@ -508,27 +507,27 @@ GNUNET_DISK_file_test (const char *fil) ret = STAT (rdir, &filestat); if (ret != 0) + { + if (errno != ENOENT) { - if (errno != ENOENT) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "stat", rdir); - GNUNET_free (rdir); - return GNUNET_SYSERR; - } + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "stat", rdir); GNUNET_free (rdir); - return GNUNET_NO; + return GNUNET_SYSERR; } + GNUNET_free (rdir); + return GNUNET_NO; + } if (!S_ISREG (filestat.st_mode)) - { - GNUNET_free (rdir); - return GNUNET_NO; - } + { + GNUNET_free (rdir); + return GNUNET_NO; + } if (ACCESS (rdir, R_OK) < 0) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "access", rdir); - GNUNET_free (rdir); - return GNUNET_SYSERR; - } + { + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "access", rdir); + GNUNET_free (rdir); + return GNUNET_SYSERR; + } GNUNET_free (rdir); return GNUNET_YES; } @@ -553,56 +552,56 @@ GNUNET_DISK_directory_create (const char *dir) len = strlen (rdir); #ifndef MINGW - pos = 1; /* skip heading '/' */ + pos = 1; /* skip heading '/' */ #else /* Local or Network path? */ if (strncmp (rdir, "\\\\", 2) == 0) + { + pos = 2; + while (rdir[pos]) { - pos = 2; - while (rdir[pos]) - { - if (rdir[pos] == '\\') - { - pos++; - break; - } - pos++; - } + if (rdir[pos] == '\\') + { + pos++; + break; + } + pos++; } + } else - { - pos = 3; /* strlen("C:\\") */ - } + { + pos = 3; /* strlen("C:\\") */ + } #endif while (pos <= len) + { + if ((rdir[pos] == DIR_SEPARATOR) || (pos == len)) { - if ((rdir[pos] == DIR_SEPARATOR) || (pos == len)) - { - rdir[pos] = '\0'; - ret = GNUNET_DISK_directory_test (rdir); - if (ret == GNUNET_SYSERR) - { - GNUNET_free (rdir); - return GNUNET_SYSERR; - } - if (ret == GNUNET_NO) - { + rdir[pos] = '\0'; + ret = GNUNET_DISK_directory_test (rdir); + if (ret == GNUNET_SYSERR) + { + GNUNET_free (rdir); + return GNUNET_SYSERR; + } + if (ret == GNUNET_NO) + { #ifndef MINGW - ret = mkdir (rdir, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); /* 755 */ + ret = mkdir (rdir, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); /* 755 */ #else - ret = mkdir (rdir); + ret = mkdir (rdir); #endif - if ((ret != 0) && (errno != EEXIST)) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_ERROR, "mkdir", rdir); - GNUNET_free (rdir); - return GNUNET_SYSERR; - } - } - rdir[pos] = DIR_SEPARATOR; - } - pos++; + if ((ret != 0) && (errno != EEXIST)) + { + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_ERROR, "mkdir", rdir); + GNUNET_free (rdir); + return GNUNET_SYSERR; + } + } + rdir[pos] = DIR_SEPARATOR; } + pos++; + } GNUNET_free (rdir); return GNUNET_OK; } @@ -649,37 +648,37 @@ GNUNET_DISK_directory_create_for_file (const char *filename) */ ssize_t GNUNET_DISK_file_read (const struct GNUNET_DISK_FileHandle * h, void *result, - size_t len) + size_t len) { if (h == NULL) - { - errno = EINVAL; - return GNUNET_SYSERR; - } + { + errno = EINVAL; + return GNUNET_SYSERR; + } #ifdef MINGW DWORD bytesRead; if (h->type != GNUNET_PIPE) + { + if (!ReadFile (h->h, result, len, &bytesRead, NULL)) { - if (!ReadFile (h->h, result, len, &bytesRead, NULL)) - { - SetErrnoFromWinError (GetLastError ()); - return GNUNET_SYSERR; - } + SetErrnoFromWinError (GetLastError ()); + return GNUNET_SYSERR; } + } else + { + if (!ReadFile (h->h, result, len, NULL, h->oOverlapRead)) { - if (!ReadFile (h->h, result, len, NULL, h->oOverlapRead)) - { - if (GetLastError () != ERROR_IO_PENDING) - { - SetErrnoFromWinError (GetLastError ()); - return GNUNET_SYSERR; - } - } - GetOverlappedResult (h->h, h->oOverlapRead, &bytesRead, TRUE); + if (GetLastError () != ERROR_IO_PENDING) + { + SetErrnoFromWinError (GetLastError ()); + return GNUNET_SYSERR; + } } + GetOverlappedResult (h->h, h->oOverlapRead, &bytesRead, TRUE); + } return bytesRead; #else return read (h->fd, result, len); @@ -701,8 +700,7 @@ GNUNET_DISK_fn_read (const char *fn, void *result, size_t len) struct GNUNET_DISK_FileHandle *fh; ssize_t ret; - fh = - GNUNET_DISK_file_open (fn, GNUNET_DISK_OPEN_READ, GNUNET_DISK_PERM_NONE); + fh = GNUNET_DISK_file_open (fn, GNUNET_DISK_OPEN_READ, GNUNET_DISK_PERM_NONE); if (!fh) return GNUNET_SYSERR; ret = GNUNET_DISK_file_read (fh, result, len); @@ -721,46 +719,46 @@ GNUNET_DISK_fn_read (const char *fn, void *result, size_t len) */ ssize_t GNUNET_DISK_file_write (const struct GNUNET_DISK_FileHandle * h, - const void *buffer, size_t n) + const void *buffer, size_t n) { if (h == NULL) - { - errno = EINVAL; - return GNUNET_SYSERR; - } + { + errno = EINVAL; + return GNUNET_SYSERR; + } #ifdef MINGW DWORD bytesWritten; if (h->type != GNUNET_PIPE) + { + if (!WriteFile (h->h, buffer, n, &bytesWritten, NULL)) { - if (!WriteFile (h->h, buffer, n, &bytesWritten, NULL)) - { - SetErrnoFromWinError (GetLastError ()); - return GNUNET_SYSERR; - } + SetErrnoFromWinError (GetLastError ()); + return GNUNET_SYSERR; } + } else - { + { #if DEBUG_PIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, "It is a pipe trying to write\n"); + LOG (GNUNET_ERROR_TYPE_DEBUG, "It is a pipe trying to write\n"); #endif - if (!WriteFile (h->h, buffer, n, NULL, h->oOverlapWrite)) - { - if (GetLastError () != ERROR_IO_PENDING) - { - SetErrnoFromWinError (GetLastError ()); + if (!WriteFile (h->h, buffer, n, NULL, h->oOverlapWrite)) + { + if (GetLastError () != ERROR_IO_PENDING) + { + SetErrnoFromWinError (GetLastError ()); #if DEBUG_PIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, "Error writing to pipe\n"); + LOG (GNUNET_ERROR_TYPE_DEBUG, "Error writing to pipe\n"); #endif - return GNUNET_SYSERR; - } - } + return GNUNET_SYSERR; + } + } #if DEBUG_PIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, "Will get overlapped result\n"); + LOG (GNUNET_ERROR_TYPE_DEBUG, "Will get overlapped result\n"); #endif - GetOverlappedResult (h->h, h->oOverlapWrite, &bytesWritten, TRUE); - } + GetOverlappedResult (h->h, h->oOverlapWrite, &bytesWritten, TRUE); + } return bytesWritten; #else return write (h->fd, buffer, n); @@ -779,15 +777,14 @@ GNUNET_DISK_file_write (const struct GNUNET_DISK_FileHandle * h, */ ssize_t GNUNET_DISK_fn_write (const char *fn, const void *buffer, size_t n, - enum GNUNET_DISK_AccessPermissions mode) + enum GNUNET_DISK_AccessPermissions mode) { struct GNUNET_DISK_FileHandle *fh; ssize_t ret; fh = GNUNET_DISK_file_open (fn, - GNUNET_DISK_OPEN_WRITE | - GNUNET_DISK_OPEN_TRUNCATE | - GNUNET_DISK_OPEN_CREATE, mode); + GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_TRUNCATE + | GNUNET_DISK_OPEN_CREATE, mode); if (!fh) return GNUNET_SYSERR; ret = GNUNET_DISK_file_write (fh, buffer, n); @@ -808,8 +805,8 @@ GNUNET_DISK_fn_write (const char *fn, const void *buffer, size_t n, */ int GNUNET_DISK_directory_scan (const char *dirName, - GNUNET_FileNameCallback callback, - void *callback_cls) + GNUNET_FileNameCallback callback, + void *callback_cls) { DIR *dinfo; struct dirent *finfo; @@ -827,61 +824,61 @@ GNUNET_DISK_directory_scan (const char *dirName, while ((strlen (dname) > 0) && (dname[strlen (dname) - 1] == DIR_SEPARATOR)) dname[strlen (dname) - 1] = '\0'; if (0 != STAT (dname, &istat)) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "stat", dname); - GNUNET_free (dname); - return GNUNET_SYSERR; - } + { + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "stat", dname); + GNUNET_free (dname); + return GNUNET_SYSERR; + } if (!S_ISDIR (istat.st_mode)) - { - LOG (GNUNET_ERROR_TYPE_WARNING, - _("Expected `%s' to be a directory!\n"), dirName); - GNUNET_free (dname); - return GNUNET_SYSERR; - } + { + LOG (GNUNET_ERROR_TYPE_WARNING, _("Expected `%s' to be a directory!\n"), + dirName); + GNUNET_free (dname); + return GNUNET_SYSERR; + } errno = 0; dinfo = OPENDIR (dname); if ((errno == EACCES) || (dinfo == NULL)) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "opendir", dname); - if (dinfo != NULL) - closedir (dinfo); - GNUNET_free (dname); - return GNUNET_SYSERR; - } + { + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "opendir", dname); + if (dinfo != NULL) + closedir (dinfo); + GNUNET_free (dname); + return GNUNET_SYSERR; + } name_len = 256; n_size = strlen (dname) + name_len + 2; name = GNUNET_malloc (n_size); while ((finfo = readdir (dinfo)) != NULL) + { + if ((0 == strcmp (finfo->d_name, ".")) || + (0 == strcmp (finfo->d_name, ".."))) + continue; + if (callback != NULL) { - if ((0 == strcmp (finfo->d_name, ".")) || - (0 == strcmp (finfo->d_name, ".."))) - continue; - if (callback != NULL) - { - if (name_len < strlen (finfo->d_name)) - { - GNUNET_free (name); - name_len = strlen (finfo->d_name); - n_size = strlen (dname) + name_len + 2; - name = GNUNET_malloc (n_size); - } - /* dname can end in "/" only if dname == "/"; - * if dname does not end in "/", we need to add - * a "/" (otherwise, we must not!) */ - GNUNET_snprintf (name, n_size, "%s%s%s", dname, - (strcmp (dname, DIR_SEPARATOR_STR) == - 0) ? "" : DIR_SEPARATOR_STR, finfo->d_name); - if (GNUNET_OK != callback (callback_cls, name)) - { - closedir (dinfo); - GNUNET_free (name); - GNUNET_free (dname); - return GNUNET_SYSERR; - } - } - count++; + if (name_len < strlen (finfo->d_name)) + { + GNUNET_free (name); + name_len = strlen (finfo->d_name); + n_size = strlen (dname) + name_len + 2; + name = GNUNET_malloc (n_size); + } + /* dname can end in "/" only if dname == "/"; + * if dname does not end in "/", we need to add + * a "/" (otherwise, we must not!) */ + GNUNET_snprintf (name, n_size, "%s%s%s", dname, + (strcmp (dname, DIR_SEPARATOR_STR) == + 0) ? "" : DIR_SEPARATOR_STR, finfo->d_name); + if (GNUNET_OK != callback (callback_cls, name)) + { + closedir (dinfo); + GNUNET_free (name); + GNUNET_free (dname); + return GNUNET_SYSERR; + } } + count++; + } closedir (dinfo); GNUNET_free (name); GNUNET_free (dname); @@ -933,7 +930,7 @@ struct GNUNET_DISK_DirectoryIterator */ static void directory_iterator_task (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) + const struct GNUNET_SCHEDULER_TaskContext *tc) { struct GNUNET_DISK_DirectoryIterator *iter = cls; char *name; @@ -958,35 +955,35 @@ directory_iterator_task (void *cls, * GNUNET_SYSERR if abort was YES */ int -GNUNET_DISK_directory_iterator_next (struct GNUNET_DISK_DirectoryIterator - *iter, int can) +GNUNET_DISK_directory_iterator_next (struct GNUNET_DISK_DirectoryIterator *iter, + int can) { struct dirent *finfo; GNUNET_assert (iter->next_name == NULL); if (can == GNUNET_YES) - { - closedir (iter->directory); - GNUNET_free (iter->dirname); - GNUNET_free (iter); - return GNUNET_SYSERR; - } + { + closedir (iter->directory); + GNUNET_free (iter->dirname); + GNUNET_free (iter); + return GNUNET_SYSERR; + } while (NULL != (finfo = readdir (iter->directory))) - { - if ((0 == strcmp (finfo->d_name, ".")) || - (0 == strcmp (finfo->d_name, ".."))) - continue; - GNUNET_asprintf (&iter->next_name, "%s%s%s", iter->dirname, - DIR_SEPARATOR_STR, finfo->d_name); - break; - } + { + if ((0 == strcmp (finfo->d_name, ".")) || + (0 == strcmp (finfo->d_name, ".."))) + continue; + GNUNET_asprintf (&iter->next_name, "%s%s%s", iter->dirname, + DIR_SEPARATOR_STR, finfo->d_name); + break; + } if (finfo == NULL) - { - GNUNET_DISK_directory_iterator_next (iter, GNUNET_YES); - return GNUNET_NO; - } - GNUNET_SCHEDULER_add_with_priority (iter->priority, - &directory_iterator_task, iter); + { + GNUNET_DISK_directory_iterator_next (iter, GNUNET_YES); + return GNUNET_NO; + } + GNUNET_SCHEDULER_add_with_priority (iter->priority, &directory_iterator_task, + iter); return GNUNET_YES; } @@ -1004,9 +1001,9 @@ GNUNET_DISK_directory_iterator_next (struct GNUNET_DISK_DirectoryIterator */ void GNUNET_DISK_directory_iterator_start (enum GNUNET_SCHEDULER_Priority prio, - const char *dirName, - GNUNET_DISK_DirectoryIteratorCallback - callback, void *callback_cls) + const char *dirName, + GNUNET_DISK_DirectoryIteratorCallback + callback, void *callback_cls) { struct GNUNET_DISK_DirectoryIterator *di; @@ -1015,11 +1012,11 @@ GNUNET_DISK_directory_iterator_start (enum GNUNET_SCHEDULER_Priority prio, di->callback_cls = callback_cls; di->directory = OPENDIR (dirName); if (di->directory == NULL) - { - GNUNET_free (di); - callback (callback_cls, NULL, NULL, NULL); - return; - } + { + GNUNET_free (di); + callback (callback_cls, NULL, NULL, NULL); + return; + } di->dirname = GNUNET_strdup (dirName); di->priority = prio; GNUNET_DISK_directory_iterator_next (di, GNUNET_NO); @@ -1056,7 +1053,7 @@ GNUNET_DISK_directory_remove (const char *fileName) struct stat istat; if (0 != LSTAT (fileName, &istat)) - return GNUNET_NO; /* file may not exist... */ + return GNUNET_NO; /* file may not exist... */ CHMOD (fileName, S_IWUSR | S_IRUSR | S_IXUSR); if (UNLINK (fileName) == 0) return GNUNET_OK; @@ -1065,18 +1062,18 @@ GNUNET_DISK_directory_remove (const char *fileName) * sticky /tmp directory may result in EPERM on BSD. * So we also explicitly check "isDirectory" */ (GNUNET_YES != GNUNET_DISK_directory_test (fileName))) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "rmdir", fileName); - return GNUNET_SYSERR; - } + { + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "rmdir", fileName); + return GNUNET_SYSERR; + } if (GNUNET_SYSERR == GNUNET_DISK_directory_scan (fileName, &remove_helper, NULL)) return GNUNET_SYSERR; if (0 != RMDIR (fileName)) - { - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "rmdir", fileName); - return GNUNET_SYSERR; - } + { + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "rmdir", fileName); + return GNUNET_SYSERR; + } return GNUNET_OK; } @@ -1102,34 +1099,34 @@ GNUNET_DISK_file_copy (const char *src, const char *dst) return GNUNET_SYSERR; pos = 0; in = GNUNET_DISK_file_open (src, GNUNET_DISK_OPEN_READ, - GNUNET_DISK_PERM_NONE); + GNUNET_DISK_PERM_NONE); if (!in) return GNUNET_SYSERR; out = - GNUNET_DISK_file_open (dst, - GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_CREATE | - GNUNET_DISK_OPEN_FAILIFEXISTS, - GNUNET_DISK_PERM_USER_READ | - GNUNET_DISK_PERM_USER_WRITE | - GNUNET_DISK_PERM_GROUP_READ | - GNUNET_DISK_PERM_GROUP_WRITE); + GNUNET_DISK_file_open (dst, + GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_CREATE | + GNUNET_DISK_OPEN_FAILIFEXISTS, + GNUNET_DISK_PERM_USER_READ | + GNUNET_DISK_PERM_USER_WRITE | + GNUNET_DISK_PERM_GROUP_READ | + GNUNET_DISK_PERM_GROUP_WRITE); if (!out) - { - GNUNET_DISK_file_close (in); - return GNUNET_SYSERR; - } + { + GNUNET_DISK_file_close (in); + return GNUNET_SYSERR; + } buf = GNUNET_malloc (COPY_BLK_SIZE); while (pos < size) - { - len = COPY_BLK_SIZE; - if (len > size - pos) - len = size - pos; - if (len != GNUNET_DISK_file_read (in, buf, len)) - goto FAIL; - if (len != GNUNET_DISK_file_write (out, buf, len)) - goto FAIL; - pos += len; - } + { + len = COPY_BLK_SIZE; + if (len > size - pos) + len = size - pos; + if (len != GNUNET_DISK_file_read (in, buf, len)) + goto FAIL; + if (len != GNUNET_DISK_file_write (out, buf, len)) + goto FAIL; + pos += len; + } GNUNET_free (buf); GNUNET_DISK_file_close (in); GNUNET_DISK_file_close (out); @@ -1154,17 +1151,17 @@ GNUNET_DISK_filename_canonicalize (char *fn) idx = fn; while (*idx) - { - c = *idx; - - if (c == '/' || c == '\\' || c == ':' || c == '*' || c == '?' - || c == '"' || c == '<' || c == '>' || c == '|') - { - *idx = '_'; - } + { + c = *idx; - idx++; + if (c == '/' || c == '\\' || c == ':' || c == '*' || c == '?' || c == '"' || + c == '<' || c == '>' || c == '|') + { + *idx = '_'; } + + idx++; + } } @@ -1184,12 +1181,12 @@ GNUNET_DISK_file_change_owner (const char *filename, const char *user) pws = getpwnam (user); if (pws == NULL) - { - LOG (GNUNET_ERROR_TYPE_ERROR, - _("Cannot obtain information about user `%s': %s\n"), user, - STRERROR (errno)); - return GNUNET_SYSERR; - } + { + LOG (GNUNET_ERROR_TYPE_ERROR, + _("Cannot obtain information about user `%s': %s\n"), user, + STRERROR (errno)); + return GNUNET_SYSERR; + } if (0 != chown (filename, pws->pw_uid, pws->pw_gid)) LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "chown", filename); #endif @@ -1207,13 +1204,13 @@ GNUNET_DISK_file_change_owner (const char *filename, const char *user) */ int GNUNET_DISK_file_lock (struct GNUNET_DISK_FileHandle *fh, off_t lockStart, - off_t lockEnd, int excl) + off_t lockEnd, int excl) { if (fh == NULL) - { - errno = EINVAL; - return GNUNET_SYSERR; - } + { + errno = EINVAL; + return GNUNET_SYSERR; + } #ifndef MINGW struct flock fl; @@ -1232,13 +1229,12 @@ GNUNET_DISK_file_lock (struct GNUNET_DISK_FileHandle *fh, off_t lockStart, o.Offset = lockStart; if (!LockFileEx - (fh->h, - (excl ? LOCKFILE_EXCLUSIVE_LOCK : 0) | LOCKFILE_FAIL_IMMEDIATELY, 0, - lockEnd - lockStart, 0, &o)) - { - SetErrnoFromWinError (GetLastError ()); - return GNUNET_SYSERR; - } + (fh->h, (excl ? LOCKFILE_EXCLUSIVE_LOCK : 0) | LOCKFILE_FAIL_IMMEDIATELY, + 0, lockEnd - lockStart, 0, &o)) + { + SetErrnoFromWinError (GetLastError ()); + return GNUNET_SYSERR; + } return GNUNET_OK; #endif @@ -1254,13 +1250,13 @@ GNUNET_DISK_file_lock (struct GNUNET_DISK_FileHandle *fh, off_t lockStart, */ int GNUNET_DISK_file_unlock (struct GNUNET_DISK_FileHandle *fh, off_t unlockStart, - off_t unlockEnd) + off_t unlockEnd) { if (fh == NULL) - { - errno = EINVAL; - return GNUNET_SYSERR; - } + { + errno = EINVAL; + return GNUNET_SYSERR; + } #ifndef MINGW struct flock fl; @@ -1279,10 +1275,10 @@ GNUNET_DISK_file_unlock (struct GNUNET_DISK_FileHandle *fh, off_t unlockStart, o.Offset = unlockStart; if (!UnlockFileEx (fh->h, 0, unlockEnd - unlockStart, 0, &o)) - { - SetErrnoFromWinError (GetLastError ()); - return GNUNET_SYSERR; - } + { + SetErrnoFromWinError (GetLastError ()); + return GNUNET_SYSERR; + } return GNUNET_OK; #endif @@ -1303,7 +1299,7 @@ GNUNET_DISK_file_unlock (struct GNUNET_DISK_FileHandle *fh, off_t unlockStart, */ struct GNUNET_DISK_FileHandle * GNUNET_DISK_file_open (const char *fn, enum GNUNET_DISK_OpenFlags flags, - enum GNUNET_DISK_AccessPermissions perm) + enum GNUNET_DISK_AccessPermissions perm) { char *expfn; struct GNUNET_DISK_FileHandle *ret; @@ -1324,17 +1320,17 @@ GNUNET_DISK_file_open (const char *fn, enum GNUNET_DISK_OpenFlags flags, #ifndef MINGW mode = 0; if (GNUNET_DISK_OPEN_READWRITE == (flags & GNUNET_DISK_OPEN_READWRITE)) - oflags = O_RDWR; /* note: O_RDWR is NOT always O_RDONLY | O_WRONLY */ + oflags = O_RDWR; /* note: O_RDWR is NOT always O_RDONLY | O_WRONLY */ else if (flags & GNUNET_DISK_OPEN_READ) oflags = O_RDONLY; else if (flags & GNUNET_DISK_OPEN_WRITE) oflags = O_WRONLY; else - { - GNUNET_break (0); - GNUNET_free (expfn); - return NULL; - } + { + GNUNET_break (0); + GNUNET_free (expfn); + return NULL; + } if (flags & GNUNET_DISK_OPEN_FAILIFEXISTS) oflags |= (O_CREAT | O_EXCL); if (flags & GNUNET_DISK_OPEN_TRUNCATE) @@ -1342,22 +1338,22 @@ GNUNET_DISK_file_open (const char *fn, enum GNUNET_DISK_OpenFlags flags, if (flags & GNUNET_DISK_OPEN_APPEND) oflags |= O_APPEND; if (flags & GNUNET_DISK_OPEN_CREATE) - { - (void) GNUNET_DISK_directory_create_for_file (expfn); - oflags |= O_CREAT; - mode = translate_unix_perms (perm); - } + { + (void) GNUNET_DISK_directory_create_for_file (expfn); + oflags |= O_CREAT; + mode = translate_unix_perms (perm); + } fd = open (expfn, oflags | O_LARGEFILE, mode); if (fd == -1) - { - if (0 == (flags & GNUNET_DISK_OPEN_FAILIFEXISTS)) - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "open", expfn); - else - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_DEBUG, "open", expfn); - GNUNET_free (expfn); - return NULL; - } + { + if (0 == (flags & GNUNET_DISK_OPEN_FAILIFEXISTS)) + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "open", expfn); + else + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_DEBUG, "open", expfn); + GNUNET_free (expfn); + return NULL; + } #else access = 0; disp = OPEN_ALWAYS; @@ -1370,48 +1366,47 @@ GNUNET_DISK_file_open (const char *fn, enum GNUNET_DISK_OpenFlags flags, access = FILE_WRITE_DATA; if (flags & GNUNET_DISK_OPEN_FAILIFEXISTS) - { - disp = CREATE_NEW; - } + { + disp = CREATE_NEW; + } else if (flags & GNUNET_DISK_OPEN_CREATE) - { - (void) GNUNET_DISK_directory_create_for_file (expfn); - if (flags & GNUNET_DISK_OPEN_TRUNCATE) - disp = CREATE_ALWAYS; - else - disp = OPEN_ALWAYS; - } + { + (void) GNUNET_DISK_directory_create_for_file (expfn); + if (flags & GNUNET_DISK_OPEN_TRUNCATE) + disp = CREATE_ALWAYS; + else + disp = OPEN_ALWAYS; + } else if (flags & GNUNET_DISK_OPEN_TRUNCATE) - { - disp = TRUNCATE_EXISTING; - } + { + disp = TRUNCATE_EXISTING; + } else - { - disp = OPEN_EXISTING; - } + { + disp = OPEN_EXISTING; + } /* TODO: access priviledges? */ h = CreateFile (expfn, access, - FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, disp, FILE_ATTRIBUTE_NORMAL, NULL); + FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, + disp, FILE_ATTRIBUTE_NORMAL, NULL); if (h == INVALID_HANDLE_VALUE) + { + SetErrnoFromWinError (GetLastError ()); + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "open", expfn); + GNUNET_free (expfn); + return NULL; + } + + if (flags & GNUNET_DISK_OPEN_APPEND) + if (SetFilePointer (h, 0, 0, FILE_END) == INVALID_SET_FILE_POINTER) { SetErrnoFromWinError (GetLastError ()); - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "open", expfn); + LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "SetFilePointer", expfn); + CloseHandle (h); GNUNET_free (expfn); return NULL; } - - if (flags & GNUNET_DISK_OPEN_APPEND) - if (SetFilePointer (h, 0, 0, FILE_END) == INVALID_SET_FILE_POINTER) - { - SetErrnoFromWinError (GetLastError ()); - LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "SetFilePointer", - expfn); - CloseHandle (h); - GNUNET_free (expfn); - return NULL; - } #endif ret = GNUNET_malloc (sizeof (struct GNUNET_DISK_FileHandle)); @@ -1435,28 +1430,28 @@ int GNUNET_DISK_file_close (struct GNUNET_DISK_FileHandle *h) { if (h == NULL) - { - errno = EINVAL; - return GNUNET_SYSERR; - } + { + errno = EINVAL; + return GNUNET_SYSERR; + } #if MINGW if (!CloseHandle (h->h)) - { - SetErrnoFromWinError (GetLastError ()); - LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "close"); - GNUNET_free (h->oOverlapRead); - GNUNET_free (h->oOverlapWrite); - GNUNET_free (h); - return GNUNET_SYSERR; - } + { + SetErrnoFromWinError (GetLastError ()); + LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "close"); + GNUNET_free (h->oOverlapRead); + GNUNET_free (h->oOverlapWrite); + GNUNET_free (h); + return GNUNET_SYSERR; + } #else if (close (h->fd) != 0) - { - LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "close"); - GNUNET_free (h); - return GNUNET_SYSERR; - } + { + LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "close"); + GNUNET_free (h); + return GNUNET_SYSERR; + } #endif GNUNET_free (h); return GNUNET_OK; @@ -1479,7 +1474,7 @@ GNUNET_DISK_file_close (struct GNUNET_DISK_FileHandle *h) */ char * GNUNET_DISK_get_home_filename (const struct GNUNET_CONFIGURATION_Handle *cfg, - const char *serviceName, ...) + const char *serviceName, ...) { const char *c; char *pfx; @@ -1488,45 +1483,44 @@ GNUNET_DISK_get_home_filename (const struct GNUNET_CONFIGURATION_Handle *cfg, unsigned int needed; if (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_filename (cfg, serviceName, "HOME", - &pfx)) + GNUNET_CONFIGURATION_get_value_filename (cfg, serviceName, "HOME", &pfx)) return NULL; if (pfx == NULL) - { - LOG (GNUNET_ERROR_TYPE_WARNING, - _("No `%s' specified for service `%s' in configuration.\n"), - "HOME", serviceName); - return NULL; - } + { + LOG (GNUNET_ERROR_TYPE_WARNING, + _("No `%s' specified for service `%s' in configuration.\n"), "HOME", + serviceName); + return NULL; + } needed = strlen (pfx) + 2; if ((pfx[strlen (pfx) - 1] != '/') && (pfx[strlen (pfx) - 1] != '\\')) needed++; va_start (ap, serviceName); while (1) - { - c = va_arg (ap, const char *); + { + c = va_arg (ap, const char *); - if (c == NULL) - break; - needed += strlen (c); - if ((c[strlen (c) - 1] != '/') && (c[strlen (c) - 1] != '\\')) - needed++; - } + if (c == NULL) + break; + needed += strlen (c); + if ((c[strlen (c) - 1] != '/') && (c[strlen (c) - 1] != '\\')) + needed++; + } va_end (ap); ret = GNUNET_malloc (needed); strcpy (ret, pfx); GNUNET_free (pfx); va_start (ap, serviceName); while (1) - { - c = va_arg (ap, const char *); + { + c = va_arg (ap, const char *); - if (c == NULL) - break; - if ((c[strlen (c) - 1] != '/') && (c[strlen (c) - 1] != '\\')) - strcat (ret, DIR_SEPARATOR_STR); - strcat (ret, c); - } + if (c == NULL) + break; + if ((c[strlen (c) - 1] != '/') && (c[strlen (c) - 1] != '\\')) + strcat (ret, DIR_SEPARATOR_STR); + strcat (ret, c); + } va_end (ap); if ((ret[strlen (ret) - 1] != '/') && (ret[strlen (ret) - 1] != '\\')) (void) GNUNET_DISK_directory_create_for_file (ret); @@ -1575,56 +1569,56 @@ struct GNUNET_DISK_MapHandle */ void * GNUNET_DISK_file_map (const struct GNUNET_DISK_FileHandle *h, - struct GNUNET_DISK_MapHandle **m, - enum GNUNET_DISK_MapType access, size_t len) + struct GNUNET_DISK_MapHandle **m, + enum GNUNET_DISK_MapType access, size_t len) { if (h == NULL) - { - errno = EINVAL; - return NULL; - } + { + errno = EINVAL; + return NULL; + } #ifdef MINGW DWORD mapAccess, protect; if ((access & GNUNET_DISK_MAP_TYPE_READ) && (access & GNUNET_DISK_MAP_TYPE_WRITE)) - { - protect = PAGE_READWRITE; - mapAccess = FILE_MAP_ALL_ACCESS; - } + { + protect = PAGE_READWRITE; + mapAccess = FILE_MAP_ALL_ACCESS; + } else if (access & GNUNET_DISK_MAP_TYPE_READ) - { - protect = PAGE_READONLY; - mapAccess = FILE_MAP_READ; - } + { + protect = PAGE_READONLY; + mapAccess = FILE_MAP_READ; + } else if (access & GNUNET_DISK_MAP_TYPE_WRITE) - { - protect = PAGE_READWRITE; - mapAccess = FILE_MAP_WRITE; - } + { + protect = PAGE_READWRITE; + mapAccess = FILE_MAP_WRITE; + } else - { - GNUNET_break (0); - return NULL; - } + { + GNUNET_break (0); + return NULL; + } *m = GNUNET_malloc (sizeof (struct GNUNET_DISK_MapHandle)); (*m)->h = CreateFileMapping (h->h, NULL, protect, 0, 0, NULL); if ((*m)->h == INVALID_HANDLE_VALUE) - { - SetErrnoFromWinError (GetLastError ()); - GNUNET_free (*m); - return NULL; - } + { + SetErrnoFromWinError (GetLastError ()); + GNUNET_free (*m); + return NULL; + } (*m)->addr = MapViewOfFile ((*m)->h, mapAccess, 0, 0, len); if (!(*m)->addr) - { - SetErrnoFromWinError (GetLastError ()); - CloseHandle ((*m)->h); - GNUNET_free (*m); - } + { + SetErrnoFromWinError (GetLastError ()); + CloseHandle ((*m)->h); + GNUNET_free (*m); + } return (*m)->addr; #else @@ -1639,10 +1633,10 @@ GNUNET_DISK_file_map (const struct GNUNET_DISK_FileHandle *h, (*m)->addr = mmap (NULL, len, prot, MAP_SHARED, h->fd, 0); GNUNET_assert (NULL != (*m)->addr); if (MAP_FAILED == (*m)->addr) - { - GNUNET_free (*m); - return NULL; - } + { + GNUNET_free (*m); + return NULL; + } (*m)->len = len; return (*m)->addr; #endif @@ -1659,20 +1653,20 @@ GNUNET_DISK_file_unmap (struct GNUNET_DISK_MapHandle *h) int ret; if (h == NULL) - { - errno = EINVAL; - return GNUNET_SYSERR; - } + { + errno = EINVAL; + return GNUNET_SYSERR; + } #ifdef MINGW ret = UnmapViewOfFile (h->addr) ? GNUNET_OK : GNUNET_SYSERR; if (ret != GNUNET_OK) SetErrnoFromWinError (GetLastError ()); if (!CloseHandle (h->h) && (ret == GNUNET_OK)) - { - ret = GNUNET_SYSERR; - SetErrnoFromWinError (GetLastError ()); - } + { + ret = GNUNET_SYSERR; + SetErrnoFromWinError (GetLastError ()); + } #else ret = munmap (h->addr, h->len) != -1 ? GNUNET_OK : GNUNET_SYSERR; #endif @@ -1690,10 +1684,10 @@ int GNUNET_DISK_file_sync (const struct GNUNET_DISK_FileHandle *h) { if (h == NULL) - { - errno = EINVAL; - return GNUNET_SYSERR; - } + { + errno = EINVAL; + return GNUNET_SYSERR; + } #ifdef MINGW int ret; @@ -1722,8 +1716,8 @@ GNUNET_DISK_file_sync (const struct GNUNET_DISK_FileHandle *h) unlike CreatePipe, which returns a bool for success or failure. */ static int create_selectable_pipe (PHANDLE read_pipe_ptr, PHANDLE write_pipe_ptr, - LPSECURITY_ATTRIBUTES sa_ptr, DWORD psize, - DWORD dwReadMode, DWORD dwWriteMode) + LPSECURITY_ATTRIBUTES sa_ptr, DWORD psize, + DWORD dwReadMode, DWORD dwWriteMode) { /* Default to error. */ *read_pipe_ptr = *write_pipe_ptr = INVALID_HANDLE_VALUE; @@ -1740,103 +1734,103 @@ create_selectable_pipe (PHANDLE read_pipe_ptr, PHANDLE write_pipe_ptr, * Retrying will probably never be necessary, but we want * to be as robust as possible. */ while (1) - { - static volatile LONG pipe_unique_id; + { + static volatile LONG pipe_unique_id; - snprintf (pipename, sizeof pipename, "\\\\.\\pipe\\gnunet-%d-%ld", - getpid (), InterlockedIncrement ((LONG *) & pipe_unique_id)); + snprintf (pipename, sizeof pipename, "\\\\.\\pipe\\gnunet-%d-%ld", + getpid (), InterlockedIncrement ((LONG *) & pipe_unique_id)); #if DEBUG_PIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, - "CreateNamedPipe: name = %s, size = %lu\n", pipename, psize); + LOG (GNUNET_ERROR_TYPE_DEBUG, "CreateNamedPipe: name = %s, size = %lu\n", + pipename, psize); #endif - /* Use CreateNamedPipe instead of CreatePipe, because the latter - * returns a write handle that does not permit FILE_READ_ATTRIBUTES - * access, on versions of win32 earlier than WinXP SP2. - * CreatePipe also stupidly creates a full duplex pipe, which is - * a waste, since only a single direction is actually used. - * It's important to only allow a single instance, to ensure that - * the pipe was not created earlier by some other process, even if - * the pid has been reused. We avoid FILE_FLAG_FIRST_PIPE_INSTANCE - * because that is only available for Win2k SP2 and WinXP. */ - read_pipe = CreateNamedPipeA (pipename, PIPE_ACCESS_INBOUND | dwReadMode, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, /* max instances */ - psize, /* output buffer size */ - psize, /* input buffer size */ - NMPWAIT_USE_DEFAULT_WAIT, sa_ptr); - - if (read_pipe != INVALID_HANDLE_VALUE) - { + /* Use CreateNamedPipe instead of CreatePipe, because the latter + * returns a write handle that does not permit FILE_READ_ATTRIBUTES + * access, on versions of win32 earlier than WinXP SP2. + * CreatePipe also stupidly creates a full duplex pipe, which is + * a waste, since only a single direction is actually used. + * It's important to only allow a single instance, to ensure that + * the pipe was not created earlier by some other process, even if + * the pid has been reused. We avoid FILE_FLAG_FIRST_PIPE_INSTANCE + * because that is only available for Win2k SP2 and WinXP. */ + read_pipe = CreateNamedPipeA (pipename, PIPE_ACCESS_INBOUND | dwReadMode, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, /* max instances */ + psize, /* output buffer size */ + psize, /* input buffer size */ + NMPWAIT_USE_DEFAULT_WAIT, sa_ptr); + + if (read_pipe != INVALID_HANDLE_VALUE) + { #if DEBUG_PIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, "pipe read handle = %p\n", read_pipe); + LOG (GNUNET_ERROR_TYPE_DEBUG, "pipe read handle = %p\n", read_pipe); #endif - break; - } + break; + } - DWORD err = GetLastError (); + DWORD err = GetLastError (); - switch (err) - { - case ERROR_PIPE_BUSY: - /* The pipe is already open with compatible parameters. - * Pick a new name and retry. */ + switch (err) + { + case ERROR_PIPE_BUSY: + /* The pipe is already open with compatible parameters. + * Pick a new name and retry. */ #if DEBUG_PIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, "pipe busy, retrying\n"); + LOG (GNUNET_ERROR_TYPE_DEBUG, "pipe busy, retrying\n"); #endif - continue; - case ERROR_ACCESS_DENIED: - /* The pipe is already open with incompatible parameters. - * Pick a new name and retry. */ + continue; + case ERROR_ACCESS_DENIED: + /* The pipe is already open with incompatible parameters. + * Pick a new name and retry. */ #if DEBUG_PIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, "pipe access denied, retrying\n"); + LOG (GNUNET_ERROR_TYPE_DEBUG, "pipe access denied, retrying\n"); #endif - continue; - case ERROR_CALL_NOT_IMPLEMENTED: - /* We are on an older Win9x platform without named pipes. - * Return an anonymous pipe as the best approximation. */ + continue; + case ERROR_CALL_NOT_IMPLEMENTED: + /* We are on an older Win9x platform without named pipes. + * Return an anonymous pipe as the best approximation. */ #if DEBUG_PIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, - "CreateNamedPipe not implemented, resorting to " - "CreatePipe: size = %lu\n", psize); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "CreateNamedPipe not implemented, resorting to " + "CreatePipe: size = %lu\n", psize); #endif - if (CreatePipe (read_pipe_ptr, write_pipe_ptr, sa_ptr, psize)) - { + if (CreatePipe (read_pipe_ptr, write_pipe_ptr, sa_ptr, psize)) + { #if DEBUG_PIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, "pipe read handle = %p\n", - *read_pipe_ptr); - LOG (GNUNET_ERROR_TYPE_DEBUG, "pipe write handle = %p\n", - *write_pipe_ptr); + LOG (GNUNET_ERROR_TYPE_DEBUG, "pipe read handle = %p\n", + *read_pipe_ptr); + LOG (GNUNET_ERROR_TYPE_DEBUG, "pipe write handle = %p\n", + *write_pipe_ptr); #endif - return GNUNET_OK; - } - err = GetLastError (); - LOG (GNUNET_ERROR_TYPE_ERROR, "CreatePipe failed: %d\n", err); - return err; - default: - LOG (GNUNET_ERROR_TYPE_ERROR, "CreateNamedPipe failed: %d\n", err); - return err; - } - /* NOTREACHED */ + return GNUNET_OK; + } + err = GetLastError (); + LOG (GNUNET_ERROR_TYPE_ERROR, "CreatePipe failed: %d\n", err); + return err; + default: + LOG (GNUNET_ERROR_TYPE_ERROR, "CreateNamedPipe failed: %d\n", err); + return err; } + /* NOTREACHED */ + } #if DEBUG_PIPE LOG (GNUNET_ERROR_TYPE_DEBUG, "CreateFile: name = %s\n", pipename); #endif /* Open the named pipe for writing. * Be sure to permit FILE_READ_ATTRIBUTES access. */ - write_pipe = CreateFileA (pipename, GENERIC_WRITE | FILE_READ_ATTRIBUTES, 0, /* share mode */ - sa_ptr, OPEN_EXISTING, dwWriteMode, /* flags and attributes */ - 0); /* handle to template file */ + write_pipe = CreateFileA (pipename, GENERIC_WRITE | FILE_READ_ATTRIBUTES, 0, /* share mode */ + sa_ptr, OPEN_EXISTING, dwWriteMode, /* flags and attributes */ + 0); /* handle to template file */ if (write_pipe == INVALID_HANDLE_VALUE) - { - /* Failure. */ - DWORD err = GetLastError (); + { + /* Failure. */ + DWORD err = GetLastError (); #if DEBUG_PIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, "CreateFile failed: %d\n", err); + LOG (GNUNET_ERROR_TYPE_DEBUG, "CreateFile failed: %d\n", err); #endif - CloseHandle (read_pipe); - return err; - } + CloseHandle (read_pipe); + return err; + } #if DEBUG_PIPE LOG (GNUNET_ERROR_TYPE_DEBUG, "pipe write handle = %p\n", write_pipe); #endif @@ -1863,7 +1857,7 @@ GNUNET_DISK_pipe (int blocking, int inherit_read, int inherit_write) struct GNUNET_DISK_FileHandle *fds; p = GNUNET_malloc (sizeof (struct GNUNET_DISK_PipeHandle) + - 2 * sizeof (struct GNUNET_DISK_FileHandle)); + 2 * sizeof (struct GNUNET_DISK_FileHandle)); fds = (struct GNUNET_DISK_FileHandle *) &p[1]; p->fd[0] = &fds[0]; p->fd[1] = &fds[1]; @@ -1875,13 +1869,13 @@ GNUNET_DISK_pipe (int blocking, int inherit_read, int inherit_write) ret = pipe (fd); if (ret == -1) - { - eno = errno; - LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "pipe"); - GNUNET_free (p); - errno = eno; - return NULL; - } + { + eno = errno; + LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "pipe"); + GNUNET_free (p); + errno = eno; + return NULL; + } p->fd[0]->fd = fd[0]; p->fd[1]->fd = fd[1]; ret = 0; @@ -1905,62 +1899,62 @@ GNUNET_DISK_pipe (int blocking, int inherit_read, int inherit_write) if (0 > fcntl (fd[1], F_SETFD, flags)) ret = -1; if (ret == -1) - { - eno = errno; - LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "fcntl"); - GNUNET_break (0 == close (p->fd[0]->fd)); - GNUNET_break (0 == close (p->fd[1]->fd)); - GNUNET_free (p); - errno = eno; - return NULL; - } + { + eno = errno; + LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "fcntl"); + GNUNET_break (0 == close (p->fd[0]->fd)); + GNUNET_break (0 == close (p->fd[1]->fd)); + GNUNET_free (p); + errno = eno; + return NULL; + } #else BOOL ret; HANDLE tmp_handle; ret = - create_selectable_pipe (&p->fd[0]->h, &p->fd[1]->h, NULL, 0, - FILE_FLAG_OVERLAPPED, FILE_FLAG_OVERLAPPED); + create_selectable_pipe (&p->fd[0]->h, &p->fd[1]->h, NULL, 0, + FILE_FLAG_OVERLAPPED, FILE_FLAG_OVERLAPPED); if (!ret) - { - GNUNET_free (p); - SetErrnoFromWinError (GetLastError ()); - return NULL; - } + { + GNUNET_free (p); + SetErrnoFromWinError (GetLastError ()); + return NULL; + } if (!DuplicateHandle - (GetCurrentProcess (), p->fd[0]->h, GetCurrentProcess (), &tmp_handle, - 0, inherit_read == GNUNET_YES ? TRUE : FALSE, DUPLICATE_SAME_ACCESS)) - { - SetErrnoFromWinError (GetLastError ()); - CloseHandle (p->fd[0]->h); - CloseHandle (p->fd[1]->h); - GNUNET_free (p); - return NULL; - } + (GetCurrentProcess (), p->fd[0]->h, GetCurrentProcess (), &tmp_handle, 0, + inherit_read == GNUNET_YES ? TRUE : FALSE, DUPLICATE_SAME_ACCESS)) + { + SetErrnoFromWinError (GetLastError ()); + CloseHandle (p->fd[0]->h); + CloseHandle (p->fd[1]->h); + GNUNET_free (p); + return NULL; + } CloseHandle (p->fd[0]->h); p->fd[0]->h = tmp_handle; if (!DuplicateHandle - (GetCurrentProcess (), p->fd[1]->h, GetCurrentProcess (), &tmp_handle, - 0, inherit_write == GNUNET_YES ? TRUE : FALSE, DUPLICATE_SAME_ACCESS)) - { - SetErrnoFromWinError (GetLastError ()); - CloseHandle (p->fd[0]->h); - CloseHandle (p->fd[1]->h); - GNUNET_free (p); - return NULL; - } + (GetCurrentProcess (), p->fd[1]->h, GetCurrentProcess (), &tmp_handle, 0, + inherit_write == GNUNET_YES ? TRUE : FALSE, DUPLICATE_SAME_ACCESS)) + { + SetErrnoFromWinError (GetLastError ()); + CloseHandle (p->fd[0]->h); + CloseHandle (p->fd[1]->h); + GNUNET_free (p); + return NULL; + } CloseHandle (p->fd[1]->h); p->fd[1]->h = tmp_handle; if (!blocking) - { - DWORD mode; - - mode = PIPE_NOWAIT; - SetNamedPipeHandleState (p->fd[0]->h, &mode, NULL, NULL); - SetNamedPipeHandleState (p->fd[1]->h, &mode, NULL, NULL); - /* this always fails on Windows 95, so we don't care about error handling */ - } + { + DWORD mode; + + mode = PIPE_NOWAIT; + SetNamedPipeHandleState (p->fd[0]->h, &mode, NULL, NULL); + SetNamedPipeHandleState (p->fd[1]->h, &mode, NULL, NULL); + /* this always fails on Windows 95, so we don't care about error handling */ + } p->fd[0]->type = GNUNET_PIPE; p->fd[1]->type = GNUNET_PIPE; @@ -1989,51 +1983,51 @@ GNUNET_DISK_pipe (int blocking, int inherit_read, int inherit_write) */ int GNUNET_DISK_pipe_close_end (struct GNUNET_DISK_PipeHandle *p, - enum GNUNET_DISK_PipeEnd end) + enum GNUNET_DISK_PipeEnd end) { int ret = GNUNET_OK; int save; #ifdef MINGW if (end == GNUNET_DISK_PIPE_END_READ) + { + if (!CloseHandle (p->fd[0]->h)) { - if (!CloseHandle (p->fd[0]->h)) - { - SetErrnoFromWinError (GetLastError ()); - ret = GNUNET_SYSERR; - } - p->fd[0]->h = INVALID_HANDLE_VALUE; + SetErrnoFromWinError (GetLastError ()); + ret = GNUNET_SYSERR; } + p->fd[0]->h = INVALID_HANDLE_VALUE; + } else if (end == GNUNET_DISK_PIPE_END_WRITE) + { + if (!CloseHandle (p->fd[1]->h)) { - if (!CloseHandle (p->fd[1]->h)) - { - SetErrnoFromWinError (GetLastError ()); - ret = GNUNET_SYSERR; - } - p->fd[1]->h = INVALID_HANDLE_VALUE; + SetErrnoFromWinError (GetLastError ()); + ret = GNUNET_SYSERR; } + p->fd[1]->h = INVALID_HANDLE_VALUE; + } save = errno; #else save = 0; if (end == GNUNET_DISK_PIPE_END_READ) + { + if (0 != close (p->fd[0]->fd)) { - if (0 != close (p->fd[0]->fd)) - { - ret = GNUNET_SYSERR; - save = errno; - } - p->fd[0]->fd = -1; + ret = GNUNET_SYSERR; + save = errno; } + p->fd[0]->fd = -1; + } else if (end == GNUNET_DISK_PIPE_END_WRITE) + { + if (0 != close (p->fd[1]->fd)) { - if (0 != close (p->fd[1]->fd)) - { - ret = GNUNET_SYSERR; - save = errno; - } - p->fd[1]->fd = -1; + ret = GNUNET_SYSERR; + save = errno; } + p->fd[1]->fd = -1; + } #endif errno = save; return ret; @@ -2053,35 +2047,35 @@ GNUNET_DISK_pipe_close (struct GNUNET_DISK_PipeHandle *p) #ifdef MINGW if (!CloseHandle (p->fd[0]->h)) - { - SetErrnoFromWinError (GetLastError ()); - ret = GNUNET_SYSERR; - } + { + SetErrnoFromWinError (GetLastError ()); + ret = GNUNET_SYSERR; + } if (!CloseHandle (p->fd[1]->h)) - { - SetErrnoFromWinError (GetLastError ()); - ret = GNUNET_SYSERR; - } + { + SetErrnoFromWinError (GetLastError ()); + ret = GNUNET_SYSERR; + } save = errno; #else save = 0; if (p->fd[0]->fd != -1) + { + if (0 != close (p->fd[0]->fd)) { - if (0 != close (p->fd[0]->fd)) - { - ret = GNUNET_SYSERR; - save = errno; - } + ret = GNUNET_SYSERR; + save = errno; } + } if (p->fd[1]->fd != -1) + { + if (0 != close (p->fd[1]->fd)) { - if (0 != close (p->fd[1]->fd)) - { - ret = GNUNET_SYSERR; - save = errno; - } + ret = GNUNET_SYSERR; + save = errno; } + } #endif GNUNET_free (p); errno = save; @@ -2098,7 +2092,7 @@ GNUNET_DISK_pipe_close (struct GNUNET_DISK_PipeHandle *p) */ struct GNUNET_DISK_FileHandle * GNUNET_DISK_npipe_create (char **fn, enum GNUNET_DISK_OpenFlags flags, - enum GNUNET_DISK_AccessPermissions perm) + enum GNUNET_DISK_AccessPermissions perm) { #ifdef MINGW struct GNUNET_DISK_FileHandle *ret; @@ -2118,71 +2112,70 @@ GNUNET_DISK_npipe_create (char **fn, enum GNUNET_DISK_OpenFlags flags, openMode |= FILE_FLAG_FIRST_PIPE_INSTANCE; while (h == NULL) - { - DWORD error_code; + { + DWORD error_code; - name = NULL; - if (*fn != NULL) - { - GNUNET_asprintf (&name, "\\\\.\\pipe\\%.246s", fn); + name = NULL; + if (*fn != NULL) + { + GNUNET_asprintf (&name, "\\\\.\\pipe\\%.246s", fn); #if DEBUG_NPIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Trying to create an instance of named pipe `%s'\n", name); + 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); - } - else - { - GNUNET_asprintf (fn, "\\\\.\\pipe\\gnunet-%llu", - GNUNET_CRYPTO_random_u64 - (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX)); + h = CreateNamedPipe (name, openMode | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 2, 1, 1, 0, + NULL); + } + else + { + GNUNET_asprintf (fn, "\\\\.\\pipe\\gnunet-%llu", + GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, + UINT64_MAX)); #if DEBUG_NPIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Trying to create unique named pipe `%s'\n", *fn); + 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 (error_code); + 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 (error_code); #if DEBUG_NPIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Pipe creation have failed because of %d, errno is %d\n", - error_code, errno); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Pipe creation have failed because of %d, errno is %d\n", error_code, + errno); #endif - if (name == NULL) - { + if (name == NULL) + { #if DEBUG_NPIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Pipe was to be unique, considering re-creation\n"); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Pipe was to be unique, considering re-creation\n"); #endif - GNUNET_free (*fn); - *fn = NULL; - if (error_code != ERROR_ACCESS_DENIED - && error_code != ERROR_PIPE_BUSY) - { - return NULL; - } + GNUNET_free (*fn); + *fn = NULL; + if (error_code != ERROR_ACCESS_DENIED && error_code != ERROR_PIPE_BUSY) + { + return NULL; + } #if DEBUG_NPIPE - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Pipe name was not unique, trying again\n"); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Pipe name was not unique, trying again\n"); #endif - h = NULL; - } - else - return NULL; - } + h = NULL; + } + else + return NULL; } + } errno = 0; ret = GNUNET_malloc (sizeof (*ret)); @@ -2198,22 +2191,22 @@ GNUNET_DISK_npipe_create (char **fn, enum GNUNET_DISK_OpenFlags flags, return ret; #else if (*fn == NULL) + { + char dir[] = "/tmp/gnunet-pipe-XXXXXX"; + + if (mkdtemp (dir) == NULL) { - char dir[] = "/tmp/gnunet-pipe-XXXXXX"; - - if (mkdtemp (dir) == NULL) - { - LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "mkdtemp"); - return NULL; - } - GNUNET_asprintf (fn, "%s/child-control", dir); + LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "mkdtemp"); + return NULL; } + GNUNET_asprintf (fn, "%s/child-control", dir); + } if (mkfifo (*fn, translate_unix_perms (perm)) == -1) - { - if ((errno != EEXIST) || (0 != (flags & GNUNET_DISK_OPEN_FAILIFEXISTS))) - return NULL; - } + { + if ((errno != EEXIST) || (0 != (flags & GNUNET_DISK_OPEN_FAILIFEXISTS))) + return NULL; + } flags = flags & (~GNUNET_DISK_OPEN_FAILIFEXISTS); return GNUNET_DISK_file_open (*fn, flags, perm); @@ -2231,7 +2224,7 @@ GNUNET_DISK_npipe_create (char **fn, enum GNUNET_DISK_OpenFlags flags, */ struct GNUNET_DISK_FileHandle * GNUNET_DISK_npipe_open (const char *fn, enum GNUNET_DISK_OpenFlags flags, - enum GNUNET_DISK_AccessPermissions perm) + enum GNUNET_DISK_AccessPermissions perm) { #ifdef MINGW struct GNUNET_DISK_FileHandle *ret; @@ -2247,12 +2240,12 @@ GNUNET_DISK_npipe_open (const char *fn, enum GNUNET_DISK_OpenFlags flags, openMode = GENERIC_WRITE; h = CreateFile (fn, openMode, 0, NULL, OPEN_EXISTING, - FILE_FLAG_OVERLAPPED | FILE_READ_ATTRIBUTES, NULL); + FILE_FLAG_OVERLAPPED | FILE_READ_ATTRIBUTES, NULL); if (h == INVALID_HANDLE_VALUE) - { - SetErrnoFromWinError (GetLastError ()); - return NULL; - } + { + SetErrnoFromWinError (GetLastError ()); + return NULL; + } ret = GNUNET_malloc (sizeof (*ret)); ret->h = h; @@ -2284,10 +2277,10 @@ GNUNET_DISK_npipe_close (struct GNUNET_DISK_FileHandle *pipe) ret = CloseHandle (pipe->h); if (!ret) - { - SetErrnoFromWinError (GetLastError ()); - return GNUNET_SYSERR; - } + { + SetErrnoFromWinError (GetLastError ()); + return GNUNET_SYSERR; + } else return GNUNET_OK; #endif @@ -2303,17 +2296,17 @@ GNUNET_DISK_npipe_close (struct GNUNET_DISK_FileHandle *pipe) */ const struct GNUNET_DISK_FileHandle * GNUNET_DISK_pipe_handle (const struct GNUNET_DISK_PipeHandle *p, - enum GNUNET_DISK_PipeEnd n) + enum GNUNET_DISK_PipeEnd n) { switch (n) - { - case GNUNET_DISK_PIPE_END_READ: - case GNUNET_DISK_PIPE_END_WRITE: - return p->fd[n]; - default: - GNUNET_break (0); - return NULL; - } + { + case GNUNET_DISK_PIPE_END_READ: + case GNUNET_DISK_PIPE_END_WRITE: + return p->fd[n]; + default: + GNUNET_break (0); + return NULL; + } } @@ -2327,7 +2320,7 @@ GNUNET_DISK_pipe_handle (const struct GNUNET_DISK_PipeHandle *p, */ int GNUNET_DISK_internal_file_handle_ (const struct GNUNET_DISK_FileHandle *fh, - void *dst, size_t dst_len) + void *dst, size_t dst_len) { #ifdef MINGW if (dst_len < sizeof (HANDLE)) |