Compare commits

..

No commits in common. "23f637dd47837a6f52e73bca42e14b1923a6dc95" and "4fa84cc877937834fea84b1977c68c9f8cd9642e" have entirely different histories.

View File

@ -87,7 +87,7 @@ func detectTLS(sysconn syscall.RawConn) (isTLS bool) {
isTLS = buf[0]&0x80 != 0 && buf[2] == 1
fallthrough
case n == 2:
isTLS = isTLS || buf[0] == 22 && buf[1] == 3
isTLS = buf[0] == 22 && buf[1] == 3
case n == 1:
isTLS = buf[0] == 22
case err == syscall.EAGAIN:
@ -748,29 +748,26 @@ type writeEvent struct {
err error // write error
}
// TODO: Maybe we want to keep it in a struct?
// A better question might be: can we run multiple instances of it?
// TODO: Port server_context. Maybe we want to keep it in a struct? A better
// question might be: can we run multiple instances of it?
// XXX: Beware that maps with identifier keys need to be indexed correctly.
// We might want to enforce accessor functions for users and channels.
var (
// network
started time.Time // when has the server been started
listeners []net.Listener
clients = make(map[*client]bool)
// IRC state
// XXX: Beware that maps with identifier keys need to be indexed correctly.
// We might want to enforce accessor functions for users and channels.
started time.Time // when the server has been started
users = make(map[string]*client) // maps nicknames to clients
channels = make(map[string]*channel) // maps channel names to data
whowas = make(map[string]*whowasInfo) // WHOWAS registry
// event loop
quitting bool
quitTimer <-chan time.Time
config simpleConfig // server configuration
serverName string // our server name
pingInterval time.Duration // ping interval
maxConnections int // max connections allowed or 0
motd []string // MOTD (none if empty)
operators = make(map[string]bool) // TLS cert. fingerprints for IRCops
)
var (
sigs = make(chan os.Signal, 1)
conns = make(chan net.Conn)
prepared = make(chan preparedEvent)
@ -778,16 +775,11 @@ var (
writes = make(chan writeEvent)
timers = make(chan func())
// configuration
config simpleConfig // server configuration
tlsConf *tls.Config // TLS connection configuration
serverName string // our server name
pingInterval time.Duration // ping interval
maxConnections int // max connections allowed or 0
motd []string // MOTD (none if empty)
catalog map[int]string // message catalog for server msgs
operators map[string]bool // TLS certificate fingerprints for IRCops
tlsConf *tls.Config
clients = make(map[*client]bool)
listeners []net.Listener
quitting bool
quitTimer <-chan time.Time
)
// Forcefully tear down all connections.
@ -1081,14 +1073,11 @@ func (c *client) setPingTimer() {
func (c *client) makeReply(id int, ap ...interface{}) string {
s := fmt.Sprintf(":%s %03d %s ", serverName, id, c.nicknameOrStar())
if reply, ok := catalog[id]; ok {
return s + fmt.Sprintf(reply, ap...)
}
return s + fmt.Sprintf(defaultReplies[id], ap...)
a := fmt.Sprintf(defaultReplies[id], ap...)
return s + a
}
// XXX: This way simple static analysis cannot typecheck the arguments, so we
// need to be careful.
// XXX: This way we cannot typecheck the arguments, so we should be careful.
func (c *client) sendReply(id int, args ...interface{}) {
c.send(c.makeReply(id, args...))
}
@ -3152,43 +3141,9 @@ func ircInitializeTLS() error {
}
func ircInitializeCatalog() error {
configCatalog := config["catalog"]
if configCatalog == "" {
return nil
}
path := resolveFilename(configCatalog, resolveRelativeConfigFilename)
if path == "" {
return fmt.Errorf("cannot find file: %s", configCatalog)
}
f, err := os.Open(path)
if err != nil {
return fmt.Errorf("failed reading the MOTD file: %s", err)
}
defer f.Close()
scanner := bufio.NewScanner(f)
catalog = make(map[int]string)
for lineNo := 1; scanner.Scan(); lineNo++ {
line := strings.TrimLeft(scanner.Text(), " \t")
if line == "" || strings.HasPrefix(line, "#") {
continue
}
delim := strings.IndexAny(line, " \t")
if delim < 0 {
return fmt.Errorf("%s:%d: malformed line", path, lineNo)
}
id, err := strconv.ParseUint(line[:delim], 10, 16)
if err != nil {
return fmt.Errorf("%s:%d: %s", path, lineNo, err)
}
catalog[int(id)] = line[delim+1:]
}
return scanner.Err()
// TODO: Not going to use catgets but a simple text file with basic
// checking whether the index is used by this daemon at all should do.
return nil
}
func ircInitializeMOTD() error {
@ -3197,12 +3152,12 @@ func ircInitializeMOTD() error {
return nil
}
path := resolveFilename(configMOTD, resolveRelativeConfigFilename)
if path == "" {
pathMOTD := resolveFilename(configMOTD, resolveRelativeConfigFilename)
if pathMOTD == "" {
return fmt.Errorf("cannot find file: %s", configMOTD)
}
f, err := os.Open(path)
f, err := os.Open(pathMOTD)
if err != nil {
return fmt.Errorf("failed reading the MOTD file: %s", err)
}
@ -3326,7 +3281,7 @@ func main() {
}
if flag.NArg() > 0 {
flag.Usage()
os.Exit(2)
os.Exit(1)
}
config = make(simpleConfig)