/* Extract a resolved url and port from a serverurl string. newurl must be * a string of at least INET6_ADDRSTRLEN and newport at least 6 bytes. */ bool url_from_serverurl(char *serverurl, char *newurl, char *newport) { char *url = NULL, *port = NULL; struct addrinfo addrinfo; bool ret = false; if (!extract_sockaddr(serverurl, &url, &port)) { LOGWARNING("Failed to extract server address from %s", serverurl); goto out; } if (!addrinfo_from_url(url, port, &addrinfo)) { LOGWARNING("Failed to extract addrinfo from url %s:%s", url, port); goto out; } if (!url_from_sockaddr((const struct sockaddr *)&addrinfo, newurl, newport)) { LOGWARNING("Failed to extract url from sockaddr for original url: %s:%s", url, port); goto out; } ret = true; out: dealloc(url); dealloc(port); return ret; }
static char *_btc_io(__maybe_unused const char *cmd, char *json, WHERE_FFL_ARGS) { char *ip, *port; char *data, *ans, *res, *ptr; int fd, ret, red; size_t len; data = btc_data(json, &len); if (!extract_sockaddr(btc_server, &ip, &port)) { LOGERR("%s() invalid btc server '%s'", __func__, btc_server); return NULL; } fd = connect_socket(ip, port); if (fd < 0) { LOGERR("%s() failed to connect to btc server %s", __func__, btc_server); return NULL; } ret = write_socket(fd, data, len); if (ret != (int)len) { LOGERR("%s() failed to write to btc server %s", __func__, btc_server); return NULL; } red = read_socket(fd, &ans, btc_timeout); ans[red] = '\0'; if (strncasecmp(ans, "HTTP/1.1 200 OK", 15)) { char *text = safe_text(ans); LOGERR("%s() btc server response not ok: %s", __func__, text); free(text); free(ans); res = strdup(EMPTY); } else { ptr = strstr(ans, "\n{"); if (ptr) res = strdup(ptr+1); else res = strdup(EMPTY); free(ans); } return res; }