8
8
"net"
9
9
"os"
10
10
"os/signal"
11
+ "os/user"
12
+ "strconv"
11
13
"strings"
12
14
"sync"
13
15
"syscall"
@@ -18,15 +20,76 @@ func main() {
18
20
network := flag .String ("network" , "tcp" , "" )
19
21
notlsaction := flag .String ("notls" , "reject" , "" )
20
22
tlsaction := flag .String ("tls" , "dunno" , "" )
23
+
24
+ perm := flag .Uint64 ("perm" , 0660 , "unix socket permmissions (when -network unix)" )
25
+ userU := flag .String ("user" , "" , "unix socket user (when -network unix)" )
26
+ groupU := flag .String ("group" , "" , "unix socket group (when -network unix)" )
21
27
flag .Parse ()
22
28
29
+ if * network == "unix" {
30
+ syscall .Umask (0777 )
31
+ }
32
+
23
33
listener , err := net .Listen (* network , * listen )
24
34
if err != nil {
25
35
fmt .Fprintf (os .Stderr , "%v\n " , err )
26
36
os .Exit (1 )
27
37
}
28
- wg := sync.WaitGroup {}
29
38
39
+ if * network == "unix" {
40
+ if err := os .Chmod (* listen , os .FileMode (* perm )); err != nil {
41
+ listener .Close ()
42
+ fmt .Fprintf (os .Stderr , "%v\n " , err )
43
+ os .Exit (1 )
44
+ }
45
+
46
+ if * userU != "" {
47
+ userUID , err := user .Lookup (* userU )
48
+ if err != nil {
49
+ listener .Close ()
50
+ fmt .Fprintf (os .Stderr , "%v\n " , err )
51
+ os .Exit (1 )
52
+ }
53
+
54
+ uid , err := strconv .ParseInt (userUID .Uid , 10 , 31 )
55
+ if err != nil {
56
+ listener .Close ()
57
+ fmt .Fprintf (os .Stderr , "%v\n " , err )
58
+ os .Exit (1 )
59
+ }
60
+
61
+ if err := os .Chown (* listen , int (uid ), - 1 ); err != nil {
62
+ listener .Close ()
63
+ fmt .Fprintf (os .Stderr , "%v\n " , err )
64
+ os .Exit (1 )
65
+ }
66
+ }
67
+
68
+ if * groupU != "" {
69
+ groupUID , err := user .LookupGroup (* groupU )
70
+ if err != nil {
71
+ listener .Close ()
72
+ fmt .Fprintf (os .Stderr , "%v\n " , err )
73
+ os .Exit (1 )
74
+ }
75
+
76
+ gid , err := strconv .ParseInt (groupUID .Gid , 10 , 31 )
77
+ if err != nil {
78
+ listener .Close ()
79
+ fmt .Fprintf (os .Stderr , "%v\n " , err )
80
+ os .Exit (1 )
81
+ }
82
+
83
+ if err := os .Chown (* listen , - 1 , int (gid )); err != nil {
84
+ listener .Close ()
85
+ fmt .Fprintf (os .Stderr , "%v\n " , err )
86
+ os .Exit (1 )
87
+ }
88
+ }
89
+
90
+ }
91
+
92
+ wg := sync.WaitGroup {}
30
93
done := make (chan struct {})
31
94
32
95
sig := make (chan os.Signal )
0 commit comments