Exemplo n.º 1
0
/*
 * 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;
}
Exemplo n.º 2
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);
	}
}
Exemplo n.º 3
0
/*
 * 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;
}
Exemplo n.º 4
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;
}
Exemplo n.º 5
0
bool ServerSocket::can_accept() const {
	return socket_has_data(sock);
}
Exemplo n.º 6
0
bool Socket::has_data() const {
	return socket_has_data(sock);
}