?? repair.c
字號:
#include <errno.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <sys/mman.h>#include <sys/types.h>#include <unistd.h>#include <string.h>#define PAGE_SIZE 4096#define O_DIRECT 040000extern void sha1_digest(unsigned char* out, unsigned char* data, size_t len);unsigned char page_digests[0x1000][20];void hex(char* out, unsigned char* in){ int i; char* o = out; char digits[] = "0123456789abcdef"; for(i=0; i<20; i++) { char c = *in++; *o++= digits[(c & 0xf0)>>4]; *o++= digits[ c & 0xf]; } *o = '\0';}int main(int argc, char** argv){ int i; int o,f; size_t loader_size; char* loader = mmap(0, 8*PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0,0); unsigned long offset = 0; unsigned long loader_pages; unsigned char final_digest[20]; char dout[41]; if(argc!=3) { puts("usage: repair disk checkpoint-no"); exit(-1); } o = open("/tmp/chk.img",O_WRONLY|O_CREAT); if(o<0) { puts("could not open /tmp/chk.img for write!"); exit(-1); } printf("input from %s\n",argv[1]); f = open(argv[1], O_RDONLY|O_DIRECT); if(f<0) { printf("could not open %s for read!\n",argv[2]); exit(-1); } printf("offset %d\n",atoi(argv[2])); offset = atoi(argv[2]) * 4200 * PAGE_SIZE; for(i=0; i<(0x1000+3); i++) { if(lseek(f, offset + i*PAGE_SIZE, SEEK_SET)<0) { puts("seek err\n"); exit(-1); } if(read(f,loader,PAGE_SIZE) < 0) { puts("read err\n"); exit(-1); } if(i>=2 && i<0x1002) { sha1_digest(page_digests[i-2],(unsigned char*)loader,PAGE_SIZE); } lseek(o, i*PAGE_SIZE, SEEK_SET); if(write(o,loader,PAGE_SIZE) < 0) { puts("write err\n"); exit(-1); } } close(f); f = open("/bin/loader", O_RDONLY); if(f<0) f = open("loader", O_RDONLY); memset(loader,0,8*PAGE_SIZE); /* to work with O_DIRECT, we need to correctly align the loader. 512 bytes should be * enough, but let's do PAGE_SIZE for now */ if(f>=0) { size_t* a; loader_size = read(f,loader+4, 8*PAGE_SIZE); close(f); loader_pages = (loader_size + 3*sizeof(size_t) + (PAGE_SIZE-1)) / PAGE_SIZE; printf("loader pages %d\n", (int)loader_pages); a = (size_t*) loader; /* first long has length of loader minus arguments */ *a = loader_pages*PAGE_SIZE - 12; a = (size_t*) ( loader+loader_pages * PAGE_SIZE - 8); *a++ = sizeof(size_t); /* four bytes of args */ *a++ = 0x1000; /* argument: number of pages in checkpoint */ /* so loader and arguments ended up page-aligned after all */ } else { puts("no file: 'loader'"); exit(-1); } /* write the loader and its args */ lseek(o, 0, SEEK_SET); write(o, loader, loader_pages * PAGE_SIZE); close(f); close(o); sha1_digest(final_digest,page_digests[0],sizeof(page_digests)); hex(dout,final_digest); printf("checkpoint chksum is %s\n",dout); return 0;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -