| 1202 | } |
| 1203 | |
| 1204 | bool control_conn_t::process_getallenv() |
| 1205 | { |
| 1206 | // 1 byte packet type |
| 1207 | // 1 byte reserved - must be 0 |
| 1208 | |
| 1209 | constexpr int pkt_size = 2; |
| 1210 | if (rbuf.get_length() < pkt_size) { |
| 1211 | chklen = pkt_size; |
| 1212 | return true; |
| 1213 | } |
| 1214 | |
| 1215 | uint8_t reserved_byte = rbuf[1]; |
| 1216 | if (reserved_byte != 0) { |
| 1217 | char badreqRep[] = { (char)cp_rply::BADREQ }; |
| 1218 | if (!queue_packet(badreqRep, 1)) return false; |
| 1219 | bad_conn_close = true; |
| 1220 | return true; |
| 1221 | } |
| 1222 | |
| 1223 | // The reply looks like: |
| 1224 | // 1 byte - reply type |
| 1225 | // sizeof(size_t) - reply data size |
| 1226 | // n bytes - reply data (NAME=VALUE, separated by nul characters) |
| 1227 | |
| 1228 | std::vector<char> env_block; |
| 1229 | constexpr size_t env_block_hdr_size = sizeof(size_t) + 1; |
| 1230 | env_block.resize(env_block_hdr_size); |
| 1231 | |
| 1232 | rbuf.consume(pkt_size); |
| 1233 | auto env = main_env.build(); |
| 1234 | for (const char *env_var : env.env_list) { |
| 1235 | if (env_var != nullptr) { |
| 1236 | env_block.insert(env_block.end(), env_var, env_var + strlen(env_var) + 1); |
| 1237 | } |
| 1238 | } |
| 1239 | |
| 1240 | env_block[0] = (char)cp_rply::ALLENV; |
| 1241 | size_t block_size = env_block.size() - env_block_hdr_size; |
| 1242 | memcpy(env_block.data() + 1, &block_size, sizeof(block_size)); |
| 1243 | if (!queue_packet(std::move(env_block))) return false; |
| 1244 | return true; |
| 1245 | } |
| 1246 | |
| 1247 | bool control_conn_t::process_listenenv() |
| 1248 | { |