rule_item_process_name.go 968 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package rule
  2. import (
  3. "path/filepath"
  4. "strings"
  5. "github.com/sagernet/sing-box/adapter"
  6. )
  7. var _ RuleItem = (*ProcessItem)(nil)
  8. type ProcessItem struct {
  9. processes []string
  10. processMap map[string]bool
  11. }
  12. func NewProcessItem(processNameList []string) *ProcessItem {
  13. rule := &ProcessItem{
  14. processes: processNameList,
  15. processMap: make(map[string]bool),
  16. }
  17. for _, processName := range processNameList {
  18. rule.processMap[processName] = true
  19. }
  20. return rule
  21. }
  22. func (r *ProcessItem) Match(metadata *adapter.InboundContext) bool {
  23. if metadata.ProcessInfo == nil || metadata.ProcessInfo.ProcessPath == "" {
  24. return false
  25. }
  26. return r.processMap[filepath.Base(metadata.ProcessInfo.ProcessPath)]
  27. }
  28. func (r *ProcessItem) String() string {
  29. var description string
  30. pLen := len(r.processes)
  31. if pLen == 1 {
  32. description = "process_name=" + r.processes[0]
  33. } else {
  34. description = "process_name=[" + strings.Join(r.processes, " ") + "]"
  35. }
  36. return description
  37. }