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

📄 yaffs_fsx.c

📁 linux 镜像文件制作 用于压制yaffs2类型的文件镜像啊啊啊啊啊啊
💻 C
📖 第 1 页 / 共 2 页
字号:
			prt("skipping zero size read\n");		log4(OP_SKIPPED, OP_READ, offset, size);		return;	}	if (size + offset > file_size) {		if (!quiet && testcalls > simulatedopcount)			prt("skipping seek/read past end of file\n");		log4(OP_SKIPPED, OP_READ, offset, size);		return;	}	log4(OP_READ, offset, size, 0);	if (testcalls <= simulatedopcount)		return;	if (!quiet && ((progressinterval &&			testcalls % progressinterval == 0) ||		       (debug &&			(monitorstart == -1 ||			 (offset + size > monitorstart &&			  (monitorend == -1 || offset <= monitorend))))))		prt("%lu read\t0x%x thru\t0x%x\t(0x%x bytes)\n", testcalls,		    offset, offset + size - 1, size);	ret = yaffs_lseek(fd, (off_t)offset, SEEK_SET);	if (ret == (off_t)-1) {		prterr("doread: lseek");		report_failure(140);	}	iret = yaffs_read(fd, temp_buf, size);	if (iret != size) {		if (iret == -1)			prterr("doread: read");		else			prt("short read: 0x%x bytes instead of 0x%x\n",			    iret, size);		report_failure(141);	}	check_buffers(offset, size);}voidgendata(char *original_buf, char *good_buf, unsigned offset, unsigned size){	while (size--) {		good_buf[offset] = testcalls % 256; 		if (offset % 2)			good_buf[offset] += original_buf[offset];		offset++;	}}voiddowrite(unsigned offset, unsigned size){	off_t ret;	unsigned iret;	offset -= offset % writebdy;	if (size == 0) {		if (!quiet && testcalls > simulatedopcount)			prt("skipping zero size write\n");		log4(OP_SKIPPED, OP_WRITE, offset, size);		return;	}	log4(OP_WRITE, offset, size, file_size);	gendata(original_buf, good_buf, offset, size);	if (file_size < offset + size) {		if (file_size < offset)			memset(good_buf + file_size, '\0', offset - file_size);		file_size = offset + size;		if (lite) {			warn("Lite file size bug in fsx!");			report_failure(149);		}	}	if (testcalls <= simulatedopcount)		return;	if (!quiet && ((progressinterval &&			testcalls % progressinterval == 0) ||		       (debug &&			(monitorstart == -1 ||			 (offset + size > monitorstart &&			  (monitorend == -1 || offset <= monitorend))))))		prt("%lu write\t0x%x thru\t0x%x\t(0x%x bytes)\n", testcalls,		    offset, offset + size - 1, size);	ret = yaffs_lseek(fd, (off_t)offset, SEEK_SET);	if (ret == (off_t)-1) {		prterr("dowrite: lseek");		report_failure(150);	}	iret = yaffs_write(fd, good_buf + offset, size);	if (iret != size) {		if (iret == -1)			prterr("dowrite: write");		else			prt("short write: 0x%x bytes instead of 0x%x\n",			    iret, size);		report_failure(151);	}}voiddotruncate(unsigned size){	int oldsize = file_size;	size -= size % truncbdy;	if (size > biggest) {		biggest = size;		if (!quiet && testcalls > simulatedopcount)			prt("truncating to largest ever: 0x%x\n", size);	}	log4(OP_TRUNCATE, size, (unsigned)file_size, 0);	if (size > file_size)		memset(good_buf + file_size, '\0', size - file_size);	file_size = size;	if (testcalls <= simulatedopcount)		return;		if ((progressinterval && testcalls % progressinterval == 0) ||	    (debug && (monitorstart == -1 || monitorend == -1 ||		       size <= monitorend)))		prt("%lu trunc\tfrom 0x%x to 0x%x\n", testcalls, oldsize, size);	if (yaffs_ftruncate(fd, (off_t)size) == -1) {		prt("ftruncate1: %x\n", size);		prterr("dotruncate: ftruncate");		report_failure(160);	}}voidwritefileimage(){	ssize_t iret;	if (yaffs_lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1) {		prterr("writefileimage: lseek");		report_failure(171);	}	iret = yaffs_write(fd, good_buf, file_size);	if ((off_t)iret != file_size) {		if (iret == -1)			prterr("writefileimage: write");		else			prt("short write: 0x%x bytes instead of 0x%llx\n",			    iret, (unsigned long long)file_size);		report_failure(172);	}	if (lite ? 0 : yaffs_ftruncate(fd, file_size) == -1) {		prt("ftruncate2: %llx\n", (unsigned long long)file_size);		prterr("writefileimage: ftruncate");		report_failure(173);	}}voiddocloseopen(void){ 	if (testcalls <= simulatedopcount)		return;	if (debug)		prt("%lu close/open\n", testcalls);	if (yaffs_close(fd)) {		prterr("docloseopen: close");		report_failure(180);	}	fd = yaffs_open(fname, O_RDWR, 0);	if (fd < 0) {		prterr("docloseopen: open");		report_failure(181);	}}voidyaffs_fsx_do_op(void){	unsigned long	offset;	unsigned long	size = maxoplen;	unsigned long	rv = random();	unsigned long	op = rv % (3 + !lite + mapped_writes);	/* turn off the map read if necessary */	if (op == 2 && !mapped_reads)	    op = 0;	if (simulatedopcount > 0 && testcalls == simulatedopcount)		writefileimage();	testcalls++;	if (closeprob)		closeopen = (rv >> 3) < (1 << 28) / closeprob;	if (debugstart > 0 && testcalls >= debugstart)		debug = 1;	if (!quiet && testcalls < simulatedopcount && testcalls % 100000 == 0)		prt("%lu...\n", testcalls);	/*	 * READ:	op = 0	 * WRITE:	op = 1	 * MAPREAD:     op = 2	 * TRUNCATE:	op = 3	 * MAPWRITE:    op = 3 or 4	 */	if (lite ? 0 : op == 3 && (style & 1) == 0) /* vanilla truncate? */		dotruncate(random() % maxfilelen);	else {		if (randomoplen)			size = random() % (maxoplen+1);		if (lite ? 0 : op == 3)			dotruncate(size);		else {			offset = random();			if (op == 1 || op == (lite ? 3 : 4)) {				offset %= maxfilelen;				if (offset + size > maxfilelen)					size = maxfilelen - offset;				dowrite(offset, size);			} else {				if (file_size)					offset %= file_size;				else					offset = 0;				if (offset + size > file_size)					size = file_size - offset;				doread(offset, size);			}		}	}	if (sizechecks && testcalls > simulatedopcount)		check_size();	if (closeopen)		docloseopen();}voidcleanup(sig)	int	sig;{	if (sig)		prt("signal %d\n", sig);	prt("testcalls = %lu\n", testcalls);	EXIT(sig);}voidusage(void){	fprintf(stdout, "usage: %s",		"fsx [-dnqLOW] [-b opnum] [-c Prob] [-l flen] [-m start:end] [-o oplen] [-p progressinterval] [-r readbdy] [-s style] [-t truncbdy] [-w writebdy] [-D startingop] [-N numops] [-P dirpath] [-S seed] fname\n\	-b opnum: beginning operation number (default 1)\n\	-c P: 1 in P chance of file close+open at each op (default infinity)\n\	-d: debug output for all operations\n\	-l flen: the upper bound on file size (default 262144)\n\	-m startop:endop: monitor (print debug output) specified byte range (default 0:infinity)\n\	-n: no verifications of file size\n\	-o oplen: the upper bound on operation size (default 65536)\n\	-p progressinterval: debug output at specified operation interval\n\	-q: quieter operation\n\	-r readbdy: 4096 would make reads page aligned (default 1)\n\	-s style: 1 gives smaller truncates (default 0)\n\	-t truncbdy: 4096 would make truncates page aligned (default 1)\n\	-w writebdy: 4096 would make writes page aligned (default 1)\n\	-D startingop: debug output starting at specified operation\n\	-L: fsxLite - no file creations & no file size changes\n\	-N numops: total # operations to do (default infinity)\n\	-O: use oplen (see -o flag) for every op (default random)\n\	-P dirpath: save .fsxlog and .fsxgood files in dirpath (default ./)\n\	-S seed: for random # generator (default 1) 0 gets timestamp\n\	fname: this filename is REQUIRED (no default)\n");	EXIT(90);}intgetnum(char *s, char **e){	int ret = -1;	*e = (char *) 0;	ret = strtol(s, e, 0);	if (*e)		switch (**e) {		case 'b':		case 'B':			ret *= 512;			*e = *e + 1;			break;		case 'k':		case 'K':			ret *= 1024;			*e = *e + 1;			break;		case 'm':		case 'M':			ret *= 1024*1024;			*e = *e + 1;			break;		case 'w':		case 'W':			ret *= 4;			*e = *e + 1;			break;		}	return (ret);}extern int random_seed;extern int simulate_power_failure;int mounted_by_fsx = 0;intyaffs_fsx_init(const char *mount_pt){	int	i;	goodfile[0] = 0;	logfile[0] = 0;	page_size = getpagesize();	page_mask = page_size - 1;	setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */	strcpy(mount_name,mount_pt);	strcpy(fname,mount_name);	strcat(fname,"/fsxdata");	#if 0	signal(SIGHUP,	cleanup);	signal(SIGINT,	cleanup);	signal(SIGPIPE,	cleanup);	signal(SIGALRM,	cleanup);	signal(SIGTERM,	cleanup);	signal(SIGXCPU,	cleanup);	signal(SIGXFSZ,	cleanup);	signal(SIGVTALRM,	cleanup);	signal(SIGUSR1,	cleanup);	signal(SIGUSR2,	cleanup);#endif	initstate(seed, state, 256);	setstate(state);	fd = yaffs_open(fname, O_RDWR|(lite ? 0 : O_CREAT|O_TRUNC), 0666);	if (fd < 0) {		prterr(fname);		EXIT(91);	}	strncat(goodfile, fname, 256);	strcat (goodfile, ".fsxgood");	fsxgoodfd = yaffs_open(goodfile, O_RDWR|O_CREAT|O_TRUNC, 0666);	if (fsxgoodfd < 0) {		prterr(goodfile);		EXIT(92);	}	strncat(logfile, "fsx", 256);	strcat (logfile, ".fsxlog");	fsxlogf = fopen(logfile, "w");	if (fsxlogf == NULL) {		prterr(logfile);		EXIT(93);	}	if (lite) {		off_t ret;		file_size = maxfilelen = yaffs_lseek(fd, (off_t)0, SEEK_END);		if (file_size == (off_t)-1) {			prterr(fname);			warn("main: lseek eof");			EXIT(94);		}		ret = yaffs_lseek(fd, (off_t)0, SEEK_SET);		if (ret == (off_t)-1) {			prterr(fname);			warn("main: lseek 0");			EXIT(95);		}	}	original_buf = (char *) malloc(maxfilelen);	for (i = 0; i < maxfilelen; i++)		original_buf[i] = random() % 256;	good_buf = (char *) malloc(maxfilelen);	memset(good_buf, '\0', maxfilelen);	temp_buf = (char *) malloc(maxoplen);	memset(temp_buf, '\0', maxoplen);	if (lite) {	/* zero entire existing file */		ssize_t written;		written = yaffs_write(fd, good_buf, (size_t)maxfilelen);		if (written != maxfilelen) {			if (written == -1) {				prterr(fname);				warn("main: error on write");			} else				warn("main: short write, 0x%x bytes instead of 0x%x\n",				     (unsigned)written, maxfilelen);			EXIT(98);		}	} else 		check_trunc_hack();			return 0;}int yaffs_fsx_complete(void){	if (yaffs_close(fd)) {		prterr("close");		report_failure(99);	}		yaffs_close(fsxgoodfd);		prt("All operations completed A-OK!\n");	EXIT(0);	return 0;}intyaffs_fsx_main(const char *mount_pt, int numops){	yaffs_fsx_init(mount_pt);	while (numops == -1 || numops--)		yaffs_fsx_do_op();	yaffs_fsx_complete();		return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -