17: def writelock(file, mode = nil)
18: unless FileTest.directory?(File.dirname(file))
19: raise Puppet::DevError, "Cannot create %s; directory %s does not exist" % [file, File.dirname(file)]
20: end
21: tmpfile = file + ".tmp"
22:
23: unless mode
24:
25:
26:
27:
28:
29: begin
30: mode = File.stat(file).mode
31: rescue
32: mode = 0600
33: end
34: end
35:
36: Puppet::Util.sync(file).synchronize(Sync::EX) do
37: File.open(file, "w", mode) do |rf|
38: rf.lock_exclusive do |lrf|
39: yield lrf
40: end
41: end
42: end
43: end