sockets.go 1000 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package main
  2. import (
  3. "net"
  4. )
  5. // SyslogSocket is a struct eventually containing a net.Listener
  6. // ready with messages, and a Path in case the Listener is not present.
  7. type SyslogSocket struct {
  8. Listener net.Listener
  9. Conn net.PacketConn
  10. Path string
  11. isSocketActivated bool
  12. }
  13. // Set from command-line
  14. func (s *SyslogSocket) Set(v string) error {
  15. err := s.getActivationSocket()
  16. if err == nil && (s.Conn != nil || s.Listener != nil) {
  17. s.isSocketActivated = true
  18. }
  19. if !s.isSocketActivated {
  20. s.Path = v
  21. }
  22. return nil
  23. }
  24. func (s *SyslogSocket) String() string {
  25. if s.isSocketActivated {
  26. return "systemd-provided"
  27. }
  28. return s.Path
  29. }
  30. func (s *SyslogSocket) getActivationSocket() error {
  31. conns, err := PacketConns()
  32. if err == nil && len(conns) > 0 && conns[0] != nil {
  33. s.Conn = conns[0]
  34. return nil
  35. }
  36. listeners, err := Listeners()
  37. if err != nil {
  38. return err
  39. }
  40. if len(listeners) == 0 {
  41. return nil
  42. }
  43. s.Listener = listeners[0]
  44. return nil
  45. }