tb_bool_t tb_ifaddrs_hwaddr(tb_ifaddrs_ref_t ifaddrs, tb_char_t const* name, tb_bool_t reload, tb_hwaddr_ref_t hwaddr) { // check tb_assert_and_check_return_val(ifaddrs && hwaddr, tb_false); // clear it first tb_hwaddr_clear(hwaddr); // the iterator tb_iterator_ref_t iterator = tb_ifaddrs_itor(ifaddrs, reload); tb_assert_and_check_return_val(iterator, tb_false); // reload it if the cached interfaces is empty if (!reload && !tb_iterator_size(iterator)) iterator = tb_ifaddrs_itor(ifaddrs, tb_true); // done tb_bool_t ok = tb_false; tb_for_all_if (tb_ifaddrs_interface_ref_t, interface, iterator, interface) { // get hwaddr from the given interface name? if (name) { // is this? if ( (interface->flags & TB_IFADDRS_INTERFACE_FLAG_HAVE_HWADDR) && (interface->name && !tb_strcmp(interface->name, name))) { // save hwaddr tb_hwaddr_copy(hwaddr, &interface->hwaddr); // ok ok = tb_true; break; } } else { // is this? if ( (interface->flags & TB_IFADDRS_INTERFACE_FLAG_HAVE_HWADDR) && (interface->flags & TB_IFADDRS_INTERFACE_FLAG_HAVE_IPADDR) && !(interface->flags & TB_IFADDRS_INTERFACE_FLAG_IS_LOOPBACK)) { // save hwaddr tb_hwaddr_copy(hwaddr, &interface->hwaddr); // ok ok = tb_true; break; } } } // ok? return ok; }
/* ////////////////////////////////////////////////////////////////////////////////////// * main */ tb_int_t tb_demo_network_hwaddr_main(tb_int_t argc, tb_char_t** argv) { // done tb_hwaddr_t addr; tb_hwaddr_clear(&addr); if (tb_hwaddr_cstr_set(&addr, argv[1])) { // trace tb_trace_i("%s => %{hwaddr}", argv[1], &addr); } return 0; }