Add replace flag to iso_dir_add_node().

This commit is contained in:
Vreixo Formoso 2007-12-05 22:37:57 +01:00
parent 14f4aa7d07
commit 8e7fe9b5a5
3 changed files with 26 additions and 4 deletions

1
TODO
View File

@ -10,6 +10,7 @@ TODO
#00003 make error.h header public #00003 make error.h header public
#00004 (fsource-h) -> Add a get_mime_type() function. #00004 (fsource-h) -> Add a get_mime_type() function.
#00005 (node.c) -> optimize iso_dir_iter_take. #00005 (node.c) -> optimize iso_dir_iter_take.
#00006 (libisofs.h) -> define more replace values when adding a node to a dir
FIXME FIXME
===== =====

View File

@ -261,15 +261,23 @@ gid_t iso_node_get_gid(const IsoNode *node);
* to other dir, and that the node name is unique inside the child. * to other dir, and that the node name is unique inside the child.
* Otherwise this function will return a failure, and the child won't be * Otherwise this function will return a failure, and the child won't be
* inserted. * inserted.
* @param replace
* if the dir already contains a node with the same name, whether to
* replace or not the old node with this.
* - 0 not replace (will fail with ISO_NODE_NAME_NOT_UNIQUE)
* - 1 replace
* TODO #00006 define more values
* to replace only if both are the same kind of file
* if both are dirs, add contents (and what to do with conflicts?)
* @return * @return
* number of nodes in dir if succes, < 0 otherwise * number of nodes in dir if succes, < 0 otherwise
* Possible errors: * Possible errors:
* ISO_NULL_POINTER, if dir or child are NULL * ISO_NULL_POINTER, if dir or child are NULL
* ISO_NODE_ALREADY_ADDED, if child is already added to other dir * ISO_NODE_ALREADY_ADDED, if child is already added to other dir
* ISO_NODE_NAME_NOT_UNIQUE, a node with same name already exists * ISO_NODE_NAME_NOT_UNIQUE, a node with same name already exists
* ISO_WRONG_ARG_VALUE, if child == dir * ISO_WRONG_ARG_VALUE, if child == dir, or replace != (0,1)
*/ */
int iso_dir_add_node(IsoDir *dir, IsoNode *child); int iso_dir_add_node(IsoDir *dir, IsoNode *child, int replace);
/** /**
* Locate a node inside a given dir. * Locate a node inside a given dir.

View File

@ -161,7 +161,7 @@ gid_t iso_node_get_gid(const IsoNode *node)
* @return * @return
* number of nodes in dir if succes, < 0 otherwise * number of nodes in dir if succes, < 0 otherwise
*/ */
int iso_dir_add_node(IsoDir *dir, IsoNode *child) int iso_dir_add_node(IsoDir *dir, IsoNode *child, int replace)
{ {
IsoNode **pos; IsoNode **pos;
@ -185,7 +185,20 @@ int iso_dir_add_node(IsoDir *dir, IsoNode *child)
pos = &((*pos)->next); pos = &((*pos)->next);
} }
if (*pos != NULL && !strcmp((*pos)->name, child->name)) { if (*pos != NULL && !strcmp((*pos)->name, child->name)) {
return ISO_NODE_NAME_NOT_UNIQUE; /* a node with same name already exists */
if (replace == 0) {
return ISO_NODE_NAME_NOT_UNIQUE;
} else if (replace == 1) {
child->next = (*pos)->next;
(*pos)->parent = NULL;
(*pos)->next = NULL;
iso_node_unref(*pos);
*pos = child;
child->parent = dir;
return dir->nchildren;
} else {
return ISO_WRONG_ARG_VALUE;
}
} }
child->next = *pos; child->next = *pos;