예제 #1
0
파일: mc_file.c 프로젝트: basuke/kinomajs
int
mc_fillbuf(MC_FILE *fp)
{
	size_t nread;

	if ((nread = mc_fread(fp->buf, 1, MC_STREAM_BUFSIZ, fp)) != 0) {
		fp->bp = fp->buf;
		fp->bufend = fp->bp + nread;
		return *fp->bp++;
	}
	else
		return EOF;
}
예제 #2
0
파일: xm_system.c 프로젝트: basuke/kinomajs
void
xs_system_get_timestamp(xsMachine *the)
{
	MC_FILE *fp;
	struct img_hdr ih;

	xsSetInteger(xsResult, 0);
	if ((fp = mc_fopen("/mcufw", "ra")) != NULL) {
		if (mc_fread(&ih, sizeof(ih), 1, fp) == 1)
			xsSetInteger(xsResult, ih.time);
		mc_fclose(fp);
	}
}
예제 #3
0
파일: mc_elf.c 프로젝트: cugfeng/kinomajs
int
mc_elf_open(const char *fname, struct mc_elf *elf)
{
	long offset;

	memset(elf, 0, sizeof(elf));
	if ((elf->f = mc_fopen(fname, "r")) == NULL)
		return -1;
	if (mc_fread(&elf->eh, sizeof(elf->eh), 1, elf->f) != 1)
		goto bail;
	if (memcmp(elf->eh.ident, "\177ELF", 4) != 0)
		goto bail;
	if (elf->eh.shentsize != sizeof(struct elf_sheader))
		goto bail;

	offset = elf->eh.shoffset;
	mc_fseek(elf->f, offset, SEEK_SET);
	if ((elf->sh = mc_malloc(elf->eh.shentsize * elf->eh.shnum)) == NULL)
		goto bail;
	if (mc_fread(elf->sh, elf->eh.shentsize * elf->eh.shnum, 1, elf->f) != 1)
		goto bail;

	/* load the string table */
	if (elf->eh.shstrndx >= elf->eh.shnum)
		goto bail;
	elf->strtabsz = elf->sh[elf->eh.shstrndx].size;
	if ((elf->strtab = mc_malloc(elf->strtabsz)) == NULL)
		goto bail;
	offset = elf->sh[elf->eh.shstrndx].offset;
	if (mc_fseek(elf->f, offset, SEEK_SET) == -1 ||
	    mc_fread(elf->strtab, elf->strtabsz, 1, elf->f) != 1)
		goto bail;
	return 0;

bail:
	mc_elf_close(elf);
	return -1;
}
예제 #4
0
파일: mc_elf.c 프로젝트: cugfeng/kinomajs
int
mc_elf_read(struct mc_elf *elf, void *buf, int nbytes)
{
	long offset;
	size_t nread;

	if (elf->pos + nbytes > elf->current->size)
		return -1;
	offset = elf->pos + elf->current->offset;
	if (mc_fseek(elf->f, offset, SEEK_SET) == 0 &&
	    (nread = mc_fread(buf, 1, (size_t)nbytes, elf->f)) != 0) {
		elf->pos += nread;
		return 0;
	}
	else
		return -1;
}
예제 #5
0
파일: mc_elf.c 프로젝트: cugfeng/kinomajs
int
mc_elf_get(struct mc_elf *elf, const char *name, void *buf, int size, int ith)
{
	int i;
	long offset;
	
	for (i = 0; i < elf->eh.shnum; i++) {
		struct elf_sheader *sh = &elf->sh[i];
		if (sh->name < elf->strtabsz && strcmp(name, (char *)&elf->strtab[sh->name]) == 0) {
			offset = sh->offset + size * ith;
			if (mc_fseek(elf->f, offset, SEEK_SET) == 0 &&
			    mc_fread(buf, (size_t)size, 1, buf) == 1)
				return 0;
			else
				return -1;
		}
	}
	return -1;
}