YkLib 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+