/** * create a new object and open it if success */ URET uffs_CreateObject(uffs_Object *obj, const char *fullname, int oflag) { oflag |= UO_CREATE; if (uffs_ParseObject(obj, fullname) == U_SUCC) uffs_CreateObjectEx(obj, obj->dev, obj->parent, obj->name, obj->name_len, oflag); return (obj->err == UENOERR ? U_SUCC : U_FAIL); }
/** * Open a UFFS object * * \param[in|out] obj the object to be open * \param[in] name the full name of the object * \param[in] oflag open flag * * \return U_SUCC if object is opened successfully, * U_FAIL if failed, error code will be set to obj->err. */ URET uffs_OpenObject(uffs_Object *obj, const char *name, int oflag) { if (obj == NULL) return U_FAIL; if (uffs_ParseObject(obj, name) == U_SUCC) uffs_OpenObjectEx(obj, obj->dev, obj->parent, obj->name, obj->name_len, oflag); return (obj->err == UENOERR ? U_SUCC : U_FAIL); }
/** * Open a UFFS object * * \param[in|out] obj the object to be open * \param[in] name the full name of the object * \param[in] oflag open flag * * \return U_SUCC if object is opened successfully, * U_FAIL if failed, error code will be set to obj->err. */ URET uffs_OpenObject(uffs_Object *obj, const char *name, int oflag) { URET ret; if (obj == NULL) return U_FAIL; if ((ret = uffs_ParseObject(obj, name)) == U_SUCC) { ret = uffs_OpenObjectEx(obj, obj->dev, obj->parent, obj->name, obj->name_len, oflag); } if (ret != U_SUCC) do_ReleaseObjectResource(obj); return ret; }
/** * create a new object and open it if success */ URET uffs_CreateObject(uffs_Object *obj, const char *fullname, int oflag) { URET ret = U_FAIL; oflag |= UO_CREATE; if (uffs_ParseObject(obj, fullname) == U_SUCC) uffs_CreateObjectEx(obj, obj->dev, obj->parent, obj->name, obj->name_len, oflag); if (obj->err == UENOERR) { ret = U_SUCC; } else { if (obj->dev) { uffs_PutDevice(obj->dev); obj->dev = NULL; } ret = U_FAIL; } 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; }