char-socket.c 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619
  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-websock.h"
  28. #include "qemu/error-report.h"
  29. #include "qemu/module.h"
  30. #include "qemu/option.h"
  31. #include "qapi/error.h"
  32. #include "qapi/clone-visitor.h"
  33. #include "qapi/qapi-visit-sockets.h"
  34. #include "qemu/yank.h"
  35. #include "trace.h"
  36. #include "chardev/char-io.h"
  37. #include "chardev/char-socket.h"
  38. static gboolean socket_reconnect_timeout(gpointer opaque);
  39. static void tcp_chr_telnet_init(Chardev *chr);
  40. static void tcp_chr_change_state(SocketChardev *s, TCPChardevState state)
  41. {
  42. switch (state) {
  43. case TCP_CHARDEV_STATE_DISCONNECTED:
  44. break;
  45. case TCP_CHARDEV_STATE_CONNECTING:
  46. assert(s->state == TCP_CHARDEV_STATE_DISCONNECTED);
  47. break;
  48. case TCP_CHARDEV_STATE_CONNECTED:
  49. assert(s->state == TCP_CHARDEV_STATE_CONNECTING);
  50. break;
  51. }
  52. s->state = state;
  53. }
  54. static void tcp_chr_reconn_timer_cancel(SocketChardev *s)
  55. {
  56. if (s->reconnect_timer) {
  57. g_source_destroy(s->reconnect_timer);
  58. g_source_unref(s->reconnect_timer);
  59. s->reconnect_timer = NULL;
  60. }
  61. }
  62. static void qemu_chr_socket_restart_timer(Chardev *chr)
  63. {
  64. SocketChardev *s = SOCKET_CHARDEV(chr);
  65. char *name;
  66. assert(s->state == TCP_CHARDEV_STATE_DISCONNECTED);
  67. assert(!s->reconnect_timer);
  68. name = g_strdup_printf("chardev-socket-reconnect-%s", chr->label);
  69. s->reconnect_timer = qemu_chr_timeout_add_ms(chr,
  70. s->reconnect_time_ms,
  71. socket_reconnect_timeout,
  72. chr);
  73. g_source_set_name(s->reconnect_timer, name);
  74. g_free(name);
  75. }
  76. static void check_report_connect_error(Chardev *chr,
  77. Error *err)
  78. {
  79. SocketChardev *s = SOCKET_CHARDEV(chr);
  80. if (!s->connect_err_reported) {
  81. error_reportf_err(err,
  82. "Unable to connect character device %s: ",
  83. chr->label);
  84. s->connect_err_reported = true;
  85. } else {
  86. error_free(err);
  87. }
  88. qemu_chr_socket_restart_timer(chr);
  89. }
  90. static void tcp_chr_accept(QIONetListener *listener,
  91. QIOChannelSocket *cioc,
  92. void *opaque);
  93. static int tcp_chr_read_poll(void *opaque);
  94. static void tcp_chr_disconnect_locked(Chardev *chr);
  95. /* Called with chr_write_lock held. */
  96. static int tcp_chr_write(Chardev *chr, const uint8_t *buf, int len)
  97. {
  98. SocketChardev *s = SOCKET_CHARDEV(chr);
  99. if (s->state == TCP_CHARDEV_STATE_CONNECTED) {
  100. int ret = io_channel_send_full(s->ioc, buf, len,
  101. s->write_msgfds,
  102. s->write_msgfds_num);
  103. /* free the written msgfds in any cases
  104. * other than ret < 0 && errno == EAGAIN
  105. */
  106. if (!(ret < 0 && EAGAIN == errno)
  107. && s->write_msgfds_num) {
  108. g_free(s->write_msgfds);
  109. s->write_msgfds = 0;
  110. s->write_msgfds_num = 0;
  111. }
  112. if (ret < 0 && errno != EAGAIN) {
  113. if (tcp_chr_read_poll(chr) <= 0) {
  114. /* Perform disconnect and return error. */
  115. trace_chr_socket_poll_err(chr, chr->label);
  116. tcp_chr_disconnect_locked(chr);
  117. } /* else let the read handler finish it properly */
  118. }
  119. return ret;
  120. } else {
  121. /* Indicate an error. */
  122. errno = EIO;
  123. return -1;
  124. }
  125. }
  126. static int tcp_chr_read_poll(void *opaque)
  127. {
  128. Chardev *chr = CHARDEV(opaque);
  129. SocketChardev *s = SOCKET_CHARDEV(opaque);
  130. if (s->state != TCP_CHARDEV_STATE_CONNECTED) {
  131. return 0;
  132. }
  133. s->max_size = qemu_chr_be_can_write(chr);
  134. return s->max_size;
  135. }
  136. static void tcp_chr_process_IAC_bytes(Chardev *chr,
  137. SocketChardev *s,
  138. uint8_t *buf, int *size)
  139. {
  140. /* Handle any telnet or tn3270 client's basic IAC options.
  141. * For telnet options, it satisfies char by char mode with no echo.
  142. * For tn3270 options, it satisfies binary mode with EOR.
  143. * All IAC options will be removed from the buf and the do_opt
  144. * pointer will be used to track the state of the width of the
  145. * IAC information.
  146. *
  147. * RFC854: "All TELNET commands consist of at least a two byte sequence.
  148. * The commands dealing with option negotiation are three byte sequences,
  149. * the third byte being the code for the option referenced."
  150. * "IAC BREAK", "IAC IP", "IAC NOP" and the double IAC are two bytes.
  151. * "IAC SB", "IAC SE" and "IAC EOR" are saved to split up data boundary
  152. * for tn3270.
  153. * NOP, Break and Interrupt Process(IP) might be encountered during a TN3270
  154. * session, and NOP and IP need to be done later.
  155. */
  156. int i;
  157. int j = 0;
  158. for (i = 0; i < *size; i++) {
  159. if (s->do_telnetopt > 1) {
  160. if ((unsigned char)buf[i] == IAC && s->do_telnetopt == 2) {
  161. /* Double IAC means send an IAC */
  162. if (j != i) {
  163. buf[j] = buf[i];
  164. }
  165. j++;
  166. s->do_telnetopt = 1;
  167. } else {
  168. if ((unsigned char)buf[i] == IAC_BREAK
  169. && s->do_telnetopt == 2) {
  170. /* Handle IAC break commands by sending a serial break */
  171. qemu_chr_be_event(chr, CHR_EVENT_BREAK);
  172. s->do_telnetopt++;
  173. } else if (s->is_tn3270 && ((unsigned char)buf[i] == IAC_EOR
  174. || (unsigned char)buf[i] == IAC_SB
  175. || (unsigned char)buf[i] == IAC_SE)
  176. && s->do_telnetopt == 2) {
  177. buf[j++] = IAC;
  178. buf[j++] = buf[i];
  179. s->do_telnetopt++;
  180. } else if (s->is_tn3270 && ((unsigned char)buf[i] == IAC_IP
  181. || (unsigned char)buf[i] == IAC_NOP)
  182. && s->do_telnetopt == 2) {
  183. /* TODO: IP and NOP need to be implemented later. */
  184. s->do_telnetopt++;
  185. }
  186. s->do_telnetopt++;
  187. }
  188. if (s->do_telnetopt >= 4) {
  189. s->do_telnetopt = 1;
  190. }
  191. } else {
  192. if ((unsigned char)buf[i] == IAC) {
  193. s->do_telnetopt = 2;
  194. } else {
  195. if (j != i) {
  196. buf[j] = buf[i];
  197. }
  198. j++;
  199. }
  200. }
  201. }
  202. *size = j;
  203. }
  204. static int tcp_get_msgfds(Chardev *chr, int *fds, int num)
  205. {
  206. SocketChardev *s = SOCKET_CHARDEV(chr);
  207. int to_copy = (s->read_msgfds_num < num) ? s->read_msgfds_num : num;
  208. assert(num <= TCP_MAX_FDS);
  209. if (to_copy) {
  210. int i;
  211. memcpy(fds, s->read_msgfds, to_copy * sizeof(int));
  212. /* Close unused fds */
  213. for (i = to_copy; i < s->read_msgfds_num; i++) {
  214. close(s->read_msgfds[i]);
  215. }
  216. g_free(s->read_msgfds);
  217. s->read_msgfds = 0;
  218. s->read_msgfds_num = 0;
  219. }
  220. return to_copy;
  221. }
  222. static int tcp_set_msgfds(Chardev *chr, int *fds, int num)
  223. {
  224. SocketChardev *s = SOCKET_CHARDEV(chr);
  225. /* clear old pending fd array */
  226. g_free(s->write_msgfds);
  227. s->write_msgfds = NULL;
  228. s->write_msgfds_num = 0;
  229. if ((s->state != TCP_CHARDEV_STATE_CONNECTED) ||
  230. !qio_channel_has_feature(s->ioc,
  231. QIO_CHANNEL_FEATURE_FD_PASS)) {
  232. return -1;
  233. }
  234. if (num) {
  235. s->write_msgfds = g_new(int, num);
  236. memcpy(s->write_msgfds, fds, num * sizeof(int));
  237. }
  238. s->write_msgfds_num = num;
  239. return 0;
  240. }
  241. static ssize_t tcp_chr_recv(Chardev *chr, char *buf, size_t len)
  242. {
  243. SocketChardev *s = SOCKET_CHARDEV(chr);
  244. struct iovec iov = { .iov_base = buf, .iov_len = len };
  245. int ret;
  246. size_t i;
  247. int *msgfds = NULL;
  248. size_t msgfds_num = 0;
  249. Error *err = NULL;
  250. if (qio_channel_has_feature(s->ioc, QIO_CHANNEL_FEATURE_FD_PASS)) {
  251. ret = qio_channel_readv_full(s->ioc, &iov, 1,
  252. &msgfds, &msgfds_num,
  253. 0, &err);
  254. } else {
  255. ret = qio_channel_readv_full(s->ioc, &iov, 1,
  256. NULL, NULL,
  257. 0, &err);
  258. }
  259. if (msgfds_num) {
  260. /* close and clean read_msgfds */
  261. for (i = 0; i < s->read_msgfds_num; i++) {
  262. close(s->read_msgfds[i]);
  263. }
  264. if (s->read_msgfds_num) {
  265. g_free(s->read_msgfds);
  266. }
  267. s->read_msgfds = msgfds;
  268. s->read_msgfds_num = msgfds_num;
  269. }
  270. for (i = 0; i < s->read_msgfds_num; i++) {
  271. int fd = s->read_msgfds[i];
  272. if (fd < 0) {
  273. continue;
  274. }
  275. /* O_NONBLOCK is preserved across SCM_RIGHTS so reset it */
  276. qemu_socket_set_block(fd);
  277. #ifndef MSG_CMSG_CLOEXEC
  278. qemu_set_cloexec(fd);
  279. #endif
  280. }
  281. if (ret == QIO_CHANNEL_ERR_BLOCK) {
  282. errno = EAGAIN;
  283. ret = -1;
  284. } else if (ret == -1) {
  285. trace_chr_socket_recv_err(chr, chr->label, error_get_pretty(err));
  286. error_free(err);
  287. errno = EIO;
  288. } else if (ret == 0) {
  289. trace_chr_socket_recv_eof(chr, chr->label);
  290. }
  291. return ret;
  292. }
  293. static GSource *tcp_chr_add_watch(Chardev *chr, GIOCondition cond)
  294. {
  295. SocketChardev *s = SOCKET_CHARDEV(chr);
  296. if (!s->ioc) {
  297. return NULL;
  298. }
  299. return qio_channel_create_watch(s->ioc, cond);
  300. }
  301. static void remove_hup_source(SocketChardev *s)
  302. {
  303. if (s->hup_source != NULL) {
  304. g_source_destroy(s->hup_source);
  305. g_source_unref(s->hup_source);
  306. s->hup_source = NULL;
  307. }
  308. }
  309. static void char_socket_yank_iochannel(void *opaque)
  310. {
  311. QIOChannel *ioc = QIO_CHANNEL(opaque);
  312. qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL);
  313. }
  314. static void tcp_chr_free_connection(Chardev *chr)
  315. {
  316. SocketChardev *s = SOCKET_CHARDEV(chr);
  317. int i;
  318. if (s->read_msgfds_num) {
  319. for (i = 0; i < s->read_msgfds_num; i++) {
  320. close(s->read_msgfds[i]);
  321. }
  322. g_free(s->read_msgfds);
  323. s->read_msgfds = NULL;
  324. s->read_msgfds_num = 0;
  325. }
  326. remove_hup_source(s);
  327. tcp_set_msgfds(chr, NULL, 0);
  328. remove_fd_in_watch(chr);
  329. if (s->registered_yank &&
  330. (s->state == TCP_CHARDEV_STATE_CONNECTING
  331. || s->state == TCP_CHARDEV_STATE_CONNECTED)) {
  332. yank_unregister_function(CHARDEV_YANK_INSTANCE(chr->label),
  333. char_socket_yank_iochannel,
  334. QIO_CHANNEL(s->sioc));
  335. }
  336. if (s->ioc) {
  337. qio_channel_close(s->ioc, NULL);
  338. }
  339. object_unref(OBJECT(s->sioc));
  340. s->sioc = NULL;
  341. object_unref(OBJECT(s->ioc));
  342. s->ioc = NULL;
  343. g_free(chr->filename);
  344. chr->filename = NULL;
  345. tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED);
  346. }
  347. static const char *qemu_chr_socket_protocol(SocketChardev *s)
  348. {
  349. if (s->is_telnet) {
  350. return "telnet";
  351. }
  352. return s->is_websock ? "websocket" : "tcp";
  353. }
  354. static char *qemu_chr_socket_address(SocketChardev *s, const char *prefix)
  355. {
  356. switch (s->addr->type) {
  357. case SOCKET_ADDRESS_TYPE_INET:
  358. return g_strdup_printf("%s%s:%s:%s%s", prefix,
  359. qemu_chr_socket_protocol(s),
  360. s->addr->u.inet.host,
  361. s->addr->u.inet.port,
  362. s->is_listen ? ",server=on" : "");
  363. break;
  364. case SOCKET_ADDRESS_TYPE_UNIX:
  365. {
  366. const char *tight = "", *abstract = "";
  367. UnixSocketAddress *sa = &s->addr->u.q_unix;
  368. #ifdef CONFIG_LINUX
  369. if (sa->has_abstract && sa->abstract) {
  370. abstract = ",abstract=on";
  371. if (sa->has_tight && sa->tight) {
  372. tight = ",tight=on";
  373. }
  374. }
  375. #endif
  376. return g_strdup_printf("%sunix:%s%s%s%s", prefix, sa->path,
  377. abstract, tight,
  378. s->is_listen ? ",server=on" : "");
  379. break;
  380. }
  381. case SOCKET_ADDRESS_TYPE_FD:
  382. return g_strdup_printf("%sfd:%s%s", prefix, s->addr->u.fd.str,
  383. s->is_listen ? ",server=on" : "");
  384. break;
  385. case SOCKET_ADDRESS_TYPE_VSOCK:
  386. return g_strdup_printf("%svsock:%s:%s", prefix,
  387. s->addr->u.vsock.cid,
  388. s->addr->u.vsock.port);
  389. default:
  390. abort();
  391. }
  392. }
  393. static void update_disconnected_filename(SocketChardev *s)
  394. {
  395. Chardev *chr = CHARDEV(s);
  396. g_free(chr->filename);
  397. if (s->addr) {
  398. chr->filename = qemu_chr_socket_address(s, "disconnected:");
  399. } else {
  400. chr->filename = g_strdup("disconnected:socket");
  401. }
  402. }
  403. /* NB may be called even if tcp_chr_connect has not been
  404. * reached, due to TLS or telnet initialization failure,
  405. * so can *not* assume s->state == TCP_CHARDEV_STATE_CONNECTED
  406. * This must be called with chr->chr_write_lock held.
  407. */
  408. static void tcp_chr_disconnect_locked(Chardev *chr)
  409. {
  410. SocketChardev *s = SOCKET_CHARDEV(chr);
  411. bool emit_close = s->state == TCP_CHARDEV_STATE_CONNECTED;
  412. trace_chr_socket_disconnect(chr, chr->label);
  413. tcp_chr_free_connection(chr);
  414. if (s->listener) {
  415. qio_net_listener_set_client_func_full(s->listener, tcp_chr_accept,
  416. chr, NULL, chr->gcontext);
  417. }
  418. update_disconnected_filename(s);
  419. if (emit_close) {
  420. qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
  421. }
  422. if (s->reconnect_time_ms && !s->reconnect_timer) {
  423. qemu_chr_socket_restart_timer(chr);
  424. }
  425. }
  426. static void tcp_chr_disconnect(Chardev *chr)
  427. {
  428. qemu_mutex_lock(&chr->chr_write_lock);
  429. tcp_chr_disconnect_locked(chr);
  430. qemu_mutex_unlock(&chr->chr_write_lock);
  431. }
  432. static gboolean tcp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
  433. {
  434. Chardev *chr = CHARDEV(opaque);
  435. SocketChardev *s = SOCKET_CHARDEV(opaque);
  436. uint8_t buf[CHR_READ_BUF_LEN];
  437. int len, size;
  438. if ((s->state != TCP_CHARDEV_STATE_CONNECTED) ||
  439. s->max_size <= 0) {
  440. return TRUE;
  441. }
  442. len = sizeof(buf);
  443. if (len > s->max_size) {
  444. len = s->max_size;
  445. }
  446. size = tcp_chr_recv(chr, (void *)buf, len);
  447. if (size == 0 || (size == -1 && errno != EAGAIN)) {
  448. /* connection closed */
  449. tcp_chr_disconnect(chr);
  450. } else if (size > 0) {
  451. if (s->do_telnetopt) {
  452. tcp_chr_process_IAC_bytes(chr, s, buf, &size);
  453. }
  454. if (size > 0) {
  455. qemu_chr_be_write(chr, buf, size);
  456. }
  457. }
  458. return TRUE;
  459. }
  460. static gboolean tcp_chr_hup(QIOChannel *channel,
  461. GIOCondition cond,
  462. void *opaque)
  463. {
  464. Chardev *chr = CHARDEV(opaque);
  465. trace_chr_socket_hangup(chr, chr->label);
  466. tcp_chr_disconnect(chr);
  467. return G_SOURCE_REMOVE;
  468. }
  469. static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len)
  470. {
  471. SocketChardev *s = SOCKET_CHARDEV(chr);
  472. int size;
  473. int saved_errno;
  474. if (s->state != TCP_CHARDEV_STATE_CONNECTED) {
  475. return 0;
  476. }
  477. qio_channel_set_blocking(s->ioc, true, NULL);
  478. size = tcp_chr_recv(chr, (void *) buf, len);
  479. saved_errno = errno;
  480. if (s->state != TCP_CHARDEV_STATE_DISCONNECTED) {
  481. qio_channel_set_blocking(s->ioc, false, NULL);
  482. }
  483. if (size == 0) {
  484. /* connection closed */
  485. tcp_chr_disconnect(chr);
  486. }
  487. errno = saved_errno;
  488. return size;
  489. }
  490. static char *qemu_chr_compute_filename(SocketChardev *s)
  491. {
  492. struct sockaddr_storage *ss = &s->sioc->localAddr;
  493. struct sockaddr_storage *ps = &s->sioc->remoteAddr;
  494. socklen_t ss_len = s->sioc->localAddrLen;
  495. socklen_t ps_len = s->sioc->remoteAddrLen;
  496. char shost[NI_MAXHOST], sserv[NI_MAXSERV];
  497. char phost[NI_MAXHOST], pserv[NI_MAXSERV];
  498. const char *left = "", *right = "";
  499. switch (ss->ss_family) {
  500. case AF_UNIX:
  501. return g_strdup_printf("unix:%s%s",
  502. ((struct sockaddr_un *)(ss))->sun_path,
  503. s->is_listen ? ",server=on" : "");
  504. case AF_INET6:
  505. left = "[";
  506. right = "]";
  507. /* fall through */
  508. case AF_INET:
  509. getnameinfo((struct sockaddr *) ss, ss_len, shost, sizeof(shost),
  510. sserv, sizeof(sserv), NI_NUMERICHOST | NI_NUMERICSERV);
  511. getnameinfo((struct sockaddr *) ps, ps_len, phost, sizeof(phost),
  512. pserv, sizeof(pserv), NI_NUMERICHOST | NI_NUMERICSERV);
  513. return g_strdup_printf("%s:%s%s%s:%s%s <-> %s%s%s:%s",
  514. qemu_chr_socket_protocol(s),
  515. left, shost, right, sserv,
  516. s->is_listen ? ",server=on" : "",
  517. left, phost, right, pserv);
  518. default:
  519. return g_strdup_printf("unknown");
  520. }
  521. }
  522. static void update_ioc_handlers(SocketChardev *s)
  523. {
  524. Chardev *chr = CHARDEV(s);
  525. if (s->state != TCP_CHARDEV_STATE_CONNECTED) {
  526. return;
  527. }
  528. remove_fd_in_watch(chr);
  529. chr->gsource = io_add_watch_poll(chr, s->ioc,
  530. tcp_chr_read_poll,
  531. tcp_chr_read, chr,
  532. chr->gcontext);
  533. remove_hup_source(s);
  534. s->hup_source = qio_channel_create_watch(s->ioc, G_IO_HUP);
  535. /*
  536. * poll() is liable to return POLLHUP even when there is
  537. * still incoming data available to read on the FD. If
  538. * we have the hup_source at the same priority as the
  539. * main io_add_watch_poll GSource, then we might end up
  540. * processing the POLLHUP event first, closing the FD,
  541. * and as a result silently discard data we should have
  542. * read.
  543. *
  544. * By setting the hup_source to G_PRIORITY_DEFAULT + 1,
  545. * we ensure that io_add_watch_poll GSource will always
  546. * be dispatched first, thus guaranteeing we will be
  547. * able to process all incoming data before closing the
  548. * FD
  549. */
  550. g_source_set_priority(s->hup_source, G_PRIORITY_DEFAULT + 1);
  551. g_source_set_callback(s->hup_source, (GSourceFunc)tcp_chr_hup,
  552. chr, NULL);
  553. g_source_attach(s->hup_source, chr->gcontext);
  554. }
  555. static void tcp_chr_connect(void *opaque)
  556. {
  557. Chardev *chr = CHARDEV(opaque);
  558. SocketChardev *s = SOCKET_CHARDEV(opaque);
  559. g_free(chr->filename);
  560. chr->filename = qemu_chr_compute_filename(s);
  561. tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTED);
  562. update_ioc_handlers(s);
  563. qemu_chr_be_event(chr, CHR_EVENT_OPENED);
  564. }
  565. static void tcp_chr_telnet_destroy(SocketChardev *s)
  566. {
  567. if (s->telnet_source) {
  568. g_source_destroy(s->telnet_source);
  569. g_source_unref(s->telnet_source);
  570. s->telnet_source = NULL;
  571. }
  572. }
  573. static void tcp_chr_update_read_handler(Chardev *chr)
  574. {
  575. SocketChardev *s = SOCKET_CHARDEV(chr);
  576. if (s->listener && s->state == TCP_CHARDEV_STATE_DISCONNECTED) {
  577. /*
  578. * It's possible that chardev context is changed in
  579. * qemu_chr_be_update_read_handlers(). Reset it for QIO net
  580. * listener if there is.
  581. */
  582. qio_net_listener_set_client_func_full(s->listener, tcp_chr_accept,
  583. chr, NULL, chr->gcontext);
  584. }
  585. if (s->telnet_source) {
  586. tcp_chr_telnet_init(CHARDEV(s));
  587. }
  588. update_ioc_handlers(s);
  589. }
  590. static gboolean tcp_chr_telnet_init_io(QIOChannel *ioc,
  591. GIOCondition cond G_GNUC_UNUSED,
  592. gpointer user_data)
  593. {
  594. SocketChardev *s = user_data;
  595. Chardev *chr = CHARDEV(s);
  596. TCPChardevTelnetInit *init = s->telnet_init;
  597. Error *err = NULL;
  598. ssize_t ret;
  599. assert(init);
  600. ret = qio_channel_write(ioc, init->buf, init->buflen, &err);
  601. if (ret < 0) {
  602. if (ret == QIO_CHANNEL_ERR_BLOCK) {
  603. ret = 0;
  604. } else {
  605. trace_chr_socket_write_err(chr, chr->label, error_get_pretty(err));
  606. error_free(err);
  607. tcp_chr_disconnect(chr);
  608. goto end;
  609. }
  610. }
  611. init->buflen -= ret;
  612. if (init->buflen == 0) {
  613. tcp_chr_connect(chr);
  614. goto end;
  615. }
  616. memmove(init->buf, init->buf + ret, init->buflen);
  617. return G_SOURCE_CONTINUE;
  618. end:
  619. g_free(s->telnet_init);
  620. s->telnet_init = NULL;
  621. g_source_unref(s->telnet_source);
  622. s->telnet_source = NULL;
  623. return G_SOURCE_REMOVE;
  624. }
  625. static void tcp_chr_telnet_init(Chardev *chr)
  626. {
  627. SocketChardev *s = SOCKET_CHARDEV(chr);
  628. TCPChardevTelnetInit *init;
  629. size_t n = 0;
  630. /* Destroy existing task */
  631. tcp_chr_telnet_destroy(s);
  632. if (s->telnet_init) {
  633. /* We are possibly during a handshake already */
  634. goto cont;
  635. }
  636. s->telnet_init = g_new0(TCPChardevTelnetInit, 1);
  637. init = s->telnet_init;
  638. #define IACSET(x, a, b, c) \
  639. do { \
  640. x[n++] = a; \
  641. x[n++] = b; \
  642. x[n++] = c; \
  643. } while (0)
  644. if (!s->is_tn3270) {
  645. init->buflen = 12;
  646. /* Prep the telnet negotiation to put telnet in binary,
  647. * no echo, single char mode */
  648. IACSET(init->buf, 0xff, 0xfb, 0x01); /* IAC WILL ECHO */
  649. IACSET(init->buf, 0xff, 0xfb, 0x03); /* IAC WILL Suppress go ahead */
  650. IACSET(init->buf, 0xff, 0xfb, 0x00); /* IAC WILL Binary */
  651. IACSET(init->buf, 0xff, 0xfd, 0x00); /* IAC DO Binary */
  652. } else {
  653. init->buflen = 21;
  654. /* Prep the TN3270 negotiation based on RFC1576 */
  655. IACSET(init->buf, 0xff, 0xfd, 0x19); /* IAC DO EOR */
  656. IACSET(init->buf, 0xff, 0xfb, 0x19); /* IAC WILL EOR */
  657. IACSET(init->buf, 0xff, 0xfd, 0x00); /* IAC DO BINARY */
  658. IACSET(init->buf, 0xff, 0xfb, 0x00); /* IAC WILL BINARY */
  659. IACSET(init->buf, 0xff, 0xfd, 0x18); /* IAC DO TERMINAL TYPE */
  660. IACSET(init->buf, 0xff, 0xfa, 0x18); /* IAC SB TERMINAL TYPE */
  661. IACSET(init->buf, 0x01, 0xff, 0xf0); /* SEND IAC SE */
  662. }
  663. #undef IACSET
  664. cont:
  665. s->telnet_source = qio_channel_add_watch_source(s->ioc, G_IO_OUT,
  666. tcp_chr_telnet_init_io,
  667. s, NULL,
  668. chr->gcontext);
  669. }
  670. static void tcp_chr_websock_handshake(QIOTask *task, gpointer user_data)
  671. {
  672. Chardev *chr = user_data;
  673. SocketChardev *s = user_data;
  674. Error *err = NULL;
  675. if (qio_task_propagate_error(task, &err)) {
  676. trace_chr_socket_ws_handshake_err(chr, chr->label,
  677. error_get_pretty(err));
  678. error_free(err);
  679. tcp_chr_disconnect(chr);
  680. } else {
  681. if (s->do_telnetopt) {
  682. tcp_chr_telnet_init(chr);
  683. } else {
  684. tcp_chr_connect(chr);
  685. }
  686. }
  687. }
  688. static void tcp_chr_websock_init(Chardev *chr)
  689. {
  690. SocketChardev *s = SOCKET_CHARDEV(chr);
  691. QIOChannelWebsock *wioc = NULL;
  692. gchar *name;
  693. wioc = qio_channel_websock_new_server(s->ioc);
  694. name = g_strdup_printf("chardev-websocket-server-%s", chr->label);
  695. qio_channel_set_name(QIO_CHANNEL(wioc), name);
  696. g_free(name);
  697. object_unref(OBJECT(s->ioc));
  698. s->ioc = QIO_CHANNEL(wioc);
  699. qio_channel_websock_handshake(wioc, tcp_chr_websock_handshake, chr, NULL);
  700. }
  701. static void tcp_chr_tls_handshake(QIOTask *task,
  702. gpointer user_data)
  703. {
  704. Chardev *chr = user_data;
  705. SocketChardev *s = user_data;
  706. Error *err = NULL;
  707. if (qio_task_propagate_error(task, &err)) {
  708. trace_chr_socket_tls_handshake_err(chr, chr->label,
  709. error_get_pretty(err));
  710. error_free(err);
  711. tcp_chr_disconnect(chr);
  712. } else {
  713. if (s->is_websock) {
  714. tcp_chr_websock_init(chr);
  715. } else if (s->do_telnetopt) {
  716. tcp_chr_telnet_init(chr);
  717. } else {
  718. tcp_chr_connect(chr);
  719. }
  720. }
  721. }
  722. static void tcp_chr_tls_init(Chardev *chr)
  723. {
  724. SocketChardev *s = SOCKET_CHARDEV(chr);
  725. QIOChannelTLS *tioc;
  726. gchar *name;
  727. Error *err = NULL;
  728. if (s->is_listen) {
  729. tioc = qio_channel_tls_new_server(
  730. s->ioc, s->tls_creds,
  731. s->tls_authz,
  732. &err);
  733. } else {
  734. tioc = qio_channel_tls_new_client(
  735. s->ioc, s->tls_creds,
  736. s->addr->u.inet.host,
  737. &err);
  738. }
  739. if (tioc == NULL) {
  740. trace_chr_socket_tls_init_err(chr, chr->label, error_get_pretty(err));
  741. error_free(err);
  742. tcp_chr_disconnect(chr);
  743. return;
  744. }
  745. name = g_strdup_printf("chardev-tls-%s-%s",
  746. s->is_listen ? "server" : "client",
  747. chr->label);
  748. qio_channel_set_name(QIO_CHANNEL(tioc), name);
  749. g_free(name);
  750. object_unref(OBJECT(s->ioc));
  751. s->ioc = QIO_CHANNEL(tioc);
  752. qio_channel_tls_handshake(tioc,
  753. tcp_chr_tls_handshake,
  754. chr,
  755. NULL,
  756. chr->gcontext);
  757. }
  758. static void tcp_chr_set_client_ioc_name(Chardev *chr,
  759. QIOChannelSocket *sioc)
  760. {
  761. SocketChardev *s = SOCKET_CHARDEV(chr);
  762. char *name;
  763. name = g_strdup_printf("chardev-tcp-%s-%s",
  764. s->is_listen ? "server" : "client",
  765. chr->label);
  766. qio_channel_set_name(QIO_CHANNEL(sioc), name);
  767. g_free(name);
  768. }
  769. static int tcp_chr_new_client(Chardev *chr, QIOChannelSocket *sioc)
  770. {
  771. SocketChardev *s = SOCKET_CHARDEV(chr);
  772. if (s->state != TCP_CHARDEV_STATE_CONNECTING) {
  773. return -1;
  774. }
  775. s->ioc = QIO_CHANNEL(sioc);
  776. object_ref(OBJECT(sioc));
  777. s->sioc = sioc;
  778. object_ref(OBJECT(sioc));
  779. qio_channel_set_blocking(s->ioc, false, NULL);
  780. if (s->do_nodelay) {
  781. qio_channel_set_delay(s->ioc, false);
  782. }
  783. if (s->listener) {
  784. qio_net_listener_set_client_func_full(s->listener, NULL, NULL,
  785. NULL, chr->gcontext);
  786. }
  787. if (s->tls_creds) {
  788. tcp_chr_tls_init(chr);
  789. } else if (s->is_websock) {
  790. tcp_chr_websock_init(chr);
  791. } else if (s->do_telnetopt) {
  792. tcp_chr_telnet_init(chr);
  793. } else {
  794. tcp_chr_connect(chr);
  795. }
  796. return 0;
  797. }
  798. static int tcp_chr_add_client(Chardev *chr, int fd)
  799. {
  800. int ret;
  801. QIOChannelSocket *sioc;
  802. SocketChardev *s = SOCKET_CHARDEV(chr);
  803. if (s->state != TCP_CHARDEV_STATE_DISCONNECTED) {
  804. return -1;
  805. }
  806. sioc = qio_channel_socket_new_fd(fd, NULL);
  807. if (!sioc) {
  808. return -1;
  809. }
  810. tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
  811. tcp_chr_set_client_ioc_name(chr, sioc);
  812. if (s->registered_yank) {
  813. yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
  814. char_socket_yank_iochannel,
  815. QIO_CHANNEL(sioc));
  816. }
  817. ret = tcp_chr_new_client(chr, sioc);
  818. object_unref(OBJECT(sioc));
  819. return ret;
  820. }
  821. static void tcp_chr_accept(QIONetListener *listener,
  822. QIOChannelSocket *cioc,
  823. void *opaque)
  824. {
  825. Chardev *chr = CHARDEV(opaque);
  826. SocketChardev *s = SOCKET_CHARDEV(chr);
  827. tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
  828. tcp_chr_set_client_ioc_name(chr, cioc);
  829. if (s->registered_yank) {
  830. yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
  831. char_socket_yank_iochannel,
  832. QIO_CHANNEL(cioc));
  833. }
  834. tcp_chr_new_client(chr, cioc);
  835. }
  836. static int tcp_chr_connect_client_sync(Chardev *chr, Error **errp)
  837. {
  838. SocketChardev *s = SOCKET_CHARDEV(chr);
  839. QIOChannelSocket *sioc = qio_channel_socket_new();
  840. tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
  841. tcp_chr_set_client_ioc_name(chr, sioc);
  842. if (qio_channel_socket_connect_sync(sioc, s->addr, errp) < 0) {
  843. tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED);
  844. object_unref(OBJECT(sioc));
  845. return -1;
  846. }
  847. if (s->registered_yank) {
  848. yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
  849. char_socket_yank_iochannel,
  850. QIO_CHANNEL(sioc));
  851. }
  852. tcp_chr_new_client(chr, sioc);
  853. object_unref(OBJECT(sioc));
  854. return 0;
  855. }
  856. static void tcp_chr_accept_server_sync(Chardev *chr)
  857. {
  858. SocketChardev *s = SOCKET_CHARDEV(chr);
  859. QIOChannelSocket *sioc;
  860. info_report("QEMU waiting for connection on: %s",
  861. chr->filename);
  862. tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
  863. sioc = qio_net_listener_wait_client(s->listener);
  864. tcp_chr_set_client_ioc_name(chr, sioc);
  865. if (s->registered_yank) {
  866. yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
  867. char_socket_yank_iochannel,
  868. QIO_CHANNEL(sioc));
  869. }
  870. tcp_chr_new_client(chr, sioc);
  871. object_unref(OBJECT(sioc));
  872. }
  873. static int tcp_chr_wait_connected(Chardev *chr, Error **errp)
  874. {
  875. SocketChardev *s = SOCKET_CHARDEV(chr);
  876. const char *opts[] = { "telnet", "tn3270", "websock", "tls-creds" };
  877. bool optset[] = { s->is_telnet, s->is_tn3270, s->is_websock, s->tls_creds };
  878. size_t i;
  879. QEMU_BUILD_BUG_ON(G_N_ELEMENTS(opts) != G_N_ELEMENTS(optset));
  880. for (i = 0; i < G_N_ELEMENTS(opts); i++) {
  881. if (optset[i]) {
  882. error_setg(errp,
  883. "'%s' option is incompatible with waiting for "
  884. "connection completion", opts[i]);
  885. return -1;
  886. }
  887. }
  888. tcp_chr_reconn_timer_cancel(s);
  889. /*
  890. * We expect states to be as follows:
  891. *
  892. * - server
  893. * - wait -> CONNECTED
  894. * - nowait -> DISCONNECTED
  895. * - client
  896. * - reconnect == 0 -> CONNECTED
  897. * - reconnect != 0 -> CONNECTING
  898. *
  899. */
  900. if (s->state == TCP_CHARDEV_STATE_CONNECTING) {
  901. if (!s->connect_task) {
  902. error_setg(errp,
  903. "Unexpected 'connecting' state without connect task "
  904. "while waiting for connection completion");
  905. return -1;
  906. }
  907. /*
  908. * tcp_chr_wait_connected should only ever be run from the
  909. * main loop thread associated with chr->gcontext, otherwise
  910. * qio_task_wait_thread has a dangerous race condition with
  911. * free'ing of the s->connect_task object.
  912. *
  913. * Acquiring the main context doesn't 100% prove we're in
  914. * the main loop thread, but it does at least guarantee
  915. * that the main loop won't be executed by another thread
  916. * avoiding the race condition with the task idle callback.
  917. */
  918. g_main_context_acquire(chr->gcontext);
  919. qio_task_wait_thread(s->connect_task);
  920. g_main_context_release(chr->gcontext);
  921. /*
  922. * The completion callback (qemu_chr_socket_connected) for
  923. * s->connect_task should have set this to NULL by the time
  924. * qio_task_wait_thread has returned.
  925. */
  926. assert(!s->connect_task);
  927. /*
  928. * NB we are *not* guaranteed to have "s->state == ..CONNECTED"
  929. * at this point as this first connect may be failed, so
  930. * allow the next loop to run regardless.
  931. */
  932. }
  933. while (s->state != TCP_CHARDEV_STATE_CONNECTED) {
  934. if (s->is_listen) {
  935. tcp_chr_accept_server_sync(chr);
  936. } else {
  937. Error *err = NULL;
  938. if (tcp_chr_connect_client_sync(chr, &err) < 0) {
  939. if (s->reconnect_time_ms) {
  940. error_free(err);
  941. g_usleep(s->reconnect_time_ms * 1000ULL);
  942. } else {
  943. error_propagate(errp, err);
  944. return -1;
  945. }
  946. }
  947. }
  948. }
  949. return 0;
  950. }
  951. static void char_socket_finalize(Object *obj)
  952. {
  953. Chardev *chr = CHARDEV(obj);
  954. SocketChardev *s = SOCKET_CHARDEV(obj);
  955. tcp_chr_free_connection(chr);
  956. tcp_chr_reconn_timer_cancel(s);
  957. qapi_free_SocketAddress(s->addr);
  958. tcp_chr_telnet_destroy(s);
  959. g_free(s->telnet_init);
  960. if (s->listener) {
  961. qio_net_listener_set_client_func_full(s->listener, NULL, NULL,
  962. NULL, chr->gcontext);
  963. object_unref(OBJECT(s->listener));
  964. s->listener = NULL;
  965. }
  966. if (s->tls_creds) {
  967. object_unref(OBJECT(s->tls_creds));
  968. }
  969. g_free(s->tls_authz);
  970. if (s->registered_yank) {
  971. /*
  972. * In the chardev-change special-case, we shouldn't unregister the yank
  973. * instance, as it still may be needed.
  974. */
  975. if (!chr->handover_yank_instance) {
  976. yank_unregister_instance(CHARDEV_YANK_INSTANCE(chr->label));
  977. }
  978. }
  979. qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
  980. }
  981. static void qemu_chr_socket_connected(QIOTask *task, void *opaque)
  982. {
  983. QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task));
  984. Chardev *chr = CHARDEV(opaque);
  985. SocketChardev *s = SOCKET_CHARDEV(chr);
  986. Error *err = NULL;
  987. s->connect_task = NULL;
  988. if (qio_task_propagate_error(task, &err)) {
  989. tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED);
  990. if (s->registered_yank) {
  991. yank_unregister_function(CHARDEV_YANK_INSTANCE(chr->label),
  992. char_socket_yank_iochannel,
  993. QIO_CHANNEL(sioc));
  994. }
  995. check_report_connect_error(chr, err);
  996. goto cleanup;
  997. }
  998. s->connect_err_reported = false;
  999. tcp_chr_new_client(chr, sioc);
  1000. cleanup:
  1001. object_unref(OBJECT(sioc));
  1002. }
  1003. static void tcp_chr_connect_client_task(QIOTask *task,
  1004. gpointer opaque)
  1005. {
  1006. QIOChannelSocket *ioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task));
  1007. SocketAddress *addr = opaque;
  1008. Error *err = NULL;
  1009. qio_channel_socket_connect_sync(ioc, addr, &err);
  1010. qio_task_set_error(task, err);
  1011. }
  1012. static void tcp_chr_connect_client_async(Chardev *chr)
  1013. {
  1014. SocketChardev *s = SOCKET_CHARDEV(chr);
  1015. QIOChannelSocket *sioc;
  1016. tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
  1017. sioc = qio_channel_socket_new();
  1018. tcp_chr_set_client_ioc_name(chr, sioc);
  1019. if (s->registered_yank) {
  1020. yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
  1021. char_socket_yank_iochannel,
  1022. QIO_CHANNEL(sioc));
  1023. }
  1024. /*
  1025. * Normally code would use the qio_channel_socket_connect_async
  1026. * method which uses a QIOTask + qio_task_set_error internally
  1027. * to avoid blocking. The tcp_chr_wait_connected method, however,
  1028. * needs a way to synchronize with completion of the background
  1029. * connect task which can't be done with the QIOChannelSocket
  1030. * async APIs. Thus we must use QIOTask directly to implement
  1031. * the non-blocking concept locally.
  1032. */
  1033. s->connect_task = qio_task_new(OBJECT(sioc),
  1034. qemu_chr_socket_connected,
  1035. object_ref(OBJECT(chr)),
  1036. (GDestroyNotify)object_unref);
  1037. qio_task_run_in_thread(s->connect_task,
  1038. tcp_chr_connect_client_task,
  1039. s->addr,
  1040. NULL,
  1041. chr->gcontext);
  1042. }
  1043. static gboolean socket_reconnect_timeout(gpointer opaque)
  1044. {
  1045. Chardev *chr = CHARDEV(opaque);
  1046. SocketChardev *s = SOCKET_CHARDEV(opaque);
  1047. qemu_mutex_lock(&chr->chr_write_lock);
  1048. g_source_unref(s->reconnect_timer);
  1049. s->reconnect_timer = NULL;
  1050. qemu_mutex_unlock(&chr->chr_write_lock);
  1051. if (chr->be_open) {
  1052. return false;
  1053. }
  1054. tcp_chr_connect_client_async(chr);
  1055. return false;
  1056. }
  1057. static int qmp_chardev_open_socket_server(Chardev *chr,
  1058. bool is_telnet,
  1059. bool is_waitconnect,
  1060. Error **errp)
  1061. {
  1062. SocketChardev *s = SOCKET_CHARDEV(chr);
  1063. char *name;
  1064. if (is_telnet) {
  1065. s->do_telnetopt = 1;
  1066. }
  1067. s->listener = qio_net_listener_new();
  1068. name = g_strdup_printf("chardev-tcp-listener-%s", chr->label);
  1069. qio_net_listener_set_name(s->listener, name);
  1070. g_free(name);
  1071. if (s->addr->type == SOCKET_ADDRESS_TYPE_FD && !*s->addr->u.fd.str) {
  1072. goto skip_listen;
  1073. }
  1074. if (qio_net_listener_open_sync(s->listener, s->addr, 1, errp) < 0) {
  1075. object_unref(OBJECT(s->listener));
  1076. s->listener = NULL;
  1077. return -1;
  1078. }
  1079. qapi_free_SocketAddress(s->addr);
  1080. s->addr = socket_local_address(s->listener->sioc[0]->fd, errp);
  1081. skip_listen:
  1082. update_disconnected_filename(s);
  1083. if (is_waitconnect) {
  1084. tcp_chr_accept_server_sync(chr);
  1085. } else {
  1086. qio_net_listener_set_client_func_full(s->listener,
  1087. tcp_chr_accept,
  1088. chr, NULL,
  1089. chr->gcontext);
  1090. }
  1091. return 0;
  1092. }
  1093. static int qmp_chardev_open_socket_client(Chardev *chr,
  1094. int64_t reconnect_ms,
  1095. Error **errp)
  1096. {
  1097. SocketChardev *s = SOCKET_CHARDEV(chr);
  1098. if (reconnect_ms > 0) {
  1099. s->reconnect_time_ms = reconnect_ms;
  1100. tcp_chr_connect_client_async(chr);
  1101. return 0;
  1102. } else {
  1103. return tcp_chr_connect_client_sync(chr, errp);
  1104. }
  1105. }
  1106. static bool qmp_chardev_validate_socket(ChardevSocket *sock,
  1107. SocketAddress *addr,
  1108. Error **errp)
  1109. {
  1110. /* Validate any options which have a dependency on address type */
  1111. switch (addr->type) {
  1112. case SOCKET_ADDRESS_TYPE_FD:
  1113. if (sock->has_reconnect) {
  1114. error_setg(errp,
  1115. "'reconnect' option is incompatible with "
  1116. "'fd' address type");
  1117. return false;
  1118. }
  1119. if (sock->tls_creds &&
  1120. !(sock->has_server && sock->server)) {
  1121. error_setg(errp,
  1122. "'tls_creds' option is incompatible with "
  1123. "'fd' address type as client");
  1124. return false;
  1125. }
  1126. break;
  1127. case SOCKET_ADDRESS_TYPE_UNIX:
  1128. if (sock->tls_creds) {
  1129. error_setg(errp,
  1130. "'tls_creds' option is incompatible with "
  1131. "'unix' address type");
  1132. return false;
  1133. }
  1134. break;
  1135. case SOCKET_ADDRESS_TYPE_INET:
  1136. break;
  1137. case SOCKET_ADDRESS_TYPE_VSOCK:
  1138. if (sock->tls_creds) {
  1139. error_setg(errp,
  1140. "'tls_creds' option is incompatible with "
  1141. "'vsock' address type");
  1142. return false;
  1143. }
  1144. default:
  1145. break;
  1146. }
  1147. if (sock->tls_authz && !sock->tls_creds) {
  1148. error_setg(errp, "'tls_authz' option requires 'tls_creds' option");
  1149. return false;
  1150. }
  1151. /* Validate any options which have a dependency on client vs server */
  1152. if (!sock->has_server || sock->server) {
  1153. if (sock->has_reconnect) {
  1154. error_setg(errp,
  1155. "'reconnect' option is incompatible with "
  1156. "socket in server listen mode");
  1157. return false;
  1158. }
  1159. } else {
  1160. if (sock->has_websocket && sock->websocket) {
  1161. error_setg(errp, "%s", "Websocket client is not implemented");
  1162. return false;
  1163. }
  1164. if (sock->has_wait) {
  1165. error_setg(errp, "%s",
  1166. "'wait' option is incompatible with "
  1167. "socket in client connect mode");
  1168. return false;
  1169. }
  1170. }
  1171. if (sock->has_reconnect_ms && sock->has_reconnect) {
  1172. error_setg(errp,
  1173. "'reconnect' and 'reconnect-ms' are mutually exclusive");
  1174. return false;
  1175. }
  1176. return true;
  1177. }
  1178. static void qmp_chardev_open_socket(Chardev *chr,
  1179. ChardevBackend *backend,
  1180. bool *be_opened,
  1181. Error **errp)
  1182. {
  1183. SocketChardev *s = SOCKET_CHARDEV(chr);
  1184. ChardevSocket *sock = backend->u.socket.data;
  1185. bool do_nodelay = sock->has_nodelay ? sock->nodelay : false;
  1186. bool is_listen = sock->has_server ? sock->server : true;
  1187. bool is_telnet = sock->has_telnet ? sock->telnet : false;
  1188. bool is_tn3270 = sock->has_tn3270 ? sock->tn3270 : false;
  1189. bool is_waitconnect = sock->has_wait ? sock->wait : false;
  1190. bool is_websock = sock->has_websocket ? sock->websocket : false;
  1191. int64_t reconnect_ms = 0;
  1192. SocketAddress *addr;
  1193. s->is_listen = is_listen;
  1194. s->is_telnet = is_telnet;
  1195. s->is_tn3270 = is_tn3270;
  1196. s->is_websock = is_websock;
  1197. s->do_nodelay = do_nodelay;
  1198. if (sock->tls_creds) {
  1199. Object *creds;
  1200. creds = object_resolve_path_component(
  1201. object_get_objects_root(), sock->tls_creds);
  1202. if (!creds) {
  1203. error_setg(errp, "No TLS credentials with id '%s'",
  1204. sock->tls_creds);
  1205. return;
  1206. }
  1207. s->tls_creds = (QCryptoTLSCreds *)
  1208. object_dynamic_cast(creds,
  1209. TYPE_QCRYPTO_TLS_CREDS);
  1210. if (!s->tls_creds) {
  1211. error_setg(errp, "Object with id '%s' is not TLS credentials",
  1212. sock->tls_creds);
  1213. return;
  1214. }
  1215. object_ref(OBJECT(s->tls_creds));
  1216. if (!qcrypto_tls_creds_check_endpoint(s->tls_creds,
  1217. is_listen
  1218. ? QCRYPTO_TLS_CREDS_ENDPOINT_SERVER
  1219. : QCRYPTO_TLS_CREDS_ENDPOINT_CLIENT,
  1220. errp)) {
  1221. return;
  1222. }
  1223. }
  1224. s->tls_authz = g_strdup(sock->tls_authz);
  1225. s->addr = addr = socket_address_flatten(sock->addr);
  1226. if (!qmp_chardev_validate_socket(sock, addr, errp)) {
  1227. return;
  1228. }
  1229. qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE);
  1230. #ifndef _WIN32
  1231. /* TODO SOCKET_ADDRESS_FD where fd has AF_UNIX */
  1232. if (addr->type == SOCKET_ADDRESS_TYPE_UNIX) {
  1233. qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS);
  1234. }
  1235. #endif
  1236. /*
  1237. * In the chardev-change special-case, we shouldn't register a new yank
  1238. * instance, as there already may be one.
  1239. */
  1240. if (!chr->handover_yank_instance) {
  1241. if (!yank_register_instance(CHARDEV_YANK_INSTANCE(chr->label), errp)) {
  1242. return;
  1243. }
  1244. }
  1245. s->registered_yank = true;
  1246. /* be isn't opened until we get a connection */
  1247. *be_opened = false;
  1248. update_disconnected_filename(s);
  1249. if (s->is_listen) {
  1250. if (qmp_chardev_open_socket_server(chr, is_telnet || is_tn3270,
  1251. is_waitconnect, errp) < 0) {
  1252. return;
  1253. }
  1254. } else {
  1255. if (sock->has_reconnect) {
  1256. reconnect_ms = sock->reconnect * 1000ULL;
  1257. } else if (sock->has_reconnect_ms) {
  1258. reconnect_ms = sock->reconnect_ms;
  1259. }
  1260. if (qmp_chardev_open_socket_client(chr, reconnect_ms, errp) < 0) {
  1261. return;
  1262. }
  1263. }
  1264. }
  1265. static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
  1266. Error **errp)
  1267. {
  1268. const char *path = qemu_opt_get(opts, "path");
  1269. const char *host = qemu_opt_get(opts, "host");
  1270. const char *port = qemu_opt_get(opts, "port");
  1271. const char *fd = qemu_opt_get(opts, "fd");
  1272. #ifdef CONFIG_LINUX
  1273. bool tight = qemu_opt_get_bool(opts, "tight", true);
  1274. bool abstract = qemu_opt_get_bool(opts, "abstract", false);
  1275. #endif
  1276. SocketAddressLegacy *addr;
  1277. ChardevSocket *sock;
  1278. if ((!!path + !!fd + !!host) > 1) {
  1279. error_setg(errp,
  1280. "None or one of 'path', 'fd' or 'host' option required.");
  1281. return;
  1282. }
  1283. if (host && !port) {
  1284. error_setg(errp, "chardev: socket: no port given");
  1285. return;
  1286. }
  1287. backend->type = CHARDEV_BACKEND_KIND_SOCKET;
  1288. sock = backend->u.socket.data = g_new0(ChardevSocket, 1);
  1289. qemu_chr_parse_common(opts, qapi_ChardevSocket_base(sock));
  1290. if (qemu_opt_get(opts, "delay") && qemu_opt_get(opts, "nodelay")) {
  1291. error_setg(errp, "'delay' and 'nodelay' are mutually exclusive");
  1292. return;
  1293. }
  1294. sock->has_nodelay =
  1295. qemu_opt_get(opts, "delay") ||
  1296. qemu_opt_get(opts, "nodelay");
  1297. sock->nodelay =
  1298. !qemu_opt_get_bool(opts, "delay", true) ||
  1299. qemu_opt_get_bool(opts, "nodelay", false);
  1300. /*
  1301. * We have different default to QMP for 'server', hence
  1302. * we can't just check for existence of 'server'
  1303. */
  1304. sock->has_server = true;
  1305. sock->server = qemu_opt_get_bool(opts, "server", false);
  1306. sock->has_telnet = qemu_opt_get(opts, "telnet");
  1307. sock->telnet = qemu_opt_get_bool(opts, "telnet", false);
  1308. sock->has_tn3270 = qemu_opt_get(opts, "tn3270");
  1309. sock->tn3270 = qemu_opt_get_bool(opts, "tn3270", false);
  1310. sock->has_websocket = qemu_opt_get(opts, "websocket");
  1311. sock->websocket = qemu_opt_get_bool(opts, "websocket", false);
  1312. /*
  1313. * We have different default to QMP for 'wait' when 'server'
  1314. * is set, hence we can't just check for existence of 'wait'
  1315. */
  1316. sock->has_wait = qemu_opt_find(opts, "wait") || sock->server;
  1317. sock->wait = qemu_opt_get_bool(opts, "wait", true);
  1318. sock->has_reconnect = qemu_opt_find(opts, "reconnect");
  1319. sock->reconnect = qemu_opt_get_number(opts, "reconnect", 0);
  1320. sock->has_reconnect_ms = qemu_opt_find(opts, "reconnect-ms");
  1321. sock->reconnect_ms = qemu_opt_get_number(opts, "reconnect-ms", 0);
  1322. sock->tls_creds = g_strdup(qemu_opt_get(opts, "tls-creds"));
  1323. sock->tls_authz = g_strdup(qemu_opt_get(opts, "tls-authz"));
  1324. addr = g_new0(SocketAddressLegacy, 1);
  1325. if (path) {
  1326. UnixSocketAddress *q_unix;
  1327. addr->type = SOCKET_ADDRESS_TYPE_UNIX;
  1328. q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
  1329. q_unix->path = g_strdup(path);
  1330. #ifdef CONFIG_LINUX
  1331. q_unix->has_tight = true;
  1332. q_unix->tight = tight;
  1333. q_unix->has_abstract = true;
  1334. q_unix->abstract = abstract;
  1335. #endif
  1336. } else if (host) {
  1337. addr->type = SOCKET_ADDRESS_TYPE_INET;
  1338. addr->u.inet.data = g_new(InetSocketAddress, 1);
  1339. *addr->u.inet.data = (InetSocketAddress) {
  1340. .host = g_strdup(host),
  1341. .port = g_strdup(port),
  1342. .has_to = qemu_opt_get(opts, "to"),
  1343. .to = qemu_opt_get_number(opts, "to", 0),
  1344. .has_ipv4 = qemu_opt_get(opts, "ipv4"),
  1345. .ipv4 = qemu_opt_get_bool(opts, "ipv4", 0),
  1346. .has_ipv6 = qemu_opt_get(opts, "ipv6"),
  1347. .ipv6 = qemu_opt_get_bool(opts, "ipv6", 0),
  1348. };
  1349. } else {
  1350. addr->type = SOCKET_ADDRESS_TYPE_FD;
  1351. addr->u.fd.data = g_new(FdSocketAddress, 1);
  1352. addr->u.fd.data->str = g_strdup(fd);
  1353. }
  1354. sock->addr = addr;
  1355. }
  1356. static void
  1357. char_socket_get_addr(Object *obj, Visitor *v, const char *name,
  1358. void *opaque, Error **errp)
  1359. {
  1360. SocketChardev *s = SOCKET_CHARDEV(obj);
  1361. visit_type_SocketAddress(v, name, &s->addr, errp);
  1362. }
  1363. static bool
  1364. char_socket_get_connected(Object *obj, Error **errp)
  1365. {
  1366. SocketChardev *s = SOCKET_CHARDEV(obj);
  1367. return s->state == TCP_CHARDEV_STATE_CONNECTED;
  1368. }
  1369. static void char_socket_class_init(ObjectClass *oc, void *data)
  1370. {
  1371. ChardevClass *cc = CHARDEV_CLASS(oc);
  1372. cc->supports_yank = true;
  1373. cc->parse = qemu_chr_parse_socket;
  1374. cc->open = qmp_chardev_open_socket;
  1375. cc->chr_wait_connected = tcp_chr_wait_connected;
  1376. cc->chr_write = tcp_chr_write;
  1377. cc->chr_sync_read = tcp_chr_sync_read;
  1378. cc->chr_disconnect = tcp_chr_disconnect;
  1379. cc->get_msgfds = tcp_get_msgfds;
  1380. cc->set_msgfds = tcp_set_msgfds;
  1381. cc->chr_add_client = tcp_chr_add_client;
  1382. cc->chr_add_watch = tcp_chr_add_watch;
  1383. cc->chr_update_read_handler = tcp_chr_update_read_handler;
  1384. object_class_property_add(oc, "addr", "SocketAddress",
  1385. char_socket_get_addr, NULL,
  1386. NULL, NULL);
  1387. object_class_property_add_bool(oc, "connected", char_socket_get_connected,
  1388. NULL);
  1389. }
  1390. static const TypeInfo char_socket_type_info = {
  1391. .name = TYPE_CHARDEV_SOCKET,
  1392. .parent = TYPE_CHARDEV,
  1393. .instance_size = sizeof(SocketChardev),
  1394. .instance_finalize = char_socket_finalize,
  1395. .class_init = char_socket_class_init,
  1396. };
  1397. static void register_types(void)
  1398. {
  1399. type_register_static(&char_socket_type_info);
  1400. }
  1401. type_init(register_types);