diff options
Diffstat (limited to 'vendor/github.com/ftrvxmtrx/fd')
-rw-r--r-- | vendor/github.com/ftrvxmtrx/fd/LICENSE.MIT | 18 | ||||
-rw-r--r-- | vendor/github.com/ftrvxmtrx/fd/README.md | 25 | ||||
-rw-r--r-- | vendor/github.com/ftrvxmtrx/fd/fd.go | 104 |
3 files changed, 0 insertions, 147 deletions
diff --git a/vendor/github.com/ftrvxmtrx/fd/LICENSE.MIT b/vendor/github.com/ftrvxmtrx/fd/LICENSE.MIT deleted file mode 100644 index 136e69e..0000000 --- a/vendor/github.com/ftrvxmtrx/fd/LICENSE.MIT +++ /dev/null @@ -1,18 +0,0 @@ -Copyright © 2012 Serge Zirukin - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/ftrvxmtrx/fd/README.md b/vendor/github.com/ftrvxmtrx/fd/README.md deleted file mode 100644 index 7a8a239..0000000 --- a/vendor/github.com/ftrvxmtrx/fd/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# fd - -Package fd provides a simple API to pass file descriptors -between different OS processes. - -It can be useful if you want to inherit network connections -from another process without closing them. - -Example scenario: - - * Running server receives a "let's upgrade" message - * Server opens a Unix domain socket for the "upgrade" - * Server starts a new copy of itself and passes Unix domain - socket name - * New copy starts reading data from the socket - * Server sends its state over the socket, also sending the number - of network connections to inherit, then it sends those connections - using fd.Put() - * New server copy reads the state and inherits connections using fd.Get(), - checks that everything is OK and writes an "OK" message to the socket - * Server receives "OK" message and kills itself - -## Documentation - -[fd on godoc.org](http://godoc.org/github.com/ftrvxmtrx/fd) diff --git a/vendor/github.com/ftrvxmtrx/fd/fd.go b/vendor/github.com/ftrvxmtrx/fd/fd.go deleted file mode 100644 index a5a4d48..0000000 --- a/vendor/github.com/ftrvxmtrx/fd/fd.go +++ /dev/null @@ -1,104 +0,0 @@ -// Package fd provides a simple API to pass file descriptors -// between different OS processes. -// -// It can be useful if you want to inherit network connections -// from another process without closing them. -// -// Example scenario: -// -// 1) Running server receives a "let's upgrade" message -// 2) Server opens a Unix domain socket for the "upgrade" -// 3) Server starts a new copy of itself and passes Unix domain socket name -// 4) New copy starts reading for the socket -// 5) Server sends its state over the socket, also sending the number -// of network connections to inherit, then it sends those connections -// using fd.Put() -// 6) New copy reads the state and inherits connections using fd.Get(), -// checks that everything is OK and sends the "OK" message to the socket -// 7) Server receives "OK" message and kills itself -package fd - -import ( - "net" - "os" - "syscall" -) - -// Get receives file descriptors from a Unix domain socket. -// -// Num specifies the expected number of file descriptors in one message. -// Internal files' names to be assigned are specified via optional filenames -// argument. -// -// You need to close all files in the returned slice. The slice can be -// non-empty even if this function returns an error. -// -// Use net.FileConn() if you're receiving a network connection. -func Get(via *net.UnixConn, num int, filenames []string) ([]*os.File, error) { - if num < 1 { - return nil, nil - } - - // get the underlying socket - viaf, err := via.File() - if err != nil { - return nil, err - } - socket := int(viaf.Fd()) - defer viaf.Close() - - // recvmsg - buf := make([]byte, syscall.CmsgSpace(num*4)) - _, _, _, _, err = syscall.Recvmsg(socket, nil, buf, 0) - if err != nil { - return nil, err - } - - // parse control msgs - var msgs []syscall.SocketControlMessage - msgs, err = syscall.ParseSocketControlMessage(buf) - - // convert fds to files - res := make([]*os.File, 0, len(msgs)) - for i := 0; i < len(msgs) && err == nil; i++ { - var fds []int - fds, err = syscall.ParseUnixRights(&msgs[i]) - - for fi, fd := range fds { - var filename string - if fi < len(filenames) { - filename = filenames[fi] - } - - res = append(res, os.NewFile(uintptr(fd), filename)) - } - } - - return res, err -} - -// Put sends file descriptors to Unix domain socket. -// -// Please note that the number of descriptors in one message is limited -// and is rather small. -// Use conn.File() to get a file if you want to put a network connection. -func Put(via *net.UnixConn, files ...*os.File) error { - if len(files) == 0 { - return nil - } - - viaf, err := via.File() - if err != nil { - return err - } - socket := int(viaf.Fd()) - defer viaf.Close() - - fds := make([]int, len(files)) - for i := range files { - fds[i] = int(files[i].Fd()) - } - - rights := syscall.UnixRights(fds...) - return syscall.Sendmsg(socket, nil, rights, nil, 0) -} |