xref: /aosp_15_r20/external/gptfdisk/diskio.cc (revision 57696d54d05c64fd1b1787f8371dbcf104911cfb)
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 Sanikop DiskIO::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 Sanikop DiskIO::~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 Sanikop int 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 Sanikop int 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