qemu-sockets.c 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366
  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. #ifdef CONFIG_AF_VSOCK
  20. #include <linux/vm_sockets.h>
  21. #endif /* CONFIG_AF_VSOCK */
  22. #include "qemu-common.h"
  23. #include "monitor/monitor.h"
  24. #include "qapi/clone-visitor.h"
  25. #include "qapi/error.h"
  26. #include "qapi/qapi-visit-sockets.h"
  27. #include "qemu/sockets.h"
  28. #include "qemu/main-loop.h"
  29. #include "qapi/qobject-input-visitor.h"
  30. #include "qapi/qobject-output-visitor.h"
  31. #include "qemu/cutils.h"
  32. #include "trace.h"
  33. #ifndef AI_ADDRCONFIG
  34. # define AI_ADDRCONFIG 0
  35. #endif
  36. #ifndef AI_V4MAPPED
  37. # define AI_V4MAPPED 0
  38. #endif
  39. #ifndef AI_NUMERICSERV
  40. # define AI_NUMERICSERV 0
  41. #endif
  42. static int inet_getport(struct addrinfo *e)
  43. {
  44. struct sockaddr_in *i4;
  45. struct sockaddr_in6 *i6;
  46. switch (e->ai_family) {
  47. case PF_INET6:
  48. i6 = (void*)e->ai_addr;
  49. return ntohs(i6->sin6_port);
  50. case PF_INET:
  51. i4 = (void*)e->ai_addr;
  52. return ntohs(i4->sin_port);
  53. default:
  54. return 0;
  55. }
  56. }
  57. static void inet_setport(struct addrinfo *e, int port)
  58. {
  59. struct sockaddr_in *i4;
  60. struct sockaddr_in6 *i6;
  61. switch (e->ai_family) {
  62. case PF_INET6:
  63. i6 = (void*)e->ai_addr;
  64. i6->sin6_port = htons(port);
  65. break;
  66. case PF_INET:
  67. i4 = (void*)e->ai_addr;
  68. i4->sin_port = htons(port);
  69. break;
  70. }
  71. }
  72. NetworkAddressFamily inet_netfamily(int family)
  73. {
  74. switch (family) {
  75. case PF_INET6: return NETWORK_ADDRESS_FAMILY_IPV6;
  76. case PF_INET: return NETWORK_ADDRESS_FAMILY_IPV4;
  77. case PF_UNIX: return NETWORK_ADDRESS_FAMILY_UNIX;
  78. #ifdef CONFIG_AF_VSOCK
  79. case PF_VSOCK: return NETWORK_ADDRESS_FAMILY_VSOCK;
  80. #endif /* CONFIG_AF_VSOCK */
  81. }
  82. return NETWORK_ADDRESS_FAMILY_UNKNOWN;
  83. }
  84. bool fd_is_socket(int fd)
  85. {
  86. int optval;
  87. socklen_t optlen = sizeof(optval);
  88. return !qemu_getsockopt(fd, SOL_SOCKET, SO_TYPE, &optval, &optlen);
  89. }
  90. /*
  91. * Matrix we're trying to apply
  92. *
  93. * ipv4 ipv6 family
  94. * - - PF_UNSPEC
  95. * - f PF_INET
  96. * - t PF_INET6
  97. * f - PF_INET6
  98. * f f <error>
  99. * f t PF_INET6
  100. * t - PF_INET
  101. * t f PF_INET
  102. * t t PF_INET6/PF_UNSPEC
  103. *
  104. * NB, this matrix is only about getting the necessary results
  105. * from getaddrinfo(). Some of the cases require further work
  106. * after reading results from getaddrinfo in order to fully
  107. * apply the logic the end user wants.
  108. *
  109. * In the first and last cases, we must set IPV6_V6ONLY=0
  110. * when binding, to allow a single listener to potentially
  111. * accept both IPv4+6 addresses.
  112. */
  113. int inet_ai_family_from_address(InetSocketAddress *addr,
  114. Error **errp)
  115. {
  116. if (addr->has_ipv6 && addr->has_ipv4 &&
  117. !addr->ipv6 && !addr->ipv4) {
  118. error_setg(errp, "Cannot disable IPv4 and IPv6 at same time");
  119. return PF_UNSPEC;
  120. }
  121. if ((addr->has_ipv6 && addr->ipv6) && (addr->has_ipv4 && addr->ipv4)) {
  122. /*
  123. * Some backends can only do a single listener. In that case
  124. * we want empty hostname to resolve to "::" and then use the
  125. * flag IPV6_V6ONLY==0 to get both protocols on 1 socket. This
  126. * doesn't work for addresses other than "", so they're just
  127. * inevitably broken until multiple listeners can be used,
  128. * and thus we honour getaddrinfo automatic protocol detection
  129. * Once all backends do multi-listener, remove the PF_INET6
  130. * branch entirely.
  131. */
  132. if (!addr->host || g_str_equal(addr->host, "")) {
  133. return PF_INET6;
  134. } else {
  135. return PF_UNSPEC;
  136. }
  137. }
  138. if ((addr->has_ipv6 && addr->ipv6) || (addr->has_ipv4 && !addr->ipv4)) {
  139. return PF_INET6;
  140. }
  141. if ((addr->has_ipv4 && addr->ipv4) || (addr->has_ipv6 && !addr->ipv6)) {
  142. return PF_INET;
  143. }
  144. return PF_UNSPEC;
  145. }
  146. static int create_fast_reuse_socket(struct addrinfo *e)
  147. {
  148. int slisten = qemu_socket(e->ai_family, e->ai_socktype, e->ai_protocol);
  149. if (slisten < 0) {
  150. return -1;
  151. }
  152. socket_set_fast_reuse(slisten);
  153. return slisten;
  154. }
  155. static int try_bind(int socket, InetSocketAddress *saddr, struct addrinfo *e)
  156. {
  157. #ifndef IPV6_V6ONLY
  158. return bind(socket, e->ai_addr, e->ai_addrlen);
  159. #else
  160. /*
  161. * Deals with first & last cases in matrix in comment
  162. * for inet_ai_family_from_address().
  163. */
  164. int v6only =
  165. ((!saddr->has_ipv4 && !saddr->has_ipv6) ||
  166. (saddr->has_ipv4 && saddr->ipv4 &&
  167. saddr->has_ipv6 && saddr->ipv6)) ? 0 : 1;
  168. int stat;
  169. rebind:
  170. if (e->ai_family == PF_INET6) {
  171. qemu_setsockopt(socket, IPPROTO_IPV6, IPV6_V6ONLY, &v6only,
  172. sizeof(v6only));
  173. }
  174. stat = bind(socket, e->ai_addr, e->ai_addrlen);
  175. if (!stat) {
  176. return 0;
  177. }
  178. /* If we got EADDRINUSE from an IPv6 bind & v6only is unset,
  179. * it could be that the IPv4 port is already claimed, so retry
  180. * with v6only set
  181. */
  182. if (e->ai_family == PF_INET6 && errno == EADDRINUSE && !v6only) {
  183. v6only = 1;
  184. goto rebind;
  185. }
  186. return stat;
  187. #endif
  188. }
  189. static int inet_listen_saddr(InetSocketAddress *saddr,
  190. int port_offset,
  191. int num,
  192. Error **errp)
  193. {
  194. struct addrinfo ai,*res,*e;
  195. char port[33];
  196. char uaddr[INET6_ADDRSTRLEN+1];
  197. char uport[33];
  198. int rc, port_min, port_max, p;
  199. int slisten = -1;
  200. int saved_errno = 0;
  201. bool socket_created = false;
  202. Error *err = NULL;
  203. if (saddr->keep_alive) {
  204. error_setg(errp, "keep-alive option is not supported for passive "
  205. "sockets");
  206. return -1;
  207. }
  208. memset(&ai,0, sizeof(ai));
  209. ai.ai_flags = AI_PASSIVE;
  210. if (saddr->has_numeric && saddr->numeric) {
  211. ai.ai_flags |= AI_NUMERICHOST | AI_NUMERICSERV;
  212. }
  213. ai.ai_family = inet_ai_family_from_address(saddr, &err);
  214. ai.ai_socktype = SOCK_STREAM;
  215. if (err) {
  216. error_propagate(errp, err);
  217. return -1;
  218. }
  219. if (saddr->host == NULL) {
  220. error_setg(errp, "host not specified");
  221. return -1;
  222. }
  223. if (saddr->port != NULL) {
  224. pstrcpy(port, sizeof(port), saddr->port);
  225. } else {
  226. port[0] = '\0';
  227. }
  228. /* lookup */
  229. if (port_offset) {
  230. unsigned long long baseport;
  231. if (strlen(port) == 0) {
  232. error_setg(errp, "port not specified");
  233. return -1;
  234. }
  235. if (parse_uint_full(port, &baseport, 10) < 0) {
  236. error_setg(errp, "can't convert to a number: %s", port);
  237. return -1;
  238. }
  239. if (baseport > 65535 ||
  240. baseport + port_offset > 65535) {
  241. error_setg(errp, "port %s out of range", port);
  242. return -1;
  243. }
  244. snprintf(port, sizeof(port), "%d", (int)baseport + port_offset);
  245. }
  246. rc = getaddrinfo(strlen(saddr->host) ? saddr->host : NULL,
  247. strlen(port) ? port : NULL, &ai, &res);
  248. if (rc != 0) {
  249. error_setg(errp, "address resolution failed for %s:%s: %s",
  250. saddr->host, port, gai_strerror(rc));
  251. return -1;
  252. }
  253. /* create socket + bind/listen */
  254. for (e = res; e != NULL; e = e->ai_next) {
  255. getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen,
  256. uaddr,INET6_ADDRSTRLEN,uport,32,
  257. NI_NUMERICHOST | NI_NUMERICSERV);
  258. port_min = inet_getport(e);
  259. port_max = saddr->has_to ? saddr->to + port_offset : port_min;
  260. for (p = port_min; p <= port_max; p++) {
  261. inet_setport(e, p);
  262. slisten = create_fast_reuse_socket(e);
  263. if (slisten < 0) {
  264. /* First time we expect we might fail to create the socket
  265. * eg if 'e' has AF_INET6 but ipv6 kmod is not loaded.
  266. * Later iterations should always succeed if first iteration
  267. * worked though, so treat that as fatal.
  268. */
  269. if (p == port_min) {
  270. continue;
  271. } else {
  272. error_setg_errno(errp, errno,
  273. "Failed to recreate failed listening socket");
  274. goto listen_failed;
  275. }
  276. }
  277. socket_created = true;
  278. rc = try_bind(slisten, saddr, e);
  279. if (rc < 0) {
  280. if (errno != EADDRINUSE) {
  281. error_setg_errno(errp, errno, "Failed to bind socket");
  282. goto listen_failed;
  283. }
  284. } else {
  285. if (!listen(slisten, num)) {
  286. goto listen_ok;
  287. }
  288. if (errno != EADDRINUSE) {
  289. error_setg_errno(errp, errno, "Failed to listen on socket");
  290. goto listen_failed;
  291. }
  292. }
  293. /* Someone else managed to bind to the same port and beat us
  294. * to listen on it! Socket semantics does not allow us to
  295. * recover from this situation, so we need to recreate the
  296. * socket to allow bind attempts for subsequent ports:
  297. */
  298. closesocket(slisten);
  299. slisten = -1;
  300. }
  301. }
  302. error_setg_errno(errp, errno,
  303. socket_created ?
  304. "Failed to find an available port" :
  305. "Failed to create a socket");
  306. listen_failed:
  307. saved_errno = errno;
  308. if (slisten >= 0) {
  309. closesocket(slisten);
  310. }
  311. freeaddrinfo(res);
  312. errno = saved_errno;
  313. return -1;
  314. listen_ok:
  315. freeaddrinfo(res);
  316. return slisten;
  317. }
  318. #ifdef _WIN32
  319. #define QEMU_SOCKET_RC_INPROGRESS(rc) \
  320. ((rc) == -EINPROGRESS || (rc) == -EWOULDBLOCK || (rc) == -WSAEALREADY)
  321. #else
  322. #define QEMU_SOCKET_RC_INPROGRESS(rc) \
  323. ((rc) == -EINPROGRESS)
  324. #endif
  325. static int inet_connect_addr(struct addrinfo *addr, Error **errp);
  326. static int inet_connect_addr(struct addrinfo *addr, Error **errp)
  327. {
  328. int sock, rc;
  329. sock = qemu_socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
  330. if (sock < 0) {
  331. error_setg_errno(errp, errno, "Failed to create socket");
  332. return -1;
  333. }
  334. socket_set_fast_reuse(sock);
  335. /* connect to peer */
  336. do {
  337. rc = 0;
  338. if (connect(sock, addr->ai_addr, addr->ai_addrlen) < 0) {
  339. rc = -errno;
  340. }
  341. } while (rc == -EINTR);
  342. if (rc < 0) {
  343. error_setg_errno(errp, errno, "Failed to connect socket");
  344. closesocket(sock);
  345. return -1;
  346. }
  347. return sock;
  348. }
  349. static struct addrinfo *inet_parse_connect_saddr(InetSocketAddress *saddr,
  350. Error **errp)
  351. {
  352. struct addrinfo ai, *res;
  353. int rc;
  354. Error *err = NULL;
  355. static int useV4Mapped = 1;
  356. memset(&ai, 0, sizeof(ai));
  357. ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
  358. if (atomic_read(&useV4Mapped)) {
  359. ai.ai_flags |= AI_V4MAPPED;
  360. }
  361. ai.ai_family = inet_ai_family_from_address(saddr, &err);
  362. ai.ai_socktype = SOCK_STREAM;
  363. if (err) {
  364. error_propagate(errp, err);
  365. return NULL;
  366. }
  367. if (saddr->host == NULL || saddr->port == NULL) {
  368. error_setg(errp, "host and/or port not specified");
  369. return NULL;
  370. }
  371. /* lookup */
  372. rc = getaddrinfo(saddr->host, saddr->port, &ai, &res);
  373. /* At least FreeBSD and OS-X 10.6 declare AI_V4MAPPED but
  374. * then don't implement it in their getaddrinfo(). Detect
  375. * this and retry without the flag since that's preferrable
  376. * to a fatal error
  377. */
  378. if (rc == EAI_BADFLAGS &&
  379. (ai.ai_flags & AI_V4MAPPED)) {
  380. atomic_set(&useV4Mapped, 0);
  381. ai.ai_flags &= ~AI_V4MAPPED;
  382. rc = getaddrinfo(saddr->host, saddr->port, &ai, &res);
  383. }
  384. if (rc != 0) {
  385. error_setg(errp, "address resolution failed for %s:%s: %s",
  386. saddr->host, saddr->port, gai_strerror(rc));
  387. return NULL;
  388. }
  389. return res;
  390. }
  391. /**
  392. * Create a socket and connect it to an address.
  393. *
  394. * @saddr: Inet socket address specification
  395. * @errp: set on error
  396. *
  397. * Returns: -1 on error, file descriptor on success.
  398. */
  399. int inet_connect_saddr(InetSocketAddress *saddr, Error **errp)
  400. {
  401. Error *local_err = NULL;
  402. struct addrinfo *res, *e;
  403. int sock = -1;
  404. res = inet_parse_connect_saddr(saddr, errp);
  405. if (!res) {
  406. return -1;
  407. }
  408. for (e = res; e != NULL; e = e->ai_next) {
  409. error_free(local_err);
  410. local_err = NULL;
  411. sock = inet_connect_addr(e, &local_err);
  412. if (sock >= 0) {
  413. break;
  414. }
  415. }
  416. freeaddrinfo(res);
  417. if (sock < 0) {
  418. error_propagate(errp, local_err);
  419. return sock;
  420. }
  421. if (saddr->keep_alive) {
  422. int val = 1;
  423. int ret = qemu_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
  424. &val, sizeof(val));
  425. if (ret < 0) {
  426. error_setg_errno(errp, errno, "Unable to set KEEPALIVE");
  427. close(sock);
  428. return -1;
  429. }
  430. }
  431. return sock;
  432. }
  433. static int inet_dgram_saddr(InetSocketAddress *sraddr,
  434. InetSocketAddress *sladdr,
  435. Error **errp)
  436. {
  437. struct addrinfo ai, *peer = NULL, *local = NULL;
  438. const char *addr;
  439. const char *port;
  440. int sock = -1, rc;
  441. Error *err = NULL;
  442. /* lookup peer addr */
  443. memset(&ai,0, sizeof(ai));
  444. ai.ai_flags = AI_CANONNAME | AI_V4MAPPED | AI_ADDRCONFIG;
  445. ai.ai_family = inet_ai_family_from_address(sraddr, &err);
  446. ai.ai_socktype = SOCK_DGRAM;
  447. if (err) {
  448. error_propagate(errp, err);
  449. goto err;
  450. }
  451. addr = sraddr->host;
  452. port = sraddr->port;
  453. if (addr == NULL || strlen(addr) == 0) {
  454. addr = "localhost";
  455. }
  456. if (port == NULL || strlen(port) == 0) {
  457. error_setg(errp, "remote port not specified");
  458. goto err;
  459. }
  460. if ((rc = getaddrinfo(addr, port, &ai, &peer)) != 0) {
  461. error_setg(errp, "address resolution failed for %s:%s: %s", addr, port,
  462. gai_strerror(rc));
  463. goto err;
  464. }
  465. /* lookup local addr */
  466. memset(&ai,0, sizeof(ai));
  467. ai.ai_flags = AI_PASSIVE;
  468. ai.ai_family = peer->ai_family;
  469. ai.ai_socktype = SOCK_DGRAM;
  470. if (sladdr) {
  471. addr = sladdr->host;
  472. port = sladdr->port;
  473. if (addr == NULL || strlen(addr) == 0) {
  474. addr = NULL;
  475. }
  476. if (!port || strlen(port) == 0) {
  477. port = "0";
  478. }
  479. } else {
  480. addr = NULL;
  481. port = "0";
  482. }
  483. if ((rc = getaddrinfo(addr, port, &ai, &local)) != 0) {
  484. error_setg(errp, "address resolution failed for %s:%s: %s", addr, port,
  485. gai_strerror(rc));
  486. goto err;
  487. }
  488. /* create socket */
  489. sock = qemu_socket(peer->ai_family, peer->ai_socktype, peer->ai_protocol);
  490. if (sock < 0) {
  491. error_setg_errno(errp, errno, "Failed to create socket");
  492. goto err;
  493. }
  494. socket_set_fast_reuse(sock);
  495. /* bind socket */
  496. if (bind(sock, local->ai_addr, local->ai_addrlen) < 0) {
  497. error_setg_errno(errp, errno, "Failed to bind socket");
  498. goto err;
  499. }
  500. /* connect to peer */
  501. if (connect(sock,peer->ai_addr,peer->ai_addrlen) < 0) {
  502. error_setg_errno(errp, errno, "Failed to connect socket");
  503. goto err;
  504. }
  505. freeaddrinfo(local);
  506. freeaddrinfo(peer);
  507. return sock;
  508. err:
  509. if (sock != -1) {
  510. closesocket(sock);
  511. }
  512. if (local) {
  513. freeaddrinfo(local);
  514. }
  515. if (peer) {
  516. freeaddrinfo(peer);
  517. }
  518. return -1;
  519. }
  520. /* compatibility wrapper */
  521. static int inet_parse_flag(const char *flagname, const char *optstr, bool *val,
  522. Error **errp)
  523. {
  524. char *end;
  525. size_t len;
  526. end = strstr(optstr, ",");
  527. if (end) {
  528. if (end[1] == ',') { /* Reject 'ipv6=on,,foo' */
  529. error_setg(errp, "error parsing '%s' flag '%s'", flagname, optstr);
  530. return -1;
  531. }
  532. len = end - optstr;
  533. } else {
  534. len = strlen(optstr);
  535. }
  536. if (len == 0 || (len == 3 && strncmp(optstr, "=on", len) == 0)) {
  537. *val = true;
  538. } else if (len == 4 && strncmp(optstr, "=off", len) == 0) {
  539. *val = false;
  540. } else {
  541. error_setg(errp, "error parsing '%s' flag '%s'", flagname, optstr);
  542. return -1;
  543. }
  544. return 0;
  545. }
  546. int inet_parse(InetSocketAddress *addr, const char *str, Error **errp)
  547. {
  548. const char *optstr, *h;
  549. char host[65];
  550. char port[33];
  551. int to;
  552. int pos;
  553. char *begin;
  554. memset(addr, 0, sizeof(*addr));
  555. /* parse address */
  556. if (str[0] == ':') {
  557. /* no host given */
  558. host[0] = '\0';
  559. if (sscanf(str, ":%32[^,]%n", port, &pos) != 1) {
  560. error_setg(errp, "error parsing port in address '%s'", str);
  561. return -1;
  562. }
  563. } else if (str[0] == '[') {
  564. /* IPv6 addr */
  565. if (sscanf(str, "[%64[^]]]:%32[^,]%n", host, port, &pos) != 2) {
  566. error_setg(errp, "error parsing IPv6 address '%s'", str);
  567. return -1;
  568. }
  569. } else {
  570. /* hostname or IPv4 addr */
  571. if (sscanf(str, "%64[^:]:%32[^,]%n", host, port, &pos) != 2) {
  572. error_setg(errp, "error parsing address '%s'", str);
  573. return -1;
  574. }
  575. }
  576. addr->host = g_strdup(host);
  577. addr->port = g_strdup(port);
  578. /* parse options */
  579. optstr = str + pos;
  580. h = strstr(optstr, ",to=");
  581. if (h) {
  582. h += 4;
  583. if (sscanf(h, "%d%n", &to, &pos) != 1 ||
  584. (h[pos] != '\0' && h[pos] != ',')) {
  585. error_setg(errp, "error parsing to= argument");
  586. return -1;
  587. }
  588. addr->has_to = true;
  589. addr->to = to;
  590. }
  591. begin = strstr(optstr, ",ipv4");
  592. if (begin) {
  593. if (inet_parse_flag("ipv4", begin + 5, &addr->ipv4, errp) < 0) {
  594. return -1;
  595. }
  596. addr->has_ipv4 = true;
  597. }
  598. begin = strstr(optstr, ",ipv6");
  599. if (begin) {
  600. if (inet_parse_flag("ipv6", begin + 5, &addr->ipv6, errp) < 0) {
  601. return -1;
  602. }
  603. addr->has_ipv6 = true;
  604. }
  605. begin = strstr(optstr, ",keep-alive");
  606. if (begin) {
  607. if (inet_parse_flag("keep-alive", begin + strlen(",keep-alive"),
  608. &addr->keep_alive, errp) < 0)
  609. {
  610. return -1;
  611. }
  612. addr->has_keep_alive = true;
  613. }
  614. return 0;
  615. }
  616. /**
  617. * Create a blocking socket and connect it to an address.
  618. *
  619. * @str: address string
  620. * @errp: set in case of an error
  621. *
  622. * Returns -1 in case of error, file descriptor on success
  623. **/
  624. int inet_connect(const char *str, Error **errp)
  625. {
  626. int sock = -1;
  627. InetSocketAddress *addr = g_new(InetSocketAddress, 1);
  628. if (!inet_parse(addr, str, errp)) {
  629. sock = inet_connect_saddr(addr, errp);
  630. }
  631. qapi_free_InetSocketAddress(addr);
  632. return sock;
  633. }
  634. #ifdef CONFIG_AF_VSOCK
  635. static bool vsock_parse_vaddr_to_sockaddr(const VsockSocketAddress *vaddr,
  636. struct sockaddr_vm *svm,
  637. Error **errp)
  638. {
  639. unsigned long long val;
  640. memset(svm, 0, sizeof(*svm));
  641. svm->svm_family = AF_VSOCK;
  642. if (parse_uint_full(vaddr->cid, &val, 10) < 0 ||
  643. val > UINT32_MAX) {
  644. error_setg(errp, "Failed to parse cid '%s'", vaddr->cid);
  645. return false;
  646. }
  647. svm->svm_cid = val;
  648. if (parse_uint_full(vaddr->port, &val, 10) < 0 ||
  649. val > UINT32_MAX) {
  650. error_setg(errp, "Failed to parse port '%s'", vaddr->port);
  651. return false;
  652. }
  653. svm->svm_port = val;
  654. return true;
  655. }
  656. static int vsock_connect_addr(const struct sockaddr_vm *svm, Error **errp)
  657. {
  658. int sock, rc;
  659. sock = qemu_socket(AF_VSOCK, SOCK_STREAM, 0);
  660. if (sock < 0) {
  661. error_setg_errno(errp, errno, "Failed to create socket");
  662. return -1;
  663. }
  664. /* connect to peer */
  665. do {
  666. rc = 0;
  667. if (connect(sock, (const struct sockaddr *)svm, sizeof(*svm)) < 0) {
  668. rc = -errno;
  669. }
  670. } while (rc == -EINTR);
  671. if (rc < 0) {
  672. error_setg_errno(errp, errno, "Failed to connect socket");
  673. closesocket(sock);
  674. return -1;
  675. }
  676. return sock;
  677. }
  678. static int vsock_connect_saddr(VsockSocketAddress *vaddr, Error **errp)
  679. {
  680. struct sockaddr_vm svm;
  681. int sock = -1;
  682. if (!vsock_parse_vaddr_to_sockaddr(vaddr, &svm, errp)) {
  683. return -1;
  684. }
  685. sock = vsock_connect_addr(&svm, errp);
  686. return sock;
  687. }
  688. static int vsock_listen_saddr(VsockSocketAddress *vaddr,
  689. int num,
  690. Error **errp)
  691. {
  692. struct sockaddr_vm svm;
  693. int slisten;
  694. if (!vsock_parse_vaddr_to_sockaddr(vaddr, &svm, errp)) {
  695. return -1;
  696. }
  697. slisten = qemu_socket(AF_VSOCK, SOCK_STREAM, 0);
  698. if (slisten < 0) {
  699. error_setg_errno(errp, errno, "Failed to create socket");
  700. return -1;
  701. }
  702. if (bind(slisten, (const struct sockaddr *)&svm, sizeof(svm)) != 0) {
  703. error_setg_errno(errp, errno, "Failed to bind socket");
  704. closesocket(slisten);
  705. return -1;
  706. }
  707. if (listen(slisten, num) != 0) {
  708. error_setg_errno(errp, errno, "Failed to listen on socket");
  709. closesocket(slisten);
  710. return -1;
  711. }
  712. return slisten;
  713. }
  714. static int vsock_parse(VsockSocketAddress *addr, const char *str,
  715. Error **errp)
  716. {
  717. char cid[33];
  718. char port[33];
  719. int n;
  720. if (sscanf(str, "%32[^:]:%32[^,]%n", cid, port, &n) != 2) {
  721. error_setg(errp, "error parsing address '%s'", str);
  722. return -1;
  723. }
  724. if (str[n] != '\0') {
  725. error_setg(errp, "trailing characters in address '%s'", str);
  726. return -1;
  727. }
  728. addr->cid = g_strdup(cid);
  729. addr->port = g_strdup(port);
  730. return 0;
  731. }
  732. #else
  733. static void vsock_unsupported(Error **errp)
  734. {
  735. error_setg(errp, "socket family AF_VSOCK unsupported");
  736. }
  737. static int vsock_connect_saddr(VsockSocketAddress *vaddr, Error **errp)
  738. {
  739. vsock_unsupported(errp);
  740. return -1;
  741. }
  742. static int vsock_listen_saddr(VsockSocketAddress *vaddr,
  743. int num,
  744. Error **errp)
  745. {
  746. vsock_unsupported(errp);
  747. return -1;
  748. }
  749. static int vsock_parse(VsockSocketAddress *addr, const char *str,
  750. Error **errp)
  751. {
  752. vsock_unsupported(errp);
  753. return -1;
  754. }
  755. #endif /* CONFIG_AF_VSOCK */
  756. #ifndef _WIN32
  757. static int unix_listen_saddr(UnixSocketAddress *saddr,
  758. int num,
  759. Error **errp)
  760. {
  761. struct sockaddr_un un;
  762. int sock, fd;
  763. char *pathbuf = NULL;
  764. const char *path;
  765. size_t pathlen;
  766. sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
  767. if (sock < 0) {
  768. error_setg_errno(errp, errno, "Failed to create Unix socket");
  769. return -1;
  770. }
  771. if (saddr->path && saddr->path[0]) {
  772. path = saddr->path;
  773. } else {
  774. const char *tmpdir = getenv("TMPDIR");
  775. tmpdir = tmpdir ? tmpdir : "/tmp";
  776. path = pathbuf = g_strdup_printf("%s/qemu-socket-XXXXXX", tmpdir);
  777. }
  778. pathlen = strlen(path);
  779. if (pathlen > sizeof(un.sun_path)) {
  780. error_setg(errp, "UNIX socket path '%s' is too long", path);
  781. error_append_hint(errp, "Path must be less than %zu bytes\n",
  782. sizeof(un.sun_path));
  783. goto err;
  784. }
  785. if (pathbuf != NULL) {
  786. /*
  787. * This dummy fd usage silences the mktemp() unsecure warning.
  788. * Using mkstemp() doesn't make things more secure here
  789. * though. bind() complains about existing files, so we have
  790. * to unlink first and thus re-open the race window. The
  791. * worst case possible is bind() failing, i.e. a DoS attack.
  792. */
  793. fd = mkstemp(pathbuf);
  794. if (fd < 0) {
  795. error_setg_errno(errp, errno,
  796. "Failed to make a temporary socket %s", pathbuf);
  797. goto err;
  798. }
  799. close(fd);
  800. }
  801. if (unlink(path) < 0 && errno != ENOENT) {
  802. error_setg_errno(errp, errno,
  803. "Failed to unlink socket %s", path);
  804. goto err;
  805. }
  806. memset(&un, 0, sizeof(un));
  807. un.sun_family = AF_UNIX;
  808. memcpy(un.sun_path, path, pathlen);
  809. if (bind(sock, (struct sockaddr*) &un, sizeof(un)) < 0) {
  810. error_setg_errno(errp, errno, "Failed to bind socket to %s", path);
  811. goto err;
  812. }
  813. if (listen(sock, num) < 0) {
  814. error_setg_errno(errp, errno, "Failed to listen on socket");
  815. goto err;
  816. }
  817. g_free(pathbuf);
  818. return sock;
  819. err:
  820. g_free(pathbuf);
  821. closesocket(sock);
  822. return -1;
  823. }
  824. static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
  825. {
  826. struct sockaddr_un un;
  827. int sock, rc;
  828. size_t pathlen;
  829. if (saddr->path == NULL) {
  830. error_setg(errp, "unix connect: no path specified");
  831. return -1;
  832. }
  833. sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
  834. if (sock < 0) {
  835. error_setg_errno(errp, errno, "Failed to create socket");
  836. return -1;
  837. }
  838. pathlen = strlen(saddr->path);
  839. if (pathlen > sizeof(un.sun_path)) {
  840. error_setg(errp, "UNIX socket path '%s' is too long", saddr->path);
  841. error_append_hint(errp, "Path must be less than %zu bytes\n",
  842. sizeof(un.sun_path));
  843. goto err;
  844. }
  845. memset(&un, 0, sizeof(un));
  846. un.sun_family = AF_UNIX;
  847. memcpy(un.sun_path, saddr->path, pathlen);
  848. /* connect to peer */
  849. do {
  850. rc = 0;
  851. if (connect(sock, (struct sockaddr *) &un, sizeof(un)) < 0) {
  852. rc = -errno;
  853. }
  854. } while (rc == -EINTR);
  855. if (rc < 0) {
  856. error_setg_errno(errp, -rc, "Failed to connect socket %s",
  857. saddr->path);
  858. goto err;
  859. }
  860. return sock;
  861. err:
  862. close(sock);
  863. return -1;
  864. }
  865. #else
  866. static int unix_listen_saddr(UnixSocketAddress *saddr,
  867. int num,
  868. Error **errp)
  869. {
  870. error_setg(errp, "unix sockets are not available on windows");
  871. errno = ENOTSUP;
  872. return -1;
  873. }
  874. static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
  875. {
  876. error_setg(errp, "unix sockets are not available on windows");
  877. errno = ENOTSUP;
  878. return -1;
  879. }
  880. #endif
  881. /* compatibility wrapper */
  882. int unix_listen(const char *str, Error **errp)
  883. {
  884. UnixSocketAddress *saddr;
  885. int sock;
  886. saddr = g_new0(UnixSocketAddress, 1);
  887. saddr->path = g_strdup(str);
  888. sock = unix_listen_saddr(saddr, 1, errp);
  889. qapi_free_UnixSocketAddress(saddr);
  890. return sock;
  891. }
  892. int unix_connect(const char *path, Error **errp)
  893. {
  894. UnixSocketAddress *saddr;
  895. int sock;
  896. saddr = g_new0(UnixSocketAddress, 1);
  897. saddr->path = g_strdup(path);
  898. sock = unix_connect_saddr(saddr, errp);
  899. qapi_free_UnixSocketAddress(saddr);
  900. return sock;
  901. }
  902. SocketAddress *socket_parse(const char *str, Error **errp)
  903. {
  904. SocketAddress *addr;
  905. addr = g_new0(SocketAddress, 1);
  906. if (strstart(str, "unix:", NULL)) {
  907. if (str[5] == '\0') {
  908. error_setg(errp, "invalid Unix socket address");
  909. goto fail;
  910. } else {
  911. addr->type = SOCKET_ADDRESS_TYPE_UNIX;
  912. addr->u.q_unix.path = g_strdup(str + 5);
  913. }
  914. } else if (strstart(str, "fd:", NULL)) {
  915. if (str[3] == '\0') {
  916. error_setg(errp, "invalid file descriptor address");
  917. goto fail;
  918. } else {
  919. addr->type = SOCKET_ADDRESS_TYPE_FD;
  920. addr->u.fd.str = g_strdup(str + 3);
  921. }
  922. } else if (strstart(str, "vsock:", NULL)) {
  923. addr->type = SOCKET_ADDRESS_TYPE_VSOCK;
  924. if (vsock_parse(&addr->u.vsock, str + strlen("vsock:"), errp)) {
  925. goto fail;
  926. }
  927. } else {
  928. addr->type = SOCKET_ADDRESS_TYPE_INET;
  929. if (inet_parse(&addr->u.inet, str, errp)) {
  930. goto fail;
  931. }
  932. }
  933. return addr;
  934. fail:
  935. qapi_free_SocketAddress(addr);
  936. return NULL;
  937. }
  938. static int socket_get_fd(const char *fdstr, int num, Error **errp)
  939. {
  940. int fd;
  941. if (num != 1) {
  942. error_setg_errno(errp, EINVAL, "socket_get_fd: too many connections");
  943. return -1;
  944. }
  945. if (cur_mon) {
  946. fd = monitor_get_fd(cur_mon, fdstr, errp);
  947. if (fd < 0) {
  948. return -1;
  949. }
  950. } else {
  951. if (qemu_strtoi(fdstr, NULL, 10, &fd) < 0) {
  952. error_setg_errno(errp, errno,
  953. "Unable to parse FD number %s",
  954. fdstr);
  955. return -1;
  956. }
  957. }
  958. if (!fd_is_socket(fd)) {
  959. error_setg(errp, "File descriptor '%s' is not a socket", fdstr);
  960. close(fd);
  961. return -1;
  962. }
  963. return fd;
  964. }
  965. int socket_connect(SocketAddress *addr, Error **errp)
  966. {
  967. int fd;
  968. switch (addr->type) {
  969. case SOCKET_ADDRESS_TYPE_INET:
  970. fd = inet_connect_saddr(&addr->u.inet, errp);
  971. break;
  972. case SOCKET_ADDRESS_TYPE_UNIX:
  973. fd = unix_connect_saddr(&addr->u.q_unix, errp);
  974. break;
  975. case SOCKET_ADDRESS_TYPE_FD:
  976. fd = socket_get_fd(addr->u.fd.str, 1, errp);
  977. break;
  978. case SOCKET_ADDRESS_TYPE_VSOCK:
  979. fd = vsock_connect_saddr(&addr->u.vsock, errp);
  980. break;
  981. default:
  982. abort();
  983. }
  984. return fd;
  985. }
  986. int socket_listen(SocketAddress *addr, int num, Error **errp)
  987. {
  988. int fd;
  989. trace_socket_listen(num);
  990. switch (addr->type) {
  991. case SOCKET_ADDRESS_TYPE_INET:
  992. fd = inet_listen_saddr(&addr->u.inet, 0, num, errp);
  993. break;
  994. case SOCKET_ADDRESS_TYPE_UNIX:
  995. fd = unix_listen_saddr(&addr->u.q_unix, num, errp);
  996. break;
  997. case SOCKET_ADDRESS_TYPE_FD:
  998. fd = socket_get_fd(addr->u.fd.str, num, errp);
  999. break;
  1000. case SOCKET_ADDRESS_TYPE_VSOCK:
  1001. fd = vsock_listen_saddr(&addr->u.vsock, num, errp);
  1002. break;
  1003. default:
  1004. abort();
  1005. }
  1006. return fd;
  1007. }
  1008. void socket_listen_cleanup(int fd, Error **errp)
  1009. {
  1010. SocketAddress *addr;
  1011. addr = socket_local_address(fd, errp);
  1012. if (!addr) {
  1013. return;
  1014. }
  1015. if (addr->type == SOCKET_ADDRESS_TYPE_UNIX
  1016. && addr->u.q_unix.path) {
  1017. if (unlink(addr->u.q_unix.path) < 0 && errno != ENOENT) {
  1018. error_setg_errno(errp, errno,
  1019. "Failed to unlink socket %s",
  1020. addr->u.q_unix.path);
  1021. }
  1022. }
  1023. qapi_free_SocketAddress(addr);
  1024. }
  1025. int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp)
  1026. {
  1027. int fd;
  1028. /*
  1029. * TODO SOCKET_ADDRESS_TYPE_FD when fd is AF_INET or AF_INET6
  1030. * (although other address families can do SOCK_DGRAM, too)
  1031. */
  1032. switch (remote->type) {
  1033. case SOCKET_ADDRESS_TYPE_INET:
  1034. fd = inet_dgram_saddr(&remote->u.inet,
  1035. local ? &local->u.inet : NULL, errp);
  1036. break;
  1037. default:
  1038. error_setg(errp, "socket type unsupported for datagram");
  1039. fd = -1;
  1040. }
  1041. return fd;
  1042. }
  1043. static SocketAddress *
  1044. socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
  1045. socklen_t salen,
  1046. Error **errp)
  1047. {
  1048. char host[NI_MAXHOST];
  1049. char serv[NI_MAXSERV];
  1050. SocketAddress *addr;
  1051. InetSocketAddress *inet;
  1052. int ret;
  1053. ret = getnameinfo((struct sockaddr *)sa, salen,
  1054. host, sizeof(host),
  1055. serv, sizeof(serv),
  1056. NI_NUMERICHOST | NI_NUMERICSERV);
  1057. if (ret != 0) {
  1058. error_setg(errp, "Cannot format numeric socket address: %s",
  1059. gai_strerror(ret));
  1060. return NULL;
  1061. }
  1062. addr = g_new0(SocketAddress, 1);
  1063. addr->type = SOCKET_ADDRESS_TYPE_INET;
  1064. inet = &addr->u.inet;
  1065. inet->host = g_strdup(host);
  1066. inet->port = g_strdup(serv);
  1067. if (sa->ss_family == AF_INET) {
  1068. inet->has_ipv4 = inet->ipv4 = true;
  1069. } else {
  1070. inet->has_ipv6 = inet->ipv6 = true;
  1071. }
  1072. return addr;
  1073. }
  1074. #ifndef WIN32
  1075. static SocketAddress *
  1076. socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
  1077. socklen_t salen,
  1078. Error **errp)
  1079. {
  1080. SocketAddress *addr;
  1081. struct sockaddr_un *su = (struct sockaddr_un *)sa;
  1082. addr = g_new0(SocketAddress, 1);
  1083. addr->type = SOCKET_ADDRESS_TYPE_UNIX;
  1084. if (su->sun_path[0]) {
  1085. addr->u.q_unix.path = g_strndup(su->sun_path, sizeof(su->sun_path));
  1086. }
  1087. return addr;
  1088. }
  1089. #endif /* WIN32 */
  1090. #ifdef CONFIG_AF_VSOCK
  1091. static SocketAddress *
  1092. socket_sockaddr_to_address_vsock(struct sockaddr_storage *sa,
  1093. socklen_t salen,
  1094. Error **errp)
  1095. {
  1096. SocketAddress *addr;
  1097. VsockSocketAddress *vaddr;
  1098. struct sockaddr_vm *svm = (struct sockaddr_vm *)sa;
  1099. addr = g_new0(SocketAddress, 1);
  1100. addr->type = SOCKET_ADDRESS_TYPE_VSOCK;
  1101. vaddr = &addr->u.vsock;
  1102. vaddr->cid = g_strdup_printf("%u", svm->svm_cid);
  1103. vaddr->port = g_strdup_printf("%u", svm->svm_port);
  1104. return addr;
  1105. }
  1106. #endif /* CONFIG_AF_VSOCK */
  1107. SocketAddress *
  1108. socket_sockaddr_to_address(struct sockaddr_storage *sa,
  1109. socklen_t salen,
  1110. Error **errp)
  1111. {
  1112. switch (sa->ss_family) {
  1113. case AF_INET:
  1114. case AF_INET6:
  1115. return socket_sockaddr_to_address_inet(sa, salen, errp);
  1116. #ifndef WIN32
  1117. case AF_UNIX:
  1118. return socket_sockaddr_to_address_unix(sa, salen, errp);
  1119. #endif /* WIN32 */
  1120. #ifdef CONFIG_AF_VSOCK
  1121. case AF_VSOCK:
  1122. return socket_sockaddr_to_address_vsock(sa, salen, errp);
  1123. #endif
  1124. default:
  1125. error_setg(errp, "socket family %d unsupported",
  1126. sa->ss_family);
  1127. return NULL;
  1128. }
  1129. return 0;
  1130. }
  1131. SocketAddress *socket_local_address(int fd, Error **errp)
  1132. {
  1133. struct sockaddr_storage ss;
  1134. socklen_t sslen = sizeof(ss);
  1135. if (getsockname(fd, (struct sockaddr *)&ss, &sslen) < 0) {
  1136. error_setg_errno(errp, errno, "%s",
  1137. "Unable to query local socket address");
  1138. return NULL;
  1139. }
  1140. return socket_sockaddr_to_address(&ss, sslen, errp);
  1141. }
  1142. SocketAddress *socket_remote_address(int fd, Error **errp)
  1143. {
  1144. struct sockaddr_storage ss;
  1145. socklen_t sslen = sizeof(ss);
  1146. if (getpeername(fd, (struct sockaddr *)&ss, &sslen) < 0) {
  1147. error_setg_errno(errp, errno, "%s",
  1148. "Unable to query remote socket address");
  1149. return NULL;
  1150. }
  1151. return socket_sockaddr_to_address(&ss, sslen, errp);
  1152. }
  1153. SocketAddress *socket_address_flatten(SocketAddressLegacy *addr_legacy)
  1154. {
  1155. SocketAddress *addr;
  1156. if (!addr_legacy) {
  1157. return NULL;
  1158. }
  1159. addr = g_new(SocketAddress, 1);
  1160. switch (addr_legacy->type) {
  1161. case SOCKET_ADDRESS_LEGACY_KIND_INET:
  1162. addr->type = SOCKET_ADDRESS_TYPE_INET;
  1163. QAPI_CLONE_MEMBERS(InetSocketAddress, &addr->u.inet,
  1164. addr_legacy->u.inet.data);
  1165. break;
  1166. case SOCKET_ADDRESS_LEGACY_KIND_UNIX:
  1167. addr->type = SOCKET_ADDRESS_TYPE_UNIX;
  1168. QAPI_CLONE_MEMBERS(UnixSocketAddress, &addr->u.q_unix,
  1169. addr_legacy->u.q_unix.data);
  1170. break;
  1171. case SOCKET_ADDRESS_LEGACY_KIND_VSOCK:
  1172. addr->type = SOCKET_ADDRESS_TYPE_VSOCK;
  1173. QAPI_CLONE_MEMBERS(VsockSocketAddress, &addr->u.vsock,
  1174. addr_legacy->u.vsock.data);
  1175. break;
  1176. case SOCKET_ADDRESS_LEGACY_KIND_FD:
  1177. addr->type = SOCKET_ADDRESS_TYPE_FD;
  1178. QAPI_CLONE_MEMBERS(String, &addr->u.fd, addr_legacy->u.fd.data);
  1179. break;
  1180. default:
  1181. abort();
  1182. }
  1183. return addr;
  1184. }