uffs_DIR * uffs_opendir(const char *path) { int err = 0; uffs_DIR *ret = NULL; uffs_DIR *dirp = GetDirEntry(); if (dirp) { dirp->obj = uffs_GetObject(); if (dirp->obj) { if (uffs_OpenObject(dirp->obj, path, UO_RDONLY | UO_DIR) == U_SUCC) { if (uffs_FindObjectOpen(&dirp->f, dirp->obj) == U_SUCC) { ret = dirp; goto ext; } else { uffs_CloseObject(dirp->obj); } } else { err = uffs_GetObjectErr(dirp->obj); } uffs_PutObject(dirp->obj); dirp->obj = NULL; } else { err = UEMFILE; } PutDirEntry(dirp); } else { err = UEMFILE; } ext: uffs_set_error(-err); return ret; }
int uffs_stat(const char *name, struct uffs_stat *buf) { uffs_Object *obj; int ret = 0; int err = 0; URET result; obj = uffs_GetObject(); if (obj) { if (*name && name[strlen(name) - 1] == '/') { result = uffs_OpenObject(obj, name, UO_RDONLY | UO_DIR); } else { if ((result = uffs_OpenObject(obj, name, UO_RDONLY)) != U_SUCC) // try file result = uffs_OpenObject(obj, name, UO_RDONLY | UO_DIR); // then try dir } if (result == U_SUCC) { ret = do_stat(obj, buf); uffs_CloseObject(obj); } else { err = uffs_GetObjectErr(obj); ret = -1; } uffs_PutObject(obj); } else { err = UENOMEM; ret = -1; } uffs_set_error(-err); return ret; }
int uffs_mkdir(const char *name, ...) { uffs_Object *obj; int ret = 0; int err = 0; uffs_GlobalFsLockLock(); obj = uffs_GetObject(); if (obj) { if (uffs_CreateObject(obj, name, UO_CREATE|UO_DIR) != U_SUCC) { err = obj->err; ret = -1; } else { uffs_CloseObject(obj); ret = 0; } uffs_PutObject(obj); } else { err = UEMFILE; ret = -1; } uffs_set_error(-err); uffs_GlobalFsLockUnlock(); return ret; }
/* * 函数功能: 创建一个文件 * 输入参数: 文件名称 * 返回参数: */ int uffs_mkfile(const char *name) { uffs_Object *fp; int ret = 0; int err = 0; fp = uffs_GetObject(); if(fp != NULL) { if(uffs_CreateObject(fp, name, UO_CREATE) != U_SUCC) { err = fp->err; ret = -1; uffs_Perror(UFFS_ERR_NORMAL, "Create %s fail, err: %d", name, uffs_get_error()); } else { uffs_Perror(UFFS_ERR_NORMAL, "Create %s succ.", name); uffs_CloseObject(fp); ret = 0; } uffs_PutObject(fp); } else { err = UEMFILE; ret = -1; } uffs_set_error(-err); return ret; }
int uffs_closedir(uffs_DIR *dirp) { CHK_DIR(dirp, -1); uffs_FindObjectClose(&dirp->f); if (dirp->obj) { uffs_CloseObject(dirp->obj); uffs_PutObject(dirp->obj); } PutDirEntry(dirp); return 0; }
int uffs_closedir(uffs_DIR *dirp) { CHK_DIR_LOCK(dirp, -1); uffs_FindObjectClose(&dirp->f); if (dirp->obj) { uffs_CloseObject(dirp->obj); uffs_PutObject(dirp->obj); } PutDirEntry(dirp); uffs_GlobalFsLockUnlock(); return 0; }
int uffs_close(int fd) { int ret = 0; uffs_Object *obj = FD2OBJ(fd); CHK_OBJ(obj, -1); uffs_ClearObjectErr(obj); if (uffs_CloseObject(obj) == U_FAIL) { uffs_set_error(-uffs_GetObjectErr(obj)); ret = -1; } else { uffs_PutObject(obj); ret = 0; } return ret; }
int uffs_close(int fd) { int ret = 0; uffs_Object *obj; CHK_OBJ_LOCK(fd, obj, -1); uffs_ClearObjectErr(obj); if (uffs_CloseObject(obj) == U_FAIL) { uffs_set_error(-uffs_GetObjectErr(obj)); ret = -1; } else { uffs_PutObject(obj); ret = 0; } uffs_GlobalFsLockUnlock(); return ret; }
int dfs_uffs_close(struct dfs_fd* fd) { int ret=U_SUCC; if (fd->type == FT_DIRECTORY) { uffs_DIR* dirp; dirp = (uffs_DIR*)(fd->data); RT_ASSERT(dirp != RT_NULL); ret = uffs_closedir(dirp); } else if (fd->type == FT_REGULAR) { uffs_Object* fp = (uffs_Object*)(fd->data); RT_ASSERT(fd != RT_NULL); ret = uffs_CloseObject(fp); /* release object hander */ uffs_PutObject(fp); } return ret; }
/** * \brief rename(move) file or dir. * \return U_SUCC if success, otherwise return U_FAIL and set error code to *err. * \note rename/move file between different mount point is not allowed. */ URET uffs_RenameObject(const char *old_name, const char *new_name, int *err) { uffs_Object *obj = NULL, *new_obj = NULL; URET ret = U_FAIL; int oflag; obj = uffs_GetObject(); new_obj = uffs_GetObject(); if (obj == NULL || new_obj == NULL) { if (err) *err = UEINVAL; goto ext; } oflag = UO_RDONLY; if (uffs_OpenObject(new_obj, new_name, oflag) == U_SUCC) { uffs_CloseObject(new_obj); uffs_Perror(UFFS_MSG_NOISY, "new object already exist!"); if (err) *err = UEEXIST; goto ext; } oflag |= UO_DIR; if (uffs_OpenObject(new_obj, new_name, oflag) == U_SUCC) { uffs_CloseObject(new_obj); uffs_Perror(UFFS_MSG_NOISY, "new object already exist!"); if (err) *err = UEEXIST; goto ext; } if (uffs_ParseObject(new_obj, new_name) != U_SUCC) { uffs_Perror(UFFS_MSG_NOISY, "parse new name fail !"); if (err) *err = UENOENT; goto ext; } if (new_obj->name_len == 0) { uffs_Perror(UFFS_MSG_NOISY, "invalid new name"); if (err) *err = UEINVAL; goto ext; } oflag = UO_RDONLY; if (uffs_OpenObject(obj, old_name, oflag) != U_SUCC) { oflag |= UO_DIR; if (uffs_OpenObject(obj, old_name, oflag) != U_SUCC) { uffs_Perror(UFFS_MSG_NOISY, "Can't open old object !"); if (err) *err = UEACCES; goto ext; } } if (obj->dev != new_obj->dev) { uffs_Perror(UFFS_MSG_NOISY, "Can't move object between different mount point"); if (err) *err = UEACCES; } else { ret = uffs_MoveObjectEx(obj, new_obj->parent, new_obj->name, new_obj->name_len); if (ret == U_FAIL && err) *err = obj->err; } uffs_CloseObject(obj); ext: if (obj) uffs_PutObject(obj); if (new_obj) { do_ReleaseObjectResource(new_obj); uffs_PutObject(new_obj); } return ret; }