You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.8 KiB
134 lines
3.8 KiB
/* |
|
* Little program that imports a directory to iso image, generates the |
|
* ecma119 low level tree and prints it. |
|
* Note that this is not an API example, but a little program for test |
|
* purposes. |
|
*/ |
|
|
|
#include "libisofs.h" |
|
#include "ecma119.h" |
|
#include "ecma119_tree.h" |
|
#include "util.h" |
|
#include "filesrc.h" |
|
#include "node.h" |
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <sys/types.h> |
|
#include <sys/stat.h> |
|
#include <unistd.h> |
|
|
|
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); |
|
} |
|
|
|
static void |
|
print_dir(Ecma119Node *dir, int level) |
|
{ |
|
int i; |
|
char *sp = alloca(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); |
|
print_permissions(iso_node_get_permissions(child->node)); |
|
printf(" %s {%p}\n", child->iso_name, (void*)child->info.file); |
|
} 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 if (child->type == ECMA119_PLACEHOLDER) { |
|
printf("%s-[RD] ", 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; |
|
IsoImage *image; |
|
Ecma119Image *ecma119; |
|
|
|
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", ""); |
|
|
|
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"); |
|
|
|
ecma119_node_free(ecma119->root); |
|
iso_rbtree_destroy(ecma119->files, iso_file_src_free); |
|
free(ecma119->input_charset); |
|
free(ecma119); |
|
iso_image_unref(image); |
|
return 0; |
|
}
|
|
|