From bd893a8cfa72b6778b799706fe83c1523d857e62 Mon Sep 17 00:00:00 2001 From: Vreixo Formoso Date: Sat, 26 Jan 2008 16:30:05 +0100 Subject: [PATCH] Base tree add functions in low level node new functions. --- src/fs_image.c | 2 +- src/node.c | 8 +++- src/tree.c | 127 +++++++++++++++++-------------------------------- 3 files changed, 51 insertions(+), 86 deletions(-) diff --git a/src/fs_image.c b/src/fs_image.c index 1f585fb..15716a1 100644 --- a/src/fs_image.c +++ b/src/fs_image.c @@ -1986,7 +1986,7 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image, } /* take a ref to the src, as stream has taken our ref */ iso_file_source_ref(src); - + file = calloc(1, sizeof(IsoFile)); if (file == NULL) { free(name); diff --git a/src/node.c b/src/node.c index 9cae9d3..0ef070e 100644 --- a/src/node.c +++ b/src/node.c @@ -632,6 +632,12 @@ int iso_node_is_valid_name(const char *name) return 1; } +/** + * Check if a given path is valid for the destination of a link. + * + * @return + * 1 if yes, 0 if not + */ int iso_node_is_valid_link_dest(const char *dest) { int ret; @@ -710,7 +716,7 @@ int iso_dir_insert(IsoDir *dir, IsoNode *node, IsoNode **pos, return dir->nchildren; } else { /* CAN'T HAPPEN */ - return ISO_WRONG_ARG_VALUE; + return ISO_ASSERT_FAILURE; } } diff --git a/src/tree.c b/src/tree.c index 7142d08..da395e9 100644 --- a/src/tree.c +++ b/src/tree.c @@ -46,6 +46,8 @@ */ int iso_tree_add_new_dir(IsoDir *parent, const char *name, IsoDir **dir) { + int ret; + char *n; IsoDir *node; IsoNode **pos; time_t now; @@ -56,11 +58,6 @@ int iso_tree_add_new_dir(IsoDir *parent, const char *name, IsoDir **dir) if (dir) { *dir = NULL; } - - /* check if the name is valid */ - if (!iso_node_is_valid_name(name)) { - return ISO_WRONG_ARG_VALUE; - } /* find place where to insert and check if it exists */ if (iso_dir_exists(parent, name, &pos)) { @@ -68,30 +65,24 @@ int iso_tree_add_new_dir(IsoDir *parent, const char *name, IsoDir **dir) return ISO_NODE_NAME_NOT_UNIQUE; } - node = calloc(1, sizeof(IsoDir)); - if (node == NULL) { - return ISO_OUT_OF_MEM; - } - - node->node.refcount = 1; - node->node.type = LIBISO_DIR; - node->node.name = strdup(name); - if (node->node.name == NULL) { - free(node); - return ISO_OUT_OF_MEM; + n = strdup(name); + ret = iso_node_new_dir(n, &node); + if (ret < 0) { + free(n); + return ret; } /* permissions from parent */ - node->node.mode = parent->node.mode; - node->node.uid = parent->node.uid; - node->node.gid = parent->node.gid; - node->node.hidden = parent->node.hidden; + iso_node_set_permissions((IsoNode*)node, parent->node.mode); + iso_node_set_uid((IsoNode*)node, parent->node.uid); + iso_node_set_gid((IsoNode*)node, parent->node.gid); + iso_node_set_hidden((IsoNode*)node, parent->node.hidden); /* current time */ now = time(NULL); - node->node.atime = now; - node->node.ctime = now; - node->node.mtime = now; + iso_node_set_atime((IsoNode*)node, now); + iso_node_set_ctime((IsoNode*)node, now); + iso_node_set_mtime((IsoNode*)node, now); if (dir) { *dir = node; @@ -128,6 +119,8 @@ int iso_tree_add_new_dir(IsoDir *parent, const char *name, IsoDir **dir) int iso_tree_add_new_symlink(IsoDir *parent, const char *name, const char *dest, IsoSymlink **link) { + int ret; + char *n, *d; IsoSymlink *node; IsoNode **pos; time_t now; @@ -138,17 +131,6 @@ int iso_tree_add_new_symlink(IsoDir *parent, const char *name, if (link) { *link = NULL; } - - /* check if the name is valid */ - if (!iso_node_is_valid_name(name)) { - return ISO_WRONG_ARG_VALUE; - } - - /* check if destination is valid */ - if (!iso_node_is_valid_link_dest(dest)) { - /* guard against null or empty dest */ - return ISO_WRONG_ARG_VALUE; - } /* find place where to insert */ if (iso_dir_exists(parent, name, &pos)) { @@ -156,37 +138,26 @@ int iso_tree_add_new_symlink(IsoDir *parent, const char *name, return ISO_NODE_NAME_NOT_UNIQUE; } - node = calloc(1, sizeof(IsoSymlink)); - if (node == NULL) { - return ISO_OUT_OF_MEM; - } - - node->node.refcount = 1; - node->node.type = LIBISO_SYMLINK; - node->node.name = strdup(name); - if (node->node.name == NULL) { - free(node); - return ISO_OUT_OF_MEM; - } - - node->dest = strdup(dest); - if (node->dest == NULL) { - free(node->node.name); - free(node); - return ISO_OUT_OF_MEM; + n = strdup(name); + d = strdup(dest); + ret = iso_node_new_symlink(n, d, &node); + if (ret < 0) { + free(n); + free(d); + return ret; } /* permissions from parent */ - node->node.mode = S_IFLNK | 0777; - node->node.uid = parent->node.uid; - node->node.gid = parent->node.gid; - node->node.hidden = parent->node.hidden; + iso_node_set_permissions((IsoNode*)node, 0777); + iso_node_set_uid((IsoNode*)node, parent->node.uid); + iso_node_set_gid((IsoNode*)node, parent->node.gid); + iso_node_set_hidden((IsoNode*)node, parent->node.hidden); /* current time */ now = time(NULL); - node->node.atime = now; - node->node.ctime = now; - node->node.mtime = now; + iso_node_set_atime((IsoNode*)node, now); + iso_node_set_ctime((IsoNode*)node, now); + iso_node_set_mtime((IsoNode*)node, now); if (link) { *link = node; @@ -237,6 +208,8 @@ int iso_tree_add_new_symlink(IsoDir *parent, const char *name, int iso_tree_add_new_special(IsoDir *parent, const char *name, mode_t mode, dev_t dev, IsoSpecial **special) { + int ret; + char *n; IsoSpecial *node; IsoNode **pos; time_t now; @@ -250,11 +223,6 @@ int iso_tree_add_new_special(IsoDir *parent, const char *name, mode_t mode, if (special) { *special = NULL; } - - /* check if the name is valid */ - if (!iso_node_is_valid_name(name)) { - return ISO_WRONG_ARG_VALUE; - } /* find place where to insert */ if (iso_dir_exists(parent, name, &pos)) { @@ -262,32 +230,23 @@ int iso_tree_add_new_special(IsoDir *parent, const char *name, mode_t mode, return ISO_NODE_NAME_NOT_UNIQUE; } - node = calloc(1, sizeof(IsoSpecial)); - if (node == NULL) { - return ISO_OUT_OF_MEM; + n = strdup(name); + ret = iso_node_new_special(n, mode, dev, &node); + if (ret < 0) { + free(n); + return ret; } - node->node.refcount = 1; - node->node.type = LIBISO_SPECIAL; - node->node.name = strdup(name); - if (node->node.name == NULL) { - free(node); - return ISO_OUT_OF_MEM; - } - - node->node.mode = mode; - node->dev = dev; - /* atts from parent */ - node->node.uid = parent->node.uid; - node->node.gid = parent->node.gid; - node->node.hidden = parent->node.hidden; + iso_node_set_uid((IsoNode*)node, parent->node.uid); + iso_node_set_gid((IsoNode*)node, parent->node.gid); + iso_node_set_hidden((IsoNode*)node, parent->node.hidden); /* current time */ now = time(NULL); - node->node.atime = now; - node->node.ctime = now; - node->node.mtime = now; + iso_node_set_atime((IsoNode*)node, now); + iso_node_set_ctime((IsoNode*)node, now); + iso_node_set_mtime((IsoNode*)node, now); if (special) { *special = node;