diff --git a/listener/unix/listener.go b/listener/unix/listener.go index 22e27a6f..2680f326 100644 --- a/listener/unix/listener.go +++ b/listener/unix/listener.go @@ -2,6 +2,7 @@ package unix import ( "net" + "os" "time" "github.com/go-gost/core/limiter" @@ -48,6 +49,12 @@ func (l *unixListener) Init(md md.Metadata) (err error) { if err != nil { return } + if l.md.fileMode > 0 { + if err = os.Chmod(l.options.Addr, l.md.fileMode); err != nil { + ln.Close() + return + } + } ln = proxyproto.WrapListener(l.options.ProxyProtocol, ln, 10*time.Second) ln = metrics.WrapListener(l.options.Service, ln) diff --git a/listener/unix/metadata.go b/listener/unix/metadata.go index 767bce40..fd17ca71 100644 --- a/listener/unix/metadata.go +++ b/listener/unix/metadata.go @@ -1,11 +1,27 @@ package unix import ( + "os" + "strconv" + md "github.com/go-gost/core/metadata" ) -type metadata struct{} +type metadata struct { + fileMode os.FileMode +} func (l *unixListener) parseMetadata(md md.Metadata) (err error) { + if !md.IsExists("mode") { + return + } + + switch v := md.Get("mode").(type) { + case int: + l.md.fileMode = os.FileMode(v) + case string: + n, _ := strconv.ParseInt(v, 0, 32) + l.md.fileMode = os.FileMode(n) + } return }