--- nono/host/netdriver_bpf.cpp 2026/04/29 17:04:34 1.1.1.3 +++ nono/host/netdriver_bpf.cpp 2026/04/29 17:04:48 1.1.1.4 @@ -5,8 +5,8 @@ // #include "netdriver_bpf.h" +#include "autofd.h" #include "cvprompt.h" -#include "mystring.h" #include #include #include @@ -48,6 +48,8 @@ NetDriverBPF::Init() BPF_STMT(BPF_RET + BPF_K, (u_int)-1), }; + putmsg(1, "NetDriverBPF"); + // XXX tap はデバイスを開くとインタフェースが出来る、という方向だが、 // bpf はインタフェースを指定してデバイスを開く、という方向で、逆…。 @@ -55,7 +57,7 @@ NetDriverBPF::Init() // インタフェース指定がなければそれっぽいのを探すか ifname = FindInterface(); if (ifname.empty()) { - warn("NetDriverBPF: no interface specified"); + warn("NetDriverBPF.Open: no interface specified"); return false; } } @@ -73,14 +75,19 @@ NetDriverBPF::Init() } fd = open(devpath.c_str(), O_RDWR); - if (fd == -1) { - warn("NetDriverBPF.Open: skip %s", devpath.c_str()); + if (fd < 0) { + // ファイルがないのを表示したら結構うるさいので除く + if (errno != ENOENT) { + putmsg(1, "%s: %s", devpath.c_str(), strerror(errno)); + } continue; } + putmsg(1, "%s: found", devpath.c_str()); break; } - if (fd == -1) { - warnx("NetDriverBPF.Open: no bpf device available"); + if (fd < 0) { + putmsg(1, "no bpf devices available"); + warnx("NetDriverBPF.Open: no bpf devices available"); return false; } @@ -88,7 +95,7 @@ NetDriverBPF::Init() memset(&ifr, 0, sizeof(ifr)); strlcpy(ifr.ifr_name, ifname.c_str(), sizeof(ifr.ifr_name)); if (ioctl(fd, BIOCSETIF, &ifr) == -1) { - warn("NetDriverBPF.Open: %s(%s) BIOCSETIF failed", + warn("NetDriverBPF.Open: %s(%s): BIOCSETIF", devpath.c_str(), ifname.c_str()); goto abort; } @@ -98,20 +105,20 @@ NetDriverBPF::Init() devpath.c_str(), ifname.c_str()); if (ioctl(fd, BIOCPROMISC, (void *)0) == -1) { - warn("NetDriverBPF.Open: %s(%s): BIOCPROMISC failed", + warn("NetDriverBPF.Open: %s(%s): BIOCPROMISC", devpath.c_str(), ifname.c_str()); goto abort; } val = 1; if (ioctl(fd, BIOCIMMEDIATE, &val) == -1) { - warn("NetDriverBPF.Open: %s(%s): BIOCIMMEDIATE failed", + warn("NetDriverBPF.Open: %s(%s): BIOCIMMEDIATE", devpath.c_str(), ifname.c_str()); goto abort; } if (ioctl(fd, BIOCSHDRCMPLT, &val) == -1) { - warn("NetDriverBPF.Open: %s(%s): BIOCSHDRCMPLT failed", + warn("NetDriverBPF.Open: %s(%s): BIOCSHDRCMPLT", devpath.c_str(), ifname.c_str()); goto abort; } @@ -124,14 +131,14 @@ NetDriverBPF::Init() prog.bf_len = countof(insn); prog.bf_insns = insn; if (ioctl(fd, BIOCSETF, &prog) == -1) { - warn("NetDriverBPF.Open: %s(%s): BIOCSETF failed", + warn("NetDriverBPF.Open: %s(%s): BIOCSETF", devpath.c_str(), ifname.c_str()); goto abort; } // バッファサイズを取得 if (ioctl(fd, BIOCGBLEN, &bpfbuflen) == -1) { - warn("NetDriverBPF.Open: %s(%s): BIOCGBLEN failed", + warn("NetDriverBPF.Open: %s(%s): BIOCGBLEN", devpath.c_str(), ifname.c_str()); goto abort; } @@ -228,7 +235,7 @@ void NetDriverBPF::ThreadRun() { struct kevent kev; - int kq; + autofd kq; int r; kq = kqueue(); @@ -241,7 +248,6 @@ NetDriverBPF::ThreadRun() r = kevent_set(kq, &kev, 1); if (r == -1) { warn("kevent_set(fd=%d) failed", fd); - close(kq); return; }