Esempio n. 1
0
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);
	}
}
Esempio n. 2
0
void
mc_elf_close(struct mc_elf *elf)
{
	if (elf->f != NULL) {
		mc_fclose(elf->f);
		elf->f = NULL;
	}
	if (elf->sh != NULL) {
		mc_free(elf->sh);
		elf->sh = NULL;
	}
	if (elf->strtab != NULL) {
		mc_free(elf->strtab);
		elf->strtab = NULL;
	}
}
Esempio n. 3
0
MC_FILE *
mc_fopen(const char *fullpath, const char *mode)
{
	MC_FILE *fp;

	errno = 0;
	if ((fp = mc_malloc(sizeof(MC_FILE))) == NULL) {
		errno = ENOMEM;
		mc_log_error("mc_fopen: mc_malloc failed\n");
		return NULL;
	}
	fp->ffs = NULL;
	fp->mmapped = NULL;
	fp->buf = NULL;
	fp->bp = fp->bufend = fp->buf;
	fp->length = 0;
	fp->pos = 0;
#if FTFS || !mxMC
	fp->aux = NULL;
#endif
	if ((mode[0] == 'r' && mode[1] != '+') && fullpath[0] != '/') {
		size_t sz;
		const void *p = mc_mmap(fullpath, &sz);
		if (p != NULL) {
			fp->mmapped = p;
			fp->length = sz;
			fp->bp = fp->buf = (uint8_t *)p;
			fp->bufend = fp->buf + sz;
			fp->pos = (long)sz;
		}
		else {
#if FTFS
			if ((fp->aux = mc_ft_fopen(fullpath, mode)) != NULL) {
				fp->length = mc_ft_fseek(fp->aux, 0L, SEEK_END);
				mc_ft_fseek(fp->aux, 0L, SEEK_SET);
			}
			else
				errno = ENOENT;
#else
			errno = ENOENT;
#endif
		}
	}
	else {
		uint32_t flags = 0;
#if !mxMC
		if (sync_with_native_path(fullpath)) {
			const char *path = mc_resolve_path(fullpath, *mode == 'r' ? 0 : 1);
			fp->aux = fopen(path, mode);
			errno = 0;
		}
#endif
		if (strlen(mode) > 1) {
			switch (mode[1]) {
			case '+':
				flags |= FFS_ORDWR;
				break;
			case 'p':
				flags |= FFS_OPASSIVE;
				break;
			case 'a':
				flags |= FFS_OACTIVE;
				break;
			}
		}
		if (mode[0] == 'w')
			flags |= FFS_OTRUNC | FFS_OCREAT;
		if ((fp->ffs = mc_ffs_open(fullpath, flags)) != NULL)
			fp->length = mc_ffs_position(fp->ffs, 1L << 30, mode[0] == 'a');
		else {
			/* errno must've been set */
			if (errno != ENOENT)
				mc_log_error("mc_fopen: ffs_open failed: %d\n", errno);
		}
	}
	if (errno == 0) {
		if (fp->mmapped == NULL) {
			if ((fp->buf = mc_malloc(MC_STREAM_BUFSIZ)) != NULL)
				fp->bufend = fp->bp = fp->buf;
			else {
				mc_log_error("mc_fopen: mc_malloc failed\n");
				errno = ENOMEM;
			}
		}
	}
	if (errno != 0) {
		if (fp != NULL)
			mc_fclose(fp);
		fp = NULL;
	}
	return fp;
}