/* * Private function name: vnc_send_keys * Since version: 0.4.2 * Description: Function to send the key to VNC window * Arguments: @server [string]: server string to specify VNC server * @port [string]: string version of port value to connect to * @keys [string]: string to be send to the guest's VNC window * Returns: 0 on success, -errno otherwise */ int vnc_send_keys(char *server, char *port, char *keys) { int sfd; int i, skip_next; tServerFBParams params; DPRINTF("%s: server is %s, port is %s, keys are '%s'\n", VNCFUNC, server, port, keys); sfd = vnc_connect(server, port, 1); if (sfd < 0) { int err = errno; DPRINTF("%s: VNC Connection failed with error code %d (%s)\n", VNCFUNC, err, strerror(err)); close(sfd); return -err; } params = vnc_read_server_init(sfd); skip_next = 0; DPRINTF("%s: About to process key sequence '%s' (%d keys)\n", VNCFUNC, keys, (int)strlen(keys)); for (i = 0; i < strlen(keys); i++) { DPRINTF("%s: Processing key %d: %d [0x%02x]\n", VNCFUNC, i, keys[i], keys[i]); if (skip_next) { skip_next = 0; continue; } /* Handling for escape characters */ if ((keys[i] == '\\') && (strlen(keys) > i + 1)) { if (keys[i + 1] == 'n') keys[i] = 13; if (keys[i + 1] == 'r') keys[i] = 10; skip_next = 1; } DPRINTF("%s: Sending key press emulation for key %d\n", VNCFUNC, keys[i]); vnc_send_key(sfd, keys[i], skip_next, 0); DPRINTF("%s: Requesting framebuffer update\n", VNCFUNC); vnc_send_framebuffer_update_request(sfd, 1, params); DPRINTF("%s: Sending key release emulation for key %d\n", VNCFUNC, keys[i]); vnc_send_key(sfd, keys[i], skip_next, 1); /* Sleep for 50 ms, required to make VNC server accept the keystroke emulation */ usleep(50000); } DPRINTF("%s: All %d keys sent\n", VNCFUNC, (int)strlen(keys)); while (socket_has_data(sfd, 500000, 0) == 1) socket_read(sfd, -1); shutdown(sfd, SHUT_RDWR); close(sfd); DPRINTF("%s: Closed descriptor #%d\n", VNCFUNC, sfd); return 0; }
static StreamError refill_socket(SocketStream* stream) { size_t bytes_recv; if(socket_has_data(stream->sock) && socket_recv_all(stream->sock, (void*)stream->start, FILE_BUFFER_SIZE, &bytes_recv) >= 0) { stream->cursor = stream->start; stream->end = stream->start + bytes_recv; return stream->error; } else { return fail_stream(stream, EofError); } }
/* * Private function name: vnc_get_bitmap * Since version: 0.4.5 * Description: Function to get the bitmap from the VNC window * Arguments: @server [string]: server string to specify VNC server * @port [string]: string version of port value to connect to * @fn [string]: string version of filename * Returns: 0 on success, -errno otherwise */ int vnc_get_bitmap(char *server, char *port, char *fn) { int sfd; long pattern_size; tServerFBParams params; char file[] = "/tmp/libvirt-php-tmp-XXXXXX"; if (mkstemp(file) == 0) return -ENOENT; if (fn == NULL) return -ENOENT; sfd = vnc_connect(server, port, 1); if (sfd < 0) { int err = errno; DPRINTF("%s: VNC Connection failed with error code %d (%s)\n", VNCFUNC, err, strerror(err)); close(sfd); return -err; } params = vnc_read_server_init(sfd); pattern_size = params.width * params.height * (params.bpp / 8); DPRINTF("%s: %ld\n", VNCFUNC, pattern_size); vnc_set_pixel_format(sfd, params); vnc_set_encoding(sfd); DPRINTF("%s: Requesting framebuffer update\n", VNCFUNC); vnc_send_framebuffer_update_request(sfd, 1, params); while (socket_has_data(sfd, 50000, 0) == 0) { continue; } socket_read_and_save(sfd, file, pattern_size); shutdown(sfd, SHUT_RDWR); close(sfd); vnc_raw_to_bmp(file, fn, params.width, params.height); unlink(file); DPRINTF("%s: Closed descriptor #%d\n", VNCFUNC, sfd); return 0; }
/* * Private function name: vnc_get_dimensions * Since version: 0.4.3 * Description: Function to get the dimensions of VNC window * Arguments: @server [string]: server string to specify VNC server * @port [string]: string version of port value to connect to * @width [out int]: pointer to integer to carry width argument * @height [out int]: pointer to integer to carry height argument * Returns: 0 on success, -errno otherwise */ int vnc_get_dimensions(char *server, char *port, int *width, int *height) { int sfd; tServerFBParams params; if (!width && !height) { DPRINTF("%s: Neither width or height output value not defined\n", VNCFUNC); return -EINVAL; } DPRINTF("%s: server is %s, port is %s\n", VNCFUNC, server, port); sfd = vnc_connect(server, port, 1); if (sfd < 0) { int err = errno; DPRINTF("%s: VNC Connection failed with error code %d (%s)\n", VNCFUNC, err, strerror(err)); close(sfd); return -err; } params = vnc_read_server_init(sfd); if (width) { *width = params.width; DPRINTF("%s: Output parameter of width set to %d\n", VNCFUNC, *width); } if (height) { *height = params.height; DPRINTF("%s: Output parameter of height set to %d\n", VNCFUNC, *height); } while (socket_has_data(sfd, 500000, 0) == 1) socket_read(sfd, -1); shutdown(sfd, SHUT_RDWR); close(sfd); DPRINTF("%s: Closed descriptor #%d\n", VNCFUNC, sfd); return 0; }
bool ServerSocket::can_accept() const { return socket_has_data(sock); }
bool Socket::has_data() const { return socket_has_data(sock); }