| 332 | } |
| 333 | |
| 334 | void AdminSocket::do_accept() |
| 335 | { |
| 336 | struct sockaddr_un address; |
| 337 | socklen_t address_length = sizeof(address); |
| 338 | ldout(m_cct, 30) << "AdminSocket: calling accept" << dendl; |
| 339 | int connection_fd = accept_cloexec(m_sock_fd, (struct sockaddr*) &address, |
| 340 | &address_length); |
| 341 | if (connection_fd < 0) { |
| 342 | int err = ceph_sock_errno(); |
| 343 | lderr(m_cct) << "AdminSocket: do_accept error: '" |
| 344 | << cpp_strerror(err) << dendl; |
| 345 | return; |
| 346 | } |
| 347 | ldout(m_cct, 30) << "AdminSocket: finished accept" << dendl; |
| 348 | |
| 349 | char cmd[1024]; |
| 350 | unsigned pos = 0; |
| 351 | string c; |
| 352 | while (1) { |
| 353 | int ret = safe_recv(connection_fd, &cmd[pos], 1); |
| 354 | if (ret <= 0) { |
| 355 | if (ret < 0) { |
| 356 | lderr(m_cct) << "AdminSocket: error reading request code: " |
| 357 | << cpp_strerror(ret) << dendl; |
| 358 | } |
| 359 | retry_sys_call(::compat_closesocket, connection_fd); |
| 360 | return; |
| 361 | } |
| 362 | if (cmd[0] == '\0') { |
| 363 | // old protocol: __be32 |
| 364 | if (pos == 3 && cmd[0] == '\0') { |
| 365 | switch (cmd[3]) { |
| 366 | case 0: |
| 367 | c = "0"; |
| 368 | break; |
| 369 | case 1: |
| 370 | c = "perfcounters_dump"; |
| 371 | break; |
| 372 | case 2: |
| 373 | c = "perfcounters_schema"; |
| 374 | break; |
| 375 | default: |
| 376 | c = "foo"; |
| 377 | break; |
| 378 | } |
| 379 | //wrap command with new protocol |
| 380 | c = "{\"prefix\": \"" + c + "\"}"; |
| 381 | break; |
| 382 | } |
| 383 | } else { |
| 384 | // new protocol: null or \n terminated string |
| 385 | if (cmd[pos] == '\n' || cmd[pos] == '\0') { |
| 386 | cmd[pos] = '\0'; |
| 387 | c = cmd; |
| 388 | break; |
| 389 | } |
| 390 | } |
| 391 | if (++pos >= sizeof(cmd)) { |
nothing calls this directly
no test coverage detected