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