ipc_unix.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
  2. package comms
  3. import (
  4. "net"
  5. "os"
  6. "github.com/ethereum/go-ethereum/logger"
  7. "github.com/ethereum/go-ethereum/logger/glog"
  8. "github.com/ethereum/go-ethereum/rpc/codec"
  9. "github.com/ethereum/go-ethereum/rpc/shared"
  10. )
  11. func newIpcClient(cfg IpcConfig, codec codec.Codec) (*ipcClient, error) {
  12. c, err := net.DialUnix("unix", nil, &net.UnixAddr{cfg.Endpoint, "unix"})
  13. if err != nil {
  14. return nil, err
  15. }
  16. return &ipcClient{cfg.Endpoint, codec, codec.New(c)}, nil
  17. }
  18. func (self *ipcClient) reconnect() error {
  19. self.coder.Close()
  20. c, err := net.DialUnix("unix", nil, &net.UnixAddr{self.endpoint, "unix"})
  21. if err == nil {
  22. self.coder = self.codec.New(c)
  23. }
  24. return err
  25. }
  26. func startIpc(cfg IpcConfig, codec codec.Codec, api shared.EthereumApi) error {
  27. os.Remove(cfg.Endpoint) // in case it still exists from a previous run
  28. l, err := net.ListenUnix("unix", &net.UnixAddr{Name: cfg.Endpoint, Net: "unix"})
  29. if err != nil {
  30. return err
  31. }
  32. os.Chmod(cfg.Endpoint, 0600)
  33. go func() {
  34. for {
  35. conn, err := l.AcceptUnix()
  36. if err != nil {
  37. glog.V(logger.Error).Infof("Error accepting ipc connection - %v\n", err)
  38. continue
  39. }
  40. go handle(conn, api, codec)
  41. }
  42. os.Remove(cfg.Endpoint)
  43. }()
  44. glog.V(logger.Info).Infof("IPC service started (%s)\n", cfg.Endpoint)
  45. return nil
  46. }