1 From dae29a98c066bc67bb5ba12219d5fd68a8675514 Mon Sep 17 00:00:00 2001
2 From: Hongxu Jia <hongxu.jia@windriver.com>
3 Date: Fri, 26 Apr 2013 20:44:10 +0800
4 Subject: [PATCH] packlib.c: support dictionary byte-order dependent
6 The previous dict files are NOT byte-order independent, in fact they are
7 probably ARCHITECTURE SPECIFIC.
8 Create the dict files in big endian, and convert to host endian while
9 load them. This could fix the endian issue on multiple platform.
11 Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
12 Upstream-Status: Pending
14 lib/packlib.c | 208 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
15 1 file changed, 204 insertions(+), 4 deletions(-)
17 diff --git a/lib/packlib.c b/lib/packlib.c
18 index 8f32d14..323ee83 100644
26 +#define _BSD_SOURCE /* See feature_test_macros(7) */
30 static const char vers_id[] = "packlib.c : v2.3p2 Alec Muffett 18 May 1993";
31 @@ -45,6 +48,182 @@ typedef struct
32 char data_get[NUMWORDS][MAXWORDLEN];
41 +IheaderHostToBigEndian(char *pHeader, int nBitType)
43 + if (nBitType == en_is64)
45 + struct pi_header64 *pHeader64 = (struct pi_header64*)pHeader;
47 + pHeader64->pih_magic = htobe64(pHeader64->pih_magic);
48 + pHeader64->pih_numwords = htobe64(pHeader64->pih_numwords);
49 + pHeader64->pih_blocklen = htobe16(pHeader64->pih_blocklen);
50 + pHeader64->pih_pad = htobe16(pHeader64->pih_pad);
53 + printf("Header64: magic %x, numwords %x, blocklen %x, pad %x\n",
54 + pHeader64->pih_magic, pHeader64->pih_numwords,
55 + pHeader64->pih_blocklen, pHeader64->pih_pad);
58 + else if (nBitType == en_is32)
60 + struct pi_header *pHeader32 = (struct pi_header*)pHeader;
62 + pHeader32->pih_magic = htobe32(pHeader32->pih_magic);
63 + pHeader32->pih_numwords = htobe32(pHeader32->pih_numwords);
64 + pHeader32->pih_blocklen = htobe16(pHeader32->pih_blocklen);
65 + pHeader32->pih_pad = htobe16(pHeader32->pih_pad);
68 + printf("Header32: magic %x, numwords %x, blocklen %x, pad %x\n",
69 + pHeader32->pih_magic, pHeader32->pih_numwords,
70 + pHeader32->pih_blocklen, pHeader32->pih_pad);
75 + fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
83 +IheaderBigEndianToHost(char *pHeader, int nBitType)
85 + if (nBitType == en_is64)
87 + struct pi_header64 *pHeader64 = (struct pi_header64*)pHeader;
89 + pHeader64->pih_magic = be64toh(pHeader64->pih_magic);
90 + pHeader64->pih_numwords = be64toh(pHeader64->pih_numwords);
91 + pHeader64->pih_blocklen = be16toh(pHeader64->pih_blocklen);
92 + pHeader64->pih_pad = be16toh(pHeader64->pih_pad);
95 + printf("Header64: magic %x, numwords %x, blocklen %x, pad %x\n",
96 + pHeader64->pih_magic, pHeader64->pih_numwords,
97 + pHeader64->pih_blocklen, pHeader64->pih_pad);
100 + else if (nBitType == en_is32)
102 + struct pi_header *pHeader32 = (struct pi_header*)pHeader;
104 + pHeader32->pih_magic = be32toh(pHeader32->pih_magic);
105 + pHeader32->pih_numwords = be32toh(pHeader32->pih_numwords);
106 + pHeader32->pih_blocklen = be16toh(pHeader32->pih_blocklen);
107 + pHeader32->pih_pad = be16toh(pHeader32->pih_pad);
110 + printf("Header32: magic %x, numwords %x, blocklen %x, pad %x\n",
111 + pHeader32->pih_magic, pHeader32->pih_numwords,
112 + pHeader32->pih_blocklen, pHeader32->pih_pad);
117 + fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
125 +HwmsHostToBigEndian(char *pHwms, int nLen,int nBitType)
129 + if (nBitType == en_is64)
131 + uint64_t *pHwms64 = (uint64_t*)pHwms;
133 + for (i = 0; i < nLen / sizeof(uint64_t); i++)
135 + *pHwms64++ = htobe64(*pHwms64);
139 + else if (nBitType == en_is32)
141 + uint32_t *pHwms32 = (uint32_t*)pHwms;
143 + for (i = 0; i < nLen / sizeof(uint32_t); i++)
145 + *pHwms32++ = htobe32(*pHwms32);
151 + fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
156 + for (i = 0; i < nLen; i+=8)
158 + printf("hwms%s: %02X %02X %02X %02X %02X %02X %02X %02X\n",
159 + nBitType==en_is64?"64":"32", pHwms[i+0]&0xFF, pHwms[i+1]&0xFF,
160 + pHwms[i+2]&0xFF, pHwms[i+3]&0xFF, pHwms[i+4]&0xFF,
161 + pHwms[i+5]&0xFF, pHwms[i+6]&0xFF, pHwms[i+7]&0xFF);
169 +HwmsBigEndianToHost(char *pHwms, int nLen, int nBitType)
173 + if (nBitType == en_is64)
175 + uint64_t *pHwms64 = (uint64_t*)pHwms;
177 + for (i = 0; i < nLen / sizeof(uint64_t); i++)
179 + *pHwms64++ = be64toh(*pHwms64);
183 + else if (nBitType == en_is32)
185 + uint32_t *pHwms32 = (uint32_t*)pHwms;
187 + for (i = 0; i < nLen / sizeof(uint32_t); i++)
189 + *pHwms32++ = be32toh(*pHwms32);
195 + fprintf(stderr, "Neither 32 or 64: %d\n", nBitType);
200 + for (i = 0; i < nLen; i+=8)
202 + printf("hwms%s: %02X %02X %02X %02X %02X %02X %02X %02X\n",
203 + nBitType==en_is64?"64":"32", pHwms[i+0]&0xFF, pHwms[i+1]&0xFF,
204 + pHwms[i+2]&0xFF, pHwms[i+3]&0xFF, pHwms[i+4]&0xFF,
205 + pHwms[i+5]&0xFF, pHwms[i+6]&0xFF, pHwms[i+7]&0xFF);
213 _PWIsBroken64(FILE *ifp)
214 @@ -57,6 +236,7 @@ _PWIsBroken64(FILE *ifp)
218 + IheaderBigEndianToHost((char *) &pdesc64.header, en_is64);
219 return (pdesc64.header.pih_magic == PIH_MAGIC);
222 @@ -149,7 +329,11 @@ PWOpen(prefix, mode)
223 pdesc.header.pih_blocklen = NUMWORDS;
224 pdesc.header.pih_numwords = 0;
226 - fwrite((char *) &pdesc.header, sizeof(pdesc.header), 1, ifp);
227 + struct pi_header tmpheader32;
229 + memcpy(&tmpheader32, &pdesc.header, sizeof(pdesc.header));
230 + IheaderHostToBigEndian((char *) &tmpheader32, en_is32);
231 + fwrite((char *) &tmpheader32, sizeof(tmpheader32), 1, ifp);
234 pdesc.flags &= ~PFOR_WRITE;
235 @@ -173,6 +357,7 @@ PWOpen(prefix, mode)
236 return ((PWDICT *) 0);
239 + IheaderBigEndianToHost((char *) &pdesc.header, en_is32);
240 if ((pdesc.header.pih_magic == 0) || (pdesc.header.pih_numwords == 0))
242 /* uh-oh. either a broken "64-bit" file or a garbage file. */
243 @@ -195,6 +380,7 @@ PWOpen(prefix, mode)
245 return ((PWDICT *) 0);
247 + IheaderBigEndianToHost((char *) &pdesc64.header, en_is64);
248 if (pdesc64.header.pih_magic != PIH_MAGIC)
250 /* nope, not "64-bit" after all */
251 @@ -290,6 +476,7 @@ PWOpen(prefix, mode)
253 pdesc.flags &= ~PFOR_USEHWMS;
255 + HwmsBigEndianToHost((char*)pdesc64.hwms, sizeof(pdesc64.hwms), en_is64);
256 for (i = 0; i < sizeof(pdesc.hwms) / sizeof(pdesc.hwms[0]); i++)
258 pdesc.hwms[i] = pdesc64.hwms[i];
259 @@ -299,6 +486,7 @@ PWOpen(prefix, mode)
261 pdesc.flags &= ~PFOR_USEHWMS;
263 + HwmsBigEndianToHost((char*)pdesc.hwms, sizeof(pdesc.hwms), en_is32);
265 for (i=1; i<=0xff; i++)
267 @@ -332,7 +520,11 @@ PWClose(pwp)
271 - if (!fwrite((char *) &pwp->header, sizeof(pwp->header), 1, pwp->ifp))
272 + struct pi_header tmpheader32;
274 + memcpy(&tmpheader32, &pwp->header, sizeof(pwp->header));
275 + IheaderHostToBigEndian((char *) &tmpheader32, en_is32);
276 + if (!fwrite((char *) &tmpheader32, sizeof(tmpheader32), 1, pwp->ifp))
278 fprintf(stderr, "index magic fwrite failed\n");
280 @@ -351,7 +543,12 @@ PWClose(pwp)
281 printf("hwm[%02x] = %d\n", i, pwp->hwms[i]);
284 - fwrite(pwp->hwms, 1, sizeof(pwp->hwms), pwp->wfp);
288 + memcpy(&tmp_pwp, pwp, sizeof(PWDICT));
289 + HwmsHostToBigEndian(tmp_pwp.hwms, sizeof(tmp_pwp.hwms), en_is32);
290 + fwrite(tmp_pwp.hwms, 1, sizeof(tmp_pwp.hwms), pwp->wfp);
294 @@ -405,7 +602,8 @@ PutPW(pwp, string)
296 datum = (uint32_t) ftell(pwp->dfp);
298 - fwrite((char *) &datum, sizeof(datum), 1, pwp->ifp);
299 + uint32_t tmpdatum = htobe32(datum);
300 + fwrite((char *) &tmpdatum, sizeof(tmpdatum), 1, pwp->ifp);
302 fputs(pwp->data_put[0], pwp->dfp);
304 @@ -473,6 +671,7 @@ GetPW(pwp, number)
305 perror("(index fread failed)");
308 + datum64 = be64toh(datum64);
311 if (fseek(pwp->ifp, sizeof(struct pi_header) + (thisblock * sizeof(uint32_t)), 0))
312 @@ -486,6 +685,7 @@ GetPW(pwp, number)
313 perror("(index fread failed)");
316 + datum = be32toh(datum);