Home | History | Annotate | Download | only in disktest
      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