code: func services(svc *Service) ([]*Service, error) {
  	var flags int
  	if svc == nil {
  		flags = netlink.MFDump
  	}
  
  	msg, err := netlink.NewMessage(C.IPVS_CMD_GET_SERVICE, family, flags)
  	if err != nil {
  		return nil, err
  	}
  	defer msg.Free()
  
  	if svc != nil {
  		ic := &ipvsCommand{Service: newIPVSService(svc)}
  		if err := msg.Marshal(ic); err != nil {
  			return nil, err
  		}
  	}
  
  	var svcs []*Service
  	cb := func(msg *netlink.Message, arg interface{}) error {
  		ic := &ipvsCommand{}
  		if err := msg.Unmarshal(ic); err != nil {
  			return fmt.Errorf("failed to unmarshal service: %v", err)
  		}
  		if ic.Service == nil {
  			return errors.New("no service in unmarshalled message")
  		}
  		svcs = append(svcs, ic.Service.toService())
  		return nil
  	}
  	if err := msg.SendCallback(cb, nil); err != nil {
  		return nil, err
  	}
  
  	for _, svc := range svcs {
  		dsts, err := destinations(svc)
  		if err != nil {
  			return nil, err
  		}
  		svc.Destinations = dsts
  	}
  
  	return svcs, nil
  }
docs: // services returns a list of services that are currently configured in the
  // kernel IPVS table. If a specific service is given, an exact match will be
  // attempted and a single service will be returned if it is found.