unicorn.git  about / heads / tags
Rack HTTP server for Unix and fast clients
blob 2d3f827562f12f10614d8ed938dd4df640239a08 1391 bytes (raw)
$ git show v0.8.1:lib/unicorn/util.rb	# shows this blob on the CLI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
require 'fcntl'

module Unicorn
  class Util
    class << self

      APPEND_FLAGS = File::WRONLY | File::APPEND

      # this reopens logs that have been rotated (using logrotate(8) or
      # similar).  It is recommended that you install
      # A +File+ object is considered for reopening if it is:
      #   1) opened with the O_APPEND and O_WRONLY flags
      #   2) opened with an absolute path (starts with "/")
      #   3) the current open file handle does not match its original open path
      #   4) unbuffered (as far as userspace buffering goes)
      # Returns the number of files reopened
      def reopen_logs
        nr = 0
        ObjectSpace.each_object(File) do |fp|
          next if fp.closed?
          next unless (fp.sync && fp.path[0..0] == "/")
          next unless (fp.fcntl(Fcntl::F_GETFL) & APPEND_FLAGS) == APPEND_FLAGS

          begin
            a, b = fp.stat, File.stat(fp.path)
            next if a.ino == b.ino && a.dev == b.dev
          rescue Errno::ENOENT
          end

          open_arg = 'a'
          if fp.respond_to?(:external_encoding) && enc = fp.external_encoding
            open_arg << ":#{enc.to_s}"
            enc = fp.internal_encoding and open_arg << ":#{enc.to_s}"
          end
          fp.reopen(fp.path, open_arg)
          fp.sync = true
          nr += 1
        end # each_object
        nr
      end

    end

  end
end

git clone https://yhbt.net/unicorn.git