int main(void) { char buffer[20]; size_t len; title("snpack()"); test("c[5]"); len = snpack(buffer, sizeof(buffer), "c[5]", "Hello" ); size_ok(len, 5); int_ok(buffer[0], 'H'); int_ok(buffer[1], 'e'); int_ok(buffer[2], 'l'); int_ok(buffer[3], 'l'); int_ok(buffer[4], 'o'); test("c[] with 3"); len = snpack(buffer, sizeof(buffer), "c[]", "Hi", 3); size_ok(len, 3); int_ok(buffer[0], 'H'); int_ok(buffer[1], 'i'); int_ok(buffer[2], 0); test("c[c] with 0"); len = snpack(buffer, sizeof(buffer), "c[c]", "", 0); size_ok(len, 1); int_ok(buffer[0], 0); test("c[c] with 4"); len = snpack(buffer, sizeof(buffer), "c[c]", "1234", 4); size_ok(len, 5); int_ok(buffer[0], 4); int_ok(buffer[1], '1'); int_ok(buffer[2], '2'); int_ok(buffer[3], '3'); int_ok(buffer[4], '4'); test("c[5] count"); len = snpack(NULL, 0, "c[5]", "Hello" ); size_ok(len, 5); test("c[] with 3 count"); len = snpack(NULL, 0, "c[]", "Hi", 3); size_ok(len, 3); title("aspack()"); char *dynbuffer; test("c[5]"); len = aspack(&dynbuffer, 20, "c[5]", "Hello" ); size_ok(len, 5); int_ok(dynbuffer[0], 'H'); int_ok(dynbuffer[1], 'e'); int_ok(dynbuffer[2], 'l'); int_ok(dynbuffer[3], 'l'); int_ok(dynbuffer[4], 'o'); test("c[] with 3"); len = aspack(&dynbuffer, 20, "c[]", "Hi", 3); size_ok(len, 3); int_ok(dynbuffer[0], 'H'); int_ok(dynbuffer[1], 'i'); int_ok(dynbuffer[2], 0); test("c[c] with 0"); len = aspack(&dynbuffer, 20, "c[c]", "", 0); size_ok(len, 1); int_ok(dynbuffer[0], 0); test("c[c] with 4"); len = aspack(&dynbuffer, 20, "c[c]", "1234", 4); size_ok(len, 5); int_ok(dynbuffer[0], 4); int_ok(dynbuffer[1], '1'); int_ok(dynbuffer[2], '2'); int_ok(dynbuffer[3], '3'); int_ok(dynbuffer[4], '4'); title("snunpack()"); char c[5]; test("c[5]"); memcpy(buffer, "Bye!!", 5); len = snunpack(buffer, sizeof(buffer), "c[5]", c); size_ok(len, 5); int_ok(c[0], 'B'); int_ok(c[1], 'y'); int_ok(c[2], 'e'); int_ok(c[3], '!'); int_ok(c[4], '!'); test("c[] with 3"); memcpy(buffer, "gon", 3); // gone is 4 chars len = snunpack(buffer, sizeof(buffer), "c[]", c, 3); size_ok(len, 3); int_ok(c[0], 'g'); int_ok(c[1], 'o'); int_ok(c[2], 'n'); char count; test("c[c] with 0"); memcpy(buffer, "\0", 1); count = 5; len = snunpack(buffer, sizeof(buffer), "c[c]", c, &count); size_ok(len, 1); int_ok(count, 0); test("c[c] with 4"); memcpy(buffer, "\0045678", 5); count = 5; len = snunpack(buffer, sizeof(buffer), "c[c]", c, &count); size_ok(len, 5); int_ok(count, 4); int_ok(c[0], '5'); int_ok(c[1], '6'); int_ok(c[2], '7'); int_ok(c[3], '8'); test("c[c] limit"); memcpy(buffer, "\0069abcde", 7); c[1] = 0; count = 1; len = snunpack(buffer, sizeof(buffer), "c[c]", c, &count); size_ok(len, 7); int_ok(count, 1); int_ok(c[0], '9'); int_ok(c[1], 0); return 0; }
int main(void) { FILE *file = tmpfile(); size_t len; title("fpack()"); test("s"); rewind(file); len = fpack(file, "s", 0); size_ok(len, 1*sizeof(short)); rewind(file); int_ok(fget_short(file), 0); test("ss"); rewind(file); len = fpack(file, "ss", 1, 2); size_ok(len, 2*sizeof(short)); rewind(file); int_ok(fget_short(file), 1); int_ok(fget_short(file), 2); test("i"); rewind(file); len = fpack(file, "i", 0); size_ok(len, 1*sizeof(int)); rewind(file); int_ok(fget_int(file), 0); test("ii"); rewind(file); len = fpack(file, "ii", 1, 2); size_ok(len, 2*sizeof(int)); rewind(file); int_ok(fget_int(file), 1); int_ok(fget_int(file), 2); test("l"); rewind(file); len = fpack(file, "l", 0L); long_ok(len, 1*sizeof(long)); rewind(file); long_ok(fget_long(file), 0); test("ll"); rewind(file); len = fpack(file, "ll", 1L, 2L); long_ok(len, 2*sizeof(long)); rewind(file); long_ok(fget_long(file), 1); long_ok(fget_long(file), 2); title("funpack()"); short s1, s2; test("s"); rewind(file); fput_short(0, file); rewind(file); len = funpack(file, "s", &s1); size_ok(len, 1*sizeof(short)); int_ok(s1, 0); test("ss"); rewind(file); fput_short(1, file); fput_short(2, file); rewind(file); len = funpack(file, "ss", &s1, &s2); size_ok(len, 2*sizeof(short)); int_ok(s1, 1); int_ok(s2, 2); int i1, i2; test("i"); rewind(file); fput_int(0, file); rewind(file); len = funpack(file, "i", &i1); size_ok(len, 1*sizeof(int)); int_ok(i1, 0); test("ii"); rewind(file); fput_int(1, file); fput_int(2, file); rewind(file); len = funpack(file, "ii", &i1, &i2); size_ok(len, 2*sizeof(int)); int_ok(i1, 1); int_ok(i2, 2); long l1, l2; test("l"); rewind(file); fput_long(0, file); rewind(file); len = funpack(file, "l", &l1); size_ok(len, 1*sizeof(long)); long_ok(l1, 0); test("ll"); rewind(file); fput_long(1, file); fput_long(2, file); rewind(file); len = funpack(file, "ll", &l1, &l2); size_ok(len, 2*sizeof(long)); long_ok(l1, 1); long_ok(l2, 2); return 0; }
/* * get_vpd_data() - populates the passed VPD structure 'vpdInfo' * with data obtained from the specified * I2C EEPROM 'dev_addr'. Returns 0 for * success or 1 for failure. */ int vpd_get_data(unsigned char dev_addr, VPD *vpdInfo) { unsigned char buf[VPD_EEPROM_SIZE]; vpd_t *vpd = (vpd_t *)buf; vpd_packet_t *packet; if (vpdInfo == NULL) return 1; /* * Fill vpdInfo with 0s to blank out * unused fields, fill vpdInfo->ethAddrs * with all 0xffs so that other's code can * determine how many real Ethernet addresses * there are. OUIs starting with 0xff are * broadcast addresses, and would never be * permantely stored. */ memset((void *)vpdInfo, 0, sizeof(VPD)); memset((void *)&vpdInfo->ethAddrs, 0xff, sizeof(vpdInfo->ethAddrs)); vpdInfo->_devAddr = dev_addr; /* Read the minimum size first */ if (vpd_reader(buf, dev_addr, 0, VPD_EEPROM_SIZE) == NULL) { return 1; } /* Check validity of VPD data */ if (!vpd_is_valid(dev_addr, buf)) { printf("VPD Data is INVALID!\n"); return 1; } /* * Walk all the packets and populate * the VPD info structure. */ packet = (vpd_packet_t *)&vpd->packets; do { switch (packet->identifier) { case VPD_PID_GI: printf("Error: Illegal VPD value\n"); break; case VPD_PID_PID: if (strlen_ok(packet, MAX_PROD_ID)) { strncpy(vpdInfo->productId, (char *)(packet->data), packet->size); } break; case VPD_PID_REV: if (size_ok(packet, sizeof(char))) vpdInfo->revisionId = *packet->data; break; case VPD_PID_SN: if (size_ok(packet, sizeof(unsigned long))) { vpdInfo->serialNum = *(unsigned long *)packet->data; } break; case VPD_PID_MANID: if (size_ok(packet, sizeof(unsigned char))) vpdInfo->manuID = *packet->data; break; case VPD_PID_PCO: if (size_ok(packet, sizeof(unsigned long))) { vpdInfo->configOpt = *(unsigned long *)packet->data; } break; case VPD_PID_SYSCLK: if (size_ok(packet, sizeof(unsigned long))) vpdInfo->sysClk = *(unsigned long *)packet->data; break; case VPD_PID_SERCLK: if (size_ok(packet, sizeof(unsigned long))) vpdInfo->serClk = *(unsigned long *)packet->data; break; case VPD_PID_FLASH: if (size_ok(packet, 9)) { /* XXX - hardcoded, padding in struct */ memcpy(&vpdInfo->flashCfg, packet->data, 9); } break; case VPD_PID_ETHADDR: memcpy(vpdInfo->ethAddrs, packet->data, packet->size); break; case VPD_PID_POTS: if (size_ok(packet, sizeof(char))) vpdInfo->numPOTS = (unsigned)*packet->data; break; case VPD_PID_DS1: if (size_ok(packet, sizeof(char))) vpdInfo->numDS1 = (unsigned)*packet->data; case VPD_PID_GAL: case VPD_PID_CRC: case VPD_PID_TERM: break; default: printf("Warning: Found unknown VPD packet ID 0x%x\n", packet->identifier); break; } } while ((packet = vpd_get_packet(packet))); return 0; } /* end get_vpd_data() */
int main(void) { char buffer[40]; size_t len; title("snpack()"); test("u8"); len = snpack(buffer, sizeof(buffer), "u8", 0); size_ok(len, 1); int_ok(buffer[0], 0); test("u8u8"); len = snpack(buffer, sizeof(buffer), "u8u8", 1, 2); size_ok(len, 2); int_ok(buffer[0], 1); int_ok(buffer[1], 2); test("u8u8 limit"); buffer[1] = 0; // reinitialise the buffer to 0 len = snpack(buffer, 1, "u8u8", 100, 101); size_ok(len, 1); int_ok(buffer[0], 100); int_ok(buffer[1], 0); test("b"); len = snpack(buffer, sizeof(buffer), "b", 0); size_ok(len, 1); int_ok(buffer[0], 0); test("u16<"); len = snpack(buffer, sizeof(buffer), "u16<", 10); size_ok(len, 2); int_ok(buffer[0], 10); int_ok(buffer[1], 0); test("u16<u16<"); len = snpack(buffer, sizeof(buffer), "u16<u16<", 1, 2); size_ok(len, 4); int_ok(buffer[0], 1); int_ok(buffer[1], 0); int_ok(buffer[2], 2); int_ok(buffer[3], 0); test("u16>"); len = snpack(buffer, sizeof(buffer), "u16>", 10); size_ok(len, 2); int_ok(buffer[0], 0); int_ok(buffer[1], 10); test("u16>u16>"); len = snpack(buffer, sizeof(buffer), "u16>u16>", 1, 2); size_ok(len, 4); int_ok(buffer[0], 0); int_ok(buffer[1], 1); int_ok(buffer[2], 0); int_ok(buffer[3], 2); test("u16u16 limit 1"); len = snpack(buffer, 1, "u16<u16<", 100, 101); size_ok(len, 0); test("u16u16 limit 2"); buffer[2] = 0; buffer[3] = 0; len = snpack(buffer, 2, "u16<u16<", 100, 101); size_ok(len, 2); int_ok(buffer[0], 100); int_ok(buffer[1], 0); int_ok(buffer[2], 0); int_ok(buffer[3], 0); test("w<"); len = snpack(buffer, sizeof(buffer), "w<", 10); size_ok(len, 2); int_ok(buffer[0], 10); int_ok(buffer[1], 0); // u32 wants a uint32_t. The only portable way to pass that is to cast it long test("u32<"); len = snpack(buffer, sizeof(buffer), "u32<", (long)10); size_ok(len, 4); int_ok(buffer[0], 10); int_ok(buffer[1], 0); int_ok(buffer[2], 0); int_ok(buffer[3], 0); test("u32<u32<"); len = snpack(buffer, sizeof(buffer), "u32<u32<", (long)1, (long)2); size_ok(len, 8); int_ok(buffer[0], 1); int_ok(buffer[1], 0); int_ok(buffer[2], 0); int_ok(buffer[3], 0); int_ok(buffer[4], 2); int_ok(buffer[5], 0); int_ok(buffer[6], 0); int_ok(buffer[7], 0); test("u32>"); len = snpack(buffer, sizeof(buffer), "u32>", (long)10); size_ok(len, 4); int_ok(buffer[0], 0); int_ok(buffer[1], 0); int_ok(buffer[2], 0); int_ok(buffer[3], 10); test("u32>u32>"); len = snpack(buffer, sizeof(buffer), "u32>u32>", (long)1, (long)2); size_ok(len, 8); int_ok(buffer[0], 0); int_ok(buffer[1], 0); int_ok(buffer[2], 0); int_ok(buffer[3], 1); int_ok(buffer[4], 0); int_ok(buffer[5], 0); int_ok(buffer[6], 0); int_ok(buffer[7], 2); test("u32u32 limit 1"); len = snpack(buffer, 1, "u32<u32<", (long)100, (long)101); size_ok(len, 0); test("u32u32 limit 2"); buffer[4] = 0; buffer[5] = 0; buffer[6] = 0; buffer[7] = 0; len = snpack(buffer, 4, "u32<u32<", (long)100, (long)101); size_ok(len, 4); int_ok(buffer[0], 100); int_ok(buffer[1], 0); int_ok(buffer[2], 0); int_ok(buffer[3], 0); int_ok(buffer[4], 0); int_ok(buffer[5], 0); int_ok(buffer[6], 0); int_ok(buffer[7], 0); test("d<"); len = snpack(buffer, sizeof(buffer), "d<", (long)10); size_ok(len, 4); int_ok(buffer[0], 10); int_ok(buffer[1], 0); int_ok(buffer[2], 0); int_ok(buffer[3], 0); test("u64<"); len = snpack(buffer, sizeof(buffer), "u64<", (uint64_t)10); size_ok(len, 8); int_ok(buffer[0], 10); int_ok(buffer[1], 0); int_ok(buffer[2], 0); int_ok(buffer[3], 0); int_ok(buffer[4], 0); int_ok(buffer[5], 0); int_ok(buffer[6], 0); int_ok(buffer[7], 0); test("u64<u64<"); len = snpack(buffer, sizeof(buffer), "u64<u64<", (uint64_t)10, (uint64_t)11); size_ok(len, 16); int_ok(buffer[ 0], 10); int_ok(buffer[ 1], 0); int_ok(buffer[ 2], 0); int_ok(buffer[ 3], 0); int_ok(buffer[ 4], 0); int_ok(buffer[ 5], 0); int_ok(buffer[ 6], 0); int_ok(buffer[ 7], 0); int_ok(buffer[ 8], 11); int_ok(buffer[ 9], 0); int_ok(buffer[10], 0); int_ok(buffer[11], 0); int_ok(buffer[12], 0); int_ok(buffer[13], 0); int_ok(buffer[14], 0); int_ok(buffer[15], 0); test("u64>"); len = snpack(buffer, sizeof(buffer), "u64>", (uint64_t)10); size_ok(len, 8); int_ok(buffer[0], 0); int_ok(buffer[1], 0); int_ok(buffer[2], 0); int_ok(buffer[3], 0); int_ok(buffer[4], 0); int_ok(buffer[5], 0); int_ok(buffer[6], 0); int_ok(buffer[7], 10); test("u64>u64>"); len = snpack(buffer, sizeof(buffer), "u64>u64>", (uint64_t)10, (uint64_t)11); size_ok(len, 16); int_ok(buffer[ 0], 0); int_ok(buffer[ 1], 0); int_ok(buffer[ 2], 0); int_ok(buffer[ 3], 0); int_ok(buffer[ 4], 0); int_ok(buffer[ 5], 0); int_ok(buffer[ 6], 0); int_ok(buffer[ 7], 10); int_ok(buffer[ 8], 0); int_ok(buffer[ 9], 0); int_ok(buffer[10], 0); int_ok(buffer[11], 0); int_ok(buffer[12], 0); int_ok(buffer[13], 0); int_ok(buffer[14], 0); int_ok(buffer[15], 11); test("q<"); len = snpack(buffer, sizeof(buffer), "q<", (uint64_t)10); size_ok(len, 8); int_ok(buffer[0], 10); int_ok(buffer[1], 0); int_ok(buffer[2], 0); int_ok(buffer[3], 0); int_ok(buffer[4], 0); int_ok(buffer[5], 0); int_ok(buffer[6], 0); int_ok(buffer[7], 0); title("snunpack()"); uint8_t b1, b2; test("u8"); buffer[0] = 10; b1 = 0; len = snunpack(buffer, sizeof(buffer), "u8", &b1); size_ok(len, 1); int_ok(b1, 10); test("u8u8"); buffer[0] = 1; buffer[1] = 2; b1 = 0; b2 = 0; len = snunpack(buffer, sizeof(buffer), "u8u8", &b1, &b2); size_ok(len, 2); int_ok(b1, 1); int_ok(b2, 2); test("u8u8 limit"); buffer[0] = 1; buffer[1] = 2; b1 = 0; b2 = 0; len = snunpack(buffer, 1, "u8u8", &b1, &b2); size_ok(len, 1); int_ok(b1, 1); int_ok(b2, 0); test("b"); buffer[0] = 10; b1 = 0; len = snunpack(buffer, sizeof(buffer), "b", &b1); size_ok(len, 1); int_ok(b1, 10); uint16_t w1, w2; test("u16<"); buffer[0] = 10; buffer[1] = 0; w1 = 0; len = snunpack(buffer, sizeof(buffer), "u16<", &w1); size_ok(len, 2); int_ok(w1, 10); test("u16<u16<"); buffer[0] = 1; buffer[1] = 0; buffer[2] = 2; buffer[3] = 0; w1 = 0; w2 = 0; len = snunpack(buffer, sizeof(buffer), "u16<u16<", &w1, &w2); size_ok(len, 4); int_ok(w1, 1); int_ok(w2, 2); test("u16>"); buffer[0] = 0; buffer[1] = 10; w1 = 0; len = snunpack(buffer, sizeof(buffer), "u16>", &w1); size_ok(len, 2); int_ok(w1, 10); test("u16>u16>"); buffer[0] = 0; buffer[1] = 1; buffer[2] = 0; buffer[3] = 2; w1 = 0; w2 = 0; len = snunpack(buffer, sizeof(buffer), "u16>u16>", &w1, &w2); size_ok(len, 4); int_ok(w1, 1); int_ok(w2, 2); test("u16u16 limit 1"); buffer[0] = 1; buffer[1] = 0; buffer[2] = 2; buffer[3] = 0; w1 = 0; w2 = 0; len = snunpack(buffer, 1, "u16<w<", &w1, &w2); size_ok(len, 0); test("u16u16 limit 2"); buffer[0] = 1; buffer[1] = 0; buffer[2] = 2; buffer[3] = 0; w1 = 0; w2 = 0; len = snunpack(buffer, 2, "u16<u16<", &w1, &w2); size_ok(len, 2); int_ok(w1, 1); int_ok(w2, 0); test("w<"); buffer[0] = 10; buffer[1] = 0; w1 = 0; len = snunpack(buffer, sizeof(buffer), "w<", &w1); size_ok(len, 2); int_ok(w1, 10); uint32_t d1, d2; test("u32<"); buffer[0] = 10; buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; d1 = 0; len = snunpack(buffer, sizeof(buffer), "u32<", &d1); size_ok(len, 4); long_ok(d1, 10); test("u32< with 128"); len = snpack(buffer, sizeof(buffer), "u32<", 128); size_ok(len, 4); d1 = 0; len = snunpack(buffer, sizeof(buffer), "u32<", &d1); size_ok(len, 4); long_ok(d1, 128); test("u32<u32<"); buffer[0] = 1; buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; buffer[4] = 2; buffer[5] = 0; buffer[6] = 0; buffer[7] = 0; d1 = 0; d2 = 0; len = snunpack(buffer, sizeof(buffer), "u32<u32<", &d1, &d2); size_ok(len, 8); long_ok(d1, 1); long_ok(d2, 2); test("u32>"); buffer[0] = 0; buffer[1] = 0; buffer[2] = 0; buffer[3] = 10; d1 = 0; len = snunpack(buffer, sizeof(buffer), "u32>", &d1); size_ok(len, 4); long_ok(d1, 10); test("u32>u32>"); buffer[0] = 0; buffer[1] = 0; buffer[2] = 0; buffer[3] = 1; buffer[4] = 0; buffer[5] = 0; buffer[6] = 0; buffer[7] = 2; d1 = 0; d2 = 0; len = snunpack(buffer, sizeof(buffer), "u32>u32>", &d1, &d2); size_ok(len, 8); long_ok(d1, 1); long_ok(d2, 2); test("u32u32 limit 1"); buffer[0] = 1; buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; buffer[4] = 2; buffer[5] = 0; buffer[6] = 0; buffer[7] = 0; d1 = 0; d2 = 0; len = snunpack(buffer, 1, "u32<u32<", &d1, &d2); size_ok(len, 0); test("u32u32 limit 2"); buffer[0] = 1; buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; buffer[4] = 2; buffer[5] = 0; buffer[6] = 0; buffer[7] = 0; d1 = 0; d2 = 0; len = snunpack(buffer, 4, "u32<u32<", &d1, &d2); size_ok(len, 4); long_ok(d1, 1); long_ok(d2, 0); test("d<"); buffer[0] = 10; buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; d1 = 0; len = snunpack(buffer, sizeof(buffer), "d<", &d1); size_ok(len, 4); long_ok(d1, 10); uint64_t q1, q2; test("u64<"); buffer[0] = 1; buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; buffer[4] = 0; buffer[5] = 0; buffer[6] = 0; buffer[7] = 0; q1 = 0; len = snunpack(buffer, sizeof(buffer), "u64<", &q1); size_ok(len, 8); u64_ok(q1, 1); test("u64< with 128"); len = snpack(buffer, sizeof(buffer), "u64<", 128); size_ok(len, 8); q1 = 0; len = snunpack(buffer, sizeof(buffer), "u64<", &q1); size_ok(len, 8); long_ok(q1, 128); test("u64<u64<"); buffer[0] = 1; buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; buffer[4] = 0; buffer[5] = 0; buffer[6] = 0; buffer[7] = 0; buffer[8] = 2; buffer[9] = 0; buffer[10] = 0; buffer[11] = 0; buffer[12] = 0; buffer[13] = 0; buffer[14] = 0; buffer[15] = 0; q1 = 0; q2 = 0; len = snunpack(buffer, sizeof(buffer), "u64<u64<", &q1, &q2); size_ok(len, 16); u64_ok(q1, 1); u64_ok(q2, 2); test("u64>"); buffer[0] = 0; buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; buffer[4] = 0; buffer[5] = 0; buffer[6] = 0; buffer[7] = 1; q1 = 0; len = snunpack(buffer, sizeof(buffer), "u64>", &q1); size_ok(len, 8); u64_ok(q1, 1); test("u64>u64>"); buffer[0] = 0; buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; buffer[4] = 0; buffer[5] = 0; buffer[6] = 0; buffer[7] = 1; buffer[8] = 0; buffer[9] = 0; buffer[10] = 0; buffer[11] = 0; buffer[12] = 0; buffer[13] = 0; buffer[14] = 0; buffer[15] = 2; q1 = 0; q2 = 0; len = snunpack(buffer, sizeof(buffer), "u64>u64>", &q1, &q2); size_ok(len, 16); u64_ok(q1, 1); u64_ok(q2, 2); test("q<"); buffer[0] = 1; buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; buffer[4] = 0; buffer[5] = 0; buffer[6] = 0; buffer[7] = 0; q1 = 0; len = snunpack(buffer, sizeof(buffer), "q<", &q1); size_ok(len, 8); u64_ok(q1, 1); return 0; }