int txtsnd(int argc, char **argv) { char *text; uint8_t addr[_MAX_ADDR_LEN]; int iface, idx = 2, res; le_uint16_t pan = { 0 }; switch (argc) { case 4: break; case 5: res = _parse_addr((uint8_t *)&pan, sizeof(pan), argv[idx++]); if ((res <= 0) || (res > sizeof(pan))) { txtsnd_usage(argv[0]); return 1; } pan.u16 = byteorder_swaps(pan.u16); break; default: txtsnd_usage(argv[0]); return 1; } iface = atoi(argv[1]); res = _parse_addr(addr, sizeof(addr), argv[idx++]); if (res <= 0) { txtsnd_usage(argv[0]); return 1; } text = argv[idx++]; return send(iface, pan, addr, (size_t)res, text); }
gboolean xr_server_bind(xr_server* server, const char* bind_addr, GError** err) { GError* local_err = NULL; char* addr = NULL; int port = 0; xr_trace(XR_DEBUG_SERVER_TRACE, "(server=%p, bind_addr=%s, err=%p)", server, bind_addr, err); g_return_val_if_fail(server != NULL, FALSE); g_return_val_if_fail(bind_addr != NULL, FALSE); g_return_val_if_fail(err == NULL || *err == NULL, FALSE); g_return_val_if_fail(_parse_addr(bind_addr, &addr, &port), FALSE); if (addr[0] == '*') { g_socket_listener_add_inet_port(G_SOCKET_LISTENER(server->service), (guint16)port, NULL, &local_err); } else { // build address GInetAddress* iaddr = g_inet_address_new_from_string(addr); if (!iaddr) { g_error_new(XR_SERVER_ERROR, XR_SERVER_ERROR_FAILED, "Invalid address: %s", bind_addr); g_free(addr); xr_server_stop(server); return FALSE; } GSocketAddress* isaddr = g_inet_socket_address_new(iaddr, (guint16)port); g_socket_listener_add_address(G_SOCKET_LISTENER(server->service), isaddr, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP, NULL, NULL, &local_err); } g_free(addr); if (local_err) { g_propagate_prefixed_error(err, local_err, "Port listen failed: "); xr_server_stop(server); return FALSE; } return TRUE; }