1*57696d54SAkhilesh Sanikop // 2*57696d54SAkhilesh Sanikop // C++ Interface: diskio (platform-independent components) 3*57696d54SAkhilesh Sanikop // 4*57696d54SAkhilesh Sanikop // Description: Class to handle low-level disk I/O for GPT fdisk 5*57696d54SAkhilesh Sanikop // 6*57696d54SAkhilesh Sanikop // 7*57696d54SAkhilesh Sanikop // Author: Rod Smith <[email protected]>, (C) 2009 8*57696d54SAkhilesh Sanikop // 9*57696d54SAkhilesh Sanikop // Copyright: See COPYING file that comes with this distribution 10*57696d54SAkhilesh Sanikop // 11*57696d54SAkhilesh Sanikop // 12*57696d54SAkhilesh Sanikop // This program is copyright (c) 2009 by Roderick W. Smith. It is distributed 13*57696d54SAkhilesh Sanikop // under the terms of the GNU GPL version 2, as detailed in the COPYING file. 14*57696d54SAkhilesh Sanikop 15*57696d54SAkhilesh Sanikop #define __STDC_LIMIT_MACROS 16*57696d54SAkhilesh Sanikop #define __STDC_CONSTANT_MACROS 17*57696d54SAkhilesh Sanikop 18*57696d54SAkhilesh Sanikop #ifdef _WIN32 19*57696d54SAkhilesh Sanikop #include <windows.h> 20*57696d54SAkhilesh Sanikop #include <winioctl.h> 21*57696d54SAkhilesh Sanikop #define fstat64 fstat 22*57696d54SAkhilesh Sanikop #define stat64 stat 23*57696d54SAkhilesh Sanikop #define S_IRGRP 0 24*57696d54SAkhilesh Sanikop #define S_IROTH 0 25*57696d54SAkhilesh Sanikop #else 26*57696d54SAkhilesh Sanikop #include <sys/ioctl.h> 27*57696d54SAkhilesh Sanikop #endif 28*57696d54SAkhilesh Sanikop #include <string> 29*57696d54SAkhilesh Sanikop #include <stdint.h> 30*57696d54SAkhilesh Sanikop #include <errno.h> 31*57696d54SAkhilesh Sanikop #include <fcntl.h> 32*57696d54SAkhilesh Sanikop #include <sys/stat.h> 33*57696d54SAkhilesh Sanikop #include <iostream> 34*57696d54SAkhilesh Sanikop 35*57696d54SAkhilesh Sanikop #include "support.h" 36*57696d54SAkhilesh Sanikop #include "diskio.h" 37*57696d54SAkhilesh Sanikop //#include "gpt.h" 38*57696d54SAkhilesh Sanikop 39*57696d54SAkhilesh Sanikop using namespace std; 40*57696d54SAkhilesh Sanikop DiskIO(void)41*57696d54SAkhilesh SanikopDiskIO::DiskIO(void) { 42*57696d54SAkhilesh Sanikop userFilename = ""; 43*57696d54SAkhilesh Sanikop realFilename = ""; 44*57696d54SAkhilesh Sanikop modelName = ""; 45*57696d54SAkhilesh Sanikop isOpen = 0; 46*57696d54SAkhilesh Sanikop openForWrite = 0; 47*57696d54SAkhilesh Sanikop } // constructor 48*57696d54SAkhilesh Sanikop ~DiskIO(void)49*57696d54SAkhilesh SanikopDiskIO::~DiskIO(void) { 50*57696d54SAkhilesh Sanikop Close(); 51*57696d54SAkhilesh Sanikop } // destructor 52*57696d54SAkhilesh Sanikop 53*57696d54SAkhilesh Sanikop // Open a disk device for reading. Returns 1 on success, 0 on failure. OpenForRead(const string & filename)54*57696d54SAkhilesh Sanikopint DiskIO::OpenForRead(const string & filename) { 55*57696d54SAkhilesh Sanikop int shouldOpen = 1; 56*57696d54SAkhilesh Sanikop 57*57696d54SAkhilesh Sanikop if (isOpen) { // file is already open 58*57696d54SAkhilesh Sanikop if (((realFilename != filename) && (userFilename != filename)) || (openForWrite)) { 59*57696d54SAkhilesh Sanikop Close(); 60*57696d54SAkhilesh Sanikop } else { 61*57696d54SAkhilesh Sanikop shouldOpen = 0; 62*57696d54SAkhilesh Sanikop } // if/else 63*57696d54SAkhilesh Sanikop } // if 64*57696d54SAkhilesh Sanikop 65*57696d54SAkhilesh Sanikop if (shouldOpen) { 66*57696d54SAkhilesh Sanikop userFilename = filename; 67*57696d54SAkhilesh Sanikop MakeRealName(); 68*57696d54SAkhilesh Sanikop OpenForRead(); 69*57696d54SAkhilesh Sanikop } // if 70*57696d54SAkhilesh Sanikop 71*57696d54SAkhilesh Sanikop return isOpen; 72*57696d54SAkhilesh Sanikop } // DiskIO::OpenForRead(string filename) 73*57696d54SAkhilesh Sanikop 74*57696d54SAkhilesh Sanikop // Open a disk for reading and writing by filename. 75*57696d54SAkhilesh Sanikop // Returns 1 on success, 0 on failure. OpenForWrite(const string & filename)76*57696d54SAkhilesh Sanikopint DiskIO::OpenForWrite(const string & filename) { 77*57696d54SAkhilesh Sanikop int retval = 0; 78*57696d54SAkhilesh Sanikop 79*57696d54SAkhilesh Sanikop if ((isOpen) && (openForWrite) && ((filename == realFilename) || (filename == userFilename))) { 80*57696d54SAkhilesh Sanikop retval = 1; 81*57696d54SAkhilesh Sanikop } else { 82*57696d54SAkhilesh Sanikop userFilename = filename; 83*57696d54SAkhilesh Sanikop MakeRealName(); 84*57696d54SAkhilesh Sanikop retval = OpenForWrite(); 85*57696d54SAkhilesh Sanikop if (retval == 0) { 86*57696d54SAkhilesh Sanikop realFilename = userFilename = ""; 87*57696d54SAkhilesh Sanikop } // if 88*57696d54SAkhilesh Sanikop } // if/else 89*57696d54SAkhilesh Sanikop return retval; 90*57696d54SAkhilesh Sanikop } // DiskIO::OpenForWrite(string filename) 91