int uffs_truncate(int fd, long remain) { int ret; uffs_Object *obj = FD2OBJ(fd); CHK_OBJ(obj, -1); uffs_ClearObjectErr(obj); ret = (uffs_TruncateObject(obj, remain) == U_SUCC) ? 0 : -1; uffs_set_error(-uffs_GetObjectErr(obj)); return ret; }
int uffs_ftruncate(int fd, long remain) { int ret; uffs_Object *obj; CHK_OBJ_LOCK(fd, obj, -1); uffs_ClearObjectErr(obj); ret = (uffs_TruncateObject(obj, remain) == U_SUCC) ? 0 : -1; uffs_set_error(-uffs_GetObjectErr(obj)); uffs_GlobalFsLockUnlock(); return ret; }
/** * \brief delete uffs object * * \param[in] name full name of object * \param[out] err return error code * * \return U_SUCC if object is deleted successfully. * return U_FAIL if error happen, error code is set to *err. */ URET uffs_DeleteObject(const char * name, int *err) { uffs_Object *obj; TreeNode *node; uffs_Device *dev; u16 block; uffs_Buf *buf; URET ret = U_FAIL; obj = uffs_GetObject(); if (obj == NULL) { if (err) *err = UEMFILE; goto err1; } if (uffs_OpenObject(obj, name, UO_RDWR|UO_DIR) == U_FAIL) { if (uffs_OpenObject(obj, name, UO_RDWR) == U_FAIL) { if (err) *err = UENOENT; goto err1; } } uffs_TruncateObject(obj, 0); uffs_ObjectDevLock(obj); dev = obj->dev; if (obj->type == UFFS_TYPE_DIR) { // if the dir is not empty, can't delete it. node = uffs_TreeFindDirNodeWithParent(dev, obj->serial); if (node != NULL) { if (err) *err = UEACCES; goto err; //have sub dirs ? } node = uffs_TreeFindFileNodeWithParent(dev, obj->serial); if (node != NULL) { if (err) *err = UEACCES; goto err; //have sub files ? } } block = GET_BLOCK_FROM_NODE(obj); node = obj->node; // before erase the block, we need to take care of the buffer ... uffs_BufFlushAll(dev); if (HAVE_BADBLOCK(dev)) uffs_BadBlockRecover(dev); buf = uffs_BufFind(dev, obj->parent, obj->serial, 0); if (buf) { //need to expire this buffer ... if (buf->ref_count != 0) { //there is other obj for this file still in use ? uffs_Perror(UFFS_ERR_NORMAL, "Try to delete object but still have buf referenced."); if (err) *err = UEACCES; goto err; } buf->mark = UFFS_BUF_EMPTY; //!< make this buffer expired. } //TODO: need to take care of other obj->node ? uffs_BreakFromEntry(dev, obj->type, node); uffs_FlashEraseBlock(dev, block); node->u.list.block = block; if (HAVE_BADBLOCK(dev)) uffs_BadBlockProcess(dev, node); else uffs_TreeInsertToErasedListTail(dev, node); ret = U_SUCC; err: uffs_ObjectDevUnLock(obj); err1: do_ReleaseObjectResource(obj); uffs_PutObject(obj); return ret; }