Browse Source

feat(transport): allow to set permission for unix domain socket

Allo 2 years ago
parent
commit
79164496d0
1 changed files with 21 additions and 0 deletions
  1. 21 0
      transport/internet/system_listener.go

+ 21 - 0
transport/internet/system_listener.go

@@ -2,7 +2,10 @@ package internet
 
 
 import (
 import (
 	"context"
 	"context"
+	"os"
 	"runtime"
 	"runtime"
+	"strconv"
+	"strings"
 	"syscall"
 	"syscall"
 	"time"
 	"time"
 
 
@@ -66,6 +69,24 @@ func (dl *DefaultListener) Listen(ctx context.Context, addr net.Addr, sockopt *S
 				address = string(fullAddr)
 				address = string(fullAddr)
 			}
 			}
 		} else {
 		} else {
+			// normal unix domain socket
+			// parse file mode from address
+			if s := strings.Split(address, ","); len(s) == 2 {
+				fMode, err := strconv.ParseUint(s[1], 8, 32)
+				if err != nil {
+					return nil, newError("failed to parse file mode").Base(err)
+				}
+				address = s[0]
+				// set file mode for unix domain socket when it is created
+				defer func(name string, mode os.FileMode) {
+					if err != nil {
+						return
+					}
+					if cerr := os.Chmod(name, mode); cerr != nil {
+						err = newError("failed to set file mode for file: ", name).Base(cerr)
+					}
+				}(address, os.FileMode(fMode))
+			}
 			// normal unix domain socket needs lock
 			// normal unix domain socket needs lock
 			locker := &FileLocker{
 			locker := &FileLocker{
 				path: address + ".lock",
 				path: address + ".lock",