12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- /*
- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at https://mozilla.org/MPL/2.0/.
- */
- package ipc
- import (
- "fmt"
- "net"
- "idio.link/go/ipc/internal"
- )
- type LogLevel int
- func NewClient() *Client {
- return &Client{
- cpm: internal.NewClientPM(),
- log: internal.NewLogger(),
- }
- }
- type Client struct {
- conn net.Conn
- cpm *internal.ClientPM
- log *internal.Logger
- }
- func (c *Client) LogLevel(l LogLevel) {
- c.log.Level(internal.LogLevel(l))
- }
- func (c *Client) Close() (err error) {
- err = c.conn.Close()
- if err != nil {
- err = fmt.Errorf("ipc client: failed to close connection: %v", err)
- }
- return
- }
- func (c *Client) Alloc() (err error) {
- c.log.Debug("connect to ipc service")
- abstract := "\000idio.link/go/ipc"
- c.conn, err = net.Dial("unixpacket", abstract)
- if err != nil {
- err = fmt.Errorf("ipc client alloc: %v", err)
- return
- }
- c.log.Debug("send allocation request")
- buf := make([]byte, 1024)
- sdu := c.cpm.ReqAlloc(buf)
- err = internal.Send(c.conn, sdu)
- if err != nil {
- _ = c.Close()
- err = fmt.Errorf("send: %v", err)
- return
- }
- sdu, err = internal.Receive(c.conn, buf)
- if err != nil {
- _ = c.Close()
- err = fmt.Errorf("receive: %v", err)
- }
- c.log.Debug("got %q\n", sdu)
- return
- }
|