+ break; + } + if (info[i].version == 1) { + ret = 2; + break; + } + } + break; + } + + free(hdr); + close(s); + return (ret); +} + static int ipfw_get_tracked_ifaces(ipfw_obj_lheader **polh) { diff --git a/sbin/ipfw/ipfw2.h b/sbin/ipfw/ipfw2.h index 2137719296f9..58b73a627bd7 100644 --- a/sbin/ipfw/ipfw2.h +++ b/sbin/ipfw/ipfw2.h @@ -454,6 +454,7 @@ int fill_ext6hdr(struct _ipfw_insn *cmd, char *av); void bp_flush(struct buf_pr *b); void fill_table(struct _ipfw_insn *cmd, char *av, uint8_t opcode, struct tidx *tstate); +int ipfw_detect_u32_kbi(void); /* tables.c */ struct _ipfw_obj_ctlv; diff --git a/sbin/ipfw/main.c b/sbin/ipfw/main.c index 3d5cfc96af46..2ad521bdbea4 100644 --- a/sbin/ipfw/main.c +++ b/sbin/ipfw/main.c @@ -18,7 +18,6 @@ * Command line interface for IP firewall facility */ -#include #include #include #include @@ -31,8 +30,6 @@ #include #include -#include - #include "ipfw2.h" static void @@ -673,6 +670,7 @@ ipfw_readfile(int ac, char *av[]) int main(int ac, char *av[]) { + int ret; #if defined(_WIN32) && defined(TCC) { WSADATA wsaData; @@ -697,17 +695,19 @@ main(int ac, char *av[]) * KBI-incompatibility detected, check for availability of ipfw/dnctl15 * binaries and run them instead */ - if (getosreldate() >= 1500000) { + ret = ipfw_detect_u32_kbi(); + if (ret > 0) { const char *releng15_progname; - int ret; if (g_co.prog == cmdline_prog_ipfw) releng15_progname = "/sbin/ipfw15"; else releng15_progname = "/sbin/dnctl15"; - printf("WARNING! KBI incompatibility for ipfw is detected," - " trying to run %s.\n", releng15_progname); + if (ret == 1) + printf("WARNING! KBI incompatibility for ipfw is" + " detected, trying to run %s.\n", + releng15_progname); if ((ret = execv(releng15_progname, av)) < 0) { printf("execv(%s) error: %s\n", releng15_progname,