1 /* 2 * Disktest 3 * Copyright (c) International Business Machines Corp., 2001 4 * 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 19 * 20 * Please send e-mail to yardleyb (at) us.ibm.com if you have 21 * questions or comments. 22 * 23 * Project Website: TBD 24 * 25 * $Id: io.c,v 1.6 2008/02/14 08:22:23 subrata_modak Exp $ 26 * 27 */ 28 29 #ifdef WINDOWS 30 #include <windows.h> 31 #include <winioctl.h> 32 #include <io.h> 33 #else 34 #include <sys/types.h> 35 #include <unistd.h> 36 #include <pthread.h> 37 #include <fcntl.h> 38 #endif 39 40 #include "defs.h" 41 #include "main.h" 42 #include "io.h" 43 44 long Write(fd_t fd, const void *buf, const unsigned long trsiz) 45 { 46 long tcnt; 47 #ifdef WINDOWS 48 WriteFile(fd, buf, trsiz, &tcnt, NULL); 49 #else 50 tcnt = write(fd, buf, trsiz); 51 #endif 52 return (tcnt); 53 } 54 55 long Read(fd_t fd, void *buf, const unsigned long trsiz) 56 { 57 long tcnt; 58 #ifdef WINDOWS 59 ReadFile(fd, buf, trsiz, &tcnt, NULL); 60 #else 61 tcnt = read(fd, buf, trsiz); 62 #endif 63 return (tcnt); 64 } 65 66 #ifdef WINDOWS 67 /* 68 * wrapper for file seeking in WINDOWS API to hind the ugle 32 bit 69 * interface of SetFile Pointer 70 */ 71 OFF_T FileSeek64(HANDLE hf, OFF_T distance, DWORD MoveMethod) 72 { 73 LARGE_INTEGER li; 74 75 li.QuadPart = distance; 76 77 li.LowPart = SetFilePointer(hf, li.LowPart, &li.HighPart, MoveMethod); 78 79 if (li.LowPart == 0xFFFFFFFF && GetLastError() != NO_ERROR) { 80 li.QuadPart = -1; 81 } 82 83 return li.QuadPart; 84 } 85 #endif 86 87 OFF_T SeekEnd(fd_t fd) 88 { 89 OFF_T return_lba; 90 91 #ifdef WINDOWS 92 return_lba = (OFF_T) FileSeek64(fd, 0, FILE_END); 93 #else 94 return_lba = (OFF_T) lseek64(fd, 0, SEEK_END); 95 #endif 96 return (return_lba); 97 } 98 99 OFF_T Seek(fd_t fd, OFF_T lba) 100 { 101 OFF_T return_lba; 102 103 #ifdef WINDOWS 104 return_lba = (OFF_T) FileSeek64(fd, lba, FILE_BEGIN); 105 #else 106 return_lba = (OFF_T) lseek64(fd, lba, SEEK_SET); 107 #endif 108 return (return_lba); 109 } 110 111 fd_t Open(const char *filespec, const OFF_T flags) 112 { 113 fd_t fd; 114 #ifdef WINDOWS 115 unsigned long OPEN_FLAGS = 0, OPEN_DISPO = 0, OPEN_READ_WRITE = 116 0, OPEN_SHARE = 0; 117 118 if ((flags & CLD_FLG_R) && !(flags & CLD_FLG_W)) { 119 OPEN_READ_WRITE |= GENERIC_READ; 120 OPEN_SHARE |= FILE_SHARE_READ; 121 } else if (!(flags & CLD_FLG_R) && (flags & CLD_FLG_W)) { 122 OPEN_READ_WRITE |= GENERIC_WRITE; 123 OPEN_SHARE |= FILE_SHARE_WRITE; 124 } else { 125 OPEN_READ_WRITE |= (GENERIC_READ | GENERIC_WRITE); 126 OPEN_SHARE |= (FILE_SHARE_READ | FILE_SHARE_WRITE); 127 } 128 129 #ifdef CLD_FLG_DIRECT 130 if (flags & CLD_FLG_DIRECT) 131 OPEN_FLAGS = FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH; 132 #endif 133 OPEN_DISPO = OPEN_EXISTING; 134 135 #ifdef CLD_FLG_RANDOM 136 if (flags & CLD_FLG_RANDOM) 137 OPEN_FLAGS |= FILE_FLAG_RANDOM_ACCESS; 138 #endif 139 #ifdef CLD_FLG_LINEAR 140 if (flags & CLD_FLG_LINEAR) 141 OPEN_FLAGS |= FILE_FLAG_SEQUENTIAL_SCAN; 142 #endif 143 #ifdef CLD_FLG_FILE 144 if (flags & CLD_FLG_FILE) { 145 OPEN_FLAGS |= FILE_ATTRIBUTE_ARCHIVE; 146 if (flags & CLD_FLG_W) 147 OPEN_DISPO = OPEN_ALWAYS; 148 } 149 #endif 150 fd = CreateFile(filespec, 151 OPEN_READ_WRITE, 152 OPEN_SHARE, NULL, OPEN_DISPO, OPEN_FLAGS, NULL); 153 #else 154 int OPEN_MASK = O_LARGEFILE; 155 if ((flags & CLD_FLG_R) && !(flags & CLD_FLG_W)) 156 OPEN_MASK |= O_RDONLY; 157 else if (!(flags & CLD_FLG_R) && (flags & CLD_FLG_W)) 158 OPEN_MASK |= O_WRONLY; 159 else 160 OPEN_MASK |= O_RDWR; 161 #ifdef CLD_FLG_FILE 162 if (flags & CLD_FLG_FILE) 163 OPEN_MASK |= O_CREAT; 164 #endif 165 #ifdef CLD_FLG_DIRECT 166 if (flags & CLD_FLG_DIRECT) 167 OPEN_MASK |= O_DIRECT; 168 #endif 169 fd = open(filespec, OPEN_MASK, 00600); 170 #endif 171 return (fd); 172 } 173 174 int Sync(fd_t fd) 175 { 176 #ifdef WINDOWS 177 if (FlushFileBuffers(fd) != TRUE) { 178 return -1; 179 } 180 return 0; 181 #else 182 return fsync(fd); 183 #endif 184 } 185