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