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); } }
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; } }
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; }