| 134 | } |
| 135 | |
| 136 | std::string AdminSocketClient::do_request(std::string request, std::string *result) |
| 137 | { |
| 138 | int socket_fd = 0, res; |
| 139 | std::string buffer; |
| 140 | uint32_t message_size_raw, message_size; |
| 141 | |
| 142 | std::string err = asok_connect(m_path, &socket_fd); |
| 143 | if (!err.empty()) { |
| 144 | goto out; |
| 145 | } |
| 146 | err = asok_request(socket_fd, request); |
| 147 | if (!err.empty()) { |
| 148 | goto done; |
| 149 | } |
| 150 | res = safe_recv_exact(socket_fd, &message_size_raw, |
| 151 | sizeof(message_size_raw)); |
| 152 | if (res < 0) { |
| 153 | int e = res; |
| 154 | ostringstream oss; |
| 155 | oss << "safe_recv(" << socket_fd << ") failed to read message size: " |
| 156 | << cpp_strerror(e); |
| 157 | err = oss.str(); |
| 158 | goto done; |
| 159 | } |
| 160 | message_size = ntohl(message_size_raw); |
| 161 | buffer.resize(message_size, 0); |
| 162 | res = safe_recv_exact(socket_fd, &buffer[0], message_size); |
| 163 | if (res < 0) { |
| 164 | int e = res; |
| 165 | ostringstream oss; |
| 166 | oss << "safe_recv(" << socket_fd << ") failed: " << cpp_strerror(e); |
| 167 | err = oss.str(); |
| 168 | goto done; |
| 169 | } |
| 170 | //printf("MESSAGE FROM SERVER: %s\n", buffer.c_str()); |
| 171 | std::swap(*result, buffer); |
| 172 | done: |
| 173 | compat_closesocket(socket_fd); |
| 174 | out: |
| 175 | return err; |
| 176 | } |
nothing calls this directly
no test coverage detected