manageiq-smartstate 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +34 -35
  3. data/.rubocop.yml +3 -3
  4. data/.rubocop_cc.yml +3 -4
  5. data/.rubocop_local.yml +1 -1
  6. data/.travis.yml +0 -1
  7. data/lib/disk/modules/MSCommon.rb +3 -1
  8. data/lib/disk/modules/VhdxDisk.rb +3 -1
  9. data/lib/fs/MiqMountManager.rb +2 -29
  10. data/lib/fs/VimDatastoreFS/VimDatastoreFS.rb +1 -6
  11. data/lib/fs/fat32/directory_entry.rb +60 -60
  12. data/lib/fs/iso9660/boot_sector.rb +3 -2
  13. data/lib/fs/iso9660/directory_entry.rb +3 -2
  14. data/lib/fs/iso9660/rock_ridge.rb +3 -1
  15. data/lib/fs/ntfs/attrib_attribute_list.rb +3 -1
  16. data/lib/fs/ntfs/attrib_file_name.rb +3 -1
  17. data/lib/fs/ntfs/attrib_header.rb +3 -1
  18. data/lib/fs/ntfs/attrib_index_root.rb +3 -1
  19. data/lib/fs/ntfs/attrib_volume_name.rb +3 -1
  20. data/lib/manageiq/smartstate/util.rb +18 -0
  21. data/lib/manageiq/smartstate/version.rb +1 -1
  22. data/lib/metadata/VmConfig/GetNativeCfg.rb +2 -4
  23. data/lib/metadata/VmConfig/VmConfig.rb +3 -1
  24. data/lib/metadata/VmConfig/cfgConfig.rb +4 -0
  25. data/lib/metadata/VmConfig/xmlConfig.rb +3 -3
  26. data/lib/metadata/linux/MiqRpmPackages.rb +3 -1
  27. data/lib/metadata/util/win32/Win32Accounts.rb +3 -0
  28. data/lib/metadata/util/win32/Win32EventLog.rb +3 -1
  29. data/lib/metadata/util/win32/Win32Software.rb +5 -3
  30. data/lib/metadata/util/win32/decode.rb +0 -0
  31. data/lib/metadata/util/win32/fleece_hives.rb +0 -8
  32. data/lib/metadata/util/win32/ms-registry.rb +3 -1
  33. data/lib/metadata/util/win32/peheader.rb +3 -2
  34. data/lib/miq_unicode.rb +45 -0
  35. data/manageiq-smartstate.gemspec +5 -5
  36. metadata +39 -24
  37. data/lib/fs/MetakitFS/MetakitFS.rb +0 -530
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73464e1eb16a92655a6a6038ccc47172d642c89d77803f887dc6b049c4ce6121
4
- data.tar.gz: f0f7e19851c0602b23b187fb89b81bdd3e8b1a0223584875725235d6ef93ab7f
3
+ metadata.gz: 2eed9833b4418d9405995117c01ae36ec8d9dbd8f59c2a71a3b1695fd1845eca
4
+ data.tar.gz: 014abce3c3c7a22594ffe9877046b1a390b0941e58e4052b3eb29525c80bd6fb
5
5
  SHA512:
6
- metadata.gz: 32310373dbd4f1ae177a330572472ad6c76fb1cf9578b3bbdba2f5eeddf3a97e6482f56b2624f3f5d215ac017f60f397841b1096bb69960acdb5f043de64bcbe
7
- data.tar.gz: ee53ecb1e307bf90218f005fa189869fa9dcd01fe80e9bf1900da7920004368f2558251a17533444d551067bbfd0296dfd96ec8231a360d51906a14d2f9a06f2
6
+ metadata.gz: 417c6b7efe6f1ebdf11f037beb537f9fd48f1654e5985699a6b6c2d29342ea7fd22b59df97b48ae4ba09e1d6c75624c198add8d988b6387d071084ae48b0aafb
7
+ data.tar.gz: 35335b08093b49f9fb4e57aeba97b2c89d6c01ead9de3cb854086f84b0a70b59f90a178f1aaa44230dd1feea24c70acefa0546f43e2b65a279b8bcd59b0d1146
@@ -1,17 +1,23 @@
1
- ---
2
- exclude_paths:
3
- - ".git/"
4
- - "**.xml"
5
- - "**.yaml"
6
- - "**.yml"
7
- - lib/metadata/linux/test/Packages
8
- - lib/metadata/linux/test/tc_LinuxUtils.rb
9
- - locale/
10
- - spec/
11
- - test/
12
- - tools/
13
- - tmp/
14
- engines:
1
+ checks:
2
+ method-complexity:
3
+ enabled: true
4
+ config:
5
+ threshold: 8
6
+ prepare:
7
+ fetch:
8
+ - url: https://raw.githubusercontent.com/ManageIQ/manageiq-style/master/.rubocop_base.yml
9
+ path: ".rubocop_base.yml"
10
+ - url: https://raw.githubusercontent.com/ManageIQ/manageiq-style/master/.rubocop_cc_base.yml
11
+ path: ".rubocop_cc_base.yml"
12
+ - url: https://raw.githubusercontent.com/ManageIQ/manageiq-style/master/styles/base.yml
13
+ path: styles/base.yml
14
+ - url: https://raw.githubusercontent.com/ManageIQ/manageiq-style/master/styles/cc_base.yml
15
+ path: styles/cc_base.yml
16
+ plugins:
17
+ rubocop:
18
+ enabled: true
19
+ config: ".rubocop_cc.yml"
20
+ channel: rubocop-0-82
15
21
  brakeman:
16
22
  enabled: false
17
23
  bundler-audit:
@@ -25,7 +31,7 @@ engines:
25
31
  ruby:
26
32
  mass_threshold: 25
27
33
  count_threshold: 5
28
- javascript:
34
+ javascript:
29
35
  eslint:
30
36
  enabled: false
31
37
  channel: eslint-3
@@ -33,23 +39,16 @@ engines:
33
39
  enabled: false
34
40
  markdownlint:
35
41
  enabled: false
36
- rubocop:
37
- enabled: true
38
- config: ".rubocop_cc.yml"
39
- channel: rubocop-0-69
40
- checks:
41
- method-complexity:
42
- enabled: true
43
- config:
44
- threshold: 8
45
- prepare:
46
- fetch:
47
- - url: https://raw.githubusercontent.com/ManageIQ/guides/master/.rubocop_base.yml
48
- path: ".rubocop_base.yml"
49
- - url: https://raw.githubusercontent.com/ManageIQ/guides/master/.rubocop_cc_base.yml
50
- path: ".rubocop_cc_base.yml"
51
- ratings:
52
- paths:
53
- - Gemfile.lock
54
- - "**.rake"
55
- - "**.rb"
42
+ exclude_patterns:
43
+ - ".git/"
44
+ - "**.xml"
45
+ - "**.yaml"
46
+ - "**.yml"
47
+ - lib/metadata/linux/test/Packages
48
+ - lib/metadata/linux/test/tc_LinuxUtils.rb
49
+ - locale/
50
+ - spec/
51
+ - test/
52
+ - tools/
53
+ - tmp/
54
+ version: '2'
@@ -1,4 +1,4 @@
1
1
  inherit_from:
2
- - https://raw.githubusercontent.com/ManageIQ/guides/master/.rubocop_base.yml
3
- # put all local rubocop config into .rubocop_local.yml as it will be loaded by .rubocop_cc.yml as well
4
- - .rubocop_local.yml
2
+ - ".rubocop_local.yml"
3
+ inherit_gem:
4
+ manageiq-style: ".rubocop_base.yml"
@@ -1,5 +1,4 @@
1
1
  inherit_from:
2
- # this is downloaded by .codeclimate.yml
3
- - .rubocop_base.yml
4
- - .rubocop_cc_base.yml
5
- - .rubocop_local.yml
2
+ - ".rubocop_base.yml"
3
+ - ".rubocop_cc_base.yml"
4
+ - ".rubocop_local.yml"
@@ -1,7 +1,7 @@
1
1
  #
2
2
  # Overrides
3
3
  #
4
- GlobalVars:
4
+ Style/GlobalVars:
5
5
  AllowedVariables:
6
6
  # Loggers
7
7
  - $log
@@ -1,5 +1,4 @@
1
1
  ---
2
- sudo: false
3
2
  cache: bundler
4
3
  language: ruby
5
4
  rvm:
@@ -1,10 +1,12 @@
1
1
  require 'disk/modules/MiqLargeFile'
2
- require 'util/miq-unicode'
2
+ require 'miq_unicode'
3
3
  require 'binary_struct'
4
4
  require 'memory_buffer'
5
5
  require 'Scvmm/miq_hyperv_disk'
6
6
 
7
7
  module MSCommon
8
+ using ManageIQ::UnicodeString
9
+
8
10
  # NOTE: All values are stored in network byte order.
9
11
 
10
12
  FOOTER = BinaryStruct.new([
@@ -1,6 +1,6 @@
1
1
  # encoding: US-ASCII
2
2
 
3
- require 'util/miq-unicode'
3
+ require 'miq_unicode'
4
4
  require 'binary_struct'
5
5
  require 'disk/MiqDisk'
6
6
  require 'memory_buffer'
@@ -8,6 +8,8 @@ require 'disk/modules/MiqLargeFile'
8
8
  require 'disk/modules/vhdx_bat_entry'
9
9
 
10
10
  module VhdxDisk
11
+ using ManageIQ::UnicodeString
12
+
11
13
  # NOTE: All values are stored in network byte order.
12
14
 
13
15
  VHDX_FILE_IDENTIFIER = BinaryStruct.new([
@@ -8,6 +8,7 @@ class MiqMountManager < MiqFS
8
8
  def self.mountVolumes(volMgr, vmCfg, ost = nil)
9
9
  rootTrees = []
10
10
  noFsVolumes = []
11
+
11
12
  volMgr.visibleVolumes.each do |dobj|
12
13
  $log.debug("MiqMountManager.mountVolumes >> fileName=#{dobj.dInfo.fileName}, partition=#{dobj.partNum}") if $log
13
14
  fs = MiqFS.getFS(dobj)
@@ -20,10 +21,7 @@ class MiqMountManager < MiqFS
20
21
  rootTrees << new(rsm, dobj, volMgr, vmCfg, ost)
21
22
  end
22
23
  end
23
- if volMgr.kind_of?(MiqNativeVolumeManager)
24
- require 'MetakitFS'
25
- rootTrees.each { |rt| rt.findPayload(noFsVolumes) } unless noFsVolumes.empty?
26
- end
24
+
27
25
  rootTrees
28
26
  end # def self.mountVolumes
29
27
 
@@ -41,31 +39,6 @@ class MiqMountManager < MiqFS
41
39
  super(rootModule, rootVolume)
42
40
  end # def initialize
43
41
 
44
- def findPayload(noFsVolumes)
45
- $log.debug "MiqMountManager.findPayload: searching for payloads:" if $log
46
- noFsVolumes.each do |v|
47
- next unless v.respond_to?(:devFile)
48
- if v.devFile
49
- $log.debug "\tMiqMountManager.findPayload: devFile = #{v.devFile}" if $log
50
- v.mkfile = v.devFile
51
- unless MetakitFS.supported?(v)
52
- $log.debug "\tMiqMountManager.findPayload: devFile = #{v.devFile} not mkfs, skipping" if $log
53
- v.mkfile = nil
54
- next
55
- end
56
- mkFs = MiqFS.new(MetakitFS, v)
57
- if mkFs.fsId == "MIQPAYLOAD"
58
- $log.debug "\tMiqMountManager.findPayload: payload found devFile = #{v.devFile}" if $log
59
- @payloads << mkFs
60
- else
61
- $log.debug "\tMiqMountManager.findPayload: devFile = #{v.devFile} not payload, fsId = #{mkFs.fsId}" if $log
62
- end
63
- else
64
- $log.debug "\tMiqMountManager.findPayload: devFile not set, fileName = #{v.dInfo.fileName}" if $log
65
- end
66
- end
67
- end
68
-
69
42
  #
70
43
  # Override standard MiqFS methods to account for mount indirection.
71
44
  # The getFsPath method is defined by the OS-specific mount modules.
@@ -105,12 +105,7 @@ module VimDatastoreFS
105
105
  #
106
106
  # fpos = 0
107
107
  # fsize = @pSize.get(fileRow)
108
- # if ftruncate && fsize != 0
109
- # @pSize.set fileRow, 0
110
- # @pData.set fileRow, Metakit::Bytes.new("", 0)
111
- # elsif fappend
112
- # fpos = fsize
113
- # end
108
+ # fpos = fsize if fappend
114
109
  #
115
110
  # return(MkFile.new(p, fileRow, fpos, fread, fwrite))
116
111
  # end # def fs_fileOpen
@@ -1,9 +1,8 @@
1
1
  # encoding: US-ASCII
2
2
 
3
3
  require 'stringio'
4
-
5
4
  require 'binary_struct'
6
- require 'util/miq-unicode'
5
+ require 'miq_unicode'
7
6
 
8
7
  # ////////////////////////////////////////////////////////////////////////////
9
8
  # // Data definitions.
@@ -13,6 +12,7 @@ require 'util/miq-unicode'
13
12
  # (which yields uppercase names on XP).
14
13
 
15
14
  module Fat32
15
+ using ManageIQ::UnicodeString
16
16
 
17
17
  DIR_ENT_SFN = BinaryStruct.new([
18
18
  'a11', 'name', # If name[0] = 0, unallocated; if name[0] = 0xe5, deleted. DOES NOT INCLUDE DOT.
@@ -39,17 +39,17 @@ module Fat32
39
39
  'S', 'reserved2', # Reserved.
40
40
  'a4', 'name3' # UNICODE chars 12-13 of name.
41
41
  ])
42
-
42
+
43
43
  CHARS_PER_LFN = 13
44
44
  LFN_NAME_MAXLEN = 260
45
45
  DIR_ENT_SIZE = 32
46
46
  ATTRIB_OFFSET = 11
47
-
47
+
48
48
  # ////////////////////////////////////////////////////////////////////////////
49
49
  # // Class.
50
50
 
51
51
  class DirectoryEntry
52
-
52
+
53
53
  # From the UTF-8 perspective.
54
54
  # LFN name components: entry hash name, char offset, length.
55
55
  LFN_NAME_COMPONENTS = [
@@ -61,19 +61,19 @@ module Fat32
61
61
  LFN_NC_HASHNAME = 0
62
62
  LFN_NC_OFFSET = 1
63
63
  LFN_NC_LENGTH = 2
64
-
64
+
65
65
  # SFN failure cases.
66
66
  SFN_NAME_LENGTH = 1
67
67
  SFN_EXT_LENGTH = 2
68
68
  SFN_NAME_NULL = 3
69
69
  SFN_NAME_DEVICE = 4
70
70
  SFN_ILLEGAL_CHARS = 5
71
-
71
+
72
72
  # LFN failure cases.
73
73
  LFN_NAME_LENGTH = 1
74
74
  LFN_NAME_DEVICE = 2
75
75
  LFN_ILLEGAL_CHARS = 3
76
-
76
+
77
77
  # FileAttributes
78
78
  FA_READONLY = 0x01
79
79
  FA_HIDDEN = 0x02
@@ -82,7 +82,7 @@ module Fat32
82
82
  FA_DIRECTORY = 0x10
83
83
  FA_ARCHIVE = 0x20
84
84
  FA_LFN = 0x0f
85
-
85
+
86
86
  # DOS time masks.
87
87
  MSK_DAY = 0x001f # Range: 1 - 31
88
88
  MSK_MONTH = 0x01e0 # Right shift 5, Range: 1 - 12
@@ -90,18 +90,18 @@ module Fat32
90
90
  MSK_SEC = 0x001f # Range: 0 - 29 WARNING: 2 second granularity on this.
91
91
  MSK_MIN = 0x07e0 # Right shift 5, Range: 0 - 59
92
92
  MSK_HOUR = 0xf800 # Right shift 11, Range: 0 - 23
93
-
93
+
94
94
  # AllocationFlags
95
95
  AF_NOT_ALLOCATED = 0x00
96
96
  AF_DELETED = 0xe5
97
97
  AF_LFN_LAST = 0x40
98
-
98
+
99
99
  # Members.
100
100
  attr_reader :unused, :name, :dirty
101
101
  attr_accessor :parentCluster, :parentOffset
102
102
  # NOTE: Directory is responsible for setting parent.
103
103
  # These describe the cluster & offset of the START of the directory entry.
104
-
104
+
105
105
  # Initialization
106
106
  def initialize(buf = nil)
107
107
  # Create for write.
@@ -109,7 +109,7 @@ module Fat32
109
109
  self.create
110
110
  return
111
111
  end
112
-
112
+
113
113
  # Handle possibly multiple LFN records.
114
114
  data = StringIO.new(buf); @lfn_ents = []
115
115
  checksum = 0; @name = ""
@@ -119,12 +119,12 @@ module Fat32
119
119
  @unused = ""
120
120
  return
121
121
  end
122
-
122
+
123
123
  # If attribute contains 0x0f then LFN entry.
124
124
  isLfn = buf[ATTRIB_OFFSET] == FA_LFN
125
125
  @dir_ent = isLfn ? DIR_ENT_LFN.decode(buf) : DIR_ENT_SFN.decode(buf)
126
126
  break if !isLfn
127
-
127
+
128
128
  # Ignore this entry if deleted or not allocated.
129
129
  af = @dir_ent['seq_num']
130
130
  if af == AF_DELETED || af == AF_NOT_ALLOCATED
@@ -132,19 +132,19 @@ module Fat32
132
132
  @unused = data.read()
133
133
  return
134
134
  end
135
-
135
+
136
136
  # Set checksum or make sure it's the same
137
137
  checksum = @dir_ent['checksum'] if checksum == 0
138
138
  raise "Directory entry LFN checksum mismatch." if @dir_ent['checksum'] != checksum
139
-
139
+
140
140
  # Track LFN entry, gather names & prepend to name.
141
141
  @lfn_ents << @dir_ent
142
142
  @name = getLongNameFromEntry(@dir_ent) + @name
143
143
  end #LFN loop
144
-
144
+
145
145
  # Push the rest of the data back.
146
146
  @unused = data.read()
147
-
147
+
148
148
  # If this is the last record of an LFN chain, check the checksum.
149
149
  if checksum != 0
150
150
  csum = calcChecksum
@@ -156,7 +156,7 @@ module Fat32
156
156
  raise "Checksum error"
157
157
  end
158
158
  end
159
-
159
+
160
160
  # Populate name if not LFN.
161
161
  if @name == "" && !@dir_ent['name'].empty?
162
162
  @name = @dir_ent['name'][0, 8].strip
@@ -167,21 +167,21 @@ module Fat32
167
167
 
168
168
  # ////////////////////////////////////////////////////////////////////////////
169
169
  # // Class helpers & accessors.
170
-
170
+
171
171
  # Return this entry as a raw string.
172
172
  def raw
173
173
  out = ""
174
174
  @lfn_ents.each {|ent| out += BinaryStruct.encode(ent, DIR_ENT_LFN)} if @lfn_ents
175
175
  out += BinaryStruct.encode(@dir_ent, DIR_ENT_SFN)
176
176
  end
177
-
177
+
178
178
  # Number of dir ent structures (both sfn and lfn).
179
179
  def numEnts
180
180
  num = 1
181
181
  num += @lfn_ents.size if @lfn_ents
182
182
  return num
183
183
  end
184
-
184
+
185
185
  # Return normalized 8.3 name.
186
186
  def shortName
187
187
  name = @dir_ent['name'][0, 8].strip
@@ -189,7 +189,7 @@ module Fat32
189
189
  name += "." + ext if ext != ""
190
190
  return name
191
191
  end
192
-
192
+
193
193
  # Construct & return long name from lfn entries.
194
194
  def longName
195
195
  return nil if @lfn_ents == nil
@@ -197,7 +197,7 @@ module Fat32
197
197
  @lfn_ents.reverse.each {|ent| name += getLongNameFromEntry(ent)}
198
198
  return name
199
199
  end
200
-
200
+
201
201
  # WRITE: change filename.
202
202
  def name=(filename)
203
203
  @dirty = true
@@ -215,17 +215,17 @@ module Fat32
215
215
  @name = filename
216
216
  end
217
217
  end
218
-
218
+
219
219
  # WRITE: change magic number.
220
220
  def magic=(magic)
221
221
  @dirty = true
222
222
  @dir_ent['reserved1'] = magic
223
223
  end
224
-
224
+
225
225
  def magic
226
226
  return @dir_ent['reserved1']
227
227
  end
228
-
228
+
229
229
  # WRITE: change attribs.
230
230
  def setAttribute(attrib, set = true)
231
231
  @dirty = true
@@ -235,27 +235,27 @@ module Fat32
235
235
  @dir_ent['attributes'] &= (~attrib)
236
236
  end
237
237
  end
238
-
238
+
239
239
  # WRITE: change length.
240
240
  def length=(len)
241
241
  @dirty = true
242
242
  @dir_ent['file_size'] = len
243
243
  end
244
-
244
+
245
245
  # WRITE: change first cluster.
246
246
  def firstCluster=(first_clus)
247
247
  @dirty = true
248
248
  @dir_ent['first_clus_hi'] = (first_clus >> 16)
249
249
  @dir_ent['first_clus_lo'] = (first_clus & 0xffff)
250
250
  end
251
-
251
+
252
252
  # WRITE: change access time.
253
253
  def aTime=(tim)
254
254
  @dirty = true
255
255
  time, day = rubyToDosTime(tim)
256
256
  @dir_ent['atime_day'] = day
257
257
  end
258
-
258
+
259
259
  # To support root dir times (all zero).
260
260
  def zeroTime
261
261
  @dirty = true
@@ -263,13 +263,13 @@ module Fat32
263
263
  @dir_ent['ctime_tos'] = 0; @dir_ent['ctime_hms'] = 0; @dir_ent['ctime_day'] = 0
264
264
  @dir_ent['mtime_hms'] = 0; @dir_ent['mtime_day'] = 0
265
265
  end
266
-
266
+
267
267
  # WRITE: change modified (written) time.
268
268
  def mTime=(tim)
269
269
  @dirty = true
270
270
  @dir_ent['mtime_hms'], @dir_ent['mtime_day'] = rubyToDosTime(tim)
271
271
  end
272
-
272
+
273
273
  # WRITE: write or rewrite directory entry.
274
274
  def writeEntry(bs)
275
275
  return if not @dirty
@@ -290,7 +290,7 @@ module Fat32
290
290
  bs.putCluster(cluster, buf)
291
291
  @dirty = false
292
292
  end
293
-
293
+
294
294
  # WRITE: delete file.
295
295
  def delete(bs)
296
296
  # Deallocate data chain.
@@ -301,43 +301,43 @@ module Fat32
301
301
  @dirty = true
302
302
  self.writeEntry(bs)
303
303
  end
304
-
304
+
305
305
  def close(bs)
306
306
  writeEntry(bs) if @dirty
307
307
  end
308
-
308
+
309
309
  def attributes
310
310
  return @dir_ent['attributes']
311
311
  end
312
-
312
+
313
313
  def length
314
314
  return @dir_ent['file_size']
315
315
  end
316
-
316
+
317
317
  def firstCluster
318
318
  return (@dir_ent['first_clus_hi'] << 16) + @dir_ent['first_clus_lo']
319
319
  end
320
-
320
+
321
321
  def isDir?
322
322
  return true if @dir_ent['attributes'] & FA_DIRECTORY == FA_DIRECTORY
323
323
  return false
324
324
  end
325
-
325
+
326
326
  def mTime
327
327
  return dosToRubyTime(@dir_ent['mtime_day'], @dir_ent['mtime_hms'])
328
328
  end
329
-
329
+
330
330
  def aTime
331
331
  return dosToRubyTime(@dir_ent['atime_day'], 0)
332
332
  end
333
-
333
+
334
334
  def cTime
335
335
  return dosToRubyTime(@dir_ent['ctime_day'], @dir_ent['ctime_hms'])
336
336
  end
337
-
337
+
338
338
  # ////////////////////////////////////////////////////////////////////////////
339
339
  # // Utility functions.
340
-
340
+
341
341
  def getLongNameFromEntry(ent)
342
342
  pre_name = ""; hashNames = %w(name name2 name3)
343
343
  hashNames.each {|name|
@@ -351,7 +351,7 @@ module Fat32
351
351
  }
352
352
  return pre_name
353
353
  end
354
-
354
+
355
355
  def incShortName
356
356
  @dirty = true
357
357
  num = @dir_ent['name'][7].to_i
@@ -363,7 +363,7 @@ module Fat32
363
363
  @lfn_ents.each {|ent| ent['checksum'] = csum}
364
364
  end
365
365
  end
366
-
366
+
367
367
  def create
368
368
  @dirty = true
369
369
  @dir_ent = Hash.new
@@ -377,7 +377,7 @@ module Fat32
377
377
  # Must fill all members or BinaryStruct.encode fails.
378
378
  self.magic = 0x00; self.length = 0; self.firstCluster = 0 #magic used to be 0x18
379
379
  end
380
-
380
+
381
381
  def mkLongName(name)
382
382
  @lfn_ents = mkLfn(name)
383
383
  @dir_ent['name'] = mkSfn(name)
@@ -387,7 +387,7 @@ module Fat32
387
387
  csum = calcChecksum()
388
388
  @lfn_ents.each {|ent| ent['checksum'] = csum}
389
389
  end
390
-
390
+
391
391
  def mkLfn(name)
392
392
  name = mkLegalLfn(name)
393
393
  lfn_ents = []
@@ -420,11 +420,11 @@ module Fat32
420
420
  lfn_ents[0]['seq_num'] |= AF_LFN_LAST
421
421
  return lfn_ents
422
422
  end
423
-
423
+
424
424
  def mkSfn(name)
425
425
  return mkLegalSfn(name)
426
426
  end
427
-
427
+
428
428
  def isIllegalSfn(name)
429
429
  # Check: name length, extension length, NULL file name,
430
430
  # device names as file names & illegal chars.
@@ -437,14 +437,14 @@ module Fat32
437
437
  return SFN_ILLEGAL_CHARS if name.index(/[;+=\[\]',\"*\\<>\/?\:|]/) != nil
438
438
  return false
439
439
  end
440
-
440
+
441
441
  def checkForDeviceName(fn)
442
442
  %w[aux com1 com2 com3 com4 lpt lpt1 lpt2 lpt3 lpt4 mailslot nul pipe prn].each {|bad|
443
443
  return true if fn == bad
444
444
  }
445
445
  return false
446
446
  end
447
-
447
+
448
448
  def mkLegalSfn(name)
449
449
  name = name.upcase; name = name.delete(" ")
450
450
  name = name + "." if not name.include?(".")
@@ -454,18 +454,18 @@ module Fat32
454
454
  fn = fn[0, 6] + "~1" if fn.length > 8
455
455
  return (fn.ljust(8) + ext.ljust(3)).gsub(/[;+=\[\]',\"*\\<>\/?\:|]/, "_")
456
456
  end
457
-
457
+
458
458
  def isIllegalLfn(name)
459
459
  return LFN_NAME_LENGTH if name.length > LFN_NAME_MAXLEN
460
460
  return LFN_ILLEGAL_CHARS if name.index(/\/\\:><?/) != nil
461
461
  return false
462
462
  end
463
-
463
+
464
464
  def mkLegalLfn(name)
465
465
  name = name[0...LFN_NAME_MAXLEN] if name.length > LFN_NAME_MAXLEN
466
466
  return name.gsub(/\/\\:><?/, "_")
467
467
  end
468
-
468
+
469
469
  def calcChecksum
470
470
  name = @dir_ent['name']; csum = 0
471
471
  0.upto(10) {|i|
@@ -473,7 +473,7 @@ module Fat32
473
473
  }
474
474
  return csum
475
475
  end
476
-
476
+
477
477
  def dosToRubyTime(dos_day, dos_time)
478
478
  # Extract d,m,y,s,m,h & range check.
479
479
  day = dos_day & MSK_DAY; day = 1 if day == 0
@@ -487,7 +487,7 @@ module Fat32
487
487
  # Make a Ruby time.
488
488
  return Time.mktime(year, month, day, hour, min, sec)
489
489
  end
490
-
490
+
491
491
  def rubyToDosTime(tim)
492
492
  # Time
493
493
  sec = tim.sec; sec -= 1 if sec == 60 #correction for possible leap second.
@@ -501,7 +501,7 @@ module Fat32
501
501
  dos_day = (year << 9) + (month << 5) + day
502
502
  return dos_time, dos_day
503
503
  end
504
-
504
+
505
505
  # Dump object.
506
506
  def dump
507
507
  out = "\#<#{self.class}:0x#{'%08x' % self.object_id}>\n"
@@ -535,6 +535,6 @@ module Fat32
535
535
  out += "First clus lo: 0x#{'%04x' % @dir_ent['first_clus_lo']}\n"
536
536
  out += "File size : 0x#{'%08x' % @dir_ent['file_size']}\n"
537
537
  end
538
-
538
+
539
539
  end
540
540
  end # module Fat32