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.
20 static const char hex[] = "0123456789abcdef";
22 int gdb_send_packet(int fd, char* data) {
23 unsigned length = strlen(data) + 5;
24 char* packet = malloc(length); /* '$' data (hex) '#' cksum (hex) */
26 memset(packet, 0, length);
31 for(unsigned int i = 0; i < strlen(data); i++) {
32 packet[i + 1] = data[i];
36 packet[length - 4] = '#';
37 packet[length - 3] = hex[cksum >> 4];
38 packet[length - 2] = hex[cksum & 0xf];
41 if(write(fd, packet, length) != length) {
47 if(read(fd, &ack, 1) != 1) {
59 #define ALLOC_STEP 1024
61 int gdb_recv_packet(int fd, char** buffer) {
62 unsigned packet_size = ALLOC_STEP + 1, packet_idx = 0;
64 char recv_cksum[3] = {0};
65 char* packet_buffer = malloc(packet_size);
80 if(read(fd, &c, 1) != 1) {
97 packet_buffer[packet_idx++] = c;
100 if(packet_idx == packet_size) {
101 packet_size += ALLOC_STEP;
102 packet_buffer = realloc(packet_buffer, packet_size);
119 uint8_t recv_cksum_int = strtoul(recv_cksum, NULL, 16);
120 if(recv_cksum_int != cksum) {
122 if(write(fd, &nack, 1) != 1) {
129 if(write(fd, &ack, 1) != 1) {
134 packet_buffer[packet_idx] = 0;
135 *buffer = packet_buffer;
140 // Here we skip any characters which are not \x03, GDB interrupt.
141 // As we use the mode with ACK, in a (very unlikely) situation of a packet
142 // lost because of this skipping, it will be resent anyway.
143 int gdb_check_for_interrupt(int fd) {
148 if(poll(&pfd, 1, 0) != 0) {
151 if(read(fd, &c, 1) != 1)
154 if(c == '\x03') // ^C