⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 repair.c

📁 系统迁移的源代码: http://www.diku.dk/hjemmesider/ansatte/jacobg/
💻 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 + -