coroutine void client(int port) { ipaddr addr = ipremote("127.0.0.1", port, 0, -1); tcpsock cs = tcpconnect(addr, -1); assert(cs); char ipstr[16] = {0}; ipaddrstr(addr, ipstr); assert(errno == 0); assert(strcmp(ipstr, "127.0.0.1") == 0); int fd = tcpdetach(cs); assert(fd != -1); cs = tcpattach(fd, 0); assert(cs); msleep(now() + 100); char buf[16]; size_t sz = tcprecv(cs, buf, 3, -1); assert(sz == 3 && buf[0] == 'A' && buf[1] == 'B' && buf[2] == 'C'); sz = tcpsend(cs, "123\n45\n6789", 11, -1); assert(sz == 11 && errno == 0); tcpflush(cs, -1); assert(errno == 0); tcpclose(cs); }
// Helper Function to get IP Address/NetMask/Gateway from Network Manager or Cache // based on Set-In-Progress State ipmi_ret_t getNetworkData(uint8_t lan_param, uint8_t * data) { sd_bus *bus = ipmid_get_sd_bus_connection(); sd_bus_message *reply = NULL; sd_bus_error error = SD_BUS_ERROR_NULL; int family; unsigned char prefixlen; char* ipaddr = NULL; unsigned long mask = 0xFFFFFFFF; char* gateway = NULL; int r = 0; ipmi_ret_t rc = IPMI_CC_OK; r = sd_bus_call_method(bus, app, obj, ifc, "GetAddress4", &error, &reply, "s", nwinterface); if(r < 0) { fprintf(stderr, "Failed to call Get Method: %s\n", strerror(-r)); rc = IPMI_CC_UNSPECIFIED_ERROR; goto cleanup; } r = sd_bus_message_read(reply, "iyss", &family, &prefixlen, &ipaddr, &gateway); if(r < 0) { fprintf(stderr, "Failed to get a response: %s\n", strerror(-rc)); rc = IPMI_CC_RESPONSE_ERROR; goto cleanup; } printf("N/W data from HW %s:%d:%s:%s\n", family==AF_INET?"IPv4":"IPv6", prefixlen, ipaddr,gateway); printf("N/W data from Cache: %s:%s:%s\n", new_ipaddr, new_netmask, new_gateway); if(lan_param == LAN_PARM_IP) { if(lan_set_in_progress == SET_COMPLETE) { std::string ipaddrstr(ipaddr); inet_pton(AF_INET, ipaddrstr.c_str(),(void *)data); } else if(lan_set_in_progress == SET_IN_PROGRESS) { inet_pton(AF_INET, new_ipaddr, (void *)data); } } else if(lan_param == LAN_PARM_SUBNET) { if(lan_set_in_progress == SET_COMPLETE) { mask = htonl(mask<<(32-prefixlen)); memcpy(data, &mask, 4); } else if(lan_set_in_progress == SET_IN_PROGRESS) { inet_pton(AF_INET, new_netmask, (void *)data); } } else if(lan_param == LAN_PARM_GATEWAY) { if(lan_set_in_progress == SET_COMPLETE) { std::string gatewaystr(gateway); inet_pton(AF_INET, gatewaystr.c_str(), (void *)data); } else if(lan_set_in_progress == SET_IN_PROGRESS) { inet_pton(AF_INET, new_gateway,(void *)data); } } else { rc = IPMI_CC_PARM_OUT_OF_RANGE; } cleanup: sd_bus_error_free(&error); reply = sd_bus_message_unref(reply); return rc; }