-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathslave.c
114 lines (89 loc) · 2.2 KB
/
slave.c
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
105
106
107
108
109
110
111
112
113
#include "utils.h"
#define BUFSIZE 4096
char data[] = "Whenever the receiver "
"receives a packet, the receiver calculates exactly "
"the same checksum or CRC, then comparesi";
struct {
int fd;
off_t offset;
char exec[BUFSIZE];
char params[BUFSIZE];
char out[BUFSIZE];
} cmds;
int exec_cmd()
{
printf("[%s] [%s]\n", cmds.exec, cmds.params);
FILE *fp;
strcat(cmds.exec, " ");
strcat(cmds.exec, cmds.params);
strcat(cmds.exec, " 2>&1");
printf("[%s] \n", cmds.exec);
fp = popen(cmds.exec, "r");
memset(cmds.out, 0, BUFSIZE);
fread(cmds.out, BUFSIZE, 1, fp);
pclose(fp);
return 0;
}
int get_file()
{
printf("[%s]\n", cmds.exec);
int fd = open(cmds.exec, O_RDONLY);
if (fd < 0)
return -1;
memset(&cmds.out , 0, BUFSIZE);
int rdnum = read(fd, cmds.out, BUFSIZE);
//printf("%s\n", cmds.out);
close(fd);
return rdnum;
}
int main(void)
{
struct res *rs = res_init("/dev/pts/11");
printf("\tServer\n");
struct packet pkt, prev_pkt;
memset(&pkt, 0, sizeof(struct packet));
memset(&prev_pkt, 0, sizeof(struct packet));
int num = 1;
for(;;) {
prev_pkt = pkt;
int pkt_ret = get_pkt(rs->fd, &pkt, 0);
if (pkt.header == CHK) {
send_cmd(rs->fd, 0, RSP);
continue;
}
if (pkt.header == ACK) {
printf("received ACK\n");
if (prev_pkt.header == CPARAM) {
if (exec_cmd() == -1)
send_cmd(rs->fd, 0, NAK);
else send_buf(rs->fd, cmds.out, sizeof(cmds.out), CEXEC);
}
if (prev_pkt.header == CGET) {
if (get_file() == -1)
send_cmd(rs->fd, 0, NAK);
else send_buf(rs->fd, cmds.out, sizeof(cmds.out), CGET);
}
num = 1;
continue;
}
if (pkt_ret != 0 || pkt.num != num || crc_ok(&pkt) != 0) {
printf("[!] get_pkt\n");
send_cmd(rs->fd, num, NAK);
} else if (pkt.header == CEXEC || pkt.header == CGET){
printf("received CEXEC or CGET\n");
size_t offset = (num-1) * DATSIZ;
memcpy(cmds.exec + offset, pkt.data, DATSIZ);
cmds.exec[offset + DATSIZ] = 0;
num++;
//print_pkt(&pkt);
} else if (pkt.header == CPARAM) {
printf("received CPARAM\n");
size_t offset = (num-1) * DATSIZ;
memcpy(cmds.params + offset, pkt.data, DATSIZ);
cmds.params[offset + DATSIZ] = 0;
num++;
//print_pkt(&pkt);
}
}
return 0;
}