2 * Copyright (C) 2011 Peter Zotov <whitequark@whitequark.org>
3 * Use of this source code is governed by a BSD-style
4 * license that can be found in the LICENSE file.
18 static const char hex[] = "0123456789abcdef";
20 int gdb_send_packet(int fd, char* data) {
21 int length = strlen(data) + 5;
22 char* packet = malloc(length); /* '$' data (hex) '#' cksum (hex) */
24 memset(packet, 0, length);
29 for(unsigned int i = 0; i < strlen(data); i++) {
30 packet[i + 1] = data[i];
34 packet[length - 4] = '#';
35 packet[length - 3] = hex[cksum >> 4];
36 packet[length - 2] = hex[cksum & 0xf];
39 if(write(fd, packet, length) != length) {
45 if(read(fd, &ack, 1) != 1) {
57 #define ALLOC_STEP 1024
59 int gdb_recv_packet(int fd, char** buffer) {
60 unsigned packet_size = ALLOC_STEP + 1, packet_idx = 0;
62 char recv_cksum[3] = {0};
63 char* packet_buffer = malloc(packet_size);
78 if(read(fd, &c, 1) != 1) {
95 packet_buffer[packet_idx++] = c;
98 if(packet_idx == packet_size) {
99 packet_size += ALLOC_STEP;
100 packet_buffer = realloc(packet_buffer, packet_size);
117 uint8_t recv_cksum_int = strtoul(recv_cksum, NULL, 16);
118 if(recv_cksum_int != cksum) {
120 if(write(fd, &nack, 1) != 1) {
127 if(write(fd, &ack, 1) != 1) {
132 packet_buffer[packet_idx] = 0;
133 *buffer = packet_buffer;
138 // Here we skip any characters which are not \x03, GDB interrupt.
139 // As we use the mode with ACK, in a (very unlikely) situation of a packet
140 // lost because of this skipping, it will be resent anyway.
141 int gdb_check_for_interrupt(int fd) {
146 if(poll(&pfd, 1, 0) != 0) {
149 if(read(fd, &c, 1) != 1)
152 if(c == '\x03') // ^C