in pcap-cli/cmd/pcap.go [80:130]
func main() {
flag.Parse()
config := &pcap.PcapConfig{
Promisc: *promisc,
Snaplen: *snaplen,
TsType: *tsType,
Format: *format,
Filter: *filter,
Output: *writeTo,
Interval: *interval,
Extension: *extension,
Ordered: *ordered,
ConnTrack: *conntrack,
}
exp, _ := regexp.Compile(fmt.Sprintf("^(?:ipvlan-)?%s.*", *iface))
devs, _ := pcap.FindDevicesByRegex(exp)
ctx := context.Background()
var cancel context.CancelFunc
id := fmt.Sprintf("cli/%s", uuid.New())
ctx = context.WithValue(ctx, pcap.PcapContextID, id)
ctx = context.WithValue(ctx, pcap.PcapContextLogName, `log/`+id)
if *timeout > 0 {
ctx, cancel = context.WithTimeout(ctx, time.Duration(*timeout)*time.Second)
} else {
ctx, cancel = context.WithCancel(ctx)
}
var wg sync.WaitGroup
stopDeadlineChan := make(chan *time.Duration, 1)
signals := make(chan os.Signal, 1)
signal.Notify(signals, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
go func() {
<-signals
cancel()
deadline := 3 * time.Second
stopDeadlineChan <- &deadline
}()
for _, dev := range devs {
wg.Add(1)
go startPCAP(ctx, &id, dev, config, &wg, stopDeadlineChan)
}
wg.Wait()
}