ipc_unix.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
  2. package comms
  3. import (
  4. "io"
  5. "net"
  6. "os"
  7. "github.com/ethereum/go-ethereum/logger"
  8. "github.com/ethereum/go-ethereum/logger/glog"
  9. "github.com/ethereum/go-ethereum/rpc/api"
  10. "github.com/ethereum/go-ethereum/rpc/codec"
  11. "github.com/ethereum/go-ethereum/rpc/shared"
  12. )
  13. func newIpcClient(cfg IpcConfig, codec codec.Codec) (*ipcClient, error) {
  14. c, err := net.DialUnix("unix", nil, &net.UnixAddr{cfg.Endpoint, "unix"})
  15. if err != nil {
  16. return nil, err
  17. }
  18. return &ipcClient{codec.New(c)}, nil
  19. }
  20. func startIpc(cfg IpcConfig, codec codec.Codec, api api.EthereumApi) error {
  21. os.Remove(cfg.Endpoint) // in case it still exists from a previous run
  22. l, err := net.ListenUnix("unix", &net.UnixAddr{Name: cfg.Endpoint, Net: "unix"})
  23. if err != nil {
  24. return err
  25. }
  26. os.Chmod(cfg.Endpoint, 0600)
  27. go func() {
  28. for {
  29. conn, err := l.AcceptUnix()
  30. if err != nil {
  31. glog.V(logger.Error).Infof("Error accepting ipc connection - %v\n", err)
  32. continue
  33. }
  34. go func(conn net.Conn) {
  35. codec := codec.New(conn)
  36. for {
  37. req, err := codec.ReadRequest()
  38. if err == io.EOF {
  39. codec.Close()
  40. return
  41. } else if err != nil {
  42. glog.V(logger.Error).Infof("IPC recv err - %v\n", err)
  43. codec.Close()
  44. return
  45. }
  46. var rpcResponse interface{}
  47. res, err := api.Execute(req)
  48. rpcResponse = shared.NewRpcResponse(req.Id, req.Jsonrpc, res, err)
  49. err = codec.WriteResponse(rpcResponse)
  50. if err != nil {
  51. glog.V(logger.Error).Infof("IPC send err - %v\n", err)
  52. codec.Close()
  53. return
  54. }
  55. }
  56. }(conn)
  57. }
  58. os.Remove(cfg.Endpoint)
  59. }()
  60. glog.V(logger.Info).Infof("IPC service started (%s)\n", cfg.Endpoint)
  61. return nil
  62. }