Example #1
0
	void init(std::string path, size_t length) {
		this->path = path;
		this->length = length;
		if (!file_exists(path)) {
			FILE * fout = fopen(path.c_str(), "wb");
			fclose(fout);
		}
		if (file_size(path) != sizeof(T) * length) {
			long file_length = sizeof(T) * length;
			assert(truncate(path.c_str(), file_length)!=-1);
			int fout = open(path.c_str(), O_WRONLY);
			void * buffer = memalign(PAGESIZE, PAGESIZE);
			for (long offset=0;offset<file_length;) {
				if (file_length - offset > PAGESIZE) {
					assert(write(fout, buffer, PAGESIZE)==PAGESIZE);
					offset += PAGESIZE;
				}
				else {
					assert(write(fout, buffer, file_length - offset)==file_length - offset);
					offset += file_length - offset;
				}
			}
			close(fout);
		}
		fd = open(path.c_str(), O_RDWR | O_DIRECT);
		assert(fd!=-1);
		open_mmap();
	}
/* ARGSUSED */
void * map_phys_mem(unsigned long base, unsigned long size)
{
	DIOParPkt	par;
	ULONG		plen;
	DIODtaPkt	dta;
	ULONG		dlen;
	static BOOL	ErrRedir = FALSE;
	APIRET		rc;

	par.addr	= (ULONG)base;
	par.size	= (ULONG)size;
	plen 		= sizeof(par);
	dlen		= sizeof(dta);

	open_mmap();
	if (mapdev == -1)
	{
		perror("libdha: device xf86sup.sys is not installed");
		exit(1);
	}
	if ((rc=DosDevIOCtl(mapdev, (ULONG)0x76, (ULONG)0x44,
	      (PVOID)&par, (ULONG)plen, (PULONG)&plen,
	      (PVOID)&dta, (ULONG)dlen, (PULONG)&dlen)) == 0) {
		if (dlen==sizeof(dta)) {
			callcount++;
			return (void *)dta.addr;
		}
		/*else fail*/
	}
	return (void *)-1;
}
Example #3
0
int main(int argc, char *argv[])
{
	int i, r = 1;
	struct ffile file_old = {
		.fd = -1,
		.addr = MAP_FAILED,
	};
	struct ffile file_new = {
		.fd = -1,
		.addr = MAP_FAILED,
	};

	if (argc < 3) {
		printf("Use: differ old_file new_file change_list.\n");
		goto bad;
	}

	file_old.name = argv[1];
	if (!open_mmap(&file_old))
		goto bad;

	file_new.name = argv[2];
	if (!open_mmap(&file_new))
		goto bad;

	for (i = 3; i < argc; i++)
		if (check(argv[i], file_old.addr, file_new.addr) == FAIL) {
			printf ("FAILED for %s\n", argv[i]);
			r = 1;
			goto bad;
		}

	r = 0;
bad:
	close_mmap(&file_new);
	close_mmap(&file_old);

	return r;
}
Example #4
0
	void save() {
		long end_offset = end_i * sizeof(T);
		long offset = begin_i * sizeof(T);
		long bytes;
		while (offset < end_offset) {
			bytes = pwrite(fd, data_in_memory + (offset / sizeof(T) - begin_i), (end_offset - offset + PAGESIZE - 1) / PAGESIZE * PAGESIZE, offset);
			if (bytes==-1) {
				printf("%ld %ld\n", offset, end_offset);
				printf("%s\n", strerror(errno));
				getchar();
				exit(-1);
			}
			offset += bytes;
		}
		int ret = munmap(data_in_memory, (end_i - begin_i) * sizeof(T) + PAGESIZE);
		assert(ret==0);
		in_memory = false;
		begin_i = 0;
		end_i = 0;
		open_mmap();
	}