1 /*
2 PKTAPI Source, Version 1.00
3
4 (c) & (p) 1999-2000 by Oliver 'Attila' Grimm
5
6 Alle Rechte vorbehalten.
7 */
8
9
10 #include "pktapi.h"
11 #include "pktdef.h"
12 #include "platform_pkt.h"
13
14 #include <io.h>
15 #include <string.h>
16
17 #ifndef __INTEL__
18
WordToI(word * val)19 static void WordToI(word *val)
20 {
21 byte dest[2];
22
23 dest[0] = (byte) (*val & 0xff);
24 dest[1] = (byte) ((*val >> 8) & 0xff);
25
26 *val = *((word *)dest);
27 }
28
DwordToI(dword * val)29 static void DwordToI(dword *val)
30 {
31 byte dest[4];
32
33 dest[0] = (byte) (*val & 0xff);
34 dest[1] = (byte) ((*val >> 8) & 0xff);
35 dest[2] = (byte) ((*val >> 16) & 0xff);
36 dest[3] = (byte) ((*val >> 24) & 0xff);
37
38 *val = *((dword *)dest);
39 }
40
WordFromI(word * val)41 static void WordFromI(word *val)
42 {
43 word dest = (word)((byte *)val)[0] | ((word) ((byte *)val)[1]) << 8;
44 *val = dest;
45 }
46
DwordFromI(dword * val)47 static void DwordFromI(dword *val)
48 {
49 dword dest = (dword)((byte *)val)[0] | ((dword)((byte *)val)[1]) << 8 |
50 ((dword)((byte *)val)[2])<<16 | ((dword)((byte *)val)[3]) << 24;
51 *val = dest;
52 }
53
NETADDRFromI(NETADDR * addr)54 static void NETADDRFromI(NETADDR *addr)
55 {
56 WordFromI(&addr->zone);
57 WordFromI(&addr->net);
58 WordFromI(&addr->node);
59 WordFromI(&addr->point);
60 }
61
NETADDRToI(NETADDR * addr)62 static void NETADDRToI(NETADDR *addr)
63 {
64 WordToI(&addr->zone);
65 WordToI(&addr->net);
66 WordToI(&addr->node);
67 WordToI(&addr->point);
68 }
69
PKT2MSGHEADERFromI(PKT2MSGHEADER * hdr)70 void PKT2MSGHEADERFromI(PKT2MSGHEADER *hdr)
71 {
72 WordFromI(&hdr->signatur);
73 WordFromI(&hdr->orig_node);
74 WordFromI(&hdr->dest_node);
75 WordFromI(&hdr->orig_net);
76 WordFromI(&hdr->dest_net);
77 WordFromI(&hdr->attrib);
78 WordFromI(&hdr->cost);
79 }
80
PKT2MSGHEADERToI(PKT2MSGHEADER * hdr)81 void PKT2MSGHEADERToI(PKT2MSGHEADER *hdr)
82 {
83 WordToI(&hdr->signatur);
84 WordToI(&hdr->orig_node);
85 WordToI(&hdr->dest_node);
86 WordToI(&hdr->orig_net);
87 WordToI(&hdr->dest_net);
88 WordToI(&hdr->attrib);
89 WordToI(&hdr->cost);
90 }
91
PKT3HEADERFromI(PKT3HEADER * hdr)92 void PKT3HEADERFromI(PKT3HEADER *hdr)
93 {
94 NETADDRFromI(&hdr->orig);
95 NETADDRFromI(&hdr->dest);
96 DwordFromI(&hdr->datetime);
97 WordFromI(&hdr->prod_code);
98 WordFromI(&hdr->prod_ver);
99 WordFromI(&hdr->capability);
100 }
101
PKT3HEADERToI(PKT3HEADER * hdr)102 void PKT3HEADERToI(PKT3HEADER *hdr)
103 {
104 NETADDRToI(&hdr->orig);
105 NETADDRToI(&hdr->dest);
106 WordToI(&hdr->pkt_subver);
107 WordToI(&hdr->pkt_ver);
108 DwordToI(&hdr->datetime);
109 WordToI(&hdr->prod_code);
110 WordToI(&hdr->prod_ver);
111 WordToI(&hdr->capability);
112 }
113
PKTHEADERFromI(PKTHEADER * hdr)114 void PKTHEADERFromI(PKTHEADER *hdr)
115 {
116 WordFromI(&hdr->baud);
117 WordFromI(&hdr->pkt_ver);
118 }
119
PKT2HEADERFromI(PKT2HEADER * hdr)120 void PKT2HEADERFromI(PKT2HEADER *hdr)
121 {
122 WordFromI(&hdr->orig_node);
123 WordFromI(&hdr->dest_node);
124 WordFromI(&hdr->year);
125 WordFromI(&hdr->month);
126 WordFromI(&hdr->day);
127 WordFromI(&hdr->hour);
128 WordFromI(&hdr->min);
129 WordFromI(&hdr->sec);
130 WordFromI(&hdr->orig_net);
131 WordFromI(&hdr->dest_net);
132 WordFromI(&hdr->prod_code);
133 WordFromI(&hdr->orig_zone);
134 WordFromI(&hdr->dest_zone);
135 }
136
PKT2PHEADERFromI(PKT2PHEADER * hdr)137 void PKT2PHEADERFromI(PKT2PHEADER *hdr)
138 {
139 WordFromI(&hdr->aux_net);
140 WordFromI(&hdr->cwcopy);
141 WordFromI(&hdr->prg_code_2);
142 WordFromI(&hdr->cap_word);
143 WordFromI(&hdr->orig_zone_2);
144 WordFromI(&hdr->dest_zone_2);
145 WordFromI(&hdr->orig_point);
146 WordFromI(&hdr->dest_point);
147 }
148
PKT2PHEADERToI(PKT2PHEADER * hdr)149 void PKT2PHEADERToI(PKT2PHEADER *hdr)
150 {
151 WordToI(&hdr->orig_node);
152 WordToI(&hdr->dest_node);
153 WordToI(&hdr->year);
154 WordToI(&hdr->month);
155 WordToI(&hdr->day);
156 WordToI(&hdr->hour);
157 WordToI(&hdr->min);
158 WordToI(&hdr->sec);
159 WordToI(&hdr->baud);
160 WordToI(&hdr->pkt_ver);
161 WordToI(&hdr->orig_net);
162 WordToI(&hdr->dest_net);
163 WordToI(&hdr->prod_code);
164 WordToI(&hdr->orig_zone);
165 WordToI(&hdr->dest_zone);
166 WordToI(&hdr->aux_net);
167 WordToI(&hdr->cwcopy);
168 WordToI(&hdr->prg_code_2);
169 WordToI(&hdr->cap_word);
170 WordToI(&hdr->orig_zone_2);
171 WordToI(&hdr->dest_zone_2);
172 WordToI(&hdr->orig_point);
173 WordToI(&hdr->dest_point);
174 }
175
176 #else
177
178 #define PKT2MSGHEADERFromI(d)
179 #define PKT2MSGHEADERToI(d)
180
181 #define PKTHEADERFromI(d)
182 #define PKT2HEADERFromI(d)
183 #define PKT2PHEADERFromI(d)
184 #define PKT2PHEADERToI(d)
185
186 #define PKT3HEADERFromI(d)
187 #define PKT3HEADERToI(d)
188
189 #endif
190
readPKT2MSGHEADER(int fd,PKT2MSGHEADER * hdr)191 int readPKT2MSGHEADER(int fd, PKT2MSGHEADER *hdr)
192 {
193 int rc = read(fd, hdr, sizeof(PKT2MSGHEADER));
194 PKT2MSGHEADERFromI(hdr);
195 return rc;
196 }
197
writePKT2MSGHEADER(int fd,PKT2MSGHEADER * _hdr)198 int writePKT2MSGHEADER(int fd, PKT2MSGHEADER *_hdr)
199 {
200 #ifndef __INTEL__
201 PKT2MSGHEADER hdrcp;
202 memcpy(&hdrcp, _hdr, sizeof(PKT2MSGHEADER));
203 #define hdr (&hdrcp)
204 #else
205 #define hdr _hdr
206 #endif
207
208 PKT2MSGHEADERToI(hdr);
209 return write(fd, hdr, sizeof(PKT2MSGHEADER));
210
211 #undef hdr
212 }
213
214
215 /* Read PKT 2/2+/2.2/3 Header */
216
readPKTHEADER(int fd,PKTHEADER * hdr)217 int readPKTHEADER(int fd, PKTHEADER *hdr)
218 {
219 if (read(fd, hdr, sizeof(PKTHEADER)) != sizeof(PKTHEADER))
220 return PKTTYPE_UNKNOWN;
221
222 PKTHEADERFromI(hdr);
223
224 if (hdr->pkt_ver == 3)
225 {
226 PKT3HEADERFromI((PKT3HEADER *) hdr);
227 return PKTTYPE_3;
228 }
229
230 if (hdr->pkt_ver == 2)
231 {
232 #define hdr2 ((PKT2PHEADER *) hdr)
233
234 PKT2HEADERFromI((PKT2HEADER *) hdr);
235 if (hdr->baud == 2)
236 return PKTTYPE_2_2;
237
238 if ( ((byte *)&hdr2->cap_word)[0] != ((byte *)&hdr2->cwcopy)[1] ||
239 ((byte *)&hdr2->cap_word)[1] != ((byte *)&hdr2->cwcopy)[0])
240 {
241 PKT2PHEADERFromI(hdr2);
242
243 return PKTTYPE_2_PLUS;
244 }
245 return PKTTYPE_2;
246
247 #undef hdr2
248 }
249
250 return PKTTYPE_UNKNOWN;
251 }
252
writePKT2PHEADER(int fd,PKT2PHEADER * _hdr)253 int writePKT2PHEADER(int fd, PKT2PHEADER *_hdr)
254 {
255 #ifndef __INTEL__
256 PKT2PHEADER hdrcp;
257 memcpy(&hdrcp, _hdr, sizeof(PKT2PHEADER));
258 #define hdr (&hdrcp)
259 #else
260 #define hdr _hdr
261 #endif
262
263 PKT2PHEADERToI(hdr);
264 return write(fd, hdr, sizeof(PKT2PHEADER));
265
266 #undef hdr
267 }
268