MCPcopy Create free account
hub / github.com/ceph/ceph / do_accept

Method do_accept

src/common/admin_socket.cc:334–428  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

332}
333
334void 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)) {

Callers

nothing calls this directly

Calls 12

accept_cloexecFunction · 0.85
ceph_sock_errnoFunction · 0.85
cpp_strerrorFunction · 0.85
safe_recvFunction · 0.85
retry_sys_callFunction · 0.85
execute_commandFunction · 0.85
safe_sendFunction · 0.85
send_fdMethod · 0.80
strMethod · 0.45
appendMethod · 0.45
claim_appendMethod · 0.45
lengthMethod · 0.45

Tested by

no test coverage detected