/* * Disktest * Copyright (c) International Business Machines Corp., 2001 * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Please send e-mail to yardleyb@us.ibm.com if you have * questions or comments. * * Project Website: TBD * * $Id: io.c,v 1.6 2008/02/14 08:22:23 subrata_modak Exp $ * */ #ifdef WINDOWS #include <windows.h> #include <winioctl.h> #include <io.h> #else #include <sys/types.h> #include <unistd.h> #include <pthread.h> #include <fcntl.h> #endif #include "defs.h" #include "main.h" #include "io.h" long Write(fd_t fd, const void *buf, const unsigned long trsiz) { long tcnt; #ifdef WINDOWS WriteFile(fd, buf, trsiz, &tcnt, NULL); #else tcnt = write(fd, buf, trsiz); #endif return (tcnt); } long Read(fd_t fd, void *buf, const unsigned long trsiz) { long tcnt; #ifdef WINDOWS ReadFile(fd, buf, trsiz, &tcnt, NULL); #else tcnt = read(fd, buf, trsiz); #endif return (tcnt); } #ifdef WINDOWS /* * wrapper for file seeking in WINDOWS API to hind the ugle 32 bit * interface of SetFile Pointer */ OFF_T FileSeek64(HANDLE hf, OFF_T distance, DWORD MoveMethod) { LARGE_INTEGER li; li.QuadPart = distance; li.LowPart = SetFilePointer(hf, li.LowPart, &li.HighPart, MoveMethod); if (li.LowPart == 0xFFFFFFFF && GetLastError() != NO_ERROR) { li.QuadPart = -1; } return li.QuadPart; } #endif OFF_T SeekEnd(fd_t fd) { OFF_T return_lba; #ifdef WINDOWS return_lba = (OFF_T) FileSeek64(fd, 0, FILE_END); #else return_lba = (OFF_T) lseek64(fd, 0, SEEK_END); #endif return (return_lba); } OFF_T Seek(fd_t fd, OFF_T lba) { OFF_T return_lba; #ifdef WINDOWS return_lba = (OFF_T) FileSeek64(fd, lba, FILE_BEGIN); #else return_lba = (OFF_T) lseek64(fd, lba, SEEK_SET); #endif return (return_lba); } fd_t Open(const char *filespec, const OFF_T flags) { fd_t fd; #ifdef WINDOWS unsigned long OPEN_FLAGS = 0, OPEN_DISPO = 0, OPEN_READ_WRITE = 0, OPEN_SHARE = 0; if ((flags & CLD_FLG_R) && !(flags & CLD_FLG_W)) { OPEN_READ_WRITE |= GENERIC_READ; OPEN_SHARE |= FILE_SHARE_READ; } else if (!(flags & CLD_FLG_R) && (flags & CLD_FLG_W)) { OPEN_READ_WRITE |= GENERIC_WRITE; OPEN_SHARE |= FILE_SHARE_WRITE; } else { OPEN_READ_WRITE |= (GENERIC_READ | GENERIC_WRITE); OPEN_SHARE |= (FILE_SHARE_READ | FILE_SHARE_WRITE); } #ifdef CLD_FLG_DIRECT if (flags & CLD_FLG_DIRECT) OPEN_FLAGS = FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH; #endif OPEN_DISPO = OPEN_EXISTING; #ifdef CLD_FLG_RANDOM if (flags & CLD_FLG_RANDOM) OPEN_FLAGS |= FILE_FLAG_RANDOM_ACCESS; #endif #ifdef CLD_FLG_LINEAR if (flags & CLD_FLG_LINEAR) OPEN_FLAGS |= FILE_FLAG_SEQUENTIAL_SCAN; #endif #ifdef CLD_FLG_FILE if (flags & CLD_FLG_FILE) { OPEN_FLAGS |= FILE_ATTRIBUTE_ARCHIVE; if (flags & CLD_FLG_W) OPEN_DISPO = OPEN_ALWAYS; } #endif fd = CreateFile(filespec, OPEN_READ_WRITE, OPEN_SHARE, NULL, OPEN_DISPO, OPEN_FLAGS, NULL); #else int OPEN_MASK = O_LARGEFILE; if ((flags & CLD_FLG_R) && !(flags & CLD_FLG_W)) OPEN_MASK |= O_RDONLY; else if (!(flags & CLD_FLG_R) && (flags & CLD_FLG_W)) OPEN_MASK |= O_WRONLY; else OPEN_MASK |= O_RDWR; #ifdef CLD_FLG_FILE if (flags & CLD_FLG_FILE) OPEN_MASK |= O_CREAT; #endif #ifdef CLD_FLG_DIRECT if (flags & CLD_FLG_DIRECT) OPEN_MASK |= O_DIRECT; #endif fd = open(filespec, OPEN_MASK, 00600); #endif return (fd); } int Sync(fd_t fd) { #ifdef WINDOWS if (FlushFileBuffers(fd) != TRUE) { return -1; } return 0; #else return fsync(fd); #endif }