/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* vim: set ts=8 sts=8 sw=8 noet : */ #define _GNU_SOURCE #include "libisofs.h" #include "libburn/libburn.h" #include #include #include #include #include #include #include #include #include #include #include #include #define SECSIZE 2048 const char * const optstring = "JRL:b:hV:"; extern char *optarg; extern int optind; void usage(char **argv) { printf("%s [OPTIONS] DIRECTORY OUTPUT\n", argv[0]); help(); } void help() { printf( "Options:\n" " -J Add Joliet support\n" " -R Add Rock Ridge support\n" " -V label Volume Label\n" " -L Set the ISO level (1 or 2)\n" " -b file Specifies a boot image to add to image\n" " -h Print this message\n" ); } int main(int argc, char **argv) { struct ecma119_source_opts opts; struct iso_volset *volset; struct iso_volume *volume; struct iso_tree_node_dir *root; struct burn_source *src; unsigned char buf[2048]; FILE *fd; int c; int constraints; struct iso_tree_radd_dir_behavior behav = {0,0,0}; int level=1, flags=0; char *boot_img = NULL; char *volid = "VOLID"; while ((c = getopt(argc, argv, optstring)) != -1) { switch(c) { case 'h': usage(argv); help(); exit(0); break; case 'J': flags |= ECMA119_JOLIET; break; case 'R': flags |= ECMA119_ROCKRIDGE; break; case 'L': level = atoi(optarg); break; case 'b': boot_img = optarg; break; case 'V': volid = optarg; break; case '?': usage(argv); exit(1); break; } } if (argc < 2) { printf ("Please pass directory from which to build ISO\n"); usage(argv); return 1; } if (argc < 3) { printf ("Please supply output file\n"); usage(argv); return 1; } if (!iso_init()) { err(1, "Can't init libisofs"); } iso_msgs_set_severities("NEVER", "ALL", ""); fd = fopen(argv[optind+1], "w"); if (!fd) { err(1, "error opening output file"); } root = iso_tree_new_root(); iso_tree_radd_dir(root, argv[optind], &behav); if (!root) { err(1, "error opening input directory"); } volume = iso_volume_new_with_root(volid, "PUBID", "PREPID", root); if ( boot_img ) { /* adds El-Torito boot info. Tunned for isolinux */ struct el_torito_boot_image *bootimg; struct iso_tree_node_dir *boot = (struct iso_tree_node_dir *) iso_tree_volume_path_to_node(volume, "isolinux"); struct iso_tree_node *img = iso_tree_volume_path_to_node(volume, boot_img); if (!img) { err(1, "boot image patch is not valid"); } bootimg = iso_volume_set_boot_image(volume, img, ELTORITO_NO_EMUL, boot, "boot.cat"); el_torito_set_load_size(bootimg, 4); el_torito_patch_isolinux_image(bootimg); /* Or just this for hidden img * iso_volume_set_boot_image_hidden(volume, boot_img, ELTORITO_NO_EMUL); */ } volset = iso_volset_new( volume, "VOLSETID" ); /* some tests */ iso_volume_set_application_id(volume, "Libburnia"); iso_volume_set_copyright_file_id(volume, "LICENSE"); constraints = ECMA119_OMIT_VERSION_NUMBERS | ECMA119_37_CHAR_FILENAMES | ECMA119_NO_DIR_REALOCATION | ECMA119_RELAXED_FILENAMES; memset(&opts, 0, sizeof(struct ecma119_source_opts)); opts.level = level; opts.flags = flags; opts.relaxed_constraints = 0; opts.input_charset = NULL; opts.ouput_charset = "UTF-8"; src = iso_source_new_ecma119(volset, &opts); while (src->read(src, buf, 2048) == 2048) { fwrite(buf, 1, 2048, fd); } fclose(fd); iso_finish(); return 0; }