Lines Matching refs:c
99 rfb_printf(rfb_client_t *c, rfb_loglevel_t level, const char *fmt, ...) in rfb_printf() argument
113 if (c != NULL) in rfb_printf()
114 (void) fprintf(fp, "rfb%u: ", c->rc_instance); in rfb_printf()
152 rfb_free_client(rfb_client_t *c) in rfb_free_client() argument
154 free(c->rc_crc); in rfb_free_client()
155 free(c->rc_crc_tmp); in rfb_free_client()
156 free(c->rc_zbuf); in rfb_free_client()
157 free(c->rc_gci.data); in rfb_free_client()
159 if (c->rc_encodings & RFB_ENCODING_ZLIB) in rfb_free_client()
160 (void) deflateEnd(&c->rc_zstream); in rfb_free_client()
162 if (c->rc_fd != -1) in rfb_free_client()
163 (void) close(c->rc_fd); in rfb_free_client()
165 free(c); in rfb_free_client()
193 rfb_send_client_status(rfb_client_t *c, uint32_t status, const char *msg) in rfb_send_client_status() argument
195 rfb_printf(c, RFB_LOGDEBUG, "sending client status %u (%s)", in rfb_send_client_status()
199 (void) stream_write(c->rc_fd, &status, sizeof (status)); in rfb_send_client_status()
201 if (msg != NULL && status != 0 && c->rc_cver == RFB_CVER_3_8) { in rfb_send_client_status()
204 rfb_printf(c, RFB_LOGWARN, msg); in rfb_send_client_status()
207 (void) stream_write(c->rc_fd, buf, 4); in rfb_send_client_status()
208 (void) stream_write(c->rc_fd, msg, strlen((char *)msg)); in rfb_send_client_status()
213 rfb_handshake_version(rfb_client_t *c) in rfb_handshake_version() argument
218 rfb_printf(c, RFB_LOGDEBUG, "handshake version"); in rfb_handshake_version()
220 if (stream_write(c->rc_fd, RFB_VERSION, RFB_VERSION_LEN) != in rfb_handshake_version()
222 rfb_printf(c, RFB_LOGWARN, "could not send server version."); in rfb_handshake_version()
226 l = stream_read(c->rc_fd, buf, sizeof (buf)); in rfb_handshake_version()
228 rfb_printf(c, RFB_LOGWARN, "client version not read"); in rfb_handshake_version()
231 rfb_printf(c, RFB_LOGWARN, "client sent short version - '%.*s'", in rfb_handshake_version()
236 rfb_printf(c, RFB_LOGDEBUG, "version handshake, client ver '%.*s'", in rfb_handshake_version()
240 rfb_printf(c, RFB_LOGERR, "bad client version '%.*s'", l, buf); in rfb_handshake_version()
246 c->rc_cver = RFB_CVER_3_8; in rfb_handshake_version()
249 c->rc_cver = RFB_CVER_3_7; in rfb_handshake_version()
258 c->rc_cver = RFB_CVER_3_3; in rfb_handshake_version()
261 rfb_printf(c, RFB_LOGERR, "unsupported client version '%.*s'", in rfb_handshake_version()
270 rfb_handshake_auth(rfb_client_t *c) in rfb_handshake_auth() argument
275 rfb_printf(c, RFB_LOGDEBUG, "handshake auth"); in rfb_handshake_auth()
279 if (c->rc_s->rs_password != NULL) in rfb_handshake_auth()
283 switch (c->rc_cver) { in rfb_handshake_auth()
290 (void) stream_write(c->rc_fd, buf, 4); in rfb_handshake_auth()
299 (void) stream_write(c->rc_fd, buf, 2); in rfb_handshake_auth()
302 if (stream_read(c->rc_fd, buf, 1) != 1) { in rfb_handshake_auth()
303 rfb_printf(c, RFB_LOGWARN, in rfb_handshake_auth()
309 rfb_send_client_status(c, 1, in rfb_handshake_auth()
325 switch (c->rc_cver) { in rfb_handshake_auth()
330 rfb_send_client_status(c, 0, NULL); in rfb_handshake_auth()
339 rfb_printf(c, RFB_LOGERR, in rfb_handshake_auth()
341 rfb_send_client_status(c, 1, "Auth failed."); in rfb_handshake_auth()
356 (void) strncpy((char *)keystr, c->rc_s->rs_password, in rfb_handshake_auth()
374 if (stream_write(c->rc_fd, challenge, RFBP_SECURITY_VNC_AUTH_LEN) in rfb_handshake_auth()
376 rfb_printf(c, RFB_LOGERR, in rfb_handshake_auth()
382 if (stream_read(c->rc_fd, buf, RFBP_SECURITY_VNC_AUTH_LEN) in rfb_handshake_auth()
384 rfb_send_client_status(c, 1, "Challenge response read failed"); in rfb_handshake_auth()
400 rfb_send_client_status(c, 1, "Auth failed: Invalid password."); in rfb_handshake_auth()
404 rfb_printf(c, RFB_LOGDEBUG, "authentication succeeded"); in rfb_handshake_auth()
405 rfb_send_client_status(c, 0, NULL); in rfb_handshake_auth()
412 rfb_handshake_init_message(rfb_client_t *c) in rfb_handshake_init_message() argument
418 rfb_printf(c, RFB_LOGDEBUG, "handshake server init"); in rfb_handshake_init_message()
421 if (stream_read(c->rc_fd, buf, 1) != 1) { in rfb_handshake_init_message()
422 rfb_printf(c, RFB_LOGWARN, "client did not send init"); in rfb_handshake_init_message()
429 rfb_printf(c, RFB_LOGDEBUG, in rfb_handshake_init_message()
432 pthread_mutex_lock(&c->rc_s->rs_clientlock); in rfb_handshake_init_message()
433 c->rc_s->rs_exclusive = true; in rfb_handshake_init_message()
435 for (oc = list_head(&c->rc_s->rs_clients); oc != NULL; in rfb_handshake_init_message()
436 oc = list_next(&c->rc_s->rs_clients, oc)) { in rfb_handshake_init_message()
437 if (oc != c) in rfb_handshake_init_message()
440 pthread_mutex_unlock(&c->rc_s->rs_clientlock); in rfb_handshake_init_message()
442 rfb_printf(c, RFB_LOGDEBUG, "client requested shared access"); in rfb_handshake_init_message()
444 pthread_mutex_lock(&c->rc_s->rs_clientlock); in rfb_handshake_init_message()
445 if (c->rc_s->rs_exclusive) { in rfb_handshake_init_message()
446 rfb_printf(c, RFB_LOGWARN, in rfb_handshake_init_message()
448 pthread_mutex_unlock(&c->rc_s->rs_clientlock); in rfb_handshake_init_message()
451 pthread_mutex_unlock(&c->rc_s->rs_clientlock); in rfb_handshake_init_message()
456 c->rc_sinfo.rsi_width = htons(gci->width); in rfb_handshake_init_message()
457 c->rc_sinfo.rsi_height = htons(gci->height); in rfb_handshake_init_message()
458 c->rc_width = gci->width; in rfb_handshake_init_message()
459 c->rc_height = gci->height; in rfb_handshake_init_message()
461 if (c->rc_s->rs_name != NULL) in rfb_handshake_init_message()
462 name = (char *)c->rc_s->rs_name; in rfb_handshake_init_message()
466 c->rc_sinfo.rsi_namelen = htonl(strlen(name)); in rfb_handshake_init_message()
467 (void) stream_write(c->rc_fd, &c->rc_sinfo, sizeof (c->rc_sinfo)); in rfb_handshake_init_message()
468 (void) stream_write(c->rc_fd, name, strlen(name)); in rfb_handshake_init_message()
474 rfb_handshake(rfb_client_t *c) in rfb_handshake() argument
476 if (!rfb_handshake_version(c)) in rfb_handshake()
479 if (!rfb_handshake_auth(c)) in rfb_handshake()
482 if (!rfb_handshake_init_message(c)) in rfb_handshake()
489 rfb_print_pixfmt(rfb_client_t *c, rfb_pixfmt_t *px, rfb_loglevel_t level) in rfb_print_pixfmt() argument
491 rfb_printf(c, level, "%20s: %u", "bpp", px->rp_bpp); in rfb_print_pixfmt()
492 rfb_printf(c, level, "%20s: %u", "depth", px->rp_depth); in rfb_print_pixfmt()
493 rfb_printf(c, level, "%20s: %u", "bigendian", px->rp_bigendian); in rfb_print_pixfmt()
494 rfb_printf(c, level, "%20s: %u", "truecolour", px->rp_truecolour); in rfb_print_pixfmt()
495 rfb_printf(c, level, "%20s: %u", "r_max", ntohs(px->rp_r_max)); in rfb_print_pixfmt()
496 rfb_printf(c, level, "%20s: %u", "g_max", ntohs(px->rp_g_max)); in rfb_print_pixfmt()
497 rfb_printf(c, level, "%20s: %u", "b_max", ntohs(px->rp_b_max)); in rfb_print_pixfmt()
498 rfb_printf(c, level, "%20s: %u", "r_shift", px->rp_r_shift); in rfb_print_pixfmt()
499 rfb_printf(c, level, "%20s: %u", "g_shift", px->rp_g_shift); in rfb_print_pixfmt()
500 rfb_printf(c, level, "%20s: %u", "b_shift", px->rp_b_shift); in rfb_print_pixfmt()
504 rfb_recv_set_pixel_format(rfb_client_t *c) in rfb_recv_set_pixel_format() argument
508 rfb_pixfmt_t *oldpx = &c->rc_sinfo.rsi_pixfmt; in rfb_recv_set_pixel_format()
509 rfb_pixfmt_t *spx = &c->rc_s->rs_pixfmt; in rfb_recv_set_pixel_format()
511 rfb_printf(c, RFB_LOGDEBUG, "received pixel format"); in rfb_recv_set_pixel_format()
513 if (stream_read(c->rc_fd, &msg, sizeof (msg)) != sizeof (msg)) in rfb_recv_set_pixel_format()
531 rfb_printf(c, RFB_LOGWARN, "unsupported pixfmt from client"); in rfb_recv_set_pixel_format()
532 rfb_print_pixfmt(c, newpx, RFB_LOGWARN); in rfb_recv_set_pixel_format()
536 rfb_print_pixfmt(c, newpx, RFB_LOGDEBUG); in rfb_recv_set_pixel_format()
542 c->rc_custom_pixfmt = true; in rfb_recv_set_pixel_format()
543 rfb_printf(c, RFB_LOGDEBUG, "Using custom pixfmt"); in rfb_recv_set_pixel_format()
545 c->rc_custom_pixfmt = false; in rfb_recv_set_pixel_format()
546 rfb_printf(c, RFB_LOGDEBUG, "Using native pixfmt"); in rfb_recv_set_pixel_format()
549 c->rc_sinfo.rsi_pixfmt = msg.rp_pixfmt; in rfb_recv_set_pixel_format()
550 c->rc_crc_reset = true; in rfb_recv_set_pixel_format()
556 rfb_recv_set_encodings(rfb_client_t *c) in rfb_recv_set_encodings() argument
560 rfb_printf(c, RFB_LOGDEBUG, "received encodings"); in rfb_recv_set_encodings()
562 if (stream_read(c->rc_fd, &msg, sizeof (msg)) != sizeof (msg)) in rfb_recv_set_encodings()
567 rfb_printf(c, RFB_LOGDEBUG, "%d values", msg.re_numencs); in rfb_recv_set_encodings()
572 if (stream_read(c->rc_fd, &enc, sizeof (enc)) != sizeof (enc)) in rfb_recv_set_encodings()
579 rfb_printf(c, RFB_LOGDEBUG, in rfb_recv_set_encodings()
581 c->rc_encodings |= RFB_ENCODING_RAW; in rfb_recv_set_encodings()
584 rfb_printf(c, RFB_LOGDEBUG, in rfb_recv_set_encodings()
586 if (!(c->rc_encodings & RFB_ENCODING_ZLIB)) { in rfb_recv_set_encodings()
587 if (deflateInit(&c->rc_zstream, Z_BEST_SPEED) in rfb_recv_set_encodings()
591 c->rc_encodings |= RFB_ENCODING_ZLIB; in rfb_recv_set_encodings()
595 rfb_printf(c, RFB_LOGDEBUG, "client supports resize"); in rfb_recv_set_encodings()
596 c->rc_encodings |= RFB_ENCODING_RESIZE; in rfb_recv_set_encodings()
599 rfb_printf(c, RFB_LOGDEBUG, in rfb_recv_set_encodings()
601 c->rc_encodings |= RFB_ENCODING_EXT_KEVENT; in rfb_recv_set_encodings()
604 rfb_printf(c, RFB_LOGDEBUG, in rfb_recv_set_encodings()
606 c->rc_encodings |= RFB_ENCODING_DESKTOP_NAME; in rfb_recv_set_encodings()
609 rfb_printf(c, RFB_LOGDEBUG, in rfb_recv_set_encodings()
618 rfb_recv_update(rfb_client_t *c) in rfb_recv_update() argument
622 if (stream_read(c->rc_fd, &msg, sizeof (msg)) != sizeof (msg)) in rfb_recv_update()
625 if (!c->rc_keyevent_sent && in rfb_recv_update()
626 (c->rc_encodings & RFB_ENCODING_EXT_KEVENT)) { in rfb_recv_update()
631 c->rc_keyevent_sent = true; in rfb_recv_update()
632 rfb_send_extended_keyevent_update_msg(c); in rfb_recv_update()
635 c->rc_pending = true; in rfb_recv_update()
637 rfb_printf(c, RFB_LOGDEBUG, in rfb_recv_update()
639 c->rc_send_fullscreen = true; in rfb_recv_update()
646 rfb_recv_key_event(rfb_client_t *c) in rfb_recv_key_event() argument
650 if (stream_read(c->rc_fd, &msg, sizeof (msg)) != sizeof (msg)) in rfb_recv_key_event()
655 rfb_printf(c, RFB_LOGDEBUG, "received key %s %x", in rfb_recv_key_event()
659 c->rc_input_detected = true; in rfb_recv_key_event()
665 rfb_recv_pointer_event(rfb_client_t *c) in rfb_recv_pointer_event() argument
669 if (stream_read(c->rc_fd, &msg, sizeof (msg)) != sizeof (msg)) in rfb_recv_pointer_event()
676 rfb_printf(c, RFB_LOGDEBUG, "received pointer event @ %dx%d", in rfb_recv_pointer_event()
681 c->rc_input_detected = true; in rfb_recv_pointer_event()
687 rfb_recv_cut_text(rfb_client_t *c) in rfb_recv_cut_text() argument
692 rfb_printf(c, RFB_LOGDEBUG, "received cut text event"); in rfb_recv_cut_text()
694 if (stream_read(c->rc_fd, &msg, sizeof (msg)) != sizeof (msg)) in rfb_recv_cut_text()
698 rfb_printf(c, RFB_LOGDEBUG, "%u bytes in buffer", msg.rct_length); in rfb_recv_cut_text()
703 l = stream_read(c->rc_fd, buf, in rfb_recv_cut_text()
714 rfb_recv_qemu(rfb_client_t *c) in rfb_recv_qemu() argument
718 rfb_printf(c, RFB_LOGDEBUG, "received QEMU event"); in rfb_recv_qemu()
720 if (stream_read(c->rc_fd, &msg, sizeof (msg)) != sizeof (msg)) in rfb_recv_qemu()
727 if (stream_read(c->rc_fd, &keymsg, sizeof (keymsg)) != in rfb_recv_qemu()
735 rfb_printf(c, RFB_LOGDEBUG, "QEMU key %s %x / %x", in rfb_recv_qemu()
741 c->rc_input_detected = true; in rfb_recv_qemu()
745 rfb_printf(c, RFB_LOGWARN, "Unknown QEMU event subtype: %d\n", in rfb_recv_qemu()
754 rfb_send_update_header(rfb_client_t *c, int numrects) in rfb_send_update_header() argument
762 return (stream_write(c->rc_fd, &msg, sizeof (msg)) == sizeof (msg)); in rfb_send_update_header()
766 rfb_send_resize_update_msg(rfb_client_t *c) in rfb_send_resize_update_msg() argument
770 rfb_printf(c, RFB_LOGDEBUG, "sending screen resize %dx%d", in rfb_send_resize_update_msg()
771 c->rc_width, c->rc_height); in rfb_send_resize_update_msg()
773 (void) rfb_send_update_header(c, 1); in rfb_send_resize_update_msg()
777 rect.rr_width = htons(c->rc_width); in rfb_send_resize_update_msg()
778 rect.rr_height = htons(c->rc_height); in rfb_send_resize_update_msg()
781 (void) stream_write(c->rc_fd, &rect, sizeof (rect)); in rfb_send_resize_update_msg()
785 rfb_send_extended_keyevent_update_msg(rfb_client_t *c) in rfb_send_extended_keyevent_update_msg() argument
789 rfb_printf(c, RFB_LOGDEBUG, "sending extended keyevent update message"); in rfb_send_extended_keyevent_update_msg()
791 (void) rfb_send_update_header(c, 1); in rfb_send_extended_keyevent_update_msg()
795 rect.rr_width = htons(c->rc_width); in rfb_send_extended_keyevent_update_msg()
796 rect.rr_height = htons(c->rc_height); in rfb_send_extended_keyevent_update_msg()
799 (void) stream_write(c->rc_fd, &rect, sizeof (rect)); in rfb_send_extended_keyevent_update_msg()
803 translate_pixels(rfb_client_t *c, struct bhyvegc_image *gci, in translate_pixels() argument
806 rfb_pixfmt_t *px = &c->rc_sinfo.rsi_pixfmt; in translate_pixels()
807 rfb_pixfmt_t *spx = &c->rc_s->rs_pixfmt; in translate_pixels()
812 VERIFY3S(gci->width, ==, c->rc_gci.width); in translate_pixels()
813 VERIFY3S(gci->height, ==, c->rc_gci.height); in translate_pixels()
820 c->rc_gci.data[y * w + x] = in translate_pixels()
830 rfb_send_rect(rfb_client_t *c, struct bhyvegc_image *gci, in rfb_send_rect() argument
841 rfb_printf(c, RFB_LOGDEBUG, "send rect %dx%d %dx%d", in rfb_send_rect()
852 if (c->rc_custom_pixfmt) { in rfb_send_rect()
853 translate_pixels(c, gci, x, y, x + w, y + h); in rfb_send_rect()
854 data = c->rc_gci.data; in rfb_send_rect()
860 if (c->rc_encodings & RFB_ENCODING_ZLIB) { in rfb_send_rect()
861 zbufp = c->rc_zbuf; in rfb_send_rect()
862 c->rc_zstream.total_in = 0; in rfb_send_rect()
863 c->rc_zstream.total_out = 0; in rfb_send_rect()
865 c->rc_zstream.next_in = (Bytef *)p; in rfb_send_rect()
866 c->rc_zstream.avail_in = w; in rfb_send_rect()
867 c->rc_zstream.next_out = (Bytef *)zbufp; in rfb_send_rect()
868 c->rc_zstream.avail_out = RFB_ZLIB_BUFSZ + 16 - in rfb_send_rect()
869 c->rc_zstream.total_out; in rfb_send_rect()
870 c->rc_zstream.data_type = Z_BINARY; in rfb_send_rect()
873 err = deflate(&c->rc_zstream, Z_SYNC_FLUSH); in rfb_send_rect()
875 rfb_printf(c, RFB_LOGWARN, in rfb_send_rect()
879 zbufp = c->rc_zbuf + c->rc_zstream.total_out; in rfb_send_rect()
883 nwrite = stream_write(c->rc_fd, &rect, sizeof (rect)); in rfb_send_rect()
887 zlen = htonl(c->rc_zstream.total_out); in rfb_send_rect()
888 nwrite = stream_write(c->rc_fd, &zlen, sizeof (uint32_t)); in rfb_send_rect()
891 return (stream_write(c->rc_fd, c->rc_zbuf, in rfb_send_rect()
892 c->rc_zstream.total_out) == c->rc_zstream.total_out); in rfb_send_rect()
898 zbufp = c->rc_zbuf; in rfb_send_rect()
907 nwrite = stream_write(c->rc_fd, &rect, sizeof (rect)); in rfb_send_rect()
911 return (stream_write(c->rc_fd, c->rc_zbuf, total) == total); in rfb_send_rect()
916 rfb_send_all(rfb_client_t *c, struct bhyvegc_image *gci) in rfb_send_all() argument
923 rfb_printf(c, RFB_LOGDEBUG, "send entire screen"); in rfb_send_all()
926 if (!rfb_send_update_header(c, 1)) in rfb_send_all()
935 if (c->rc_custom_pixfmt) { in rfb_send_all()
936 translate_pixels(c, gci, 0, 0, gci->width, gci->height); in rfb_send_all()
937 data = c->rc_gci.data; in rfb_send_all()
940 if (c->rc_encodings & RFB_ENCODING_ZLIB) { in rfb_send_all()
941 c->rc_zstream.next_in = (Bytef *)data; in rfb_send_all()
942 c->rc_zstream.avail_in = gci->width * gci->height * in rfb_send_all()
944 c->rc_zstream.next_out = (Bytef *)c->rc_zbuf; in rfb_send_all()
945 c->rc_zstream.avail_out = RFB_ZLIB_BUFSZ + 16; in rfb_send_all()
946 c->rc_zstream.data_type = Z_BINARY; in rfb_send_all()
948 c->rc_zstream.total_in = 0; in rfb_send_all()
949 c->rc_zstream.total_out = 0; in rfb_send_all()
952 err = deflate(&c->rc_zstream, Z_SYNC_FLUSH); in rfb_send_all()
954 rfb_printf(c, RFB_LOGWARN, "zlib deflate err: %d", err); in rfb_send_all()
959 nwrite = stream_write(c->rc_fd, &rect, sizeof (rect)); in rfb_send_all()
963 zlen = htonl(c->rc_zstream.total_out); in rfb_send_all()
964 nwrite = stream_write(c->rc_fd, &zlen, sizeof (uint32_t)); in rfb_send_all()
967 return (stream_write(c->rc_fd, c->rc_zbuf, in rfb_send_all()
968 c->rc_zstream.total_out) == c->rc_zstream.total_out); in rfb_send_all()
973 nwrite = stream_write(c->rc_fd, &rect, sizeof (rect)); in rfb_send_all()
978 return (stream_write(c->rc_fd, data, nwrite) == nwrite); in rfb_send_all()
982 rfb_send_screen(rfb_client_t *c) in rfb_send_screen() argument
993 if (atomic_exchange(&c->rc_pending, false) == false) in rfb_send_screen()
1006 if (c->rc_width != gci->width || in rfb_send_screen()
1007 c->rc_height != gci->height) { in rfb_send_screen()
1008 c->rc_width = gci->width; in rfb_send_screen()
1009 c->rc_height = gci->height; in rfb_send_screen()
1010 c->rc_crc_reset = true; in rfb_send_screen()
1011 c->rc_send_fullscreen = true; in rfb_send_screen()
1014 if (c->rc_encodings & RFB_ENCODING_RESIZE) { in rfb_send_screen()
1015 rfb_send_resize_update_msg(c); in rfb_send_screen()
1026 if (atomic_exchange(&c->rc_crc_reset, false)) in rfb_send_screen()
1027 memset(c->rc_crc, '\0', c->rc_cells * sizeof (uint32_t)); in rfb_send_screen()
1029 if (c->rc_custom_pixfmt && (c->rc_gci.data == NULL || in rfb_send_screen()
1030 c->rc_gci.width != c->rc_width || in rfb_send_screen()
1031 c->rc_gci.height != c->rc_height)) { in rfb_send_screen()
1032 c->rc_gci.data = reallocarray(c->rc_gci.data, in rfb_send_screen()
1033 c->rc_width * c->rc_height, sizeof (uint32_t)); in rfb_send_screen()
1034 if (c->rc_gci.data == NULL) { in rfb_send_screen()
1038 c->rc_gci.width = c->rc_width; in rfb_send_screen()
1039 c->rc_gci.height = c->rc_height; in rfb_send_screen()
1040 } else if (!c->rc_custom_pixfmt && c->rc_gci.data != NULL) { in rfb_send_screen()
1041 free(c->rc_gci.data); in rfb_send_screen()
1042 c->rc_gci.data = NULL; in rfb_send_screen()
1045 sendall = atomic_exchange(&c->rc_send_fullscreen, false); in rfb_send_screen()
1061 ncrc = c->rc_crc_tmp - xcells; in rfb_send_screen()
1062 ocrc = c->rc_crc - xcells; in rfb_send_screen()
1064 memset(c->rc_crc_tmp, '\0', sizeof (uint32_t) * xcells * ycells); in rfb_send_screen()
1105 rfb_printf(c, RFB_LOGDEBUG, in rfb_send_screen()
1115 c->rc_pending = true; in rfb_send_screen()
1124 retval = rfb_send_all(c, gci); in rfb_send_screen()
1128 if (!rfb_send_update_header(c, changes)) { in rfb_send_screen()
1134 ncrc = c->rc_crc_tmp; in rfb_send_screen()
1151 if (!rfb_send_rect(c, gci, in rfb_send_screen()
1170 rfb_client_t *c = arg; in rfb_client_rx_thread() local
1174 while (ret && !c->rc_closing && (read(c->rc_fd, &cmd, 1) == 1)) { in rfb_client_rx_thread()
1177 ret = rfb_recv_set_pixel_format(c); in rfb_client_rx_thread()
1180 ret = rfb_recv_set_encodings(c); in rfb_client_rx_thread()
1183 ret = rfb_recv_update(c); in rfb_client_rx_thread()
1186 ret = rfb_recv_key_event(c); in rfb_client_rx_thread()
1189 ret = rfb_recv_pointer_event(c); in rfb_client_rx_thread()
1192 ret = rfb_recv_cut_text(c); in rfb_client_rx_thread()
1195 ret = rfb_recv_qemu(c); in rfb_client_rx_thread()
1198 rfb_printf(c, RFB_LOGWARN, "unknown cs code %d", in rfb_client_rx_thread()
1204 rfb_printf(c, RFB_LOGDEBUG, "client rx thread exiting"); in rfb_client_rx_thread()
1205 c->rc_closing = true; in rfb_client_rx_thread()
1213 rfb_client_t *c = arg; in rfb_client_tx_thread() local
1214 rfb_server_t *s = c->rc_s; in rfb_client_tx_thread()
1221 (void) snprintf(tname, sizeof (tname), "rfb%u tx", c->rc_instance); in rfb_client_tx_thread()
1222 (void) pthread_set_name_np(c->rc_tx_tid, tname); in rfb_client_tx_thread()
1224 c->rc_sinfo.rsi_pixfmt = c->rc_s->rs_pixfmt; in rfb_client_tx_thread()
1225 c->rc_encodings = RFB_ENCODING_RAW; in rfb_client_tx_thread()
1227 if (!rfb_handshake(c)) { in rfb_client_tx_thread()
1228 rfb_printf(c, RFB_LOGWARN, "handshake failure"); in rfb_client_tx_thread()
1232 c->rc_cells = howmany(RFB_MAX_WIDTH * RFB_MAX_HEIGHT, RFB_PIX_PER_CELL); in rfb_client_tx_thread()
1233 if ((c->rc_crc = calloc(c->rc_cells, sizeof (uint32_t))) == NULL || in rfb_client_tx_thread()
1234 (c->rc_crc_tmp = calloc(c->rc_cells, sizeof (uint32_t))) == NULL) { in rfb_client_tx_thread()
1239 err = pthread_create(&c->rc_rx_tid, NULL, rfb_client_rx_thread, c); in rfb_client_tx_thread()
1245 (void) snprintf(tname, sizeof (tname), "rfb%u rx", c->rc_instance); in rfb_client_tx_thread()
1246 (void) pthread_set_name_np(c->rc_rx_tid, tname); in rfb_client_tx_thread()
1250 while (!c->rc_closing) { in rfb_client_tx_thread()
1258 FD_SET(c->rc_fd, &rfds); in rfb_client_tx_thread()
1262 err = select(c->rc_fd + 1, &rfds, NULL, NULL, &tv); in rfb_client_tx_thread()
1274 input = atomic_exchange(&c->rc_input_detected, false); in rfb_client_tx_thread()
1280 if (!rfb_send_screen(c)) in rfb_client_tx_thread()
1290 rfb_printf(c, RFB_LOGWARN, "disconnected"); in rfb_client_tx_thread()
1292 (void) pthread_join(c->rc_rx_tid, &status); in rfb_client_tx_thread()
1295 list_remove(&s->rs_clients, c); in rfb_client_tx_thread()
1298 id_free(rfb_idspace, c->rc_instance); in rfb_client_tx_thread()
1301 rfb_free_client(c); in rfb_client_tx_thread()
1309 rfb_client_t *c = NULL; in rfb_accept() local
1316 rfb_printf(c, RFB_LOGDEBUG, "incoming connection"); in rfb_accept()
1352 if ((c = calloc(1, sizeof (rfb_client_t))) == NULL) { in rfb_accept()
1357 c->rc_fd = cfd; in rfb_accept()
1358 c->rc_s = s; in rfb_accept()
1359 c->rc_zbuf = malloc(RFB_ZLIB_BUFSZ + 16); in rfb_accept()
1360 if (c->rc_zbuf == NULL) in rfb_accept()
1365 err = pthread_create(&c->rc_tx_tid, NULL, rfb_client_tx_thread, c); in rfb_accept()
1373 list_insert_tail(&s->rs_clients, c); in rfb_accept()
1374 c->rc_instance = id_allocff(rfb_idspace); in rfb_accept()
1377 (void) pthread_detach(c->rc_tx_tid); in rfb_accept()
1379 rfb_printf(c, RFB_LOGWARN, "connection from %s", host); in rfb_accept()
1385 free(c); in rfb_accept()