ipc.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. This Source Code Form is subject to the terms of the Mozilla Public
  3. License, v. 2.0. If a copy of the MPL was not distributed with this
  4. file, You can obtain one at https://mozilla.org/MPL/2.0/.
  5. */
  6. package ipc
  7. import (
  8. "fmt"
  9. "net"
  10. "idio.link/go/ipc/internal"
  11. )
  12. type LogLevel int
  13. func NewClient() *Client {
  14. return &Client{
  15. cpm: internal.NewClientPM(),
  16. log: internal.NewLogger(),
  17. }
  18. }
  19. type Client struct {
  20. conn net.Conn
  21. cpm *internal.ClientPM
  22. log *internal.Logger
  23. }
  24. func (c *Client) LogLevel(l LogLevel) {
  25. c.log.Level(internal.LogLevel(l))
  26. }
  27. func (c *Client) Close() (err error) {
  28. err = c.conn.Close()
  29. if err != nil {
  30. err = fmt.Errorf("ipc client: failed to close connection: %v", err)
  31. }
  32. return
  33. }
  34. func (c *Client) Alloc() (err error) {
  35. c.log.Debug("connect to ipc service")
  36. abstract := "\000idio.link/go/ipc"
  37. c.conn, err = net.Dial("unixpacket", abstract)
  38. if err != nil {
  39. err = fmt.Errorf("ipc client alloc: %v", err)
  40. return
  41. }
  42. c.log.Debug("send allocation request")
  43. buf := make([]byte, 1024)
  44. sdu := c.cpm.ReqAlloc(buf)
  45. err = internal.Send(c.conn, sdu)
  46. if err != nil {
  47. _ = c.Close()
  48. err = fmt.Errorf("send: %v", err)
  49. return
  50. }
  51. sdu, err = internal.Receive(c.conn, buf)
  52. if err != nil {
  53. _ = c.Close()
  54. err = fmt.Errorf("receive: %v", err)
  55. }
  56. c.log.Debug("got %q\n", sdu)
  57. return
  58. }