Skip to content

Commit c201c0a

Browse files
authored
Merge pull request #147 from wongma7/filehandlebeta3standalone
Close Open disk file handles
2 parents 1bc6add + e9c0cbe commit c201c0a

File tree

1 file changed

+25
-62
lines changed

1 file changed

+25
-62
lines changed

internal/os/disk/api.go

Lines changed: 25 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -194,52 +194,6 @@ func (DiskAPI) GetDiskNumber(disk syscall.Handle) (uint32, error) {
194194
return devNum.DeviceNumber, err
195195
}
196196

197-
func (DiskAPI) DiskHasPage83ID(disk syscall.Handle, matchID string) (bool, error) {
198-
query := StoragePropertyQuery{}
199-
200-
bufferSize := uint32(4 * 1024)
201-
buffer := make([]byte, 4*1024)
202-
var size uint32
203-
var n uint32
204-
var m uint16
205-
206-
query.QueryType = PropertyStandardQuery
207-
query.PropertyID = StorageDeviceIDProperty
208-
209-
querySize := uint32(unsafe.Sizeof(query.PropertyID)) + uint32(unsafe.Sizeof(query.QueryType)) + uint32(unsafe.Sizeof(query.Byte))
210-
querySize = uint32(unsafe.Sizeof(query))
211-
err := syscall.DeviceIoControl(disk, IOCTL_STORAGE_QUERY_PROPERTY, (*byte)(unsafe.Pointer(&query)), querySize, (*byte)(unsafe.Pointer(&buffer[0])), bufferSize, &size, nil)
212-
if err != nil {
213-
return false, fmt.Errorf("IOCTL_STORAGE_QUERY_PROPERTY failed: %v", err)
214-
}
215-
216-
devIDDesc := (*StorageDeviceIDDescriptor)(unsafe.Pointer(&buffer[0]))
217-
218-
pID := (*StorageIdentifier)(unsafe.Pointer(&devIDDesc.Identifiers[0]))
219-
220-
page83ID := []byte{}
221-
byteSize := unsafe.Sizeof(byte(0))
222-
for n = 0; n < devIDDesc.NumberOfIdentifiers; n++ {
223-
if pID.Association == StorageIDAssocDevice && (pID.CodeSet == StorageIDCodeSetBinary || pID.CodeSet == StorageIDCodeSetASCII) {
224-
for m = 0; m < pID.IdentifierSize; m++ {
225-
page83ID = append(page83ID, *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&pID.Identifier[0])) + byteSize*uintptr(m))))
226-
}
227-
228-
var page83IDString string
229-
if pID.CodeSet == StorageIDCodeSetASCII {
230-
page83IDString = string(page83ID)
231-
} else if pID.CodeSet == StorageIDCodeSetBinary {
232-
page83IDString = hex.EncodeToString(page83ID)
233-
}
234-
if strings.Contains(page83IDString, matchID) {
235-
return true, nil
236-
}
237-
}
238-
pID = (*StorageIdentifier)(unsafe.Pointer(uintptr(unsafe.Pointer(pID)) + byteSize*uintptr(pID.NextOffset)))
239-
}
240-
return false, nil
241-
}
242-
243197
func (DiskAPI) GetDiskPage83ID(disk syscall.Handle) (string, error) {
244198
query := StoragePropertyQuery{}
245199

@@ -266,7 +220,7 @@ func (DiskAPI) GetDiskPage83ID(disk syscall.Handle) (string, error) {
266220
page83ID := []byte{}
267221
byteSize := unsafe.Sizeof(byte(0))
268222
for n = 0; n < devIDDesc.NumberOfIdentifiers; n++ {
269-
if pID.Association == StorageIDAssocDevice {
223+
if pID.Association == StorageIDAssocDevice && (pID.CodeSet == StorageIDCodeSetBinary || pID.CodeSet == StorageIDCodeSetASCII) {
270224
for m = 0; m < pID.IdentifierSize; m++ {
271225
page83ID = append(page83ID, *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&pID.Identifier[0])) + byteSize*uintptr(m))))
272226
}
@@ -294,20 +248,39 @@ func (imp DiskAPI) GetDiskNumberWithID(page83ID string) (uint32, error) {
294248
json.Unmarshal([]byte(outString), &disks)
295249

296250
for i := range disks {
297-
h, err := syscall.Open(disks[i].Path, syscall.O_RDONLY, 0)
251+
diskNumber, diskPage83ID, err := imp.GetDiskNumberAndPage83ID(disks[i].Path)
298252
if err != nil {
299253
return 0, err
300254
}
301255

302-
found, err := imp.DiskHasPage83ID(h, page83ID)
303-
if found {
304-
return imp.GetDiskNumber(h)
256+
if diskPage83ID == page83ID {
257+
return diskNumber, nil
305258
}
306259
}
307260

308261
return 0, fmt.Errorf("Could not find disk with Page83 ID %s", page83ID)
309262
}
310263

264+
func (imp DiskAPI) GetDiskNumberAndPage83ID(path string) (uint32, string, error) {
265+
h, err := syscall.Open(path, syscall.O_RDONLY, 0)
266+
defer syscall.Close(h)
267+
if err != nil {
268+
return 0, "", err
269+
}
270+
271+
diskNumber, err := imp.GetDiskNumber(h)
272+
if err != nil {
273+
return 0, "", err
274+
}
275+
276+
page83ID, err := imp.GetDiskPage83ID(h)
277+
if err != nil {
278+
return 0, "", err
279+
}
280+
281+
return diskNumber, page83ID, nil
282+
}
283+
311284
// ListDiskIDs - constructs a map with the disk number as the key and the DiskID structure
312285
// as the value. The DiskID struct has a field for the page83 ID.
313286
func (imp DiskAPI) ListDiskIDs() (map[uint32]shared.DiskIDs, error) {
@@ -334,21 +307,11 @@ func (imp DiskAPI) ListDiskIDs() (map[uint32]shared.DiskIDs, error) {
334307
m := make(map[uint32]shared.DiskIDs)
335308

336309
for i := range disks {
337-
h, err := syscall.Open(disks[i].Path, syscall.O_RDONLY, 0)
310+
diskNumber, page83, err := imp.GetDiskNumberAndPage83ID(disks[i].Path)
338311
if err != nil {
339312
return nil, err
340313
}
341314

342-
page83, err := imp.GetDiskPage83ID(h)
343-
if err != nil {
344-
return m, fmt.Errorf("Could not get page83 ID: %v", err)
345-
}
346-
347-
diskNumber, err := imp.GetDiskNumber(h)
348-
if err != nil {
349-
return m, fmt.Errorf("Could not get disk number: %v", err)
350-
}
351-
352315
m[diskNumber] = shared.DiskIDs{
353316
Page83: page83,
354317
SerialNumber: disks[i].SerialNumber,

0 commit comments

Comments
 (0)