qemu-sockets.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134
  1. /*
  2. * inet and unix socket functions for qemu
  3. *
  4. * (c) 2008 Gerd Hoffmann <kraxel@redhat.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; under version 2 of the License.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * Contributions after 2012-01-13 are licensed under the terms of the
  16. * GNU GPL, version 2 or (at your option) any later version.
  17. */
  18. #include "qemu/osdep.h"
  19. #include "monitor/monitor.h"
  20. #include "qemu/sockets.h"
  21. #include "qemu/main-loop.h"
  22. #include "qapi/qmp-input-visitor.h"
  23. #include "qapi/qmp-output-visitor.h"
  24. #include "qapi-visit.h"
  25. #ifndef AI_ADDRCONFIG
  26. # define AI_ADDRCONFIG 0
  27. #endif
  28. #ifndef AI_V4MAPPED
  29. # define AI_V4MAPPED 0
  30. #endif
  31. static int inet_getport(struct addrinfo *e)
  32. {
  33. struct sockaddr_in *i4;
  34. struct sockaddr_in6 *i6;
  35. switch (e->ai_family) {
  36. case PF_INET6:
  37. i6 = (void*)e->ai_addr;
  38. return ntohs(i6->sin6_port);
  39. case PF_INET:
  40. i4 = (void*)e->ai_addr;
  41. return ntohs(i4->sin_port);
  42. default:
  43. return 0;
  44. }
  45. }
  46. static void inet_setport(struct addrinfo *e, int port)
  47. {
  48. struct sockaddr_in *i4;
  49. struct sockaddr_in6 *i6;
  50. switch (e->ai_family) {
  51. case PF_INET6:
  52. i6 = (void*)e->ai_addr;
  53. i6->sin6_port = htons(port);
  54. break;
  55. case PF_INET:
  56. i4 = (void*)e->ai_addr;
  57. i4->sin_port = htons(port);
  58. break;
  59. }
  60. }
  61. NetworkAddressFamily inet_netfamily(int family)
  62. {
  63. switch (family) {
  64. case PF_INET6: return NETWORK_ADDRESS_FAMILY_IPV6;
  65. case PF_INET: return NETWORK_ADDRESS_FAMILY_IPV4;
  66. case PF_UNIX: return NETWORK_ADDRESS_FAMILY_UNIX;
  67. }
  68. return NETWORK_ADDRESS_FAMILY_UNKNOWN;
  69. }
  70. /*
  71. * Matrix we're trying to apply
  72. *
  73. * ipv4 ipv6 family
  74. * - - PF_UNSPEC
  75. * - f PF_INET
  76. * - t PF_INET6
  77. * f - PF_INET6
  78. * f f <error>
  79. * f t PF_INET6
  80. * t - PF_INET
  81. * t f PF_INET
  82. * t t PF_INET6
  83. *
  84. * NB, this matrix is only about getting the neccessary results
  85. * from getaddrinfo(). Some of the cases require further work
  86. * after reading results from getaddrinfo in order to fully
  87. * apply the logic the end user wants. eg with the last case
  88. * ipv4=t + ipv6=t + PF_INET6, getaddrinfo alone can only
  89. * guarantee the ipv6=t part of the request - we need more
  90. * checks to provide ipv4=t part of the guarantee. This is
  91. * outside scope of this method and not currently handled by
  92. * callers at all.
  93. */
  94. static int inet_ai_family_from_address(InetSocketAddress *addr,
  95. Error **errp)
  96. {
  97. if (addr->has_ipv6 && addr->has_ipv4 &&
  98. !addr->ipv6 && !addr->ipv4) {
  99. error_setg(errp, "Cannot disable IPv4 and IPv6 at same time");
  100. return PF_UNSPEC;
  101. }
  102. if ((addr->has_ipv6 && addr->ipv6) || (addr->has_ipv4 && !addr->ipv4)) {
  103. return PF_INET6;
  104. }
  105. if ((addr->has_ipv4 && addr->ipv4) || (addr->has_ipv6 && !addr->ipv6)) {
  106. return PF_INET;
  107. }
  108. return PF_UNSPEC;
  109. }
  110. static int inet_listen_saddr(InetSocketAddress *saddr,
  111. int port_offset,
  112. bool update_addr,
  113. Error **errp)
  114. {
  115. struct addrinfo ai,*res,*e;
  116. char port[33];
  117. char uaddr[INET6_ADDRSTRLEN+1];
  118. char uport[33];
  119. int slisten, rc, port_min, port_max, p;
  120. Error *err = NULL;
  121. memset(&ai,0, sizeof(ai));
  122. ai.ai_flags = AI_PASSIVE;
  123. ai.ai_family = inet_ai_family_from_address(saddr, &err);
  124. ai.ai_socktype = SOCK_STREAM;
  125. if (err) {
  126. error_propagate(errp, err);
  127. return -1;
  128. }
  129. if (saddr->host == NULL) {
  130. error_setg(errp, "host not specified");
  131. return -1;
  132. }
  133. if (saddr->port != NULL) {
  134. pstrcpy(port, sizeof(port), saddr->port);
  135. } else {
  136. port[0] = '\0';
  137. }
  138. /* lookup */
  139. if (port_offset) {
  140. unsigned long long baseport;
  141. if (strlen(port) == 0) {
  142. error_setg(errp, "port not specified");
  143. return -1;
  144. }
  145. if (parse_uint_full(port, &baseport, 10) < 0) {
  146. error_setg(errp, "can't convert to a number: %s", port);
  147. return -1;
  148. }
  149. if (baseport > 65535 ||
  150. baseport + port_offset > 65535) {
  151. error_setg(errp, "port %s out of range", port);
  152. return -1;
  153. }
  154. snprintf(port, sizeof(port), "%d", (int)baseport + port_offset);
  155. }
  156. rc = getaddrinfo(strlen(saddr->host) ? saddr->host : NULL,
  157. strlen(port) ? port : NULL, &ai, &res);
  158. if (rc != 0) {
  159. error_setg(errp, "address resolution failed for %s:%s: %s",
  160. saddr->host, port, gai_strerror(rc));
  161. return -1;
  162. }
  163. /* create socket + bind */
  164. for (e = res; e != NULL; e = e->ai_next) {
  165. getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen,
  166. uaddr,INET6_ADDRSTRLEN,uport,32,
  167. NI_NUMERICHOST | NI_NUMERICSERV);
  168. slisten = qemu_socket(e->ai_family, e->ai_socktype, e->ai_protocol);
  169. if (slisten < 0) {
  170. if (!e->ai_next) {
  171. error_setg_errno(errp, errno, "Failed to create socket");
  172. }
  173. continue;
  174. }
  175. socket_set_fast_reuse(slisten);
  176. #ifdef IPV6_V6ONLY
  177. if (e->ai_family == PF_INET6) {
  178. /* listen on both ipv4 and ipv6 */
  179. const int off = 0;
  180. qemu_setsockopt(slisten, IPPROTO_IPV6, IPV6_V6ONLY, &off,
  181. sizeof(off));
  182. }
  183. #endif
  184. port_min = inet_getport(e);
  185. port_max = saddr->has_to ? saddr->to + port_offset : port_min;
  186. for (p = port_min; p <= port_max; p++) {
  187. inet_setport(e, p);
  188. if (bind(slisten, e->ai_addr, e->ai_addrlen) == 0) {
  189. goto listen;
  190. }
  191. if (p == port_max) {
  192. if (!e->ai_next) {
  193. error_setg_errno(errp, errno, "Failed to bind socket");
  194. }
  195. }
  196. }
  197. closesocket(slisten);
  198. }
  199. freeaddrinfo(res);
  200. return -1;
  201. listen:
  202. if (listen(slisten,1) != 0) {
  203. error_setg_errno(errp, errno, "Failed to listen on socket");
  204. closesocket(slisten);
  205. freeaddrinfo(res);
  206. return -1;
  207. }
  208. if (update_addr) {
  209. g_free(saddr->host);
  210. saddr->host = g_strdup(uaddr);
  211. g_free(saddr->port);
  212. saddr->port = g_strdup_printf("%d",
  213. inet_getport(e) - port_offset);
  214. saddr->has_ipv6 = saddr->ipv6 = e->ai_family == PF_INET6;
  215. saddr->has_ipv4 = saddr->ipv4 = e->ai_family != PF_INET6;
  216. }
  217. freeaddrinfo(res);
  218. return slisten;
  219. }
  220. #ifdef _WIN32
  221. #define QEMU_SOCKET_RC_INPROGRESS(rc) \
  222. ((rc) == -EINPROGRESS || (rc) == -EWOULDBLOCK || (rc) == -WSAEALREADY)
  223. #else
  224. #define QEMU_SOCKET_RC_INPROGRESS(rc) \
  225. ((rc) == -EINPROGRESS)
  226. #endif
  227. /* Struct to store connect state for non blocking connect */
  228. typedef struct ConnectState {
  229. int fd;
  230. struct addrinfo *addr_list;
  231. struct addrinfo *current_addr;
  232. NonBlockingConnectHandler *callback;
  233. void *opaque;
  234. } ConnectState;
  235. static int inet_connect_addr(struct addrinfo *addr, bool *in_progress,
  236. ConnectState *connect_state, Error **errp);
  237. static void wait_for_connect(void *opaque)
  238. {
  239. ConnectState *s = opaque;
  240. int val = 0, rc = 0;
  241. socklen_t valsize = sizeof(val);
  242. bool in_progress;
  243. Error *err = NULL;
  244. qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
  245. do {
  246. rc = qemu_getsockopt(s->fd, SOL_SOCKET, SO_ERROR, &val, &valsize);
  247. } while (rc == -1 && errno == EINTR);
  248. /* update rc to contain error */
  249. if (!rc && val) {
  250. rc = -1;
  251. errno = val;
  252. }
  253. /* connect error */
  254. if (rc < 0) {
  255. error_setg_errno(&err, errno, "Error connecting to socket");
  256. closesocket(s->fd);
  257. s->fd = rc;
  258. }
  259. /* try to connect to the next address on the list */
  260. if (s->current_addr) {
  261. while (s->current_addr->ai_next != NULL && s->fd < 0) {
  262. s->current_addr = s->current_addr->ai_next;
  263. s->fd = inet_connect_addr(s->current_addr, &in_progress, s, NULL);
  264. if (s->fd < 0) {
  265. error_free(err);
  266. err = NULL;
  267. error_setg_errno(&err, errno, "Unable to start socket connect");
  268. }
  269. /* connect in progress */
  270. if (in_progress) {
  271. goto out;
  272. }
  273. }
  274. freeaddrinfo(s->addr_list);
  275. }
  276. if (s->callback) {
  277. s->callback(s->fd, err, s->opaque);
  278. }
  279. g_free(s);
  280. out:
  281. error_free(err);
  282. }
  283. static int inet_connect_addr(struct addrinfo *addr, bool *in_progress,
  284. ConnectState *connect_state, Error **errp)
  285. {
  286. int sock, rc;
  287. *in_progress = false;
  288. sock = qemu_socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
  289. if (sock < 0) {
  290. error_setg_errno(errp, errno, "Failed to create socket");
  291. return -1;
  292. }
  293. socket_set_fast_reuse(sock);
  294. if (connect_state != NULL) {
  295. qemu_set_nonblock(sock);
  296. }
  297. /* connect to peer */
  298. do {
  299. rc = 0;
  300. if (connect(sock, addr->ai_addr, addr->ai_addrlen) < 0) {
  301. rc = -errno;
  302. }
  303. } while (rc == -EINTR);
  304. if (connect_state != NULL && QEMU_SOCKET_RC_INPROGRESS(rc)) {
  305. connect_state->fd = sock;
  306. qemu_set_fd_handler(sock, NULL, wait_for_connect, connect_state);
  307. *in_progress = true;
  308. } else if (rc < 0) {
  309. error_setg_errno(errp, errno, "Failed to connect socket");
  310. closesocket(sock);
  311. return -1;
  312. }
  313. return sock;
  314. }
  315. static struct addrinfo *inet_parse_connect_saddr(InetSocketAddress *saddr,
  316. Error **errp)
  317. {
  318. struct addrinfo ai, *res;
  319. int rc;
  320. Error *err = NULL;
  321. memset(&ai, 0, sizeof(ai));
  322. ai.ai_flags = AI_CANONNAME | AI_V4MAPPED | AI_ADDRCONFIG;
  323. ai.ai_family = inet_ai_family_from_address(saddr, &err);
  324. ai.ai_socktype = SOCK_STREAM;
  325. if (err) {
  326. error_propagate(errp, err);
  327. return NULL;
  328. }
  329. if (saddr->host == NULL || saddr->port == NULL) {
  330. error_setg(errp, "host and/or port not specified");
  331. return NULL;
  332. }
  333. /* lookup */
  334. rc = getaddrinfo(saddr->host, saddr->port, &ai, &res);
  335. if (rc != 0) {
  336. error_setg(errp, "address resolution failed for %s:%s: %s",
  337. saddr->host, saddr->port, gai_strerror(rc));
  338. return NULL;
  339. }
  340. return res;
  341. }
  342. /**
  343. * Create a socket and connect it to an address.
  344. *
  345. * @saddr: Inet socket address specification
  346. * @errp: set on error
  347. * @callback: callback function for non-blocking connect
  348. * @opaque: opaque for callback function
  349. *
  350. * Returns: -1 on error, file descriptor on success.
  351. *
  352. * If @callback is non-null, the connect is non-blocking. If this
  353. * function succeeds, callback will be called when the connection
  354. * completes, with the file descriptor on success, or -1 on error.
  355. */
  356. static int inet_connect_saddr(InetSocketAddress *saddr, Error **errp,
  357. NonBlockingConnectHandler *callback, void *opaque)
  358. {
  359. Error *local_err = NULL;
  360. struct addrinfo *res, *e;
  361. int sock = -1;
  362. bool in_progress;
  363. ConnectState *connect_state = NULL;
  364. res = inet_parse_connect_saddr(saddr, errp);
  365. if (!res) {
  366. return -1;
  367. }
  368. if (callback != NULL) {
  369. connect_state = g_malloc0(sizeof(*connect_state));
  370. connect_state->addr_list = res;
  371. connect_state->callback = callback;
  372. connect_state->opaque = opaque;
  373. }
  374. for (e = res; e != NULL; e = e->ai_next) {
  375. error_free(local_err);
  376. local_err = NULL;
  377. if (connect_state != NULL) {
  378. connect_state->current_addr = e;
  379. }
  380. sock = inet_connect_addr(e, &in_progress, connect_state, &local_err);
  381. if (sock >= 0) {
  382. break;
  383. }
  384. }
  385. if (sock < 0) {
  386. error_propagate(errp, local_err);
  387. } else if (in_progress) {
  388. /* wait_for_connect() will do the rest */
  389. return sock;
  390. } else {
  391. if (callback) {
  392. callback(sock, NULL, opaque);
  393. }
  394. }
  395. g_free(connect_state);
  396. freeaddrinfo(res);
  397. return sock;
  398. }
  399. static int inet_dgram_saddr(InetSocketAddress *sraddr,
  400. InetSocketAddress *sladdr,
  401. Error **errp)
  402. {
  403. struct addrinfo ai, *peer = NULL, *local = NULL;
  404. const char *addr;
  405. const char *port;
  406. int sock = -1, rc;
  407. Error *err = NULL;
  408. /* lookup peer addr */
  409. memset(&ai,0, sizeof(ai));
  410. ai.ai_flags = AI_CANONNAME | AI_V4MAPPED | AI_ADDRCONFIG;
  411. ai.ai_family = inet_ai_family_from_address(sraddr, &err);
  412. ai.ai_socktype = SOCK_DGRAM;
  413. if (err) {
  414. error_propagate(errp, err);
  415. goto err;
  416. }
  417. addr = sraddr->host;
  418. port = sraddr->port;
  419. if (addr == NULL || strlen(addr) == 0) {
  420. addr = "localhost";
  421. }
  422. if (port == NULL || strlen(port) == 0) {
  423. error_setg(errp, "remote port not specified");
  424. goto err;
  425. }
  426. if (0 != (rc = getaddrinfo(addr, port, &ai, &peer))) {
  427. error_setg(errp, "address resolution failed for %s:%s: %s", addr, port,
  428. gai_strerror(rc));
  429. goto err;
  430. }
  431. /* lookup local addr */
  432. memset(&ai,0, sizeof(ai));
  433. ai.ai_flags = AI_PASSIVE;
  434. ai.ai_family = peer->ai_family;
  435. ai.ai_socktype = SOCK_DGRAM;
  436. if (sladdr) {
  437. addr = sladdr->host;
  438. port = sladdr->port;
  439. if (addr == NULL || strlen(addr) == 0) {
  440. addr = NULL;
  441. }
  442. if (!port || strlen(port) == 0) {
  443. port = "0";
  444. }
  445. } else {
  446. addr = NULL;
  447. port = "0";
  448. }
  449. if (0 != (rc = getaddrinfo(addr, port, &ai, &local))) {
  450. error_setg(errp, "address resolution failed for %s:%s: %s", addr, port,
  451. gai_strerror(rc));
  452. goto err;
  453. }
  454. /* create socket */
  455. sock = qemu_socket(peer->ai_family, peer->ai_socktype, peer->ai_protocol);
  456. if (sock < 0) {
  457. error_setg_errno(errp, errno, "Failed to create socket");
  458. goto err;
  459. }
  460. socket_set_fast_reuse(sock);
  461. /* bind socket */
  462. if (bind(sock, local->ai_addr, local->ai_addrlen) < 0) {
  463. error_setg_errno(errp, errno, "Failed to bind socket");
  464. goto err;
  465. }
  466. /* connect to peer */
  467. if (connect(sock,peer->ai_addr,peer->ai_addrlen) < 0) {
  468. error_setg_errno(errp, errno, "Failed to connect socket");
  469. goto err;
  470. }
  471. freeaddrinfo(local);
  472. freeaddrinfo(peer);
  473. return sock;
  474. err:
  475. if (-1 != sock)
  476. closesocket(sock);
  477. if (local)
  478. freeaddrinfo(local);
  479. if (peer)
  480. freeaddrinfo(peer);
  481. return -1;
  482. }
  483. /* compatibility wrapper */
  484. InetSocketAddress *inet_parse(const char *str, Error **errp)
  485. {
  486. InetSocketAddress *addr;
  487. const char *optstr, *h;
  488. char host[65];
  489. char port[33];
  490. int to;
  491. int pos;
  492. addr = g_new0(InetSocketAddress, 1);
  493. /* parse address */
  494. if (str[0] == ':') {
  495. /* no host given */
  496. host[0] = '\0';
  497. if (1 != sscanf(str, ":%32[^,]%n", port, &pos)) {
  498. error_setg(errp, "error parsing port in address '%s'", str);
  499. goto fail;
  500. }
  501. } else if (str[0] == '[') {
  502. /* IPv6 addr */
  503. if (2 != sscanf(str, "[%64[^]]]:%32[^,]%n", host, port, &pos)) {
  504. error_setg(errp, "error parsing IPv6 address '%s'", str);
  505. goto fail;
  506. }
  507. addr->ipv6 = addr->has_ipv6 = true;
  508. } else {
  509. /* hostname or IPv4 addr */
  510. if (2 != sscanf(str, "%64[^:]:%32[^,]%n", host, port, &pos)) {
  511. error_setg(errp, "error parsing address '%s'", str);
  512. goto fail;
  513. }
  514. if (host[strspn(host, "0123456789.")] == '\0') {
  515. addr->ipv4 = addr->has_ipv4 = true;
  516. }
  517. }
  518. addr->host = g_strdup(host);
  519. addr->port = g_strdup(port);
  520. /* parse options */
  521. optstr = str + pos;
  522. h = strstr(optstr, ",to=");
  523. if (h) {
  524. h += 4;
  525. if (sscanf(h, "%d%n", &to, &pos) != 1 ||
  526. (h[pos] != '\0' && h[pos] != ',')) {
  527. error_setg(errp, "error parsing to= argument");
  528. goto fail;
  529. }
  530. addr->has_to = true;
  531. addr->to = to;
  532. }
  533. if (strstr(optstr, ",ipv4")) {
  534. addr->ipv4 = addr->has_ipv4 = true;
  535. }
  536. if (strstr(optstr, ",ipv6")) {
  537. addr->ipv6 = addr->has_ipv6 = true;
  538. }
  539. return addr;
  540. fail:
  541. qapi_free_InetSocketAddress(addr);
  542. return NULL;
  543. }
  544. int inet_listen(const char *str, char *ostr, int olen,
  545. int socktype, int port_offset, Error **errp)
  546. {
  547. char *optstr;
  548. int sock = -1;
  549. InetSocketAddress *addr;
  550. addr = inet_parse(str, errp);
  551. if (addr != NULL) {
  552. sock = inet_listen_saddr(addr, port_offset, true, errp);
  553. if (sock != -1 && ostr) {
  554. optstr = strchr(str, ',');
  555. if (addr->ipv6) {
  556. snprintf(ostr, olen, "[%s]:%s%s",
  557. addr->host,
  558. addr->port,
  559. optstr ? optstr : "");
  560. } else {
  561. snprintf(ostr, olen, "%s:%s%s",
  562. addr->host,
  563. addr->port,
  564. optstr ? optstr : "");
  565. }
  566. }
  567. qapi_free_InetSocketAddress(addr);
  568. }
  569. return sock;
  570. }
  571. /**
  572. * Create a blocking socket and connect it to an address.
  573. *
  574. * @str: address string
  575. * @errp: set in case of an error
  576. *
  577. * Returns -1 in case of error, file descriptor on success
  578. **/
  579. int inet_connect(const char *str, Error **errp)
  580. {
  581. int sock = -1;
  582. InetSocketAddress *addr;
  583. addr = inet_parse(str, errp);
  584. if (addr != NULL) {
  585. sock = inet_connect_saddr(addr, errp, NULL, NULL);
  586. qapi_free_InetSocketAddress(addr);
  587. }
  588. return sock;
  589. }
  590. /**
  591. * Create a non-blocking socket and connect it to an address.
  592. * Calls the callback function with fd in case of success or -1 in case of
  593. * error.
  594. *
  595. * @str: address string
  596. * @callback: callback function that is called when connect completes,
  597. * cannot be NULL.
  598. * @opaque: opaque for callback function
  599. * @errp: set in case of an error
  600. *
  601. * Returns: -1 on immediate error, file descriptor on success.
  602. **/
  603. int inet_nonblocking_connect(const char *str,
  604. NonBlockingConnectHandler *callback,
  605. void *opaque, Error **errp)
  606. {
  607. int sock = -1;
  608. InetSocketAddress *addr;
  609. g_assert(callback != NULL);
  610. addr = inet_parse(str, errp);
  611. if (addr != NULL) {
  612. sock = inet_connect_saddr(addr, errp, callback, opaque);
  613. qapi_free_InetSocketAddress(addr);
  614. }
  615. return sock;
  616. }
  617. #ifndef _WIN32
  618. static int unix_listen_saddr(UnixSocketAddress *saddr,
  619. bool update_addr,
  620. Error **errp)
  621. {
  622. struct sockaddr_un un;
  623. int sock, fd;
  624. sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
  625. if (sock < 0) {
  626. error_setg_errno(errp, errno, "Failed to create Unix socket");
  627. return -1;
  628. }
  629. memset(&un, 0, sizeof(un));
  630. un.sun_family = AF_UNIX;
  631. if (saddr->path && strlen(saddr->path)) {
  632. snprintf(un.sun_path, sizeof(un.sun_path), "%s", saddr->path);
  633. } else {
  634. const char *tmpdir = getenv("TMPDIR");
  635. tmpdir = tmpdir ? tmpdir : "/tmp";
  636. if (snprintf(un.sun_path, sizeof(un.sun_path), "%s/qemu-socket-XXXXXX",
  637. tmpdir) >= sizeof(un.sun_path)) {
  638. error_setg_errno(errp, errno,
  639. "TMPDIR environment variable (%s) too large", tmpdir);
  640. goto err;
  641. }
  642. /*
  643. * This dummy fd usage silences the mktemp() unsecure warning.
  644. * Using mkstemp() doesn't make things more secure here
  645. * though. bind() complains about existing files, so we have
  646. * to unlink first and thus re-open the race window. The
  647. * worst case possible is bind() failing, i.e. a DoS attack.
  648. */
  649. fd = mkstemp(un.sun_path);
  650. if (fd < 0) {
  651. error_setg_errno(errp, errno,
  652. "Failed to make a temporary socket name in %s", tmpdir);
  653. goto err;
  654. }
  655. close(fd);
  656. if (update_addr) {
  657. g_free(saddr->path);
  658. saddr->path = g_strdup(un.sun_path);
  659. }
  660. }
  661. if (unlink(un.sun_path) < 0 && errno != ENOENT) {
  662. error_setg_errno(errp, errno,
  663. "Failed to unlink socket %s", un.sun_path);
  664. goto err;
  665. }
  666. if (bind(sock, (struct sockaddr*) &un, sizeof(un)) < 0) {
  667. error_setg_errno(errp, errno, "Failed to bind socket to %s", un.sun_path);
  668. goto err;
  669. }
  670. if (listen(sock, 1) < 0) {
  671. error_setg_errno(errp, errno, "Failed to listen on socket");
  672. goto err;
  673. }
  674. return sock;
  675. err:
  676. closesocket(sock);
  677. return -1;
  678. }
  679. static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp,
  680. NonBlockingConnectHandler *callback, void *opaque)
  681. {
  682. struct sockaddr_un un;
  683. ConnectState *connect_state = NULL;
  684. int sock, rc;
  685. if (saddr->path == NULL) {
  686. error_setg(errp, "unix connect: no path specified");
  687. return -1;
  688. }
  689. sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
  690. if (sock < 0) {
  691. error_setg_errno(errp, errno, "Failed to create socket");
  692. return -1;
  693. }
  694. if (callback != NULL) {
  695. connect_state = g_malloc0(sizeof(*connect_state));
  696. connect_state->callback = callback;
  697. connect_state->opaque = opaque;
  698. qemu_set_nonblock(sock);
  699. }
  700. memset(&un, 0, sizeof(un));
  701. un.sun_family = AF_UNIX;
  702. snprintf(un.sun_path, sizeof(un.sun_path), "%s", saddr->path);
  703. /* connect to peer */
  704. do {
  705. rc = 0;
  706. if (connect(sock, (struct sockaddr *) &un, sizeof(un)) < 0) {
  707. rc = -errno;
  708. }
  709. } while (rc == -EINTR);
  710. if (connect_state != NULL && QEMU_SOCKET_RC_INPROGRESS(rc)) {
  711. connect_state->fd = sock;
  712. qemu_set_fd_handler(sock, NULL, wait_for_connect, connect_state);
  713. return sock;
  714. } else if (rc >= 0) {
  715. /* non blocking socket immediate success, call callback */
  716. if (callback != NULL) {
  717. callback(sock, NULL, opaque);
  718. }
  719. }
  720. if (rc < 0) {
  721. error_setg_errno(errp, -rc, "Failed to connect socket");
  722. close(sock);
  723. sock = -1;
  724. }
  725. g_free(connect_state);
  726. return sock;
  727. }
  728. #else
  729. static int unix_listen_saddr(UnixSocketAddress *saddr,
  730. bool update_addr,
  731. Error **errp)
  732. {
  733. error_setg(errp, "unix sockets are not available on windows");
  734. errno = ENOTSUP;
  735. return -1;
  736. }
  737. static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp,
  738. NonBlockingConnectHandler *callback, void *opaque)
  739. {
  740. error_setg(errp, "unix sockets are not available on windows");
  741. errno = ENOTSUP;
  742. return -1;
  743. }
  744. #endif
  745. /* compatibility wrapper */
  746. int unix_listen(const char *str, char *ostr, int olen, Error **errp)
  747. {
  748. char *path, *optstr;
  749. int sock, len;
  750. UnixSocketAddress *saddr;
  751. saddr = g_new0(UnixSocketAddress, 1);
  752. optstr = strchr(str, ',');
  753. if (optstr) {
  754. len = optstr - str;
  755. if (len) {
  756. path = g_malloc(len+1);
  757. snprintf(path, len+1, "%.*s", len, str);
  758. saddr->path = path;
  759. }
  760. } else {
  761. saddr->path = g_strdup(str);
  762. }
  763. sock = unix_listen_saddr(saddr, true, errp);
  764. if (sock != -1 && ostr)
  765. snprintf(ostr, olen, "%s%s", saddr->path, optstr ? optstr : "");
  766. qapi_free_UnixSocketAddress(saddr);
  767. return sock;
  768. }
  769. int unix_connect(const char *path, Error **errp)
  770. {
  771. UnixSocketAddress *saddr;
  772. int sock;
  773. saddr = g_new0(UnixSocketAddress, 1);
  774. saddr->path = g_strdup(path);
  775. sock = unix_connect_saddr(saddr, errp, NULL, NULL);
  776. qapi_free_UnixSocketAddress(saddr);
  777. return sock;
  778. }
  779. int unix_nonblocking_connect(const char *path,
  780. NonBlockingConnectHandler *callback,
  781. void *opaque, Error **errp)
  782. {
  783. UnixSocketAddress *saddr;
  784. int sock = -1;
  785. g_assert(callback != NULL);
  786. saddr = g_new0(UnixSocketAddress, 1);
  787. saddr->path = g_strdup(path);
  788. sock = unix_connect_saddr(saddr, errp, callback, opaque);
  789. qapi_free_UnixSocketAddress(saddr);
  790. return sock;
  791. }
  792. SocketAddress *socket_parse(const char *str, Error **errp)
  793. {
  794. SocketAddress *addr;
  795. addr = g_new0(SocketAddress, 1);
  796. if (strstart(str, "unix:", NULL)) {
  797. if (str[5] == '\0') {
  798. error_setg(errp, "invalid Unix socket address");
  799. goto fail;
  800. } else {
  801. addr->type = SOCKET_ADDRESS_KIND_UNIX;
  802. addr->u.q_unix.data = g_new(UnixSocketAddress, 1);
  803. addr->u.q_unix.data->path = g_strdup(str + 5);
  804. }
  805. } else if (strstart(str, "fd:", NULL)) {
  806. if (str[3] == '\0') {
  807. error_setg(errp, "invalid file descriptor address");
  808. goto fail;
  809. } else {
  810. addr->type = SOCKET_ADDRESS_KIND_FD;
  811. addr->u.fd.data = g_new(String, 1);
  812. addr->u.fd.data->str = g_strdup(str + 3);
  813. }
  814. } else {
  815. addr->type = SOCKET_ADDRESS_KIND_INET;
  816. addr->u.inet.data = inet_parse(str, errp);
  817. if (addr->u.inet.data == NULL) {
  818. goto fail;
  819. }
  820. }
  821. return addr;
  822. fail:
  823. qapi_free_SocketAddress(addr);
  824. return NULL;
  825. }
  826. int socket_connect(SocketAddress *addr, Error **errp,
  827. NonBlockingConnectHandler *callback, void *opaque)
  828. {
  829. int fd;
  830. switch (addr->type) {
  831. case SOCKET_ADDRESS_KIND_INET:
  832. fd = inet_connect_saddr(addr->u.inet.data, errp, callback, opaque);
  833. break;
  834. case SOCKET_ADDRESS_KIND_UNIX:
  835. fd = unix_connect_saddr(addr->u.q_unix.data, errp, callback, opaque);
  836. break;
  837. case SOCKET_ADDRESS_KIND_FD:
  838. fd = monitor_get_fd(cur_mon, addr->u.fd.data->str, errp);
  839. if (fd >= 0 && callback) {
  840. qemu_set_nonblock(fd);
  841. callback(fd, NULL, opaque);
  842. }
  843. break;
  844. default:
  845. abort();
  846. }
  847. return fd;
  848. }
  849. int socket_listen(SocketAddress *addr, Error **errp)
  850. {
  851. int fd;
  852. switch (addr->type) {
  853. case SOCKET_ADDRESS_KIND_INET:
  854. fd = inet_listen_saddr(addr->u.inet.data, 0, false, errp);
  855. break;
  856. case SOCKET_ADDRESS_KIND_UNIX:
  857. fd = unix_listen_saddr(addr->u.q_unix.data, false, errp);
  858. break;
  859. case SOCKET_ADDRESS_KIND_FD:
  860. fd = monitor_get_fd(cur_mon, addr->u.fd.data->str, errp);
  861. break;
  862. default:
  863. abort();
  864. }
  865. return fd;
  866. }
  867. int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp)
  868. {
  869. int fd;
  870. switch (remote->type) {
  871. case SOCKET_ADDRESS_KIND_INET:
  872. fd = inet_dgram_saddr(remote->u.inet.data,
  873. local ? local->u.inet.data : NULL, errp);
  874. break;
  875. default:
  876. error_setg(errp, "socket type unsupported for datagram");
  877. fd = -1;
  878. }
  879. return fd;
  880. }
  881. static SocketAddress *
  882. socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
  883. socklen_t salen,
  884. Error **errp)
  885. {
  886. char host[NI_MAXHOST];
  887. char serv[NI_MAXSERV];
  888. SocketAddress *addr;
  889. InetSocketAddress *inet;
  890. int ret;
  891. ret = getnameinfo((struct sockaddr *)sa, salen,
  892. host, sizeof(host),
  893. serv, sizeof(serv),
  894. NI_NUMERICHOST | NI_NUMERICSERV);
  895. if (ret != 0) {
  896. error_setg(errp, "Cannot format numeric socket address: %s",
  897. gai_strerror(ret));
  898. return NULL;
  899. }
  900. addr = g_new0(SocketAddress, 1);
  901. addr->type = SOCKET_ADDRESS_KIND_INET;
  902. inet = addr->u.inet.data = g_new0(InetSocketAddress, 1);
  903. inet->host = g_strdup(host);
  904. inet->port = g_strdup(serv);
  905. if (sa->ss_family == AF_INET) {
  906. inet->has_ipv4 = inet->ipv4 = true;
  907. } else {
  908. inet->has_ipv6 = inet->ipv6 = true;
  909. }
  910. return addr;
  911. }
  912. #ifndef WIN32
  913. static SocketAddress *
  914. socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
  915. socklen_t salen,
  916. Error **errp)
  917. {
  918. SocketAddress *addr;
  919. struct sockaddr_un *su = (struct sockaddr_un *)sa;
  920. addr = g_new0(SocketAddress, 1);
  921. addr->type = SOCKET_ADDRESS_KIND_UNIX;
  922. addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
  923. if (su->sun_path[0]) {
  924. addr->u.q_unix.data->path = g_strndup(su->sun_path,
  925. sizeof(su->sun_path));
  926. }
  927. return addr;
  928. }
  929. #endif /* WIN32 */
  930. SocketAddress *
  931. socket_sockaddr_to_address(struct sockaddr_storage *sa,
  932. socklen_t salen,
  933. Error **errp)
  934. {
  935. switch (sa->ss_family) {
  936. case AF_INET:
  937. case AF_INET6:
  938. return socket_sockaddr_to_address_inet(sa, salen, errp);
  939. #ifndef WIN32
  940. case AF_UNIX:
  941. return socket_sockaddr_to_address_unix(sa, salen, errp);
  942. #endif /* WIN32 */
  943. default:
  944. error_setg(errp, "socket family %d unsupported",
  945. sa->ss_family);
  946. return NULL;
  947. }
  948. return 0;
  949. }
  950. SocketAddress *socket_local_address(int fd, Error **errp)
  951. {
  952. struct sockaddr_storage ss;
  953. socklen_t sslen = sizeof(ss);
  954. if (getsockname(fd, (struct sockaddr *)&ss, &sslen) < 0) {
  955. error_setg_errno(errp, errno, "%s",
  956. "Unable to query local socket address");
  957. return NULL;
  958. }
  959. return socket_sockaddr_to_address(&ss, sslen, errp);
  960. }
  961. SocketAddress *socket_remote_address(int fd, Error **errp)
  962. {
  963. struct sockaddr_storage ss;
  964. socklen_t sslen = sizeof(ss);
  965. if (getpeername(fd, (struct sockaddr *)&ss, &sslen) < 0) {
  966. error_setg_errno(errp, errno, "%s",
  967. "Unable to query remote socket address");
  968. return NULL;
  969. }
  970. return socket_sockaddr_to_address(&ss, sslen, errp);
  971. }
  972. void qapi_copy_SocketAddress(SocketAddress **p_dest,
  973. SocketAddress *src)
  974. {
  975. QmpOutputVisitor *qov;
  976. QmpInputVisitor *qiv;
  977. Visitor *ov, *iv;
  978. QObject *obj;
  979. *p_dest = NULL;
  980. qov = qmp_output_visitor_new();
  981. ov = qmp_output_get_visitor(qov);
  982. visit_type_SocketAddress(ov, NULL, &src, &error_abort);
  983. obj = qmp_output_get_qobject(qov);
  984. qmp_output_visitor_cleanup(qov);
  985. if (!obj) {
  986. return;
  987. }
  988. qiv = qmp_input_visitor_new(obj);
  989. iv = qmp_input_get_visitor(qiv);
  990. visit_type_SocketAddress(iv, NULL, p_dest, &error_abort);
  991. qmp_input_visitor_cleanup(qiv);
  992. qobject_decref(obj);
  993. }