ALT Linux Bugzilla
– Attachment 1763 Details for
Bug 10717
не поддерживает большие файлы
New bug
|
Search
|
[?]
|
Help
Register
|
Log In
[x]
|
Forgot Password
Login:
[x]
|
EN
|
RU
[patch]
Поддержка больших файлов
mdf2iso.patch (text/plain), 17.22 KB, created by
Alexey Shabalin
on 2007-01-26 16:51:46 MSK
(
hide
)
Description:
Поддержка больших файлов
Filename:
MIME Type:
Creator:
Alexey Shabalin
Created:
2007-01-26 16:51:46 MSK
Size:
17.22 KB
patch
obsolete
>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 <salvatore.santagati@gmail.com> > >@@ -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 <stdio.h> > #include <stdlib.h> > #include <string.h> > #include <errno.h> > >-#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] <sourcefile> [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);*/ > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 10717
: 1763