michael@0: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "nspr.h" michael@0: michael@0: #include michael@0: #include michael@0: #include michael@0: #ifdef _WIN32 michael@0: #include michael@0: #endif michael@0: michael@0: #define TEST_FILE_NAME "bigfile3.txt" michael@0: #ifdef WINCE michael@0: #define TEST_FILE_NAME_FOR_CREATEFILE L"bigfile3.txt" michael@0: #else michael@0: #define TEST_FILE_NAME_FOR_CREATEFILE TEST_FILE_NAME michael@0: #endif michael@0: michael@0: #define MESSAGE "Hello world!" michael@0: #define MESSAGE_SIZE 13 michael@0: michael@0: int main(int argc, char **argv) michael@0: { michael@0: PRFileDesc *fd; michael@0: PRInt64 offset, position; michael@0: PRInt32 nbytes; michael@0: char buf[MESSAGE_SIZE]; michael@0: #ifdef _WIN32 michael@0: HANDLE hFile; michael@0: LARGE_INTEGER li; michael@0: #endif /* _WIN32 */ michael@0: michael@0: LL_I2L(offset, 1); michael@0: LL_SHL(offset, offset, 32); michael@0: michael@0: #ifdef _WIN32 michael@0: hFile = CreateFile(TEST_FILE_NAME_FOR_CREATEFILE, GENERIC_WRITE, 0, NULL, michael@0: CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); michael@0: if (hFile == INVALID_HANDLE_VALUE) { michael@0: fprintf(stderr, "CreateFile failed\n"); michael@0: exit(1); michael@0: } michael@0: li.QuadPart = offset; michael@0: li.LowPart = SetFilePointer(hFile, li.LowPart, &li.HighPart, FILE_BEGIN); michael@0: if (li.LowPart == 0xFFFFFFFF && GetLastError() != NO_ERROR) { michael@0: fprintf(stderr, "SetFilePointer failed\n"); michael@0: exit(1); michael@0: } michael@0: PR_ASSERT(li.QuadPart == offset); michael@0: strcpy(buf, MESSAGE); michael@0: if (WriteFile(hFile, buf, sizeof(buf), &nbytes, NULL) == 0) { michael@0: fprintf(stderr, "WriteFile failed\n"); michael@0: exit(1); michael@0: } michael@0: PR_ASSERT(nbytes == sizeof(buf)); michael@0: if (CloseHandle(hFile) == 0) { michael@0: fprintf(stderr, "CloseHandle failed\n"); michael@0: exit(1); michael@0: } michael@0: #endif /* _WIN32 */ michael@0: michael@0: memset(buf, 0, sizeof(buf)); michael@0: michael@0: fd = PR_Open(TEST_FILE_NAME, PR_RDONLY, 0666); michael@0: if (fd == NULL) { michael@0: fprintf(stderr, "PR_Open failed\n"); michael@0: exit(1); michael@0: } michael@0: position = PR_Seek64(fd, offset, PR_SEEK_SET); michael@0: if (!LL_GE_ZERO(position)) { michael@0: fprintf(stderr, "PR_Seek64 failed\n"); michael@0: exit(1); michael@0: } michael@0: PR_ASSERT(LL_EQ(position, offset)); michael@0: nbytes = PR_Read(fd, buf, sizeof(buf)); michael@0: if (nbytes != sizeof(buf)) { michael@0: fprintf(stderr, "PR_Read failed\n"); michael@0: exit(1); michael@0: } michael@0: if (strcmp(buf, MESSAGE)) { michael@0: fprintf(stderr, "corrupt data:$%s$\n", buf); michael@0: exit(1); michael@0: } michael@0: if (PR_Close(fd) == PR_FAILURE) { michael@0: fprintf(stderr, "PR_Close failed\n"); michael@0: exit(1); michael@0: } michael@0: michael@0: if (PR_Delete(TEST_FILE_NAME) == PR_FAILURE) { michael@0: fprintf(stderr, "PR_Delete failed\n"); michael@0: exit(1); michael@0: } michael@0: michael@0: printf("PASS\n"); michael@0: return 0; michael@0: }