1 /* -*- tab-width:8 -*- */
4 Copyright (C) 2011 Peter Zotov <whitequark@whitequark.org>
5 Use of this source code is governed by a BSD-style
6 license that can be found in the LICENSE file.
16 static const char hex[] = "0123456789abcdef";
18 int gdb_send_packet(int fd, char* data) {
19 unsigned length = strlen(data) + 5;
20 char* packet = malloc(length); /* '$' data (hex) '#' cksum (hex) */
22 memset(packet, 0, length);
27 for(int i = 0; i < strlen(data); i++) {
28 packet[i + 1] = data[i];
32 packet[length - 4] = '#';
33 packet[length - 3] = hex[cksum >> 4];
34 packet[length - 2] = hex[cksum & 0xf];
37 if(write(fd, packet, length) != length) {
43 if(read(fd, &ack, 1) != 1) {
55 #define ALLOC_STEP 1024
57 int gdb_recv_packet(int fd, char** buffer) {
58 unsigned packet_size = ALLOC_STEP + 1, packet_idx = 0;
60 char recv_cksum[3] = {0};
61 char* packet_buffer = malloc(packet_size);
76 if(read(fd, &c, 1) != 1) {
93 packet_buffer[packet_idx++] = c;
96 if(packet_idx == packet_size) {
97 packet_size += ALLOC_STEP;
98 packet_buffer = realloc(packet_buffer, packet_size);
115 uint8_t recv_cksum_int = strtoul(recv_cksum, NULL, 16);
116 if(recv_cksum_int != cksum) {
118 if(write(fd, &nack, 1) != 1) {
125 if(write(fd, &ack, 1) != 1) {
130 packet_buffer[packet_idx] = 0;
131 *buffer = packet_buffer;
136 // Here we skip any characters which are not \x03, GDB interrupt.
137 // As we use the mode with ACK, in a (very unlikely) situation of a packet
138 // lost because of this skipping, it will be resent anyway.
139 int gdb_check_for_interrupt(int fd) {
144 if(poll(&pfd, 1, 0) != 0) {
147 if(read(fd, &c, 1) != 1)
150 if(c == '\x03') // ^C