ports/111010: [NEW PORT] sysutils/iat: Converter of many types of CD-ROM image file formats into ISO-9660

Dmitry Marakasov amdmi3 at amdmi3.ru
Thu Mar 29 14:20:12 UTC 2007


The following reply was made to PR ports/111010; it has been noted by GNATS.

From: Dmitry Marakasov <amdmi3 at amdmi3.ru>
To: bug-followup at FreeBSD.org
Cc:  
Subject: Re: ports/111010: [NEW PORT] sysutils/iat: Converter of many types of CD-ROM image file formats into ISO-9660
Date: Thu, 29 Mar 2007 18:19:33 +0400

 --mP3DRpeJDSE+ciuQ
 Content-Type: text/plain; charset=koi8-r
 Content-Disposition: inline
 
 * Dmitry Marakasov (amdmi3 at amdmi3.ru) wrote:
 
 Here's also patch from berlios bug tracker, which adds some more
 functionality. I guess it'll be included into next release of iat, but I
 think it would be wise to add it to the port for now, just like guys
 from Debian did.
 
 The file attached should be placed under iat/files/
 
 -- 
 Best regards,
   Dmitry Marakasov               mailto:amdmi3 at amdmi3.ru
 
 --mP3DRpeJDSE+ciuQ
 Content-Type: text/x-csrc; charset=koi8-r
 Content-Disposition: attachment; filename="patch-src-iat.c"
 
 --- src/iat.c	2007-03-08 18:39:49.000000000 +0300
 +++ src/iat.c.new	2007-03-28 16:34:58.000000000 +0400
 @@ -14,12 +14,20 @@
      along with this program; if not, write to the
      Free Software Foundation, Inc.,
      59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 -*/
 +    */
  
  /* Support Large File */
  
 +/*
 + * Modified by Dmitry E. Oboukhov <dimka at avanto.org>
 + *  [+] Use 'getopt' function;
 + *  [+] Use STDOUT as output file (if not defined);
 + *  [*] Fix percent output.
 + */
 +
  #define _FILE_OFFSET_BITS 64
  
 +#include <unistd.h>
  #include <getopt.h>
  #include <stdio.h>
  #include <stdlib.h>
 @@ -29,6 +38,12 @@
  #define VERSION "0.1.3"
  #define BLOCK_ISO_CD 2048
  
 +
 +#define OPTIONS_LIST   "h"
 +
 +
 +static char *input_file=0, *output_file=0;
 +
  /* Signature for Image ISO-9660 */
  const char ISO_9660_START[] = { 
    (char) 0x01,
 @@ -106,35 +121,49 @@
  
  int previous_percent=-1;
  void main_percent (int percent_bar)
 -// Prints a progress bar, takes a percentage as argument.
 +  // Prints a progress bar, takes a percentage as argument.
  {
    //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,percent_bar/5,"====================",
 -                                        20-(percent_bar/5),"                    ");
 -
 +  if (isatty(fileno(stderr)))
 +  {
 +  fprintf(stderr, 
 +    "\r%3d%% [:%.*s>%.*s:]",
 +    percent_bar,
 +    percent_bar/5,
 +    "====================",
 +    20-(percent_bar/5),
 +    "                    ");
 +  }
 +  else
 +  {
 +    if (previous_percent==-1) fprintf(stderr, "Working ");
 +    if ((percent_bar/5)*5==percent_bar) fprintf(stderr, ".");
 +  }
 +  previous_percent=percent_bar;
  }
  
  
 -void
 +  void
  usage ()
  {
 -
 -  printf ("Web     : http://developer.berlios.de/projects/iat\n");
 -  printf ("Email   : salvatore.santagati at gmail.com\n");
 -  printf ("Irc     : irc.freenode.net #ignus\n");
 -  printf ("Note	   : What's My Age Again? \n");
 -  
 -  printf ("Usage :\n");
 -  printf ("iat  OPTIONS[inputfile] OPTIONS[outputfile]\n\n");
 -//  printf ("OPTIONS\n");
 -//  printf ("\t-i	--iso     		Generate iso image from bin image\n");
 -//  printf ("\t-l	--log     		Generate log  for debug image\n");
 -//  printf ("\t-v	--verbose 	 	Print verbose messages\n");
 -//  printf ("\t-o --output filename       Write output to file\n");
 -  printf ("\t-h --help    		Display this notice\n\n");
 +  fprintf (stderr, "Web     : http://developer.berlios.de/projects/iat\n");
 +  fprintf (stderr, "Email   : salvatore.santagati at gmail.com\n");
 +  fprintf (stderr, "Irc     : irc.freenode.net #ignus\n\n");
 +
 +  fprintf (stderr, "Usage   : ");
 +  fprintf (stderr, "iat  input_file [output_file.iso]\n\n");
 +  fprintf (stderr, "\tIf output file name is not defined, \n"
 +            "\tthen stdout will be used instead.\n");
 +  //  printf ("OPTIONS\n");
 +  //  printf ("\t-i	--iso     		Generate iso image from bin image\n");
 +  //  printf ("\t-l	--log     		Generate log  for debug image\n");
 +  //  printf ("\t-v	--verbose 	 	Print verbose messages\n");
 +  //  printf ("\t-o --output filename       Write output to file\n");
 +  fprintf (stderr, "\nOptions :\n");
 +  fprintf (stderr, "\t-h    		Display this notice\n\n");
  }
  
  
 @@ -163,21 +192,24 @@
  
  		    else
  		      {
 -			printf ("%s\n", strerror (errno));
 +        fprintf (stderr, "%s\n", strerror (errno));
  			exit (EXIT_FAILURE);
  		      };
  		    if (fwrite (buf, sizeof (char),  BLOCK_ISO_CD, fdest));
  
  		    else
  		      {
 -			printf ("%s\n", strerror (errno));
 +        fprintf (stderr, "%s\n", strerror (errno));
  			exit (EXIT_FAILURE);
  		      };
  		    fseek (fsource, img_ecc, SEEK_CUR);
  	      	}
  	      }
 - 	printf ("100%% [:=====================:]\n");	
 -return 0;
 +  if (isatty(fileno(stderr)))
 +    fprintf (stderr, "\rDone                           \n");
 +  else
 +    fprintf (stderr, " Done\n");
 +  return 0;
  }
  
  
 @@ -207,12 +239,12 @@
  		
  		if (!memcmp(ISO_9660_START, buf, 8))
  	    	{
 -	    		printf("Detect Signature ISO9660 START at %d\n", i);
 +      fprintf(stderr, "Detect Signature ISO9660 START at %d\n", i);
  			if (block_image_start == 0) block_image_start = i ;
  		}
  	
 
 		if (!memcmp(ISO_9660, buf, 8))
  	    	{
 -	    		printf("Detect Signature ISO9660 at %d\n", i);
 +      fprintf(stderr, "Detect Signature ISO9660 at %d\n", i);
  			if (block_image_end == 0)
  				{
  					block_image_end = i;
 @@ -220,9 +252,11 @@
  				}
  				
  			img_detect++;
 -		}
 
 		if (!memcmp(ISO_9660_END, buf, 8))
 +    }
 +
 +    if (!memcmp(ISO_9660_END, buf, 8))
  	    	{
 -	    		printf("Detect Signature ISO9660 END at %d\n", i);
 +      fprintf(stderr, "Detect Signature ISO9660 END at %d\n", i);
  			if (block_image_end == 0)
  				{
  					block_image_end = i;
 @@ -234,7 +268,7 @@
  
  		if (!memcmp(SYNC_RAW_2, buf, 8)) 
  		{
 -	    		printf("Detect Signature RAW 2 at %d\n", i);
 +      fprintf(stderr, "Detect Signature RAW 2 at %d\n", i);
  			if (raw_2_check == 0) 
  			{
  				img_header = img_header + 8;
 @@ -244,7 +278,7 @@
  		}
 		  
  		if (!memcmp(SYNC_RAW, raw, 12))
  		{
 -			printf("Detect Signature RAW at %d\n", i);
 +      fprintf(stderr, "Detect Signature RAW at %d\n", i);
  			if (raw_check == 0) 
  			{
  		    		img_header = img_header + 16;
 @@ -256,7 +290,7 @@
  	    
 		if ((img_size * 8) <= i) 
  	 	{
  			img_detect = -1;
 -			printf("Image is broken\n");
 +      fprintf(stderr, "Image is broken\n");
  			return 0;
  		}
 		
  	}
 @@ -318,48 +352,90 @@
      img_offset = block_image_start - block_image * 16 - img_header;	
  
  
 -    printf("\n Image offset start at %d", img_offset);
 -    printf("\n Sector header %d bit", img_header);
 -    printf("\n Sector ECC %d bit", img_ecc);
 -    printf("\n Block %d\n", block_image);	
 +  fprintf(stderr, "\n Image offset start at %d", img_offset);
 +  fprintf(stderr, "\n Sector header %d bit", img_header);
 +  fprintf(stderr, "\n Sector ECC %d bit", img_ecc);
 +  fprintf(stderr, "\n Block %d\n", block_image);
  
      
 return 1;
 +}
 +
 +
 +void parse_options(int argc, char ** argv)
 +{
 +  int c;
 +  
 +  for (c=getopt(argc, argv, OPTIONS_LIST);
 +      c!=-1;
 +      c=getopt(argc, argv, OPTIONS_LIST))
 +  {
 +    switch(c)
 +    {
 +      case 'h':
 +        usage();
 +        exit(0);
 +
 +      case '?':
 +        break;
 +
 +      default:
 +        fprintf (stderr, "?? getopt returned character code 0%o ??\n", c);
 +
 +    }
 +  }
 +
 +  if (argc-optind<1 || argc-optind>2)
 +  {
 +    usage();
 +    exit(EXIT_FAILURE);
  
 }
  
 +  input_file=argv[optind];
 +  if (argc-optind==2) output_file=argv[optind+1];
 +}
 +
 +
  int main(int argc, char **argv) 
  {
 +  fprintf(stderr, 
 +    "Iso9660 Analyzer Tool v%s by Salvatore Santagati\n", VERSION);
 +  fprintf(stderr, "Licensed under GPL v2 or later\n\n");
  
 -	printf("Iso9660 Analyzer Tool v%s by Salvatore Santagati\n", VERSION);
 -	printf("Licensed under GPL v2 or later\n");
 -
 +  parse_options(argc, argv);
  
 -	if ((fsource = fopen(argv[1], "rb")) != NULL)
 +  if ((fsource = fopen(input_file, "rb")) != NULL)
  		{
  			if (image_detection() == 0)
 -				printf("This image is not CD IMAGE\n");
 -			else if  (argc > 2)
  				{
 -					if ((fdest = fopen(argv[2],"wb")) != NULL)
 -					{
 -						image_convert();
 -						fclose(fdest);
 +      fprintf(stderr, "This image is not CD IMAGE\n");
 +      exit(EXIT_FAILURE);
  					}
  					else
  						{			
 -							printf("%s\n", strerror(errno));
 +      if (output_file)
 +      {
 +        if (!(fdest = fopen(output_file, "wb")))
 +        {
 +          fprintf(stderr, "%s\n", strerror(errno));
  							usage();
 +          exit(EXIT_FAILURE);
  						}
  				}
 -			
 +      else
 +      {
 +        fdest=stdout;
 +      }
 +      image_convert();
 +      fclose(fdest);
 +    }
  		}		
  	else	
  		{	
 -			printf("%s\n", strerror(errno));
 +    fprintf(stderr, "%s\n", strerror(errno));
  			usage();
  			exit(EXIT_FAILURE);
  		}   	
  	
 -	return 1;				
 -	 
 +  return 0;
  }   
  
 
 --mP3DRpeJDSE+ciuQ--
 



More information about the freebsd-ports-bugs mailing list