/* * Little program that import a directory and prints the resulting iso tree. */ #include "libisofs.h" #include #include #include #include #include #include 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(IsoDir *dir, int level) { int i; IsoDirIter *iter; IsoNode *node; 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'; iso_dir_get_children(dir, &iter); while (iso_dir_iter_next(iter, &node) == 1) { if (ISO_NODE_IS_DIR(node)) { printf("%s+[D] ", sp); print_permissions(iso_node_get_permissions(node)); printf(" %s\n", iso_node_get_name(node)); print_dir(ISO_DIR(node), level+1); } else if (ISO_NODE_IS_FILE(node)) { printf("%s-[F] ", sp); print_permissions(iso_node_get_permissions(node)); printf(" %s\n", iso_node_get_name(node) ); } else if (ISO_NODE_IS_SYMLINK(node)) { printf("%s-[L] ", sp); print_permissions(iso_node_get_permissions(node)); printf(" %s -> %s \n", iso_node_get_name(node), iso_symlink_get_dest(ISO_SYMLINK(node)) ); } else { printf("%s-[C] ", sp); print_permissions(iso_node_get_permissions(node)); printf(" %s\n", iso_node_get_name(node) ); } } iso_dir_iter_free(iter); } int main(int argc, char **argv) { int result; IsoImage *image; if (argc != 2) { printf ("You need to specify a valid path\n"); return 1; } iso_init(); iso_set_msgs_severities("NEVER", "ALL", ""); result = iso_image_new("volume_id", &image); if (result < 0) { printf ("Error creating image\n"); return 1; } 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; } printf("================= IMAGE =================\n"); print_dir(iso_image_get_root(image), 0); printf("\n\n"); iso_image_unref(image); iso_finish(); return 0; }