server_linux.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. // +build linux
  2. package server
  3. import (
  4. "fmt"
  5. "net/http"
  6. "os"
  7. "syscall"
  8. "github.com/docker/docker/engine"
  9. )
  10. // NewServer sets up the required Server and does protocol specific checking.
  11. func NewServer(proto, addr string, job *engine.Job) (Server, error) {
  12. // Basic error and sanity checking
  13. switch proto {
  14. case "fd":
  15. return nil, serveFd(addr, job)
  16. case "tcp":
  17. return setupTcpHttp(addr, job)
  18. case "unix":
  19. return setupUnixHttp(addr, job)
  20. default:
  21. return nil, fmt.Errorf("Invalid protocol format.")
  22. }
  23. }
  24. func setupUnixHttp(addr string, job *engine.Job) (*HttpServer, error) {
  25. r := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("Version"))
  26. if err := syscall.Unlink(addr); err != nil && !os.IsNotExist(err) {
  27. return nil, err
  28. }
  29. mask := syscall.Umask(0777)
  30. defer syscall.Umask(mask)
  31. l, err := newListener("unix", addr, job.GetenvBool("BufferRequests"))
  32. if err != nil {
  33. return nil, err
  34. }
  35. if err := setSocketGroup(addr, job.Getenv("SocketGroup")); err != nil {
  36. return nil, err
  37. }
  38. if err := os.Chmod(addr, 0660); err != nil {
  39. return nil, err
  40. }
  41. return &HttpServer{&http.Server{Addr: addr, Handler: r}, l}, nil
  42. }