2020-05-09 17:36:41 +02:00
|
|
|
// Package ctlsock is a Go library that can be used to query the
|
|
|
|
// gocryptfs control socket interface. This interface can be
|
|
|
|
// activated by passing `-ctlsock /tmp/my.sock` to gocryptfs on the
|
|
|
|
// command line.
|
2020-05-09 19:09:09 +02:00
|
|
|
// See gocryptfs-xray for a usage example.
|
2020-05-09 17:36:41 +02:00
|
|
|
package ctlsock
|
|
|
|
|
2020-05-09 19:09:09 +02:00
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"net"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (r *ResponseStruct) Error() string {
|
|
|
|
return fmt.Sprintf("errno %d: %s", r.ErrNo, r.ErrText)
|
|
|
|
}
|
|
|
|
|
|
|
|
// CtlSock encapsulates a control socket
|
|
|
|
type CtlSock struct {
|
|
|
|
Conn net.Conn
|
|
|
|
}
|
|
|
|
|
|
|
|
// New opens the socket at `socketPath` and stores it in a `CtlSock` object.
|
|
|
|
func New(socketPath string) (*CtlSock, error) {
|
|
|
|
conn, err := net.DialTimeout("unix", socketPath, 1*time.Second)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return &CtlSock{Conn: conn}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Query sends a request to the control socket returns the response.
|
|
|
|
func (c *CtlSock) Query(req *RequestStruct) (*ResponseStruct, error) {
|
|
|
|
c.Conn.SetDeadline(time.Now().Add(time.Second))
|
|
|
|
msg, err := json.Marshal(req)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
_, err = c.Conn.Write(msg)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
buf := make([]byte, 5000)
|
|
|
|
n, err := c.Conn.Read(buf)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
buf = buf[:n]
|
|
|
|
var resp ResponseStruct
|
|
|
|
json.Unmarshal(buf, &resp)
|
|
|
|
if resp.ErrNo != 0 {
|
|
|
|
return nil, &resp
|
|
|
|
}
|
|
|
|
return &resp, nil
|
2020-05-09 17:36:41 +02:00
|
|
|
}
|
|
|
|
|
2020-05-09 19:09:09 +02:00
|
|
|
// Close closes the socket
|
|
|
|
func (c *CtlSock) Close() {
|
|
|
|
c.Conn.Close()
|
2020-05-09 17:36:41 +02:00
|
|
|
}
|