YkLib 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +7 -0
  7. data/Gemfile.lock +34 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +44 -0
  10. data/Rakefile +6 -0
  11. data/YkLib.gemspec +29 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/lib/YkLib/Yk/__advance__.rb +151 -0
  15. data/lib/YkLib/Yk/__defun__.rb +44 -0
  16. data/lib/YkLib/Yk/__hook__.rb +244 -0
  17. data/lib/YkLib/Yk/__minmax__.rb +123 -0
  18. data/lib/YkLib/Yk/__stdlog.rb +329 -0
  19. data/lib/YkLib/Yk/adhocLiterals/email.rb +119 -0
  20. data/lib/YkLib/Yk/adhocLiterals/path.rb +402 -0
  21. data/lib/YkLib/Yk/adhocLiterals/tag.rb +19 -0
  22. data/lib/YkLib/Yk/adhocLiterals/url.rb +36 -0
  23. data/lib/YkLib/Yk/adhocLiterals.rb +199 -0
  24. data/lib/YkLib/Yk/auto_escseq.rb +5 -0
  25. data/lib/YkLib/Yk/auto_pstore.rb +179 -0
  26. data/lib/YkLib/Yk/bsearch.rb +120 -0
  27. data/lib/YkLib/Yk/clambda.rb +309 -0
  28. data/lib/YkLib/Yk/confLine.rb +423 -0
  29. data/lib/YkLib/Yk/create_tty_width_available.rb +24 -0
  30. data/lib/YkLib/Yk/crypt.rb +26 -0
  31. data/lib/YkLib/Yk/debug2 +1 -0
  32. data/lib/YkLib/Yk/debug2.rb +473 -0
  33. data/lib/YkLib/Yk/debugout.rb +139 -0
  34. data/lib/YkLib/Yk/email_tz.rb +533 -0
  35. data/lib/YkLib/Yk/enum_expect.rb +170 -0
  36. data/lib/YkLib/Yk/errlog.rb +5 -0
  37. data/lib/YkLib/Yk/escseq.rb +59 -0
  38. data/lib/YkLib/Yk/eval_alt.rb +281 -0
  39. data/lib/YkLib/Yk/expector.rb +93 -0
  40. data/lib/YkLib/Yk/fetch.rb +556 -0
  41. data/lib/YkLib/Yk/fetch_old.rb +290 -0
  42. data/lib/YkLib/Yk/fib.rb +158 -0
  43. data/lib/YkLib/Yk/file_aux.rb +843 -0
  44. data/lib/YkLib/Yk/file_aux2.rb +919 -0
  45. data/lib/YkLib/Yk/file_aux_old.rb +160 -0
  46. data/lib/YkLib/Yk/filemod.rb +19 -0
  47. data/lib/YkLib/Yk/force_escseq.rb +3 -0
  48. data/lib/YkLib/Yk/generator__.rb +144 -0
  49. data/lib/YkLib/Yk/generator__.rb.org +139 -0
  50. data/lib/YkLib/Yk/indenter/argless_case.rb +46 -0
  51. data/lib/YkLib/Yk/indenter/each_token.rb +671 -0
  52. data/lib/YkLib/Yk/indenter/free_case.rb +313 -0
  53. data/lib/YkLib/Yk/indenter/if_less.rb +53 -0
  54. data/lib/YkLib/Yk/indenter/independent_ensure.rb +23 -0
  55. data/lib/YkLib/Yk/indenter/independent_rescue.rb +23 -0
  56. data/lib/YkLib/Yk/indenter/operand_circumflex.rb +0 -0
  57. data/lib/YkLib/Yk/indenter/operand_period.rb +16 -0
  58. data/lib/YkLib/Yk/indenter/parenless_and.rb +37 -0
  59. data/lib/YkLib/Yk/indenter/post_test.rb +48 -0
  60. data/lib/YkLib/Yk/indenter/token.rb +1525 -0
  61. data/lib/YkLib/Yk/indenter.rb +1382 -0
  62. data/lib/YkLib/Yk/inot.rb +265 -0
  63. data/lib/YkLib/Yk/intf.rb +815 -0
  64. data/lib/YkLib/Yk/io_aux.rb +1332 -0
  65. data/lib/YkLib/Yk/ioctl.rb +60 -0
  66. data/lib/YkLib/Yk/ipcc.rb +87 -0
  67. data/lib/YkLib/Yk/ipcountry.rb +207 -0
  68. data/lib/YkLib/Yk/ipv4adr.rb +318 -0
  69. data/lib/YkLib/Yk/localmail.rb +276 -0
  70. data/lib/YkLib/Yk/method_chain.rb +359 -0
  71. data/lib/YkLib/Yk/misc_tz.rb +1716 -0
  72. data/lib/YkLib/Yk/missing_method.rb +50 -0
  73. data/lib/YkLib/Yk/mojiConv.rb +257 -0
  74. data/lib/YkLib/Yk/nostdlog.rb +4 -0
  75. data/lib/YkLib/Yk/on_marshal.rb +20 -0
  76. data/lib/YkLib/Yk/overrider.rb +47 -0
  77. data/lib/YkLib/Yk/path.rb +293 -0
  78. data/lib/YkLib/Yk/path_aux.rb +883 -0
  79. data/lib/YkLib/Yk/path_aux_alt.rb +0 -0
  80. data/lib/YkLib/Yk/path_rep.rb +1267 -0
  81. data/lib/YkLib/Yk/pg_setup.rb +917 -0
  82. data/lib/YkLib/Yk/procinfo.rb +314 -0
  83. data/lib/YkLib/Yk/proclist.rb +492 -0
  84. data/lib/YkLib/Yk/property.rb +863 -0
  85. data/lib/YkLib/Yk/ranger.rb +606 -0
  86. data/lib/YkLib/Yk/resolv_tz.rb +88 -0
  87. data/lib/YkLib/Yk/rlprompt.rb +73 -0
  88. data/lib/YkLib/Yk/rootexec.rb +48 -0
  89. data/lib/YkLib/Yk/rpm-packageproxy.rb +784 -0
  90. data/lib/YkLib/Yk/rpm-packageproxy2.rb +1430 -0
  91. data/lib/YkLib/Yk/rwhen.rb +21 -0
  92. data/lib/YkLib/Yk/selector.rb +124 -0
  93. data/lib/YkLib/Yk/set.rb +170 -0
  94. data/lib/YkLib/Yk/shellquote.rb +300 -0
  95. data/lib/YkLib/Yk/sio.rb +1001 -0
  96. data/lib/YkLib/Yk/sio0.rb +835 -0
  97. data/lib/YkLib/Yk/sio_aux.rb +1524 -0
  98. data/lib/YkLib/Yk/sio_inot.rb +86 -0
  99. data/lib/YkLib/Yk/sock_aux.rb +42 -0
  100. data/lib/YkLib/Yk/spipe.rb +843 -0
  101. data/lib/YkLib/Yk/sql_table.rb +565 -0
  102. data/lib/YkLib/Yk/stdlog.rb +4 -0
  103. data/lib/YkLib/Yk/syscommand.rb +173 -0
  104. data/lib/YkLib/Yk/sysinit.rb +75 -0
  105. data/lib/YkLib/Yk/ttyFontWidth.rb +46113 -0
  106. data/lib/YkLib/Yk/tty_char.dump +0 -0
  107. data/lib/YkLib/Yk/tty_char.rb +47 -0
  108. data/lib/YkLib/Yk/tty_char_create.rb +437031 -0
  109. data/lib/YkLib/Yk/tty_char_static.rb +437016 -0
  110. data/lib/YkLib/Yk/tty_rewrite.rb +142 -0
  111. data/lib/YkLib/Yk/tty_str.rb +461 -0
  112. data/lib/YkLib/Yk/tty_width.dat.rb +114 -0
  113. data/lib/YkLib/Yk/tty_width.rb +180 -0
  114. data/lib/YkLib/Yk/tty_width_available +569 -0
  115. data/lib/YkLib/Yk/tty_width_list +0 -0
  116. data/lib/YkLib/Yk/tty_width_list.linux +280 -0
  117. data/lib/YkLib/Yk/tty_width_list.windows +324 -0
  118. data/lib/YkLib/Yk/tz_tty +0 -0
  119. data/lib/YkLib/Yk/tz_tty.rb +0 -0
  120. data/lib/YkLib/Yk/uprepos.rb +94 -0
  121. data/lib/YkLib/Yk/userinfo.rb +91 -0
  122. data/lib/YkLib/Yk/with.rb +109 -0
  123. data/lib/YkLib/version.rb +3 -0
  124. data/lib/YkLib.rb +6 -0
  125. metadata +170 -0
@@ -0,0 +1,919 @@
1
+
2
+
3
+
4
+ require 'pathname'
5
+ require 'Yk/__defun__'
6
+ require 'Yk/__hook__'
7
+ require 'Yk/io_aux'
8
+ begin
9
+ require 'tpty'
10
+ rescue LoadError
11
+ end
12
+
13
+
14
+ (class << File; self; end).class_eval do
15
+ alias_method :__org_open_____, :open
16
+ at_exit do
17
+ FileUtils.rm_rf "#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances/#{$$}"
18
+ FileUtils.rmdir("#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances") rescue ""
19
+ FileUtils.rmdir("#{ENV['HOME']}/.tmp/#{File.basename($0)}") rescue ""
20
+ end
21
+ def open (f, mode = "r", perm = nil)
22
+ if f == ""
23
+ if !File.exist? "#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances/#{$$}"
24
+ File.mkpath "#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances/#{$$}"
25
+ end
26
+ f.replace("#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances/#{$$}/tmp.#{rand(10000000000).to_s}")
27
+ tmode = true
28
+ fmode.delete = true
29
+ end
30
+ res = nil
31
+ fmode = mode.to_fmode
32
+ pid = nil
33
+ handleIO = Proc.new do |h|
34
+ pid && h.__defun__(:pid, pid)
35
+ if block_given?
36
+ begin
37
+ res = yield h
38
+ ensure
39
+ h.closed? || h.close
40
+ if pid
41
+ begin
42
+ Process.waitpid pid
43
+ rescue => e
44
+ end
45
+ end
46
+ end
47
+ if pid
48
+ res = !$?.exitstatus ? nil : res
49
+ else
50
+ res
51
+ end
52
+ else
53
+ res = h
54
+ end
55
+ end
56
+ fp = nil
57
+ doProg = Proc.new do |cmdLine|
58
+ if fmode.sys?
59
+ raise ArgumentError.new("cannot use popen with sysopen")
60
+ end
61
+ if !fmode.terminal?
62
+ fp, ff = nil
63
+ if fmode.readable? && fmode.writable?
64
+ fr, fout = IO.pipe
65
+ pid = fork do
66
+ fr.close
67
+ fw.close
68
+ STDIN.reopen fin
69
+ fmode.stdout? && STDOUT.reopen(fout)
70
+ fmode.stdout? && STDERR.reopen(fout)
71
+ exec *cmdLine
72
+ end
73
+ fin.close
74
+ fout.close
75
+ fr.set_write_io fw
76
+ fp = fr
77
+ else
78
+ fr, fw = IO.pipe
79
+ fcs = []
80
+ if fmode.writable?
81
+ fp, ff = fw, fr
82
+ fcs.push STDIN
83
+ else
84
+ fp, ff = fr, fw
85
+ fmode.stdout? && fcs.push(STDOUT)
86
+ fmode.stderr? && fcs.push(STDERR)
87
+ end
88
+ #fr.nonblock = true
89
+ #fw.nonblock = true
90
+ pid = fork do
91
+ fp.close
92
+ fcs.each do |fc|
93
+ fc.reopen ff
94
+ end
95
+ ff.close
96
+ exec *cmdLine
97
+ end
98
+ ff.close
99
+ end
100
+ handleIO.call fp
101
+ else
102
+ p
103
+ fp = nil
104
+ pty = TPty.new
105
+ if !pty || !(fp = pty.master)
106
+ p pty
107
+ Exception.new("cannot allocate pseudo tty")
108
+ end
109
+ p
110
+ fq = pty.slave
111
+ p fp
112
+ fp.set_raw
113
+ p
114
+ pid = fork do
115
+ p
116
+ Process.setsid
117
+ #Process.setpgrp
118
+ fqFile = "/proc/#{$$}/fd/#{pty.slave.to_i}".readlink
119
+ fq.reopen fqFile
120
+ STDIN.reopen fq
121
+ STDOUT.reopen fq
122
+ STDERR.reopen fq
123
+ fq.close
124
+ fp.close
125
+ p
126
+ exec *cmdLine
127
+ p :failed
128
+ end
129
+ p pid
130
+ fq.close
131
+ trap :WINCH do
132
+ end
133
+ handleIO.call fp
134
+ end
135
+ end
136
+ if f.is_a? Array
137
+ doProg.call f
138
+ elsif f.is_a? String
139
+ f = f.clone
140
+ case f
141
+ when "|-"
142
+ f = "-"
143
+ fmode.pmode = :program
144
+ fmode.writable = true
145
+ when "-|"
146
+ f = "-"
147
+ fmode.pmode = :program
148
+ fmode.readable = true
149
+ when "|-|"
150
+ f = "-"
151
+ fmode.pmode = :program
152
+ fmode.readable = true
153
+ fmode.writable = true
154
+ when "-"
155
+ fmode.pmode = :program
156
+ else
157
+ if f =~ /^\|/
158
+ f.sub!(/^\|/, "")
159
+ fmode.writable = true; fmode.pmode = :program
160
+ end
161
+ if f =~ /^\|/
162
+ f.sub!(/^\|/, "")
163
+ fmode.readable = true; fmode.pmode = :program
164
+ end
165
+ end
166
+ File.pipe?(f) && fmode.pmode = :pipe
167
+ case fmode.pmode
168
+ when :program, :terminal
169
+ doProg.call [f]
170
+ else
171
+ writeFile = nil
172
+ getFp = Proc.new do |m|
173
+ if fmode.sys?
174
+ IO.for_fd IO.sysopen(f, m.to_i, perm)
175
+ else
176
+ __org_open_____ f, m.to_i, perm
177
+ end
178
+ end
179
+ if fmode.pmode == :pipe
180
+ if !IO::PIPE_LOCKABLE && fmode.lock?
181
+ raise ArgumentError.new("cannot lock pipe in this system")
182
+ end
183
+ if !File.exist?(f) && fmode.creatable?
184
+ begin
185
+ File.mkfifo(f)
186
+ rescue Exception => e
187
+ end
188
+ end
189
+ if !File.pipe?(f)
190
+ raise ArgumentError.new("cannot crate pipe #{f}, non-pipe file already exists.")
191
+ end
192
+ if fmode.writable? && fmode.readable?
193
+ hasPipeWriter = true
194
+ writeFile = "#{f}.__write__"
195
+ File.pipe?(f) && (File.pipe?(writeFile) || File.mkfifo(writeFile))
196
+ openWithWrite = Proc.new do |a, b|
197
+ fp = __org_open_____(a, fmode.to_i, perm)
198
+ fp.set_write_io __org_open_____(b, fmode.to_i, perm)
199
+ end
200
+ if fmode.truncate?
201
+ openWithWrite.call(f, writeFile)
202
+ else
203
+ openWithWrite.call(writeFile, f)
204
+ end
205
+ else
206
+ if fmode.writable? && !fmode.readable? && fmode.nonblock?
207
+ fmode2 = fmode.clone
208
+ fmode2.readable = true
209
+ fp = getFp.call fmode2
210
+ fp.fmode = fmode
211
+ else
212
+ fp = getFp.call fmode
213
+ end
214
+ end
215
+ else
216
+ fp = getFp.call fmode
217
+ end
218
+ if fmode.delete?
219
+ fp.__hook__ :close, f, writeFile do |_org_h, _f_h, _f_h2|
220
+ _org_h.call
221
+ File.exist?(_f_h) && File.delete(_f_h)
222
+ _f_h2 and File.exist?(_f_h2) && File.delete(_f_h2)
223
+ end
224
+ end
225
+ fmode.lock? and fp.flock fmode.to_flock
226
+ fmode.truncate? and (fp.truncate(0) rescue nil)
227
+ handleIO.call fp
228
+ end
229
+ if tmode
230
+ fp.__defun__ :to_s, f.clone
231
+ end
232
+ end
233
+ res
234
+ end
235
+ end
236
+
237
+
238
+ require 'Yk/file_aux_old'
239
+
240
+
241
+ class File
242
+ def self.readable_file? (f)
243
+ !FileTest.blockdev?(f) && !FileTest.directory?(f) && FileTest.readable?(f)
244
+ end
245
+ def self.writable_file? (f)
246
+ if !File.exist? f
247
+ File.directory?(tmp = File.dirname(f)) && File.writable?(tmp)
248
+ else
249
+ !FileTest.blockdev?(f) && !FileTest.directory?(f) && FileTest.writable?(f)
250
+ end
251
+ end
252
+ def self.executable_file? (f)
253
+ FileTest.executable?(f) && File.file?(f)
254
+ end
255
+ # def self.realpath (f)
256
+ # Pathname.new(f).realpath.to_s
257
+ # end
258
+ def self.relative_path (f, d = ".")
259
+ f = Pathname.new(f)
260
+ d = Pathname.new(d)
261
+ f.relative_path_from(d).to_s
262
+ end
263
+ def self.normalize_path (pth, defdir = nil)
264
+ pth = File.expand_path(pth, defdir)
265
+ if pth =~ /^\/+/
266
+ pth = "/" + $'
267
+ end
268
+ if pth =~ /\/+$/
269
+ pth = $`
270
+ end
271
+ pth
272
+ end
273
+ def self.is_in (f, d, cd = nil)
274
+ f = File.normalize_path(f, cd)
275
+ d = File.normalize_path(d, cd)
276
+ if f =~ /^#{Regexp.escape d}(\/|$)/
277
+ $'
278
+ else
279
+ false
280
+ end
281
+ end
282
+ def self.is_in? (f, d, cd = nil)
283
+ f = File.normalize_path(f, cd)
284
+ d = File.normalize_path(d, cd)
285
+ if f =~ /^#{Regexp.escape d}(\/|$)/
286
+ $'
287
+ else
288
+ false
289
+ end
290
+ end
291
+ def self.sibling (f, g)
292
+ if f =~ /\/[^\/]+$/
293
+ $` + "/" + g
294
+ else
295
+ g
296
+ end
297
+ end
298
+ def self.resymlink (src, dst)
299
+ if File.symlink? dst
300
+ if File.readlink(dst) == src
301
+ return
302
+ else
303
+ FileUtils.rm_f dst
304
+ File.symlink src, dst
305
+ end
306
+ else
307
+ File.symlink src, dst
308
+ end
309
+ end
310
+ def self.resolv_link (l)
311
+ if File.symlink? l
312
+ lk = File.readlink(l)
313
+ else
314
+ return l
315
+ end
316
+ if lk =~ /^\//
317
+ lk
318
+ else
319
+ File.dirname(l) + "/" + File.readlink(l)
320
+ end
321
+ end
322
+ def self.fifo? (f)
323
+ File.pipe?(f)
324
+ end
325
+ def self.lexist? (arg)
326
+ File.symlink?(arg) || File.exist?(arg)
327
+ end
328
+ def self.exist? (arg)
329
+ File.symlink?(arg) || File.exist?(arg)
330
+ end
331
+ def self.lmtime (arg)
332
+ File.lstat(arg).mtime
333
+ end
334
+ def self.mknod (name, type = nil, devn = nil, mode = nil)
335
+ if type
336
+ if mode
337
+ mode = "-m #{mode.to_s(8)}"
338
+ else
339
+ mode = ""
340
+ end
341
+ minor = devn & 0xff
342
+ major = devn >> 8
343
+ tp = type.chr
344
+ system "mknod #{name} #{tp} #{mode} #{major} #{minor}"
345
+ else
346
+ if system "mksock #{name}"
347
+ if mode
348
+ File.chmod mode, name
349
+ end
350
+ else
351
+ raise Exception.new("cannot create socket `#{name}'")
352
+ end
353
+ end
354
+ end
355
+ def self.mkfifo (name, mode = nil)
356
+ if mode
357
+ mode = "-m #{mode.to_s(8)}"
358
+ else
359
+ mode = ""
360
+ end
361
+ if !system "mkfifo #{mode} #{name}"
362
+ raise Exception.new("cannot create fifo `#{name}'")
363
+ end
364
+ end
365
+ def self.mksock (name, mode = nil)
366
+ if !system "mksock #{name}"
367
+ raise Exception.new("cannot create socket `#{name}'")
368
+ end
369
+ if mode
370
+ FileUtils.chmod mode, name
371
+ end
372
+ end
373
+ def self.partial_path (name, sub)
374
+ arr = name.split(/\/+/)
375
+ while arr.size != 0 && arr[-1] == ""
376
+ arr.pop
377
+ end
378
+ arr[sub].join("/")
379
+ end
380
+ def self.delext (name, ext = nil)
381
+ if !ext
382
+ if name =~ /\.[^\.]*$/ && $` != ""
383
+ return name.sub(/\.[^\.]*$/, "")
384
+ else
385
+ return name
386
+ end
387
+ end
388
+ if ext[0] != ?.
389
+ raise ArgumentError.new("'#{ext}' is not extension. Please add '.' before it.")
390
+ end
391
+ name = name.clone
392
+ name.sub! /#{Regexp.escape ext}$/, ""
393
+ name
394
+ end
395
+ def self.which (arg)
396
+ `which #{arg}`.chomp
397
+ end
398
+ end
399
+
400
+
401
+ class Dir
402
+ def self.lrecursive (d)
403
+ recursive d, false do |e|
404
+ yield e
405
+ end
406
+ end
407
+ def self.recursive (d, fl = true, orgSz = nil, *exList)
408
+ ret = []
409
+ if d != "/" && d =~ /\/+$/
410
+ d = $`
411
+ end
412
+ if orgSz == nil
413
+ if d == "/"
414
+ orgSz = 1
415
+ else
416
+ orgSz = d.size + 1
417
+ end
418
+ end
419
+ if !File.directory?(d)
420
+ return block_given? ? 0 : ret
421
+ end
422
+ getRealPath = Proc.new do |a|
423
+ File.realpath(a) rescue a
424
+ end
425
+ if exList[-1].is_a? Hash
426
+ h = exList.pop
427
+ else
428
+ h = Hash.new
429
+ end
430
+ exList.each do |e|
431
+ h[getRealPath.call(e)] = true
432
+ end
433
+ pth = getRealPath.call(d)
434
+ if h[pth]
435
+ return block_given? ? 0 : ret
436
+ end
437
+ h[pth] = true
438
+ cnt = 0
439
+ begin
440
+ Dir.foreach d do |f|
441
+ if f != "." && f != ".."
442
+ if d[-1] == ?/
443
+ f = d + f
444
+ else
445
+ f = d + "/" + f
446
+ end
447
+ if (fl || !File.symlink?(f)) && File.directory?(f)
448
+ cnt += Dir.recursive f, fl, orgSz, h do |g|
449
+ def g.dir
450
+ File.dirname(self)
451
+ end
452
+ def g.base
453
+ File.basename(self)
454
+ end
455
+ def g.dir?
456
+ File.directory?(self)
457
+ end
458
+ g.__defun__ :recbase, g do |tmp|
459
+ tmp[orgSz .. -1]
460
+ end
461
+ if block_given?
462
+ yield g
463
+ else
464
+ ret.push g
465
+ end
466
+ end
467
+ elsif File.exist?(f) || !fl
468
+ def f.dir
469
+ File.dirname(self)
470
+ end
471
+ def f.base
472
+ File.basename(self)
473
+ end
474
+ def f.dir?
475
+ File.directory?(self)
476
+ end
477
+ f.__defun__ :recbase, f do |tmp|
478
+ tmp[orgSz .. -1]
479
+ end
480
+ if block_given?
481
+ yield f
482
+ else
483
+ ret.push f
484
+ end
485
+ cnt += 1
486
+ end
487
+ end
488
+ end
489
+ rescue
490
+ return block_given? ? 0 : []
491
+ end
492
+ return block_given? ? cnt : ret
493
+ end
494
+ def self.each (d)
495
+ Dir.foreach d do |f|
496
+ next if f == "." || f == ".."
497
+ if d[-1] != ?/
498
+ g = d + "/" + f
499
+ else
500
+ g = d + f
501
+ end
502
+ def g.dir
503
+ File.dirname(self)
504
+ end
505
+ def g.base
506
+ File.basename(self)
507
+ end
508
+ def g.dir?
509
+ File.directory?(self)
510
+ end
511
+ yield g
512
+ end
513
+ end
514
+ end
515
+
516
+
517
+ require 'fileutils'
518
+
519
+
520
+ module FileUtils
521
+ class Entry_
522
+ begin
523
+ begin
524
+ File.lchmod(0644, "/")
525
+ rescue NotImplementedError
526
+ def File.lchmod (*args)
527
+ end
528
+ end
529
+ rescue
530
+ end
531
+ begin
532
+ begin
533
+ File.lchown(0, 0, "/")
534
+ rescue NotImplementedError
535
+ def File.lchown (*args)
536
+ end
537
+ end
538
+ rescue
539
+ end
540
+ def lcopy_metadata(path)
541
+ st = lstat()
542
+ if !File.symlink? path
543
+ File.utime st.atime, st.mtime, path
544
+ end
545
+ begin
546
+ File.lchown st.uid, st.gid, path
547
+ rescue Errno::EPERM
548
+ # clear setuid/setgid
549
+ File.lchmod st.mode & 01777, path
550
+ else
551
+ File.lchmod st.mode, path
552
+ end
553
+ end
554
+ def mknod (name, type = nil, devn = nil, mode = nil)
555
+ File.mknod(name, type, devn, mode)
556
+ end
557
+ def mkfifo (name, mode = nil)
558
+ File.mkfifo(name, mode)
559
+ end
560
+ end
561
+ def copy_entry(src, dest, preserve = false, dereference_root = false)
562
+ Entry_.new(src, nil, dereference_root).traverse do |ent|
563
+ destent = Entry_.new(dest, ent.rel, false)
564
+ ent.copy destent.path
565
+ ent.lcopy_metadata destent.path if preserve
566
+ end
567
+ end
568
+ def copy_stat(src, dest, preserve = true, dereference_root = false)
569
+ Entry_.new(src, nil, dereference_root).traverse do |ent|
570
+ destent = Entry_.new(dest, ent.rel, false)
571
+ ent.lcopy_metadata destent.path if preserve
572
+ end
573
+ end
574
+ def cp_stat(src, path)
575
+ st = File.lstat(src)
576
+ if !File.symlink? path
577
+ File.utime st.atime, st.mtime, path
578
+ end
579
+ begin
580
+ File.lchown st.uid, st.gid, path
581
+ rescue Errno::EPERM
582
+ # clear setuid/setgid
583
+ File.lchmod st.mode & 01777, path
584
+ else
585
+ File.lchmod st.mode, path
586
+ end
587
+ end
588
+ module_function :copy_entry
589
+ module_function :copy_stat
590
+ module_function :cp_stat
591
+ end
592
+
593
+
594
+ class File
595
+ class CannotGetLock < Exception
596
+ end
597
+ def try_lock_ex
598
+ if !flock File::LOCK_EX | File::LOCK_NB
599
+ false
600
+ else
601
+ true
602
+ end
603
+ end
604
+ def try_lock_sh
605
+ if !flock File::LOCK_SH | File::LOCK_NB
606
+ false
607
+ else
608
+ true
609
+ end
610
+ end
611
+ def lock_ex
612
+ flock File::LOCK_EX
613
+ end
614
+ def lock_sh
615
+ flock File::LOCK_SH
616
+ end
617
+ def unlock
618
+ flock File::LOCK_UN
619
+ end
620
+ def lock (mode = "e")
621
+ case mode
622
+ when "e"
623
+ flock File::LOCK_EX
624
+ when "s"
625
+ flock File::LOCK_SH
626
+ when "l"
627
+ flock(fmode.writable? ? File::LOCK_EX : File::LOCK_SH)
628
+ else
629
+ raise ArgumentError.new("illeagal mode, '#{mode}'")
630
+ end
631
+ end
632
+ def self.__lock_failed (file)
633
+ require 'Yk/shellquote'
634
+ pidList = []
635
+ if File.executable?("/usr/sbin/lsof") && File.executable?("/usr/bin/lsp")
636
+ IO.popen "/usr/sbin/lsof #{file.condSQuote} 2> /dev/null" do |r|
637
+ r.each_line do |ln|
638
+ pid = ln.strip.split[1]
639
+ if pid =~ /\d+/
640
+ pidList.push pid
641
+ end
642
+ end
643
+ end
644
+ require 'Yk/proclist'
645
+ ProcList.refresh
646
+ curProc = ProcList.current
647
+ pidList = pidList.select do |e|
648
+ if pc = ProcList.pid(e)
649
+ if pc.isFamilyOf?(curProc)
650
+ next false
651
+ end
652
+ next true
653
+ end
654
+ next false
655
+ end
656
+ if pidList.size > 0
657
+ system "/usr/bin/lsp -a -K #{pidList.join(' ')}"
658
+ end
659
+ end
660
+ end
661
+ def self.try_lock_ex (name)
662
+ fr = File.open name, File::RDONLY|File::CREAT|File::NONBLOCK
663
+ if !fr.flock File::LOCK_EX | File::LOCK_NB
664
+ $DEBUG && __lock_failed(name)
665
+ if block_given?
666
+ raise File::CannotGetLock.new("failed to get exclusive lock '#{name}'")
667
+ end
668
+ return nil
669
+ end
670
+ if block_given?
671
+ begin
672
+ yield fr
673
+ ensure
674
+ fr.close
675
+ end
676
+ else
677
+ fr
678
+ end
679
+ end
680
+ def self.setpid (name)
681
+ fw = File.open name, File::RDWR|File::CREAT|File::NONBLOCK
682
+ same = fw.read.chomp == $$.to_s
683
+ if !fw.flock(File::LOCK_EX | File::LOCK_NB) && !same
684
+ $DEBUG && __lock_failed(name)
685
+ fw.close
686
+ raise File::CannotGetLock.new("failed to get exclusive lock '#{name}'")
687
+ end
688
+ fw.pos = 0
689
+ if !same
690
+ fw.truncate(0)
691
+ fw.write $$.to_i
692
+ fw.flush
693
+ fw.flock File::LOCK_SH
694
+ else
695
+ Dir.foreach "/proc/#{$$}/fd" do |ent|
696
+ next if ent !~ /^\d+$/
697
+ if File.symlink?(s = "/proc/#{$$}/fd/#{ent}")
698
+ if File.readlink(s) == File.normalize_path(name)
699
+ fw.close
700
+ fw = IO.for_fd(ent.to_i)
701
+ break
702
+ end
703
+ end
704
+ end
705
+ end
706
+ if block_given?
707
+ begin
708
+ yield fw
709
+ ensure
710
+ File.delete name
711
+ !fw.closed? && fw.close
712
+ end
713
+ else
714
+ at_exit do
715
+ File.delete(name) if File.exist?(name)
716
+ !fw.closed? && fw.close
717
+ end
718
+ end
719
+ end
720
+ def self.try_lock_sh (name)
721
+ fr = File.open name, File::RDONLY|File::CREAT|File::NONBLOCK
722
+ if !fr.flock File::LOCK_SH | File::LOCK_NB
723
+ $DEBUG && __lock_failed(name)
724
+ if block_given?
725
+ raise File::CannotGetLock.new("failed to get shared lock '#{name}'")
726
+ end
727
+ return nil
728
+ end
729
+ if block_given?
730
+ begin
731
+ yield fr
732
+ ensure
733
+ fr.close
734
+ end
735
+ else
736
+ fr
737
+ end
738
+ end
739
+ def self.lock_ex (name)
740
+ fr = File.open name, File::RDONLY|File::CREAT|File::NONBLOCK
741
+ fr.flock File::LOCK_EX
742
+ if block_given?
743
+ begin
744
+ yield
745
+ ensure
746
+ fr.close
747
+ end
748
+ else
749
+ fr
750
+ end
751
+ end
752
+ def self.lock_sh (name)
753
+ fr = File.open name, File::RDONLY|File::CREAT|File::NONBLOCK
754
+ fr.flock File::LOCK_SH
755
+ if block_given?
756
+ begin
757
+ yield
758
+ ensure
759
+ fr.close
760
+ end
761
+ else
762
+ fr
763
+ end
764
+ end
765
+ end
766
+
767
+
768
+ class << Object.new
769
+ def self.rewriteIOMethods (cls, rewrite_methods)
770
+ cls.class_eval do
771
+ rms = rewrite_methods.sort_by do |a|
772
+ -a.size
773
+ end
774
+ def self.getLabelAndFm (e, extra = "")
775
+ case e.to_sym
776
+ when :write, :writeln
777
+ fmode = IO::FMode.new extra
778
+ fmode.writable = true
779
+ fmode.readable = false
780
+ fmode.creatable = true
781
+ if !fmode.append?
782
+ fmode.truncate = true
783
+ end
784
+ when :rewrite_each_line, :ref_each_line, :addlines, :addline, :dellines, :delline
785
+ fmode = IO::FMode.new extra
786
+ fmode.readable = true
787
+ fmode.writable = true
788
+ fmode.creatable = true
789
+ fmode.truncate = false
790
+ when :writeln_readln
791
+ fmode = IO::FMode.new extra
792
+ fmode.readable = true
793
+ fmode.writable = true
794
+ fmode.creatable = true
795
+ fmode.truncate = true
796
+ else
797
+ fmode = IO::FMode.new extra
798
+ end
799
+ ["__#{e}_____".to_sym, fmode]
800
+ end
801
+ rms.each do |e|
802
+ e = e.to_sym
803
+ self.__hook__ e, *getLabelAndFm(e) do |org, tlabel, fmode|
804
+ #STDERR.write caller.inspect + "\n"
805
+ #STDERR.flush
806
+ #STDERR.write org.class.inspect + "\n"
807
+ #STDERR.flush
808
+ #STDERR.write org.inspect + "\n"
809
+ #STDERR.flush
810
+ path = org.args.shift
811
+ #STDERR.write path + "\n"
812
+ #STDERR.write fmode.inspect + "\n"
813
+ File.open path, fmode do |fp|
814
+ fp.method(tlabel).call(*org.args, &org.block)
815
+ end
816
+ end
817
+ end
818
+ self.__hook__ :method_missing do |org|
819
+ name = org.args[0]
820
+ if name != :__hk_org_method_B_missing
821
+ if name.to_s =~ /^(#{rms.join('|')})_/ && (lb, fm = getLabelAndFm($1, $') rescue false)
822
+ File.open org.args[1], fm do |fp|
823
+ fp.method(lb).call(*org.args[2..-1], &org.block)
824
+ end
825
+ else
826
+ org.call
827
+ end
828
+ else
829
+ __reraise_method_missing name
830
+ end
831
+ end
832
+ self.__hook__ :respond_to? do |org|
833
+ name = org.args[0]
834
+ if name.to_s =~ /^(#{rms.join('|')})_/ && (fm = IO::FMode.new($') rescue false)
835
+ true
836
+ else
837
+ org.call
838
+ end
839
+ end
840
+ end
841
+ end
842
+ rewriteIOMethods(IO,
843
+ %w{
844
+ read gets readline readlines foreach write
845
+ readln writeln read_each_line rewrite_each_line ref_each_line
846
+ writeln_readln print println printf printfln addline delline addlines dellines
847
+ }
848
+ )
849
+ end
850
+
851
+
852
+ class IO
853
+ def __read_____ (length = nil, offset = nil)
854
+ pos = offset if offset
855
+ read length
856
+ end
857
+ def __readlines_____ (rs = $/)
858
+ readlines rs
859
+ end
860
+ def __readline_____ (rs = $/)
861
+ readline rs
862
+ end
863
+ def __gets_____ (rs = $/)
864
+ gets rs
865
+ end
866
+ def __readln_____ (rs = $/)
867
+ readln rs
868
+ end
869
+ def __read_each_line_____ (rs = $/, &bl)
870
+ read_each_line rs, &bl
871
+ end
872
+ def __foreach_____ (rs = $/)
873
+ each_line rs do |ln|
874
+ yield ln
875
+ end
876
+ end
877
+ def __write_____ (*args)
878
+ write *args
879
+ end
880
+ def __writeln_____ (*args)
881
+ writeln *args
882
+ end
883
+ def __rewrite_each_line_____ (&bl)
884
+ rewrite_each_line(&bl)
885
+ end
886
+ def __ref_each_line_____ (&bl)
887
+ ref_each_line(&bl)
888
+ end
889
+ def __writeln_readln_____ (*args)
890
+ writeln_readln *args
891
+ end
892
+ def __print_____ (*args)
893
+ print *args
894
+ end
895
+ def __println_____ (*args)
896
+ println *args
897
+ end
898
+ def __printf_____ (*args)
899
+ printf *args
900
+ end
901
+ def __printfln_____ (*args)
902
+ println *args
903
+ end
904
+ def __addline_____ (*args)
905
+ addline *args
906
+ end
907
+ def __addlines_____ (*args)
908
+ addlines *args
909
+ end
910
+ def __delline_____ (*args)
911
+ delline *args
912
+ end
913
+ def __dellines_____ (*args)
914
+ dellines *args
915
+ end
916
+ end
917
+
918
+
919
+