@@ -23,6 +23,7 @@ import (
23
23
const (
24
24
listenFDs = "LISTEN_FDS"
25
25
startFD = 3
26
+ unlinkFDs = "GITEA_UNLINK_FDS"
26
27
)
27
28
28
29
// In order to keep the working directory the same as when we started we record
33
34
once = sync.Once {}
34
35
mutex = sync.Mutex {}
35
36
36
- providedListeners = []net.Listener {}
37
- activeListeners = []net.Listener {}
37
+ providedListenersToUnlink = []bool {}
38
+ activeListenersToUnlink = []bool {}
39
+ providedListeners = []net.Listener {}
40
+ activeListeners = []net.Listener {}
38
41
)
39
42
40
43
func getProvidedFDs () (savedErr error ) {
@@ -53,6 +56,16 @@ func getProvidedFDs() (savedErr error) {
53
56
return
54
57
}
55
58
59
+ fdsToUnlinkStr := strings .Split (os .Getenv (unlinkFDs ), "," )
60
+ providedListenersToUnlink = make ([]bool , n )
61
+ for _ , fdStr := range fdsToUnlinkStr {
62
+ i , err := strconv .Atoi (fdStr )
63
+ if err != nil || i < 0 || i >= n {
64
+ continue
65
+ }
66
+ providedListenersToUnlink [i ] = true
67
+ }
68
+
56
69
for i := startFD ; i < n + startFD ; i ++ {
57
70
file := os .NewFile (uintptr (i ), fmt .Sprintf ("listener_FD%d" , i ))
58
71
@@ -136,8 +149,11 @@ func GetListenerTCP(network string, address *net.TCPAddr) (*net.TCPListener, err
136
149
for i , l := range providedListeners {
137
150
if isSameAddr (l .Addr (), address ) {
138
151
providedListeners = append (providedListeners [:i ], providedListeners [i + 1 :]... )
152
+ needsUnlink := providedListenersToUnlink [i ]
153
+ providedListenersToUnlink = append (providedListenersToUnlink [:i ], providedListenersToUnlink [i + 1 :]... )
139
154
140
155
activeListeners = append (activeListeners , l )
156
+ activeListenersToUnlink = append (activeListenersToUnlink , needsUnlink )
141
157
return l .(* net.TCPListener ), nil
142
158
}
143
159
}
@@ -148,6 +164,7 @@ func GetListenerTCP(network string, address *net.TCPAddr) (*net.TCPListener, err
148
164
return nil , err
149
165
}
150
166
activeListeners = append (activeListeners , l )
167
+ activeListenersToUnlink = append (activeListenersToUnlink , false )
151
168
return l , nil
152
169
}
153
170
@@ -166,9 +183,15 @@ func GetListenerUnix(network string, address *net.UnixAddr) (*net.UnixListener,
166
183
for i , l := range providedListeners {
167
184
if isSameAddr (l .Addr (), address ) {
168
185
providedListeners = append (providedListeners [:i ], providedListeners [i + 1 :]... )
186
+ needsUnlink := providedListenersToUnlink [i ]
187
+ providedListenersToUnlink = append (providedListenersToUnlink [:i ], providedListenersToUnlink [i + 1 :]... )
188
+
189
+ activeListenersToUnlink = append (activeListenersToUnlink , needsUnlink )
169
190
activeListeners = append (activeListeners , l )
170
191
unixListener := l .(* net.UnixListener )
171
- unixListener .SetUnlinkOnClose (true )
192
+ if needsUnlink {
193
+ unixListener .SetUnlinkOnClose (true )
194
+ }
172
195
return unixListener , nil
173
196
}
174
197
}
@@ -189,6 +212,7 @@ func GetListenerUnix(network string, address *net.UnixAddr) (*net.UnixListener,
189
212
}
190
213
191
214
activeListeners = append (activeListeners , l )
215
+ activeListenersToUnlink = append (activeListenersToUnlink , true )
192
216
return l , nil
193
217
}
194
218
@@ -223,3 +247,11 @@ func getActiveListeners() []net.Listener {
223
247
copy (listeners , activeListeners )
224
248
return listeners
225
249
}
250
+
251
+ func getActiveListenersToUnlink () []bool {
252
+ mutex .Lock ()
253
+ defer mutex .Unlock ()
254
+ listenersToUnlink := make ([]bool , len (activeListenersToUnlink ))
255
+ copy (listenersToUnlink , activeListenersToUnlink )
256
+ return listenersToUnlink
257
+ }
0 commit comments