Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 7
- Log:
Initial import of RForum 0.2 sources from a downloaded Tarball.
RForum is a Ruby On Rails based forum and mail gateway service.
- Author:
- adh
- Date:
- Sat Jul 22 18:43:13 +0100 2006
- Size:
- 1412 Bytes
1 | require File.dirname(__FILE__) + '/../config/environment.rb' |
2 | require 'socket' |
3 | require 'thread' |
4 | require 'nntp' |
5 | require 'log4r' |
6 | |
7 | #include Log4r |
8 | |
9 | PORT = 9999 |
10 | MAX_CONNS_PER_IP = 3 |
11 | MAX_CONNS = 30 |
12 | |
13 | logger = Log4r::Logger.new "nntpd" |
14 | logger.outputters = Log4r::Outputter.stdout |
15 | |
16 | Thread.abort_on_exception = true |
17 | server = TCPserver.open(PORT) |
18 | logger.info "Listening on #{PORT}" |
19 | |
20 | conns_counter_mutex = Mutex.new |
21 | conns = 0 |
22 | conns_per_ip = Hash.new |
23 | |
24 | loop do |
25 | socket = server.accept |
26 | ip = socket.peeraddr[3] |
27 | logger.info "connection from #{ip}" |
28 | |
29 | if conns >= MAX_CONNS |
30 | logger.info "too many connections" |
31 | socket.warn "502 Too many connections\r\n" |
32 | socket.shutdown |
33 | next |
34 | end |
35 | if conns_per_ip[ip].to_i >= MAX_CONNS_PER_IP |
36 | logger.warn "too many connections from #{ip}" |
37 | socket.write "502 Too many connections from #{ip}\r\n" |
38 | socket.shutdown |
39 | next |
40 | end |
41 | |
42 | conns_counter_mutex.synchronize do |
43 | conns += 1 |
44 | if conns_per_ip[ip] == nil |
45 | conns_per_ip[ip] = 1 |
46 | else |
47 | conns_per_ip[ip] += 1 |
48 | end |
49 | end |
50 | |
51 | Thread.start(socket, ip, logger) do |socket, ip, logger| |
52 | begin |
53 | NNTPSession.new(socket, logger).serve |
54 | rescue => err |
55 | logger.error err |
56 | ensure |
57 | socket.shutdown rescue nil |
58 | GC.start |
59 | conns_counter_mutex.synchronize do |
60 | conns -= 1 |
61 | conns_per_ip[ip] -= 1 |
62 | end |
63 | logger.info "connection to #{ip} lost" |
64 | end |
65 | end |
66 | |
67 | end |