int32 TFFS_fopen( IN tffs_handle_t hfs, IN byte * file_path, IN byte * open_mode, OUT tfile_handle_t * phfile) { int32 ret; tffs_t * ptffs = (tffs_t *)hfs; byte * fname, * path; byte * dup_file_path; tfile_t * pfile; tdir_t * pdir; tdir_entry_t * pdir_entry; if (!hfs || !file_path || !open_mode || !phfile) return ERR_TFFS_INVALID_PARAM; ret = TFFS_OK; pfile = (tfile_t *)Malloc(sizeof(tfile_t)); dup_file_path = dup_string(file_path); pdir_entry = dirent_malloc(); fname = (byte *)Malloc(DNAME_MAX); pfile->secbuf = (ubyte *)Malloc(ptffs->pbs->byts_per_sec); Memset(pfile->secbuf, 0, ptffs->pbs->byts_per_sec); path = dup_file_path; if (!divide_path(dup_file_path, fname)) { ret = ERR_TFFS_INVALID_PATH; goto _release; } if (!_parse_open_mode(open_mode, &pfile->open_mode)) { ret = ERR_TFFS_INVALID_OPENMODE; goto _release; } if ((dir_init(ptffs, path, &pdir)) != DIR_OK) { ret = ERR_TFFS_INVALID_PATH; goto _release; } if (dirent_find(pdir, fname, pdir_entry) != DIRENTRY_OK) { DBG("%s(): can't find file [%s] at [%s]\n", __FUNCTION__, fname, path); if (pfile->open_mode == OPENMODE_READONLY) { ret = ERR_TFFS_FILE_NOT_EXIST; goto _release; } if (!dirent_init(fname, 0, TRUE, pdir_entry)) { ret = ERR_TFFS_INVALID_PATH; goto _release; } if ((ret = dir_append_direntry(pdir, pdir_entry)) != DIR_OK) { if (ret == ERR_DIR_NO_FREE_SPACE) { ret = ERR_TFFS_NO_FREE_SPACE; } else { ret = ERR_TFFS_DEVICE_FAIL; } goto _release; } } ret = _initialize_file(ptffs, pdir, pdir_entry, pfile); if (ret == FILE_OK) { *phfile = (tfile_handle_t)pfile; } _release: Free(fname); Free(dup_file_path); return ret; }
MBArray * mbarray_Create(BTYPE num_bits, const char * file, const char * header, int32_t header_len, int oflag, int perms) { errno = 0; MBArray * array = (MBArray *)malloc(sizeof(MBArray)); int filesize; int32_t fheaderlen; if (!array || errno) { return NULL; } array->filename = NULL; array->vector = NULL; errno = 0; array->fd = open(file, oflag, perms); if (array->fd < 0) { errno = EINVAL; mbarray_Destroy(array); return NULL; } fheaderlen = mbarray_HeaderLen(array); errno = 0; if (fheaderlen >= 0 && !(oflag && O_CREAT) && fheaderlen != header_len) { errno = EINVAL; mbarray_Destroy(array); return NULL; } else if (fheaderlen >= 0) { header_len = fheaderlen; } array->preamblebytes = MBAMAGICSIZE + sizeof(BTYPE) + sizeof(header_len) + header_len; /* This size is using 256-byte alignment so that we can use pretty much any base 2 data type */ array->preamblesize = ((int)ceil((double)array->preamblebytes / 256.0) * 256) / sizeof(DTYPE); array->preamblebytes = array->preamblesize * (sizeof(DTYPE)); if (errno) { mbarray_Destroy(array); return NULL; } filesize = _filesize(array->fd); if (filesize > 50 && !num_bits) { num_bits = _get_num_bits(array->fd); } array->size = (int)ceil((double)num_bits / sizeof(DTYPE) / 8.0); array->bytes = (int)ceil((double)num_bits / 8.0); if (filesize < 0) { mbarray_Destroy(array); return NULL; } else if (filesize && !_valid_magic(array->fd)) { errno = EINVAL; mbarray_Destroy(array); return NULL; } else if (filesize && filesize < (array->bytes + array->preamblebytes - 1)) { errno = EINVAL; mbarray_Destroy(array); return NULL; } else if (!filesize) { if (!(oflag & O_CREAT) || (!num_bits) || _initialize_file(array->fd, array->bytes + array->preamblebytes - 1, num_bits, header, header_len)) { if (!errno) { errno = ENOENT; } mbarray_Destroy(array); return NULL; } } else { if (!num_bits) { num_bits = _get_num_bits(array->fd); array->size = (int)ceil((double)num_bits / sizeof(DTYPE) / 8.0); array->bytes = (int)ceil((double)num_bits / 8.0); } else if (_get_num_bits(array->fd) != num_bits) { mbarray_Destroy(array); errno = EINVAL; return NULL; } } errno = 0; array->vector = (DTYPE *)mmap(NULL, _mmap_size(array), PROT_READ | PROT_WRITE, MAP_SHARED, array->fd, 0); if (errno || !array->vector) { mbarray_Destroy(array); return NULL; } array->filename = (char *)malloc(strlen(file) + 1); if (!array->filename) { mbarray_Destroy(array); return NULL; } strcpy((char *)array->filename, file); array->bits = num_bits; return array; }