int convert_block0(Block0 *data, int to_cpu_form) { #if BYTE_ORDER == LITTLE_ENDIAN DDMap *m; u16 count; int i; // Since this data is optional we do not want to convert willy-nilly. // We use the flag to determine whether to check for the signature // before or after we flip the bytes and to determine which form of // the count to use. if (to_cpu_form) { reverse2((u8 *)&data->sbSig); if (data->sbSig != BLOCK0_SIGNATURE) { reverse2((u8 *)&data->sbSig); if (data->sbSig != BLOCK0_SIGNATURE) { return 0; } } } else { if (data->sbSig != BLOCK0_SIGNATURE) { return 0; } reverse2((u8 *)&data->sbSig); } reverse2((u8 *)&data->sbBlkSize); reverse4((u8 *)&data->sbBlkCount); reverse2((u8 *)&data->sbDevType); reverse2((u8 *)&data->sbDevId); reverse4((u8 *)&data->sbData); if (to_cpu_form) { reverse2((u8 *)&data->sbDrvrCount); count = data->sbDrvrCount; } else { count = data->sbDrvrCount; reverse2((u8 *)&data->sbDrvrCount); } if (count > 0) { m = (DDMap *) data->sbMap; for (i = 0; i < count; i++) { reverse4((u8 *)&m[i].ddBlock); reverse2((u8 *)&m[i].ddSize); reverse2((u8 *)&m[i].ddType); } } #endif return 0; }
int convert_bzb(BZB *data, int to_cpu_form) { // Since the data here varies according to the type of partition we // do not want to convert willy-nilly. We use the flag to determine // whether to check for the signature before or after we flip the bytes. if (to_cpu_form) { reverse4((u8 *)&data->bzb_magic); if (data->bzb_magic != BZBMAGIC) { reverse4((u8 *)&data->bzb_magic); if (data->bzb_magic != BZBMAGIC) { return 0; } } } else { if (data->bzb_magic != BZBMAGIC) { return 0; } reverse4((u8 *)&data->bzb_magic); } reverse2((u8 *)&data->bzb_inode); reverse4((u8 *)&data->bzb_flags); reverse4((u8 *)&data->bzb_tmade); reverse4((u8 *)&data->bzb_tmount); reverse4((u8 *)&data->bzb_tumount); return 0; }
/***************************************************************** *函数名称:addrtot *功能 :2 进制地址转换成字符型 * addrtot - convert binary address to text * (dotted decimal or IPv6 string) * ******************************************************************* * * * ******************************************************************/ size_t addrtot(const ip_address *src, int format, char *dst, size_t dstlen) { const unsigned char *b; size_t n; char buf[1+ADDRTOT_BUF+1]; /* :address: */ char *p; int t = addrtypeof(src); #define TF(t, f) (((t)<<8) | (f)) n = addrbytesptr(src, &b); if (n == 0) { bad: dst[0]='\0'; strncat(dst, "invalid", dstlen); return sizeof("invalid"); } switch (TF(t, format)) { case TF(AF_INET, 0): n = normal4(b, n, buf, &p); break; case TF(AF_INET6, 0): n = normal6(b, n, buf, &p, 1); break; case TF(AF_INET, 'Q'): n = normal4(b, n, buf, &p); break; case TF(AF_INET6, 'Q'): n = normal6(b, n, buf, &p, 0); break; case TF(AF_INET, 'r'): n = reverse4(b, n, buf, &p); break; case TF(AF_INET6, 'r'): n = reverse6(b, n, buf, &p); break; default: /* including (AF_INET, 'R') */ goto bad; break; } if (dstlen > 0) { if (dstlen < n) p[dstlen - 1] = '\0'; strcpy(dst, p); } return n; }
// // Routines // int convert_dpme(DPME *data, int to_cpu_form) { #if BYTE_ORDER == LITTLE_ENDIAN // Since we will toss the block if the signature doesn't match // we don't need to check the signature down here. reverse2((u8 *)&data->dpme_signature); reverse2((u8 *)&data->dpme_reserved_1); reverse4((u8 *)&data->dpme_map_entries); reverse4((u8 *)&data->dpme_pblock_start); reverse4((u8 *)&data->dpme_pblocks); reverse4((u8 *)&data->dpme_lblock_start); reverse4((u8 *)&data->dpme_lblocks); reverse4((u8 *)&data->dpme_flags); reverse4((u8 *)&data->dpme_boot_block); reverse4((u8 *)&data->dpme_boot_bytes); reverse4((u8 *)&data->dpme_load_addr); reverse4((u8 *)&data->dpme_load_addr_2); reverse4((u8 *)&data->dpme_goto_addr); reverse4((u8 *)&data->dpme_goto_addr_2); reverse4((u8 *)&data->dpme_checksum); convert_bzb((BZB *)data->dpme_bzb, to_cpu_form); #endif return 0; }