| /* Copyright (C) 2010 The Android Open Source Project |
| ** |
| ** This software is licensed under the terms of the GNU General Public |
| ** License version 2, as published by the Free Software Foundation, and |
| ** may be copied, distributed, and modified under those terms. |
| ** |
| ** This program is distributed in the hope that it will be useful, |
| ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
| ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| ** GNU General Public License for more details. |
| */ |
| |
| /* |
| * This file contains declaration related to communication between emulator's |
| * UI and core through a console port. |
| */ |
| |
| #ifndef QEMU_ANDROID_CORE_CONNECTION_H |
| #define QEMU_ANDROID_CORE_CONNECTION_H |
| |
| #include "android/sync-utils.h" |
| |
| // Opaque CoreConnection structure. |
| typedef struct CoreConnection CoreConnection; |
| |
| // Base console port |
| #define CORE_BASE_PORT 5554 |
| |
| // Maximum number of core porocesses running simultaneously on a machine. |
| #define MAX_CORE_PROCS 16 |
| |
| // Socket timeout in millisec (set to 5 seconds) |
| #define CORE_PORT_TIMEOUT_MS 5000 |
| |
| /* Opens core console socket. |
| * Param: |
| * sockaddr Socket address to the core console. |
| * Return: |
| * Sync socket descriptor on success, or -1 on failure, with errno appropriately |
| * set. |
| */ |
| SyncSocket* core_connection_open_socket(SockAddress* sockaddr); |
| |
| /* Creates descriptor for a console client. |
| * Param: |
| * console_socket Socket address for the console. |
| * Return: |
| * Allocated and initialized descriptor for the client on success, or NULL |
| * on failure. |
| */ |
| CoreConnection* core_connection_create(SockAddress* console_socket); |
| |
| /* Frees descriptor allocated with core_connection_create. |
| * Param: |
| * desc Descriptor to free. Note that this routine will simply free the memory |
| * used by the descriptor. |
| */ |
| void core_connection_free(CoreConnection* desc); |
| |
| /* Opens a socket handle to the console. |
| * Param: |
| * desc Console client descriptor. Note that if the descriptor has been already |
| * opened, this routine will simply return with success. |
| * Return: |
| * 0 on success, or -1 on failure with errno properly set. This routine will |
| * return in at most one second. |
| */ |
| int core_connection_open(CoreConnection* desc); |
| |
| /* Closes a socket handle to the console opened with core_connection_open. |
| * Param: |
| * desc Console client descriptor opened with core_connection_open. |
| */ |
| void core_connection_close(CoreConnection* desc); |
| |
| /* Synchronously writes to the console. See CORE_PORT_TIMEOUT_MS for the timeout |
| * value used to wait for the write operation to complete. |
| * Param: |
| * desc Console client descriptor opened with core_connection_open. |
| * buffer Buffer to write. |
| * to_write Number of bytes to write. |
| * written_bytes Upon success, contains number of bytes written. This parameter |
| * is optional, and can be NULL. |
| * Return: |
| * 0 on success, or -1 on failure. |
| */ |
| int core_connection_write(CoreConnection* desc, |
| const void* buffer, |
| size_t to_write, |
| size_t* written_bytes); |
| |
| /* Synchronously reads from the console. See CORE_PORT_TIMEOUT_MS for the |
| * timeout value used to wait for the read operation to complete. |
| * Param: |
| * desc Console client descriptor opened with core_connection_open. |
| * buffer Buffer to read data to. |
| * to_read Number of bytes to read. |
| * read_bytes Upon success, contains number of bytes that have been actually |
| * read. This parameter is optional, and can be NULL. |
| * Return: |
| * 0 on success, or -1 on failure. |
| */ |
| int core_connection_read(CoreConnection* desc, |
| void* buffer, |
| size_t to_read, |
| size_t* read_bytes); |
| |
| /* Switches opened console client to a given stream. |
| * Param: |
| * desc Console client descriptor opened with core_connection_open. Note |
| * that this descriptor should represent console itself. In other words, |
| * there must have been no previous calls to this routine for that |
| * descriptor. |
| * stream_name Name of the stream to switch to. |
| * handshake Address of a string to allocate for a handshake message on |
| * success, or an error message on failure. If upon return from this |
| * routine that string is not NULL, its buffer must be freed with 'free'. |
| * Return: |
| * 0 on success, or -1 on failure. |
| */ |
| int core_connection_switch_stream(CoreConnection* desc, |
| const char* stream_name, |
| char** handshake); |
| |
| /* Creates a console client, and switches it to a given stream. |
| * console_socket Socket address for the console. |
| * stream_name Name of the stream to switch to. |
| * handshake Address of a string to allocate for a handshake message on |
| * success, or an error message on failure. If upon return from this |
| * routine that string is not NULL, its buffer must be freed with 'free'. |
| * Return: |
| * Allocated and initialized descriptor for the switched client on success, or |
| * NULL on failure. |
| */ |
| CoreConnection* core_connection_create_and_switch(SockAddress* console_socket, |
| const char* stream_name, |
| char** handshake); |
| |
| /* Detaches opened console client from the console. |
| * By console protocol, writing "\r\n" string to the console will destroy the |
| * console client. |
| * Param: |
| * desc Console client descriptor opened with core_connection_open. |
| */ |
| void core_connection_detach(CoreConnection* desc); |
| |
| /* Gets socket descriptor associated with the core connection. |
| * Param: |
| * desc Console client descriptor opened with core_connection_open. |
| * Return |
| * Socket descriptor associated with the core connection. |
| */ |
| int core_connection_get_socket(CoreConnection* desc); |
| |
| /* Calculates timeout for transferring the given number of bytes via core |
| * connection. |
| * Return: |
| * Number of milliseconds during which the entire number of bytes is expected |
| * to be transferred via core connection. |
| */ |
| static inline int |
| core_connection_get_timeout(size_t data_size) |
| { |
| // Min 2 seconds + 10 millisec for each transferring byte. |
| // TODO: Come up with a better arithmetics here. |
| return 2000 + data_size * 10; |
| } |
| |
| #endif // QEMU_ANDROID_CORE_CONNECTION_H |