Only in mdf2iso/src: .deps Only in mdf2iso.new/src: .kdbgrc.mdf2iso diff -bur mdf2iso/src/Makefile.am mdf2iso.new/src/Makefile.am --- mdf2iso/src/Makefile.am 2005-05-19 11:24:11.000000000 +0200 +++ mdf2iso.new/src/Makefile.am 2005-07-31 17:47:36.000000000 +0200 @@ -1,2 +1,3 @@ bin_PROGRAMS = mdf2iso mdf2iso_SOURCES = mdf2iso.c +AM_CFLAGS = -D_FILE_OFFSET_BITS=64 -Wall diff -bur mdf2iso/src/Makefile.in mdf2iso.new/src/Makefile.in --- mdf2iso/src/Makefile.in 2005-05-22 21:42:09.000000000 +0200 +++ mdf2iso.new/src/Makefile.in 2005-07-31 17:49:16.000000000 +0200 @@ -136,6 +136,7 @@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ mdf2iso_SOURCES = mdf2iso.c +AM_CFLAGS = -D_FILE_OFFSET_BITS=64 -Wall all: all-am .SUFFIXES: @@ -149,9 +150,9 @@ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign src/Makefile + $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ diff -bur mdf2iso/src/mdf2iso.c mdf2iso.new/src/mdf2iso.c --- mdf2iso/src/mdf2iso.c 2005-05-22 21:52:08.000000000 +0200 +++ mdf2iso.new/src/mdf2iso.c 2005-07-31 19:41:56.000000000 +0200 @@ -1,4 +1,4 @@ - /* $Id: mdf2iso.c, 22/05/05 +/* $Id: mdf2iso.c, 22/05/05 Copyright (C) 2004,2005 Salvatore Santagati @@ -16,19 +16,14 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ +*/ #include #include #include #include -#define VERSION "0.3.0" - -/* Support Large File */ - -#define _FILE_OFFSET_BITS 64 - +#define VERSION "0.3.1" const char SYNC_HEADER[12] = { (char) 0x00, @@ -83,14 +78,21 @@ (char) 0x00 }; +#define ISO9660 0 +#define SYNC 1 +#define SYNC_MDF 2 +#define MDF_AUDIO 3 +#define UNKNOWN -1 -void -toc_file (char *destfilename, int sub) +int toc_file (char *destfilename, int sub) { - char destfiletoc[1024], destfiledat[1024]; + int ret=0; + char *destfiletoc; + char *destfiledat; FILE *ftoc; - strcpy (destfiletoc, destfilename); - strcpy (destfiledat, destfilename); + + destfiletoc=strdup(destfilename); + destfiledat=strdup(destfilename); strcpy (destfiletoc + strlen (destfilename) - 4, ".toc"); strcpy (destfiledat + strlen (destfilename) - 4, ".dat"); @@ -100,11 +102,8 @@ fprintf (ftoc, "// Track 1\n"); fprintf (ftoc, "TRACK MODE1_RAW"); - if (sub == 1) - fprintf (ftoc, " RW_RAW\n"); - - else - fprintf (ftoc, "\n"); + if (sub == 1) fprintf (ftoc, " RW_RAW\n"); + else fprintf (ftoc, "\n"); fprintf (ftoc, "NO COPY\n"); fprintf (ftoc, "DATAFILE \"%s\"\n", destfiledat); @@ -114,26 +113,27 @@ } else { - printf ("%s\n", strerror (errno)); - exit (EXIT_FAILURE); + printf ("Error opening %s for output: %s\n",destfiletoc,strerror(errno)); + ret=-1; }; - + free(destfiletoc); + free(destfiledat); + return ret; } -int -number_file (char *destfilename) +/* +int number_file (char *destfilename) { int i = 1, test_mdf = 0; int n_mdf; char mdf[2], destfilemdf[2354]; FILE *fsource; + strcpy (destfilemdf, destfilename); strcpy (destfilemdf + strlen (destfilename) - 1, ".0"); for (i = 0; test_mdf == 0; i++) - { if ((fsource = fopen (destfilemdf, "rb")) != NULL) - { printf ("\nCheck : "); sprintf (mdf, "md%d", i); @@ -141,203 +141,219 @@ printf ("%s, ", destfilemdf); fclose (fsource); } - else { test_mdf = 1; } - }; + } printf ("\r \n"); n_mdf = i - 1; return (n_mdf); } +*/ -void -cuesheets (char *destfilename) +int cuesheets (char *destfilename) { - char destfilecue[1024], destfilebin[1024]; + int ret=0; + char *destfilecue; + char *destfilebin; FILE *fcue; - strcpy (destfilecue, destfilename); - strcpy (destfilebin, destfilename); + + destfilecue=strdup(destfilename); + destfilebin=strdup(destfilename); strcpy (destfilecue + strlen (destfilename) - 4, ".cue"); strcpy (destfilebin + strlen (destfilename) - 4, ".bin"); - fcue = fopen (destfilecue, "w"); + if ((fcue = fopen (destfilecue, "w"))!=NULL) + { fprintf (fcue, "FILE \"%s\" BINARY\n", destfilebin); fprintf (fcue, "TRACK 1 MODE1/2352\n"); fprintf (fcue, "INDEX 1 00:00:00\n"); rename (destfilename, destfilebin); printf ("Create Cuesheets : %s\n", destfilecue); fclose (fcue); + } + else + { + printf ("Error opening %s for output: %s\n",destfilecue,strerror(errno)); + ret=-1; + } + return ret; } -void -main_percent (int percent_bar) +int previous_percent=-1; +void main_percent (int percent_bar) +// Prints a progress bar, takes a percentage as argument. { - int progress_bar, progress_space; + //int progress_bar, progress_space; + + if (percent_bar==previous_percent) return; // Nothing changed, don't waste CPU cycles. + + printf("%3d%% [:%.*s>%.*s:]\r",percent_bar,20-(percent_bar/5)," ", + percent_bar/5,"===================="); + /* printf ("%d%% [:", percent_bar); - for (progress_bar = 1; progress_bar <= (int) (percent_bar / 5); - progress_bar++) + for (progress_bar = 1; progress_bar <= (int) (percent_bar / 5); progress_bar++) printf ("="); printf (">"); - for (progress_space = 0; progress_space < (20 - progress_bar); - progress_space++) - printf (" "); + for (; progress_bar <= 20; ++progress_bar) printf (" "); printf (":]\r"); + */ } -void -usage () +void usage () +// Prints the command line syntax { - printf ("mdf2iso v%s by Salvatore Santagati\n", VERSION); - printf ("Web : http//mdf2iso.berlios.de\n"); - printf ("Email : salvatore.santagati@gmail.com\n"); - printf ("Irc : irc.freenode.net #ignus\n"); - printf ("Note : iodellavitanonhocapitouncazzo\n"); - printf ("License : released under the GNU GPL v2 or later\n\n"); + printf (" Web : http//mdf2iso.berlios.de\n"); + printf (" Email : salvatore.santagati@gmail.com\n"); + printf (" Irc : irc.freenode.net #ignus\n"); + printf (" Note : iodellavitanonhocapitouncazzo\n\n"); printf ("Usage :\n"); - printf ("mdf2iso [OPTION] [BASENAME.MDF] [DESTINATION]\n\n"); - printf ("OPTION\n"); - printf ("\t--toc Generate toc file\n"); - printf ("\t--cue Generate cue file\n"); - printf ("\t--help display this notice\n\n"); + printf ("mdf2iso [--cue|--toc|--help] [destfile]\n\n"); + printf ("Options:\n"); + printf (" --toc Generate toc/dat files\n"); + printf (" --cue Generate cue/bin files\n"); + printf (" --help Display this notice\n"); + printf (" sourcefile\tFilename of the .mdf file to be converted\n"); + printf (" destfile\tFilename of the target ISO9660 file.\n"\ + "\t\tIf none given, one is derived from sourcefile.\n\n"); } -int -main (int argc, char **argv) +char mdftype(FILE *f) +/* returns + -1 for unknown + 0 for ISO9660 + 1 for SYNC + 2 for SYNC MDF + 3 for MDF Audio + (see #defines above) +*/ { - int seek_ecc, sector_size, seek_head, sector_data, n_mdf; + char buf[12]; + + fseek(f, 32768, SEEK_SET); + fread(buf, sizeof (char), 8, f); + if (!memcmp (ISO_9660, buf, 8)) return ISO9660; // File is ISO9660 + + fseek(f, 0L, SEEK_SET); + fread(buf, sizeof (char), 12, f); + + fseek (f, 2352, SEEK_SET); + + if (!memcmp (SYNC_HEADER, buf, 12)) // Has SYNC_HEADER + { + fread (buf, sizeof (char), 12, f); + if (!memcmp (SYNC_HEADER_MDF, buf, 12)) return SYNC_MDF; // File is SYNC MDF + if (!memcmp (SYNC_HEADER, buf, 12)) return SYNC; // File is SYNC + } + else // Does not have SYNC_HEADER + { + fread(buf, sizeof (char), 12, f); + if (!memcmp (SYNC_HEADER_MDF_AUDIO, buf, 12)) return MDF_AUDIO; // File is MDF Audio + } + + // Reached a point where nothing else matters. + return UNKNOWN; // Unknown format +} + + +// === Main program code === + +int main (int argc, char **argv) +{ + int seek_ecc, sector_size, seek_head, sector_data;//, n_mdf; int cue = 0, cue_mode = 0, sub = 1, toc = 0, sub_toc = 0; int opts = 0; - double size_iso, write_iso; - long percent = 0; - long i, source_length, progressbar; - char buf[2448], destfilename[2354]; + long i, source_length; + char buf[2448]; + char *destfilename=NULL; + char *basefilename=NULL; FILE *fdest, *fsource; + // Print identification + printf ("mdf2iso v%s by Salvatore Santagati\n", VERSION); + printf ("Licensed under GPL v2 or later\n"); - if (argc < 2) + // *** Process command line options *** + + if (argc < 2) { - usage (); - exit (EXIT_FAILURE); + // Not enough parameters; print help + usage(); + exit(EXIT_FAILURE); } - else - - { + // Search for options --cue and --toc for (i = 0; i < argc; i++) - { - if (!strcmp (argv[i], "--help")) - { usage (); exit (EXIT_SUCCESS); } if (!strcmp (argv[i], "--cue")) - { cue = 1; opts++; } if (!strcmp (argv[i], "--toc")) - { toc = 1; opts++; } } - if ((cue == 1) && (toc == 1)) - - { - usage (); - exit (EXIT_FAILURE); - } - if ((opts == 1) && (argc <= 2)) - + // Catch impossible parameter combinations + if (((cue == 1) && (toc == 1)) || + ((opts == 1) && (argc <= 2))) { - usage (); - exit (EXIT_FAILURE); + usage(); + exit(EXIT_FAILURE); } + // Get the base filename + basefilename=argv[1+opts]; // simple pointer, but makes life easier. + // Get the destination filename if (argc >= (3 + opts)) - strcpy (destfilename, argv[2 + opts]); - - else - - { - strcpy (destfilename, argv[1 + opts]); - if (strlen (argv[1 + cue]) < 5 - || strcmp (destfilename + strlen (argv[1 + opts]) - 4, ".mdf")) - strcpy (destfilename + strlen (argv[1 + opts]), ".iso"); - + // The destination filename is explicitly entered at the prompt + destfilename=strdup(argv[2 + opts]); else - strcpy (destfilename + strlen (argv[1 + opts]) - 4, ".iso"); - } - if ((fsource = fopen (argv[1 + opts], "rb")) != NULL) - { - fseek (fsource, 32768, SEEK_CUR); - fread (buf, sizeof (char), 8, fsource); - if (memcmp (ISO_9660, buf, 8)) - + // Derive destination filename from the basename: + // If basename is "*.mdf" use "*.iso" als destname + // otherwise simply append ".iso" to the basename to create destname. + destfilename=strdup(basefilename); + i=strlen(destfilename); // Reusing 'i' here as temporary variable + if (i < 5 || strcmp(destfilename + i - 4, ".mdf")) { - fseek (fsource, 0L, SEEK_SET); - fread (buf, sizeof (char), 12, fsource); - if (!memcmp (SYNC_HEADER, buf, 12)) - - { - fseek (fsource, 0L, SEEK_SET); - fseek (fsource, 2352, SEEK_CUR); - fread (buf, sizeof (char), 12, fsource); - if (!memcmp (SYNC_HEADER_MDF, buf, 12)) - - { - if (cue == 1) - { - cue_mode = 1; - - /* BAD SECTOR TO NORMAL IMAGE */ - seek_ecc = 96; - sector_size = 2448; - sector_data = 2352; - seek_head = 0; - } - - else if (toc == 0) - - { - - /*BAD SECTOR */ - seek_ecc = 384; - sector_size = 2448; - sector_data = 2048; - seek_head = 16; + destfilename=realloc(destfilename,i+5); + strcat(destfilename, ".iso"); } - else - - { - - /*BAD SECTOR */ - seek_ecc = 0; - sector_size = 2448; - sector_data = 2448; - seek_head = 0; - sub_toc = 1; - } + strcpy(destfilename + i - 3, "iso"); } - else + // *** Preprocess basefile *** + // Try opening basefile + if ((fsource = fopen(basefilename, "rb")) == NULL) { - if (!memcmp (SYNC_HEADER, buf, 12)) + free(destfilename); + printf ("Could not open %s: %s\n", basefilename, strerror(errno)); + exit (EXIT_FAILURE); + } + // Determine filetype & set some stuff accordingly (or exit) + switch (mdftype(fsource)) { + case ISO9660: + printf("%s is already ISO9660.\n",basefilename); + fclose(fsource); + free(destfilename); + exit(EXIT_SUCCESS); + case SYNC: if (cue == 1) { cue_mode = 1; @@ -348,129 +364,134 @@ seek_head = 0; } if (toc == 0) - { - /*NORMAL IMAGE */ seek_ecc = 288; sector_size = 2352; sector_data = 2048; seek_head = 16; } - else - { seek_ecc = 0; sector_size = 2352; sector_data = 2352; seek_head = 0; } - } - - else - - { - printf ("Sorry I don't know this format :(\n"); - exit (EXIT_FAILURE); - } - } - } - - else - + break; + case SYNC_MDF: + if (cue == 1) { - fseek (fsource, 0L, SEEK_SET); - fseek (fsource, 2352, SEEK_CUR); - fread (buf, sizeof (char), 12, fsource); - if (memcmp (SYNC_HEADER_MDF_AUDIO, buf, 12)) + cue_mode = 1; + /* BAD SECTOR TO NORMAL IMAGE */ + seek_ecc = 96; + sector_size = 2448; + sector_data = 2352; + seek_head = 0; + } + else if (toc == 0) { - printf ("Sorry I don't know this format :(\n"); - exit (EXIT_FAILURE); + /*BAD SECTOR */ + seek_ecc = 384; + sector_size = 2448; + sector_data = 2048; + seek_head = 16; } - else - { - + /*BAD SECTOR */ + seek_ecc = 0; + sector_size = 2448; + sector_data = 2448; + seek_head = 0; + sub_toc = 1; + } + break; + case MDF_AUDIO: /*BAD SECTOR AUDIO */ seek_head = 0; sector_size = 2448; seek_ecc = 96; sector_data = 2352; cue = 0; + break; + default:printf("Unknown format for %s.\n",basefilename); + fclose(fsource); + free(destfilename); + exit (EXIT_FAILURE); } - } - if ((fdest = fopen (destfilename, "wb")) != NULL); - else + // *** Create destination file *** + + // Try opening the destination file for output + if ((fdest = fopen (destfilename, "wb")) == NULL) { - printf ("%s\n", strerror (errno)); + printf ("Unable to open %s for output: %s\n",destfilename,strerror(errno)); + free(destfilename); + fclose(fsource); exit (EXIT_FAILURE); - }; + } + + fseek (fsource, 0L, SEEK_END); source_length = ftell (fsource) / sector_size; - size_iso = (int) (source_length * sector_data); - progressbar = 100 / source_length; fseek (fsource, 0L, SEEK_SET); - { for (i = 0; i < source_length; i++) - { fseek (fsource, seek_head, SEEK_CUR); - if (fread (buf, sizeof (char), sector_data, fsource)); - - else + if (fread(buf, sizeof (char), sector_data, fsource)!=sector_data) { - printf ("%s\n", strerror (errno)); + printf ("Error reading from %s: %s\n",basefilename, strerror (errno)); + fclose(fsource); + fclose(fdest); + remove(destfilename); + free(destfilename); exit (EXIT_FAILURE); - }; - if (fwrite (buf, sizeof (char), sector_data, fdest)); - - else + } + if (fwrite (buf, sizeof (char), sector_data, fdest)!=sector_data) { - printf ("%s\n", strerror (errno)); + printf ("Error writing to %s: %s\n",destfilename, strerror (errno)); + fclose(fsource); + fclose(fdest); + remove(destfilename); + free(destfilename); exit (EXIT_FAILURE); - }; + } fseek (fsource, seek_ecc, SEEK_CUR); - write_iso = (int) (sector_data * i); - if (i != 0) - percent = (int) (write_iso * 100 / size_iso); - main_percent (percent); - }} printf ("100%%[:====================:]\n"); + main_percent(i*100/source_length); + } + } printf ("100%% [:=====================:]\n"); fclose (fsource); fclose (fdest); - if (cue == 1) - cuesheets (destfilename); - if (toc == 1) - toc_file (destfilename, sub_toc); + // *** create Toc or Cue file is requested *** + if (cue == 1) if (cuesheets(destfilename)) + { + free(destfilename); + exit(EXIT_FAILURE); + } + if (toc == 1) if (toc_file(destfilename, sub_toc)) + { + free(destfilename); + exit(EXIT_FAILURE); + } if ((toc == 0) && (cue == 0)) - printf ("Create iso9660: %s\n", destfilename); + printf("Created iso9660: %s\n", destfilename); + + free(destfilename); exit (EXIT_SUCCESS); - } - else - printf ("This is file iso9660 ;)\n"); +/* n_mdf = number_file (destfilename) - 1; - /* if (n_mdf > 1) - + / * if (n_mdf > 1) { printf ("\rDetect %d md* file and now emerge this\n", n_mdf); } - */ + * / fclose (fsource); - exit (EXIT_SUCCESS); - } - - else - { - printf ("%s\n", strerror (errno)); - exit (EXIT_FAILURE); - }; - } + exit (EXIT_SUCCESS);*/ }