-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathglobals.c
More file actions
105 lines (91 loc) · 2.14 KB
/
Copy pathglobals.c
File metadata and controls
105 lines (91 loc) · 2.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* globals.c
* Kevin Wells, Spring 2012
*/
#include "globals.h"
int isVerbose = 0;
static bool validateChecksum(const PACKET* packet);
static void hexdump(const unsigned char* data, size_t length);
const char* getPacketType(const PACKET* packet)
{
switch (packet->control)
{
case ACK:
return "ACK";
case DATA:
return "DATA";
case ECHO:
return "ECHO";
case GET:
return "GET";
case PUT:
return "PUT";
case RETR:
return "RETR";
default:
return "UNKNOWN";
}
}
void printPacket(const PACKET* packet)
{
if (packet->control < 0 || packet->control > RETR)
printf("Control: \033[1;31mUNKNOWN\033[0m\n");
else
printf("Control: \033[0;32m%s\033[0m\n", getPacketType(packet));
if (!validateChecksum(packet))
printf("Checksum: \033[1;31m%08X\033[0m\n", packet->checksum);
else
printf("Checksum: \033[0;32m%08X\033[0m\n", packet->checksum);
if (packet->loadsize < 0 || packet->loadsize > LOADSIZE)
printf("Loadsize: \033[1;31m%d\033[0m\n", packet->loadsize);
else
printf("Loadsize: \033[0;32m%d\033[0m\n", packet->loadsize);
if (packet->sequence < 0)
printf("Sequence: \033[0;31m%d\033[0m\n", packet->sequence);
else
printf("Sequence: \033[0m%d\033[0m\n", packet->sequence);
if (isVerbose)
{
char data[LOADSIZE+3] = {0,};
memcpy(data, packet->data, LOADSIZE);
char* n = strtok(data, "\r\n");
if ((n = strtok(NULL, "\r\n")))
strcpy(n-1, "...");
printf("Data: %s\n", data);
int load = packet->loadsize;
if (load > LOADSIZE)
load = LOADSIZE;
hexdump((uint8_t*)packet->data, load);
}
printf("\n");
}
static bool validateChecksum(const PACKET* packet)
{
//TODO Add checksum validation
return true;
}
static void hexdump(const unsigned char* data, size_t length)
{
int i;
size_t stoplength = (length % 16 == 0) ? length : (length/16+1)*16;
for (i = 0; i < stoplength; i++)
{
if (i < length)
printf("%02X ", (unsigned char)data[i]);
else
printf(" ");
if ((i+1) % 16 == 0)
{
printf(" ");
int x;
for (x = 0; x < ((i < length) ? 16 : (length % 16)); x++)
{
char c = data[i-15+x];
if (isprint(c))
printf("%c", c);
else
printf(".");
}
printf("\n");
}
}
}