From ca1385cce101be24f68b2a6a114dc795ea0ad7be Mon Sep 17 00:00:00 2001 From: Vreixo Formoso Date: Sun, 23 Dec 2007 16:16:26 +0100 Subject: [PATCH] Begin RR support. Symlinks and Special files added to low level tree. --- demo/ecma119_tree.c | 126 ++++++++++++++++++++++++-------------------- src/ecma119.c | 1 + src/ecma119.h | 3 ++ src/ecma119_tree.c | 64 +++++++++++++++++----- src/ecma119_tree.h | 5 +- 5 files changed, 129 insertions(+), 70 deletions(-) diff --git a/demo/ecma119_tree.c b/demo/ecma119_tree.c index a8491b7..5ab28a4 100644 --- a/demo/ecma119_tree.c +++ b/demo/ecma119_tree.c @@ -10,6 +10,7 @@ #include "ecma119_tree.h" #include "util.h" #include "filesrc.h" +#include "node.h" #include #include #include @@ -19,96 +20,107 @@ static void print_permissions(mode_t mode) { - char perm[10]; - - //TODO suid, sticky... - - perm[9] = '\0'; - perm[8] = mode & S_IXOTH ? 'x' : '-'; - perm[7] = mode & S_IWOTH ? 'w' : '-'; - perm[6] = mode & S_IROTH ? 'r' : '-'; - perm[5] = mode & S_IXGRP ? 'x' : '-'; - perm[4] = mode & S_IWGRP ? 'w' : '-'; - perm[3] = mode & S_IRGRP ? 'r' : '-'; - perm[2] = mode & S_IXUSR ? 'x' : '-'; - perm[1] = mode & S_IWUSR ? 'w' : '-'; - perm[0] = mode & S_IRUSR ? 'r' : '-'; - printf("[%s]",perm); + char perm[10]; + + //TODO suid, sticky... + + perm[9] = '\0'; + perm[8] = mode & S_IXOTH ? 'x' : '-'; + perm[7] = mode & S_IWOTH ? 'w' : '-'; + perm[6] = mode & S_IROTH ? 'r' : '-'; + perm[5] = mode & S_IXGRP ? 'x' : '-'; + perm[4] = mode & S_IWGRP ? 'w' : '-'; + perm[3] = mode & S_IRGRP ? 'r' : '-'; + perm[2] = mode & S_IXUSR ? 'x' : '-'; + perm[1] = mode & S_IWUSR ? 'w' : '-'; + perm[0] = mode & S_IRUSR ? 'r' : '-'; + printf("[%s]",perm); } -static void -print_dir(Ecma119Node *dir, int level) +static void +print_dir(Ecma119Node *dir, int level) { - int i; - char sp[level * 2 + 1]; - - for (i = 0; i < level * 2; i += 2) { - sp[i] = '|'; - sp[i+1] = ' '; - } - - sp[level * 2-1] = '-'; - sp[level * 2] = '\0'; - + int i; + char sp[level * 2 + 1]; + + for (i = 0; i < level * 2; i += 2) { + sp[i] = '|'; + sp[i+1] = ' '; + } + + sp[level * 2-1] = '-'; + sp[level * 2] = '\0'; + for (i = 0; i < dir->info.dir.nchildren; i++) { - Ecma119Node *child = dir->info.dir.children[i]; - - if (child->type == ECMA119_DIR) { - printf("%s+[D] ", sp); - print_permissions(iso_node_get_permissions(child->node)); - printf(" %s\n", child->iso_name); - print_dir(child, level+1); - } else if (child->type == ECMA119_FILE) { - printf("%s-[F] ", sp); + Ecma119Node *child = dir->info.dir.children[i]; + + if (child->type == ECMA119_DIR) { + printf("%s+[D] ", sp); + print_permissions(iso_node_get_permissions(child->node)); + printf(" %s\n", child->iso_name); + print_dir(child, level+1); + } else if (child->type == ECMA119_FILE) { + printf("%s-[F] ", sp); print_permissions(iso_node_get_permissions(child->node)); printf(" %s {%p}\n", child->iso_name, (void*)child->info.file); - } else { - printf("%s-[????] ", sp); - } - } + } else if (child->type == ECMA119_SYMLINK) { + printf("%s-[L] ", sp); + print_permissions(iso_node_get_permissions(child->node)); + printf(" %s -> %s\n", child->iso_name, + ((IsoSymlink*)child->node)->dest); + } else if (child->type == ECMA119_SPECIAL) { + printf("%s-[S] ", sp); + print_permissions(iso_node_get_permissions(child->node)); + printf(" %s\n", child->iso_name); + } else { + printf("%s-[????] ", sp); + } + } } int main(int argc, char **argv) { - int result; + int result; IsoImage *image; Ecma119Image *ecma119; - - if (argc != 2) { - printf ("You need to specify a valid path\n"); - return 1; - } - + + if (argc != 2) { + printf ("You need to specify a valid path\n"); + return 1; + } + result = iso_image_new("volume_id", &image); if (result < 0) { printf ("Error creating image\n"); return 1; } - iso_image_set_msgs_severities(image, "NEVER", "ALL", ""); - + iso_image_set_msgs_severities(image, "NEVER", "ALL", ""); + result = iso_tree_add_dir_rec(image, iso_image_get_root(image), argv[1]); if (result < 0) { printf ("Error adding directory %d\n", result); return 1; } - + ecma119 = calloc(1, sizeof(Ecma119Image)); iso_rbtree_new(iso_file_src_cmp, &(ecma119->files)); ecma119->iso_level = 1; + ecma119->rockridge = 1; ecma119->image = image; - + ecma119->input_charset = strdup("UTF-8"); + /* create low level tree */ result = ecma119_tree_create(ecma119); if (result < 0) { printf ("Error creating ecma-119 tree: %d\n", result); return 1; } - + printf("================= ECMA-119 TREE =================\n"); - print_dir(ecma119->root, 0); - printf("\n\n"); - + print_dir(ecma119->root, 0); + printf("\n\n"); + ecma119_node_free(ecma119->root); iso_image_unref(image); - return 0; + return 0; } diff --git a/src/ecma119.c b/src/ecma119.c index 5f884bd..fa0fdf7 100644 --- a/src/ecma119.c +++ b/src/ecma119.c @@ -630,6 +630,7 @@ int ecma119_image_new(IsoImage *src, Ecma119WriteOpts *opts, iso_image_ref(src); target->iso_level = opts->level; + target->rockridge = 1; //TODO target->omit_version_numbers = opts->omit_version_numbers; target->sort_files = opts->sort_files; diff --git a/src/ecma119.h b/src/ecma119.h index 1ca5cc2..cfe9981 100644 --- a/src/ecma119.h +++ b/src/ecma119.h @@ -29,6 +29,9 @@ struct ecma119_image { unsigned int iso_level:2; + /* extensions */ + unsigned int rockridge:1; + /* relaxed constraints */ unsigned int omit_version_numbers:1; diff --git a/src/ecma119_tree.c b/src/ecma119_tree.c index f60856e..5129a80 100644 --- a/src/ecma119_tree.c +++ b/src/ecma119_tree.c @@ -151,6 +151,39 @@ int create_file(Ecma119Image *img, IsoFile *iso, Ecma119Node **node) return ret; } +/** + * Create a new ECMA-119 node representing a symbolic link from a iso symlink + * node. + */ +static +int create_symlink(Ecma119Image *img, IsoSymlink *iso, Ecma119Node **node) +{ + int ret; + + ret = create_ecma119_node(img, (IsoNode*)iso, node); + if (ret < 0) { + return ret; + } + (*node)->type = ECMA119_SYMLINK; + return ISO_SUCCESS; +} + +/** + * Create a new ECMA-119 node representing a special file. + */ +static +int create_special(Ecma119Image *img, IsoSpecial *iso, Ecma119Node **node) +{ + int ret; + + ret = create_ecma119_node(img, (IsoNode*)iso, node); + if (ret < 0) { + return ret; + } + (*node)->type = ECMA119_SPECIAL; + return ISO_SUCCESS; +} + void ecma119_node_free(Ecma119Node *node) { if (node == NULL) { @@ -165,7 +198,6 @@ void ecma119_node_free(Ecma119Node *node) } free(node->iso_name); iso_node_unref(node->node); - //TODO? free(node->name); free(node); } @@ -197,7 +229,7 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree, return ret; } max_path = pathlen + 1 + (iso_name ? strlen(iso_name) : 0); - if (1) { //TODO !rockridge && !relaxed_paths + if (!image->rockridge) { //TODO !rockridge && !relaxed_paths if (depth > 8 || max_path > 255) { iso_msg_note(image->image, LIBISO_FILE_IGNORED, "File \"%s\" can't be added, because depth > 8 " @@ -212,18 +244,26 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree, ret = create_file(image, (IsoFile*)iso, &node); break; case LIBISO_SYMLINK: - //TODO only supported with RR - iso_msg_note(image->image, LIBISO_FILE_IGNORED, "File \"%s\" ignored. " - "Symlinks need RockRidge extensions.", iso->name); - free(iso_name); - return 0; + if (image->rockridge) { + ret = create_symlink(image, (IsoSymlink*)iso, &node); + } else { + /* symlinks are only supported when RR is enabled */ + iso_msg_note(image->image, LIBISO_FILE_IGNORED, "File \"%s\" " + "ignored. Symlinks need RockRidge extensions.", + iso->name); + ret = 0; + } break; case LIBISO_SPECIAL: - iso_msg_note(image->image, LIBISO_FILE_IGNORED, "File \"%s\" ignored. " - "Special files need RockRidge extensions.", iso->name); - //TODO only supported with RR - free(iso_name); - return 0; + if (image->rockridge) { + ret = create_special(image, (IsoSpecial*)iso, &node); + } else { + /* symlinks are only supported when RR is enabled */ + iso_msg_note(image->image, LIBISO_FILE_IGNORED, "File \"%s\" " + "ignored. Special files need RockRidge extensions.", + iso->name); + ret = 0; + } break; case LIBISO_BOOT: //TODO diff --git a/src/ecma119_tree.h b/src/ecma119_tree.h index f0c4547..17ed884 100644 --- a/src/ecma119_tree.h +++ b/src/ecma119_tree.h @@ -14,7 +14,10 @@ enum ecma119_node_type { ECMA119_FILE, - ECMA119_DIR + ECMA119_DIR, + ECMA119_SYMLINK, + ECMA119_SPECIAL, + ECMA119_PLACEHOLDER }; /**