char-socket.c 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102
  1. /*
  2. * QEMU System Emulator
  3. *
  4. * Copyright (c) 2003-2008 Fabrice Bellard
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * of this software and associated documentation files (the "Software"), to deal
  8. * in the Software without restriction, including without limitation the rights
  9. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. * copies of the Software, and to permit persons to whom the Software is
  11. * furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. * THE SOFTWARE.
  23. */
  24. #include "qemu/osdep.h"
  25. #include "chardev/char.h"
  26. #include "io/channel-socket.h"
  27. #include "io/channel-tls.h"
  28. #include "qemu/error-report.h"
  29. #include "qapi/error.h"
  30. #include "qapi/clone-visitor.h"
  31. #include "chardev/char-io.h"
  32. /***********************************************************/
  33. /* TCP Net console */
  34. #define TCP_MAX_FDS 16
  35. typedef struct {
  36. Chardev parent;
  37. QIOChannel *ioc; /* Client I/O channel */
  38. QIOChannelSocket *sioc; /* Client master channel */
  39. QIOChannelSocket *listen_ioc;
  40. guint listen_tag;
  41. QCryptoTLSCreds *tls_creds;
  42. int connected;
  43. int max_size;
  44. int do_telnetopt;
  45. int do_nodelay;
  46. int *read_msgfds;
  47. size_t read_msgfds_num;
  48. int *write_msgfds;
  49. size_t write_msgfds_num;
  50. SocketAddress *addr;
  51. bool is_listen;
  52. bool is_telnet;
  53. bool is_tn3270;
  54. guint reconnect_timer;
  55. int64_t reconnect_time;
  56. bool connect_err_reported;
  57. } SocketChardev;
  58. #define SOCKET_CHARDEV(obj) \
  59. OBJECT_CHECK(SocketChardev, (obj), TYPE_CHARDEV_SOCKET)
  60. static gboolean socket_reconnect_timeout(gpointer opaque);
  61. static void qemu_chr_socket_restart_timer(Chardev *chr)
  62. {
  63. SocketChardev *s = SOCKET_CHARDEV(chr);
  64. char *name;
  65. assert(s->connected == 0);
  66. s->reconnect_timer = g_timeout_add_seconds(s->reconnect_time,
  67. socket_reconnect_timeout, chr);
  68. name = g_strdup_printf("chardev-socket-reconnect-%s", chr->label);
  69. g_source_set_name_by_id(s->reconnect_timer, name);
  70. g_free(name);
  71. }
  72. static void check_report_connect_error(Chardev *chr,
  73. Error *err)
  74. {
  75. SocketChardev *s = SOCKET_CHARDEV(chr);
  76. if (!s->connect_err_reported) {
  77. error_report("Unable to connect character device %s: %s",
  78. chr->label, error_get_pretty(err));
  79. s->connect_err_reported = true;
  80. }
  81. qemu_chr_socket_restart_timer(chr);
  82. }
  83. static gboolean tcp_chr_accept(QIOChannel *chan,
  84. GIOCondition cond,
  85. void *opaque);
  86. static int tcp_chr_read_poll(void *opaque);
  87. static void tcp_chr_disconnect(Chardev *chr);
  88. /* Called with chr_write_lock held. */
  89. static int tcp_chr_write(Chardev *chr, const uint8_t *buf, int len)
  90. {
  91. SocketChardev *s = SOCKET_CHARDEV(chr);
  92. if (s->connected) {
  93. int ret = io_channel_send_full(s->ioc, buf, len,
  94. s->write_msgfds,
  95. s->write_msgfds_num);
  96. /* free the written msgfds, no matter what */
  97. if (s->write_msgfds_num) {
  98. g_free(s->write_msgfds);
  99. s->write_msgfds = 0;
  100. s->write_msgfds_num = 0;
  101. }
  102. if (ret < 0 && errno != EAGAIN) {
  103. if (tcp_chr_read_poll(chr) <= 0) {
  104. tcp_chr_disconnect(chr);
  105. return len;
  106. } /* else let the read handler finish it properly */
  107. }
  108. return ret;
  109. } else {
  110. /* XXX: indicate an error ? */
  111. return len;
  112. }
  113. }
  114. static int tcp_chr_read_poll(void *opaque)
  115. {
  116. Chardev *chr = CHARDEV(opaque);
  117. SocketChardev *s = SOCKET_CHARDEV(opaque);
  118. if (!s->connected) {
  119. return 0;
  120. }
  121. s->max_size = qemu_chr_be_can_write(chr);
  122. return s->max_size;
  123. }
  124. static void tcp_chr_process_IAC_bytes(Chardev *chr,
  125. SocketChardev *s,
  126. uint8_t *buf, int *size)
  127. {
  128. /* Handle any telnet or tn3270 client's basic IAC options.
  129. * For telnet options, it satisfies char by char mode with no echo.
  130. * For tn3270 options, it satisfies binary mode with EOR.
  131. * All IAC options will be removed from the buf and the do_opt
  132. * pointer will be used to track the state of the width of the
  133. * IAC information.
  134. *
  135. * RFC854: "All TELNET commands consist of at least a two byte sequence.
  136. * The commands dealing with option negotiation are three byte sequences,
  137. * the third byte being the code for the option referenced."
  138. * "IAC BREAK", "IAC IP", "IAC NOP" and the double IAC are two bytes.
  139. * "IAC SB", "IAC SE" and "IAC EOR" are saved to split up data boundary
  140. * for tn3270.
  141. * NOP, Break and Interrupt Process(IP) might be encountered during a TN3270
  142. * session, and NOP and IP need to be done later.
  143. */
  144. int i;
  145. int j = 0;
  146. for (i = 0; i < *size; i++) {
  147. if (s->do_telnetopt > 1) {
  148. if ((unsigned char)buf[i] == IAC && s->do_telnetopt == 2) {
  149. /* Double IAC means send an IAC */
  150. if (j != i) {
  151. buf[j] = buf[i];
  152. }
  153. j++;
  154. s->do_telnetopt = 1;
  155. } else {
  156. if ((unsigned char)buf[i] == IAC_BREAK
  157. && s->do_telnetopt == 2) {
  158. /* Handle IAC break commands by sending a serial break */
  159. qemu_chr_be_event(chr, CHR_EVENT_BREAK);
  160. s->do_telnetopt++;
  161. } else if (s->is_tn3270 && ((unsigned char)buf[i] == IAC_EOR
  162. || (unsigned char)buf[i] == IAC_SB
  163. || (unsigned char)buf[i] == IAC_SE)
  164. && s->do_telnetopt == 2) {
  165. buf[j++] = IAC;
  166. buf[j++] = buf[i];
  167. s->do_telnetopt++;
  168. } else if (s->is_tn3270 && ((unsigned char)buf[i] == IAC_IP
  169. || (unsigned char)buf[i] == IAC_NOP)
  170. && s->do_telnetopt == 2) {
  171. /* TODO: IP and NOP need to be implemented later. */
  172. s->do_telnetopt++;
  173. }
  174. s->do_telnetopt++;
  175. }
  176. if (s->do_telnetopt >= 4) {
  177. s->do_telnetopt = 1;
  178. }
  179. } else {
  180. if ((unsigned char)buf[i] == IAC) {
  181. s->do_telnetopt = 2;
  182. } else {
  183. if (j != i) {
  184. buf[j] = buf[i];
  185. }
  186. j++;
  187. }
  188. }
  189. }
  190. *size = j;
  191. }
  192. static int tcp_get_msgfds(Chardev *chr, int *fds, int num)
  193. {
  194. SocketChardev *s = SOCKET_CHARDEV(chr);
  195. int to_copy = (s->read_msgfds_num < num) ? s->read_msgfds_num : num;
  196. assert(num <= TCP_MAX_FDS);
  197. if (to_copy) {
  198. int i;
  199. memcpy(fds, s->read_msgfds, to_copy * sizeof(int));
  200. /* Close unused fds */
  201. for (i = to_copy; i < s->read_msgfds_num; i++) {
  202. close(s->read_msgfds[i]);
  203. }
  204. g_free(s->read_msgfds);
  205. s->read_msgfds = 0;
  206. s->read_msgfds_num = 0;
  207. }
  208. return to_copy;
  209. }
  210. static int tcp_set_msgfds(Chardev *chr, int *fds, int num)
  211. {
  212. SocketChardev *s = SOCKET_CHARDEV(chr);
  213. /* clear old pending fd array */
  214. g_free(s->write_msgfds);
  215. s->write_msgfds = NULL;
  216. s->write_msgfds_num = 0;
  217. if (!s->connected ||
  218. !qio_channel_has_feature(s->ioc,
  219. QIO_CHANNEL_FEATURE_FD_PASS)) {
  220. return -1;
  221. }
  222. if (num) {
  223. s->write_msgfds = g_new(int, num);
  224. memcpy(s->write_msgfds, fds, num * sizeof(int));
  225. }
  226. s->write_msgfds_num = num;
  227. return 0;
  228. }
  229. static ssize_t tcp_chr_recv(Chardev *chr, char *buf, size_t len)
  230. {
  231. SocketChardev *s = SOCKET_CHARDEV(chr);
  232. struct iovec iov = { .iov_base = buf, .iov_len = len };
  233. int ret;
  234. size_t i;
  235. int *msgfds = NULL;
  236. size_t msgfds_num = 0;
  237. if (qio_channel_has_feature(s->ioc, QIO_CHANNEL_FEATURE_FD_PASS)) {
  238. ret = qio_channel_readv_full(s->ioc, &iov, 1,
  239. &msgfds, &msgfds_num,
  240. NULL);
  241. } else {
  242. ret = qio_channel_readv_full(s->ioc, &iov, 1,
  243. NULL, NULL,
  244. NULL);
  245. }
  246. if (ret == QIO_CHANNEL_ERR_BLOCK) {
  247. errno = EAGAIN;
  248. ret = -1;
  249. } else if (ret == -1) {
  250. errno = EIO;
  251. }
  252. if (msgfds_num) {
  253. /* close and clean read_msgfds */
  254. for (i = 0; i < s->read_msgfds_num; i++) {
  255. close(s->read_msgfds[i]);
  256. }
  257. if (s->read_msgfds_num) {
  258. g_free(s->read_msgfds);
  259. }
  260. s->read_msgfds = msgfds;
  261. s->read_msgfds_num = msgfds_num;
  262. }
  263. for (i = 0; i < s->read_msgfds_num; i++) {
  264. int fd = s->read_msgfds[i];
  265. if (fd < 0) {
  266. continue;
  267. }
  268. /* O_NONBLOCK is preserved across SCM_RIGHTS so reset it */
  269. qemu_set_block(fd);
  270. #ifndef MSG_CMSG_CLOEXEC
  271. qemu_set_cloexec(fd);
  272. #endif
  273. }
  274. return ret;
  275. }
  276. static GSource *tcp_chr_add_watch(Chardev *chr, GIOCondition cond)
  277. {
  278. SocketChardev *s = SOCKET_CHARDEV(chr);
  279. return qio_channel_create_watch(s->ioc, cond);
  280. }
  281. static void tcp_chr_free_connection(Chardev *chr)
  282. {
  283. SocketChardev *s = SOCKET_CHARDEV(chr);
  284. int i;
  285. if (!s->connected) {
  286. return;
  287. }
  288. if (s->read_msgfds_num) {
  289. for (i = 0; i < s->read_msgfds_num; i++) {
  290. close(s->read_msgfds[i]);
  291. }
  292. g_free(s->read_msgfds);
  293. s->read_msgfds = NULL;
  294. s->read_msgfds_num = 0;
  295. }
  296. tcp_set_msgfds(chr, NULL, 0);
  297. remove_fd_in_watch(chr);
  298. object_unref(OBJECT(s->sioc));
  299. s->sioc = NULL;
  300. object_unref(OBJECT(s->ioc));
  301. s->ioc = NULL;
  302. g_free(chr->filename);
  303. chr->filename = NULL;
  304. s->connected = 0;
  305. }
  306. static char *SocketAddress_to_str(const char *prefix, SocketAddress *addr,
  307. bool is_listen, bool is_telnet)
  308. {
  309. switch (addr->type) {
  310. case SOCKET_ADDRESS_TYPE_INET:
  311. return g_strdup_printf("%s%s:%s:%s%s", prefix,
  312. is_telnet ? "telnet" : "tcp",
  313. addr->u.inet.host,
  314. addr->u.inet.port,
  315. is_listen ? ",server" : "");
  316. break;
  317. case SOCKET_ADDRESS_TYPE_UNIX:
  318. return g_strdup_printf("%sunix:%s%s", prefix,
  319. addr->u.q_unix.path,
  320. is_listen ? ",server" : "");
  321. break;
  322. case SOCKET_ADDRESS_TYPE_FD:
  323. return g_strdup_printf("%sfd:%s%s", prefix, addr->u.fd.str,
  324. is_listen ? ",server" : "");
  325. break;
  326. case SOCKET_ADDRESS_TYPE_VSOCK:
  327. return g_strdup_printf("%svsock:%s:%s", prefix,
  328. addr->u.vsock.cid,
  329. addr->u.vsock.port);
  330. default:
  331. abort();
  332. }
  333. }
  334. static void update_disconnected_filename(SocketChardev *s)
  335. {
  336. Chardev *chr = CHARDEV(s);
  337. g_free(chr->filename);
  338. chr->filename = SocketAddress_to_str("disconnected:", s->addr,
  339. s->is_listen, s->is_telnet);
  340. }
  341. static void tcp_chr_disconnect(Chardev *chr)
  342. {
  343. SocketChardev *s = SOCKET_CHARDEV(chr);
  344. if (!s->connected) {
  345. return;
  346. }
  347. tcp_chr_free_connection(chr);
  348. if (s->listen_ioc) {
  349. s->listen_tag = qio_channel_add_watch(
  350. QIO_CHANNEL(s->listen_ioc), G_IO_IN, tcp_chr_accept, chr, NULL);
  351. }
  352. update_disconnected_filename(s);
  353. qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
  354. if (s->reconnect_time) {
  355. qemu_chr_socket_restart_timer(chr);
  356. }
  357. }
  358. static gboolean tcp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
  359. {
  360. Chardev *chr = CHARDEV(opaque);
  361. SocketChardev *s = SOCKET_CHARDEV(opaque);
  362. uint8_t buf[CHR_READ_BUF_LEN];
  363. int len, size;
  364. if (!s->connected || s->max_size <= 0) {
  365. return TRUE;
  366. }
  367. len = sizeof(buf);
  368. if (len > s->max_size) {
  369. len = s->max_size;
  370. }
  371. size = tcp_chr_recv(chr, (void *)buf, len);
  372. if (size == 0 || size == -1) {
  373. /* connection closed */
  374. tcp_chr_disconnect(chr);
  375. } else if (size > 0) {
  376. if (s->do_telnetopt) {
  377. tcp_chr_process_IAC_bytes(chr, s, buf, &size);
  378. }
  379. if (size > 0) {
  380. qemu_chr_be_write(chr, buf, size);
  381. }
  382. }
  383. return TRUE;
  384. }
  385. static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len)
  386. {
  387. SocketChardev *s = SOCKET_CHARDEV(chr);
  388. int size;
  389. if (!s->connected) {
  390. return 0;
  391. }
  392. size = tcp_chr_recv(chr, (void *) buf, len);
  393. if (size == 0) {
  394. /* connection closed */
  395. tcp_chr_disconnect(chr);
  396. }
  397. return size;
  398. }
  399. static char *sockaddr_to_str(struct sockaddr_storage *ss, socklen_t ss_len,
  400. struct sockaddr_storage *ps, socklen_t ps_len,
  401. bool is_listen, bool is_telnet)
  402. {
  403. char shost[NI_MAXHOST], sserv[NI_MAXSERV];
  404. char phost[NI_MAXHOST], pserv[NI_MAXSERV];
  405. const char *left = "", *right = "";
  406. switch (ss->ss_family) {
  407. #ifndef _WIN32
  408. case AF_UNIX:
  409. return g_strdup_printf("unix:%s%s",
  410. ((struct sockaddr_un *)(ss))->sun_path,
  411. is_listen ? ",server" : "");
  412. #endif
  413. case AF_INET6:
  414. left = "[";
  415. right = "]";
  416. /* fall through */
  417. case AF_INET:
  418. getnameinfo((struct sockaddr *) ss, ss_len, shost, sizeof(shost),
  419. sserv, sizeof(sserv), NI_NUMERICHOST | NI_NUMERICSERV);
  420. getnameinfo((struct sockaddr *) ps, ps_len, phost, sizeof(phost),
  421. pserv, sizeof(pserv), NI_NUMERICHOST | NI_NUMERICSERV);
  422. return g_strdup_printf("%s:%s%s%s:%s%s <-> %s%s%s:%s",
  423. is_telnet ? "telnet" : "tcp",
  424. left, shost, right, sserv,
  425. is_listen ? ",server" : "",
  426. left, phost, right, pserv);
  427. default:
  428. return g_strdup_printf("unknown");
  429. }
  430. }
  431. static void tcp_chr_connect(void *opaque)
  432. {
  433. Chardev *chr = CHARDEV(opaque);
  434. SocketChardev *s = SOCKET_CHARDEV(opaque);
  435. g_free(chr->filename);
  436. chr->filename = sockaddr_to_str(
  437. &s->sioc->localAddr, s->sioc->localAddrLen,
  438. &s->sioc->remoteAddr, s->sioc->remoteAddrLen,
  439. s->is_listen, s->is_telnet);
  440. s->connected = 1;
  441. if (s->ioc) {
  442. chr->gsource = io_add_watch_poll(chr, s->ioc,
  443. tcp_chr_read_poll,
  444. tcp_chr_read,
  445. chr, NULL);
  446. }
  447. qemu_chr_be_event(chr, CHR_EVENT_OPENED);
  448. }
  449. static void tcp_chr_update_read_handler(Chardev *chr,
  450. GMainContext *context)
  451. {
  452. SocketChardev *s = SOCKET_CHARDEV(chr);
  453. if (!s->connected) {
  454. return;
  455. }
  456. remove_fd_in_watch(chr);
  457. if (s->ioc) {
  458. chr->gsource = io_add_watch_poll(chr, s->ioc,
  459. tcp_chr_read_poll,
  460. tcp_chr_read, chr,
  461. context);
  462. }
  463. }
  464. typedef struct {
  465. Chardev *chr;
  466. char buf[21];
  467. size_t buflen;
  468. } TCPChardevTelnetInit;
  469. static gboolean tcp_chr_telnet_init_io(QIOChannel *ioc,
  470. GIOCondition cond G_GNUC_UNUSED,
  471. gpointer user_data)
  472. {
  473. TCPChardevTelnetInit *init = user_data;
  474. ssize_t ret;
  475. ret = qio_channel_write(ioc, init->buf, init->buflen, NULL);
  476. if (ret < 0) {
  477. if (ret == QIO_CHANNEL_ERR_BLOCK) {
  478. ret = 0;
  479. } else {
  480. tcp_chr_disconnect(init->chr);
  481. return FALSE;
  482. }
  483. }
  484. init->buflen -= ret;
  485. if (init->buflen == 0) {
  486. tcp_chr_connect(init->chr);
  487. return FALSE;
  488. }
  489. memmove(init->buf, init->buf + ret, init->buflen);
  490. return TRUE;
  491. }
  492. static void tcp_chr_telnet_init(Chardev *chr)
  493. {
  494. SocketChardev *s = SOCKET_CHARDEV(chr);
  495. TCPChardevTelnetInit *init = g_new0(TCPChardevTelnetInit, 1);
  496. size_t n = 0;
  497. #define IACSET(x, a, b, c) \
  498. do { \
  499. x[n++] = a; \
  500. x[n++] = b; \
  501. x[n++] = c; \
  502. } while (0)
  503. init->chr = chr;
  504. if (!s->is_tn3270) {
  505. init->buflen = 12;
  506. /* Prep the telnet negotion to put telnet in binary,
  507. * no echo, single char mode */
  508. IACSET(init->buf, 0xff, 0xfb, 0x01); /* IAC WILL ECHO */
  509. IACSET(init->buf, 0xff, 0xfb, 0x03); /* IAC WILL Suppress go ahead */
  510. IACSET(init->buf, 0xff, 0xfb, 0x00); /* IAC WILL Binary */
  511. IACSET(init->buf, 0xff, 0xfd, 0x00); /* IAC DO Binary */
  512. } else {
  513. init->buflen = 21;
  514. /* Prep the TN3270 negotion based on RFC1576 */
  515. IACSET(init->buf, 0xff, 0xfd, 0x19); /* IAC DO EOR */
  516. IACSET(init->buf, 0xff, 0xfb, 0x19); /* IAC WILL EOR */
  517. IACSET(init->buf, 0xff, 0xfd, 0x00); /* IAC DO BINARY */
  518. IACSET(init->buf, 0xff, 0xfb, 0x00); /* IAC WILL BINARY */
  519. IACSET(init->buf, 0xff, 0xfd, 0x18); /* IAC DO TERMINAL TYPE */
  520. IACSET(init->buf, 0xff, 0xfa, 0x18); /* IAC SB TERMINAL TYPE */
  521. IACSET(init->buf, 0x01, 0xff, 0xf0); /* SEND IAC SE */
  522. }
  523. #undef IACSET
  524. qio_channel_add_watch(
  525. s->ioc, G_IO_OUT,
  526. tcp_chr_telnet_init_io,
  527. init, NULL);
  528. }
  529. static void tcp_chr_tls_handshake(QIOTask *task,
  530. gpointer user_data)
  531. {
  532. Chardev *chr = user_data;
  533. SocketChardev *s = user_data;
  534. if (qio_task_propagate_error(task, NULL)) {
  535. tcp_chr_disconnect(chr);
  536. } else {
  537. /* tn3270 does not support TLS yet */
  538. if (s->do_telnetopt && !s->is_tn3270) {
  539. tcp_chr_telnet_init(chr);
  540. } else {
  541. tcp_chr_connect(chr);
  542. }
  543. }
  544. }
  545. static void tcp_chr_tls_init(Chardev *chr)
  546. {
  547. SocketChardev *s = SOCKET_CHARDEV(chr);
  548. QIOChannelTLS *tioc;
  549. Error *err = NULL;
  550. gchar *name;
  551. if (s->is_listen) {
  552. tioc = qio_channel_tls_new_server(
  553. s->ioc, s->tls_creds,
  554. NULL, /* XXX Use an ACL */
  555. &err);
  556. } else {
  557. tioc = qio_channel_tls_new_client(
  558. s->ioc, s->tls_creds,
  559. s->addr->u.inet.host,
  560. &err);
  561. }
  562. if (tioc == NULL) {
  563. error_free(err);
  564. tcp_chr_disconnect(chr);
  565. return;
  566. }
  567. name = g_strdup_printf("chardev-tls-%s-%s",
  568. s->is_listen ? "server" : "client",
  569. chr->label);
  570. qio_channel_set_name(QIO_CHANNEL(tioc), name);
  571. g_free(name);
  572. object_unref(OBJECT(s->ioc));
  573. s->ioc = QIO_CHANNEL(tioc);
  574. qio_channel_tls_handshake(tioc,
  575. tcp_chr_tls_handshake,
  576. chr,
  577. NULL);
  578. }
  579. static void tcp_chr_set_client_ioc_name(Chardev *chr,
  580. QIOChannelSocket *sioc)
  581. {
  582. SocketChardev *s = SOCKET_CHARDEV(chr);
  583. char *name;
  584. name = g_strdup_printf("chardev-tcp-%s-%s",
  585. s->is_listen ? "server" : "client",
  586. chr->label);
  587. qio_channel_set_name(QIO_CHANNEL(sioc), name);
  588. g_free(name);
  589. }
  590. static int tcp_chr_new_client(Chardev *chr, QIOChannelSocket *sioc)
  591. {
  592. SocketChardev *s = SOCKET_CHARDEV(chr);
  593. if (s->ioc != NULL) {
  594. return -1;
  595. }
  596. s->ioc = QIO_CHANNEL(sioc);
  597. object_ref(OBJECT(sioc));
  598. s->sioc = sioc;
  599. object_ref(OBJECT(sioc));
  600. qio_channel_set_blocking(s->ioc, false, NULL);
  601. if (s->do_nodelay) {
  602. qio_channel_set_delay(s->ioc, false);
  603. }
  604. if (s->listen_tag) {
  605. g_source_remove(s->listen_tag);
  606. s->listen_tag = 0;
  607. }
  608. if (s->tls_creds) {
  609. tcp_chr_tls_init(chr);
  610. } else {
  611. if (s->do_telnetopt) {
  612. tcp_chr_telnet_init(chr);
  613. } else {
  614. tcp_chr_connect(chr);
  615. }
  616. }
  617. return 0;
  618. }
  619. static int tcp_chr_add_client(Chardev *chr, int fd)
  620. {
  621. int ret;
  622. QIOChannelSocket *sioc;
  623. sioc = qio_channel_socket_new_fd(fd, NULL);
  624. if (!sioc) {
  625. return -1;
  626. }
  627. tcp_chr_set_client_ioc_name(chr, sioc);
  628. ret = tcp_chr_new_client(chr, sioc);
  629. object_unref(OBJECT(sioc));
  630. return ret;
  631. }
  632. static gboolean tcp_chr_accept(QIOChannel *channel,
  633. GIOCondition cond,
  634. void *opaque)
  635. {
  636. Chardev *chr = CHARDEV(opaque);
  637. QIOChannelSocket *sioc;
  638. sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(channel),
  639. NULL);
  640. if (!sioc) {
  641. return TRUE;
  642. }
  643. tcp_chr_new_client(chr, sioc);
  644. object_unref(OBJECT(sioc));
  645. return TRUE;
  646. }
  647. static int tcp_chr_wait_connected(Chardev *chr, Error **errp)
  648. {
  649. SocketChardev *s = SOCKET_CHARDEV(chr);
  650. QIOChannelSocket *sioc;
  651. /* It can't wait on s->connected, since it is set asynchronously
  652. * in TLS and telnet cases, only wait for an accepted socket */
  653. while (!s->ioc) {
  654. if (s->is_listen) {
  655. error_report("QEMU waiting for connection on: %s",
  656. chr->filename);
  657. qio_channel_set_blocking(QIO_CHANNEL(s->listen_ioc), true, NULL);
  658. tcp_chr_accept(QIO_CHANNEL(s->listen_ioc), G_IO_IN, chr);
  659. qio_channel_set_blocking(QIO_CHANNEL(s->listen_ioc), false, NULL);
  660. } else {
  661. sioc = qio_channel_socket_new();
  662. tcp_chr_set_client_ioc_name(chr, sioc);
  663. if (qio_channel_socket_connect_sync(sioc, s->addr, errp) < 0) {
  664. object_unref(OBJECT(sioc));
  665. return -1;
  666. }
  667. tcp_chr_new_client(chr, sioc);
  668. object_unref(OBJECT(sioc));
  669. }
  670. }
  671. return 0;
  672. }
  673. static void char_socket_finalize(Object *obj)
  674. {
  675. Chardev *chr = CHARDEV(obj);
  676. SocketChardev *s = SOCKET_CHARDEV(obj);
  677. tcp_chr_free_connection(chr);
  678. if (s->reconnect_timer) {
  679. g_source_remove(s->reconnect_timer);
  680. s->reconnect_timer = 0;
  681. }
  682. qapi_free_SocketAddress(s->addr);
  683. if (s->listen_tag) {
  684. g_source_remove(s->listen_tag);
  685. s->listen_tag = 0;
  686. }
  687. if (s->listen_ioc) {
  688. object_unref(OBJECT(s->listen_ioc));
  689. }
  690. if (s->tls_creds) {
  691. object_unref(OBJECT(s->tls_creds));
  692. }
  693. qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
  694. }
  695. static void qemu_chr_socket_connected(QIOTask *task, void *opaque)
  696. {
  697. QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task));
  698. Chardev *chr = CHARDEV(opaque);
  699. SocketChardev *s = SOCKET_CHARDEV(chr);
  700. Error *err = NULL;
  701. if (qio_task_propagate_error(task, &err)) {
  702. check_report_connect_error(chr, err);
  703. error_free(err);
  704. goto cleanup;
  705. }
  706. s->connect_err_reported = false;
  707. tcp_chr_new_client(chr, sioc);
  708. cleanup:
  709. object_unref(OBJECT(sioc));
  710. }
  711. static gboolean socket_reconnect_timeout(gpointer opaque)
  712. {
  713. Chardev *chr = CHARDEV(opaque);
  714. SocketChardev *s = SOCKET_CHARDEV(opaque);
  715. QIOChannelSocket *sioc;
  716. s->reconnect_timer = 0;
  717. if (chr->be_open) {
  718. return false;
  719. }
  720. sioc = qio_channel_socket_new();
  721. tcp_chr_set_client_ioc_name(chr, sioc);
  722. qio_channel_socket_connect_async(sioc, s->addr,
  723. qemu_chr_socket_connected,
  724. chr, NULL);
  725. return false;
  726. }
  727. static void qmp_chardev_open_socket(Chardev *chr,
  728. ChardevBackend *backend,
  729. bool *be_opened,
  730. Error **errp)
  731. {
  732. SocketChardev *s = SOCKET_CHARDEV(chr);
  733. ChardevSocket *sock = backend->u.socket.data;
  734. bool do_nodelay = sock->has_nodelay ? sock->nodelay : false;
  735. bool is_listen = sock->has_server ? sock->server : true;
  736. bool is_telnet = sock->has_telnet ? sock->telnet : false;
  737. bool is_tn3270 = sock->has_tn3270 ? sock->tn3270 : false;
  738. bool is_waitconnect = sock->has_wait ? sock->wait : false;
  739. int64_t reconnect = sock->has_reconnect ? sock->reconnect : 0;
  740. QIOChannelSocket *sioc = NULL;
  741. SocketAddress *addr;
  742. s->is_listen = is_listen;
  743. s->is_telnet = is_telnet;
  744. s->is_tn3270 = is_tn3270;
  745. s->do_nodelay = do_nodelay;
  746. if (sock->tls_creds) {
  747. Object *creds;
  748. creds = object_resolve_path_component(
  749. object_get_objects_root(), sock->tls_creds);
  750. if (!creds) {
  751. error_setg(errp, "No TLS credentials with id '%s'",
  752. sock->tls_creds);
  753. goto error;
  754. }
  755. s->tls_creds = (QCryptoTLSCreds *)
  756. object_dynamic_cast(creds,
  757. TYPE_QCRYPTO_TLS_CREDS);
  758. if (!s->tls_creds) {
  759. error_setg(errp, "Object with id '%s' is not TLS credentials",
  760. sock->tls_creds);
  761. goto error;
  762. }
  763. object_ref(OBJECT(s->tls_creds));
  764. if (is_listen) {
  765. if (s->tls_creds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_SERVER) {
  766. error_setg(errp, "%s",
  767. "Expected TLS credentials for server endpoint");
  768. goto error;
  769. }
  770. } else {
  771. if (s->tls_creds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_CLIENT) {
  772. error_setg(errp, "%s",
  773. "Expected TLS credentials for client endpoint");
  774. goto error;
  775. }
  776. }
  777. }
  778. s->addr = addr = socket_address_flatten(sock->addr);
  779. qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE);
  780. /* TODO SOCKET_ADDRESS_FD where fd has AF_UNIX */
  781. if (addr->type == SOCKET_ADDRESS_TYPE_UNIX) {
  782. qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS);
  783. }
  784. /* be isn't opened until we get a connection */
  785. *be_opened = false;
  786. update_disconnected_filename(s);
  787. if (is_listen) {
  788. if (is_telnet || is_tn3270) {
  789. s->do_telnetopt = 1;
  790. }
  791. } else if (reconnect > 0) {
  792. s->reconnect_time = reconnect;
  793. }
  794. if (s->reconnect_time) {
  795. sioc = qio_channel_socket_new();
  796. tcp_chr_set_client_ioc_name(chr, sioc);
  797. qio_channel_socket_connect_async(sioc, s->addr,
  798. qemu_chr_socket_connected,
  799. chr, NULL);
  800. } else {
  801. if (s->is_listen) {
  802. char *name;
  803. sioc = qio_channel_socket_new();
  804. name = g_strdup_printf("chardev-tcp-listener-%s", chr->label);
  805. qio_channel_set_name(QIO_CHANNEL(sioc), name);
  806. g_free(name);
  807. if (qio_channel_socket_listen_sync(sioc, s->addr, errp) < 0) {
  808. goto error;
  809. }
  810. qapi_free_SocketAddress(s->addr);
  811. s->addr = socket_local_address(sioc->fd, errp);
  812. update_disconnected_filename(s);
  813. s->listen_ioc = sioc;
  814. if (is_waitconnect &&
  815. qemu_chr_wait_connected(chr, errp) < 0) {
  816. return;
  817. }
  818. if (!s->ioc) {
  819. s->listen_tag = qio_channel_add_watch(
  820. QIO_CHANNEL(s->listen_ioc), G_IO_IN,
  821. tcp_chr_accept, chr, NULL);
  822. }
  823. } else if (qemu_chr_wait_connected(chr, errp) < 0) {
  824. goto error;
  825. }
  826. }
  827. return;
  828. error:
  829. if (sioc) {
  830. object_unref(OBJECT(sioc));
  831. }
  832. }
  833. static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
  834. Error **errp)
  835. {
  836. bool is_listen = qemu_opt_get_bool(opts, "server", false);
  837. bool is_waitconnect = is_listen && qemu_opt_get_bool(opts, "wait", true);
  838. bool is_telnet = qemu_opt_get_bool(opts, "telnet", false);
  839. bool is_tn3270 = qemu_opt_get_bool(opts, "tn3270", false);
  840. bool do_nodelay = !qemu_opt_get_bool(opts, "delay", true);
  841. int64_t reconnect = qemu_opt_get_number(opts, "reconnect", 0);
  842. const char *path = qemu_opt_get(opts, "path");
  843. const char *host = qemu_opt_get(opts, "host");
  844. const char *port = qemu_opt_get(opts, "port");
  845. const char *tls_creds = qemu_opt_get(opts, "tls-creds");
  846. SocketAddressLegacy *addr;
  847. ChardevSocket *sock;
  848. backend->type = CHARDEV_BACKEND_KIND_SOCKET;
  849. if (!path) {
  850. if (!host) {
  851. error_setg(errp, "chardev: socket: no host given");
  852. return;
  853. }
  854. if (!port) {
  855. error_setg(errp, "chardev: socket: no port given");
  856. return;
  857. }
  858. } else {
  859. if (tls_creds) {
  860. error_setg(errp, "TLS can only be used over TCP socket");
  861. return;
  862. }
  863. }
  864. sock = backend->u.socket.data = g_new0(ChardevSocket, 1);
  865. qemu_chr_parse_common(opts, qapi_ChardevSocket_base(sock));
  866. sock->has_nodelay = true;
  867. sock->nodelay = do_nodelay;
  868. sock->has_server = true;
  869. sock->server = is_listen;
  870. sock->has_telnet = true;
  871. sock->telnet = is_telnet;
  872. sock->has_tn3270 = true;
  873. sock->tn3270 = is_tn3270;
  874. sock->has_wait = true;
  875. sock->wait = is_waitconnect;
  876. sock->has_reconnect = true;
  877. sock->reconnect = reconnect;
  878. sock->tls_creds = g_strdup(tls_creds);
  879. addr = g_new0(SocketAddressLegacy, 1);
  880. if (path) {
  881. UnixSocketAddress *q_unix;
  882. addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
  883. q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
  884. q_unix->path = g_strdup(path);
  885. } else {
  886. addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
  887. addr->u.inet.data = g_new(InetSocketAddress, 1);
  888. *addr->u.inet.data = (InetSocketAddress) {
  889. .host = g_strdup(host),
  890. .port = g_strdup(port),
  891. .has_to = qemu_opt_get(opts, "to"),
  892. .to = qemu_opt_get_number(opts, "to", 0),
  893. .has_ipv4 = qemu_opt_get(opts, "ipv4"),
  894. .ipv4 = qemu_opt_get_bool(opts, "ipv4", 0),
  895. .has_ipv6 = qemu_opt_get(opts, "ipv6"),
  896. .ipv6 = qemu_opt_get_bool(opts, "ipv6", 0),
  897. };
  898. }
  899. sock->addr = addr;
  900. }
  901. static void
  902. char_socket_get_addr(Object *obj, Visitor *v, const char *name,
  903. void *opaque, Error **errp)
  904. {
  905. SocketChardev *s = SOCKET_CHARDEV(obj);
  906. visit_type_SocketAddress(v, name, &s->addr, errp);
  907. }
  908. static bool
  909. char_socket_get_connected(Object *obj, Error **errp)
  910. {
  911. SocketChardev *s = SOCKET_CHARDEV(obj);
  912. return s->connected;
  913. }
  914. static void char_socket_class_init(ObjectClass *oc, void *data)
  915. {
  916. ChardevClass *cc = CHARDEV_CLASS(oc);
  917. cc->parse = qemu_chr_parse_socket;
  918. cc->open = qmp_chardev_open_socket;
  919. cc->chr_wait_connected = tcp_chr_wait_connected;
  920. cc->chr_write = tcp_chr_write;
  921. cc->chr_sync_read = tcp_chr_sync_read;
  922. cc->chr_disconnect = tcp_chr_disconnect;
  923. cc->get_msgfds = tcp_get_msgfds;
  924. cc->set_msgfds = tcp_set_msgfds;
  925. cc->chr_add_client = tcp_chr_add_client;
  926. cc->chr_add_watch = tcp_chr_add_watch;
  927. cc->chr_update_read_handler = tcp_chr_update_read_handler;
  928. object_class_property_add(oc, "addr", "SocketAddress",
  929. char_socket_get_addr, NULL,
  930. NULL, NULL, &error_abort);
  931. object_class_property_add_bool(oc, "connected", char_socket_get_connected,
  932. NULL, &error_abort);
  933. }
  934. static const TypeInfo char_socket_type_info = {
  935. .name = TYPE_CHARDEV_SOCKET,
  936. .parent = TYPE_CHARDEV,
  937. .instance_size = sizeof(SocketChardev),
  938. .instance_finalize = char_socket_finalize,
  939. .class_init = char_socket_class_init,
  940. };
  941. static void register_types(void)
  942. {
  943. type_register_static(&char_socket_type_info);
  944. }
  945. type_init(register_types);