diff --git a/config/config.go b/config/config.go index 5fb31204a..1a820c422 100644 --- a/config/config.go +++ b/config/config.go @@ -24,7 +24,12 @@ func Load(filename string) ([]Config, error) { return nil, err } defer file.Close() - p := newParser(file) + + p, err := newParser(file) + if err != nil { + return nil, err + } + return p.parse() } diff --git a/config/directives.go b/config/directives.go index 16d0e897f..85a677f4a 100644 --- a/config/directives.go +++ b/config/directives.go @@ -28,12 +28,16 @@ func init() { return p.argErr() } - file, err := os.Open(p.tkn()) + filename := p.tkn() + file, err := os.Open(filename) if err != nil { return p.err("Parse", err.Error()) } defer file.Close() - p2 := newParser(file) + p2, err := newParser(file) + if err != nil { + return p.err("Parse", "Could not import "+filename+"; "+err.Error()) + } p2.cfg = p.cfg err = p2.directives() diff --git a/config/parser.go b/config/parser.go index 484fa9d3e..42855ed85 100644 --- a/config/parser.go +++ b/config/parser.go @@ -20,10 +20,16 @@ type parser struct { // newParser makes a new parser and prepares it for parsing, given // the input to parse. -func newParser(file *os.File) *parser { - p := &parser{filename: file.Name()} +func newParser(file *os.File) (*parser, error) { + stat, err := file.Stat() + if err != nil { + return nil, err + } + + p := &parser{filename: stat.Name()} p.lexer.load(file) - return p + + return p, nil } // Parse parses the configuration file. It produces a slice of Config diff --git a/config/parsing.go b/config/parsing.go index 9c12d9bc7..4d7289fb6 100644 --- a/config/parsing.go +++ b/config/parsing.go @@ -45,6 +45,7 @@ func (p *parser) addressBlock() error { err := p.openCurlyBrace() if err != nil { // meh, single-server configs don't need curly braces + p.unused = true // we read the token but aren't consuming it return p.directives() }