]>
git.proxmox.com Git - ceph.git/blob - ceph/src/common/admin_socket_client.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2011 New Dream Network
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
15 #include "include/int_types.h"
17 #include "common/admin_socket.h"
18 #include "common/ceph_context.h"
19 #include "common/errno.h"
20 #include "common/safe_io.h"
21 #include "common/admin_socket_client.h"
23 #include <arpa/inet.h>
34 #include <sys/socket.h>
35 #include <sys/types.h>
41 using std::ostringstream
;
43 const char* get_rand_socket_path()
45 static char *g_socket_path
= NULL
;
47 if (g_socket_path
== NULL
) {
49 const char *tdir
= getenv("TMPDIR");
53 snprintf(buf
, sizeof(((struct sockaddr_un
*)0)->sun_path
),
54 "%s/perfcounters_test_socket.%ld.%ld",
55 tdir
, (long int)getpid(), time(NULL
));
56 g_socket_path
= (char*)strdup(buf
);
61 static std::string
asok_connect(const std::string
&path
, int *fd
)
63 int socket_fd
= socket(PF_UNIX
, SOCK_STREAM
, 0);
67 oss
<< "socket(PF_UNIX, SOCK_STREAM, 0) failed: " << cpp_strerror(err
);
71 struct sockaddr_un address
;
72 memset(&address
, 0, sizeof(struct sockaddr_un
));
73 address
.sun_family
= AF_UNIX
;
74 snprintf(address
.sun_path
, sizeof(address
.sun_path
), "%s", path
.c_str());
76 if (::connect(socket_fd
, (struct sockaddr
*) &address
,
77 sizeof(struct sockaddr_un
)) != 0) {
80 oss
<< "connect(" << socket_fd
<< ") failed: " << cpp_strerror(err
);
88 if (::setsockopt(socket_fd
, SOL_SOCKET
, SO_RCVTIMEO
, &timer
, sizeof(timer
))) {
91 oss
<< "setsockopt(" << socket_fd
<< ", SO_RCVTIMEO) failed: "
98 if (::setsockopt(socket_fd
, SOL_SOCKET
, SO_SNDTIMEO
, &timer
, sizeof(timer
))) {
101 oss
<< "setsockopt(" << socket_fd
<< ", SO_SNDTIMEO) failed: "
102 << cpp_strerror(err
);
111 static std::string
asok_request(int socket_fd
, std::string request
)
113 ssize_t res
= safe_write(socket_fd
, request
.c_str(), request
.length() + 1);
117 oss
<< "safe_write(" << socket_fd
<< ") failed to write request code: "
118 << cpp_strerror(err
);
125 AdminSocketClient(const std::string
&path
)
130 std::string
AdminSocketClient::ping(bool *ok
)
133 std::string result
= do_request("{\"prefix\":\"0\"}", &version
);
134 *ok
= result
== "" && version
.length() == 1;
138 std::string
AdminSocketClient::do_request(std::string request
, std::string
*result
)
140 int socket_fd
= 0, res
;
142 uint32_t message_size_raw
, message_size
;
144 std::string err
= asok_connect(m_path
, &socket_fd
);
148 err
= asok_request(socket_fd
, request
);
152 res
= safe_read_exact(socket_fd
, &message_size_raw
,
153 sizeof(message_size_raw
));
157 oss
<< "safe_read(" << socket_fd
<< ") failed to read message size: "
162 message_size
= ntohl(message_size_raw
);
163 buffer
.resize(message_size
, 0);
164 res
= safe_read_exact(socket_fd
, &buffer
[0], message_size
);
168 oss
<< "safe_read(" << socket_fd
<< ") failed: " << cpp_strerror(e
);
172 //printf("MESSAGE FROM SERVER: %s\n", buffer.c_str());
173 std::swap(*result
, buffer
);