tb_bool_t tb_ifaddrs_ipaddr(tb_ifaddrs_ref_t ifaddrs, tb_char_t const* name, tb_bool_t reload, tb_size_t family, tb_ipaddr_ref_t ipaddr) { // check tb_assert_and_check_return_val(ifaddrs && ipaddr, tb_false); // clear it first tb_ipaddr_clear(ipaddr); // 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); // the ipaddr flags tb_uint32_t ipflags = 0; if (family == TB_IPADDR_FAMILY_IPV4) ipflags |= TB_IFADDRS_INTERFACE_FLAG_HAVE_IPADDR4; else if (family == TB_IPADDR_FAMILY_IPV6) ipflags |= TB_IFADDRS_INTERFACE_FLAG_HAVE_IPADDR6; // done tb_bool_t ok = tb_false; tb_for_all_if (tb_ifaddrs_interface_ref_t, interface, iterator, interface) { // is this? if ( (name || !(interface->flags & TB_IFADDRS_INTERFACE_FLAG_IS_LOOPBACK)) && (interface->flags & TB_IFADDRS_INTERFACE_FLAG_HAVE_IPADDR) && (!name || (interface->name && !tb_strcmp(interface->name, name)))) { // ipv4? if ( interface->flags & TB_IFADDRS_INTERFACE_FLAG_HAVE_IPADDR4 && (!family || family == TB_IPADDR_FAMILY_IPV4)) { // save ipaddr4 tb_ipaddr_ipv4_set(ipaddr, &interface->ipaddr4); // ok ok = tb_true; break; } // ipv6? else if ( interface->flags & TB_IFADDRS_INTERFACE_FLAG_HAVE_IPADDR6 && (!family || family == TB_IPADDR_FAMILY_IPV6)) { // save ipaddr6 tb_ipaddr_ipv6_set(ipaddr, &interface->ipaddr6); // ok ok = tb_true; break; } } } // ok? return ok; }
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; }
/* ////////////////////////////////////////////////////////////////////////////////////// * test */ static tb_void_t tb_demo_database_sql_test_done(tb_database_sql_ref_t database, tb_char_t const* sql) { // check tb_assert_and_check_return(database && sql); // done do { // done sql if (!tb_database_sql_done(database, sql)) { // trace tb_trace_e("done %s failed, error: %s", sql, tb_state_cstr(tb_database_sql_state(database))); break ; } // load result // tb_iterator_ref_t result = tb_database_sql_result_load(database, tb_true); tb_iterator_ref_t result = tb_database_sql_result_load(database, tb_false); tb_check_break(result); // trace tb_trace_i("=============================================================================="); tb_trace_i("row: size: %lu", tb_iterator_size(result)); // walk result tb_for_all_if (tb_iterator_ref_t, row, result, row) { // trace tb_tracef_i("[row: %lu, col: size: %lu]: ", row_itor, tb_iterator_size(row)); // walk items tb_for_all_if (tb_database_sql_value_t*, value, row, value) { // trace tb_tracet_i("[%s:%s] ", tb_database_sql_value_name(value), tb_database_sql_value_text(value)); } // trace tb_tracet_i(__tb_newline__); }
tb_ifaddrs_interface_ref_t tb_ifaddrs_interface(tb_ifaddrs_ref_t ifaddrs, tb_char_t const* name, tb_bool_t reload) { // check tb_assert_and_check_return_val(ifaddrs && name, tb_null); // the iterator tb_iterator_ref_t iterator = tb_ifaddrs_itor(ifaddrs, reload); tb_assert_and_check_return_val(iterator, tb_null); // reload it if the cached interfaces is empty if (!reload && !tb_iterator_size(iterator)) iterator = tb_ifaddrs_itor(ifaddrs, tb_true); // ok return tb_ifaddrs_interface_find(iterator, name); }