/*
01/05/2003 Nrg2Iso v 0.1
Copyright (C) 2003 Grégory Kokanosky <gregory.kokanosky@free.fr>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#define VERSION "0.4"
void usage(){
printf("Nrg2Iso v%s by G. Kokanosky\n", VERSION);
printf("released under the GNU GPL v2 or later\n\n");
printf("Usage :\n");
printf("nrg2iso image.nrg image.iso\n\n");
printf("--version display version number\n");
printf("--help display this notice\n\n");
}
int checkIso(char *filename)
{
int iso = 0 ;
FILE *f;
char buf[17*2048];
if(!(f=fopen(filename,"rb"))) return 0;
if( fread( buf, 1,17*2048 ,f) == 17*2048 ) {
// taken from k3b
// check if this is an iso9660-image
// the beginning of the 16th sector needs to have the following format:
// first byte: 1
// second to 11th byte: 67, 68, 48, 48, 49, 1 (CD001)
// 12th byte: 0
iso = ( buf[16*2048] == 1 &&
buf[16*2048+1] == 67 &&
buf[16*2048+2] == 68 &&
buf[16*2048+3] == 48 &&
buf[16*2048+4] == 48 &&
buf[16*2048+5] == 49 &&
buf[16*2048+6] == 1 &&
buf[16*2048+7] == 0 );
}
if(iso){
printf("It seems that %s is already an ISO 9660 image \n",filename);
printf("[Aborting conversion]\n");
}
fclose(f);
return iso;
}
#define NUM_OF_COLUMNS 70
int main(int argc, char **argv){
FILE *nrgFile, *isoFile;
char buffer[1024 * 1024];
size_t i=0,j=0;
size_t size=0,k=0,l;
size_t nrgSize=0;
int percent = 0;
int old_percent = -1;
struct stat buf;
if( argc==2 && (strcmp(argv[1],"--version") == 0) ){
printf("nrg2iso v%s\n", VERSION);
return 0;
}
if(argc!=3 ||(argc==2 && strcmp(argv[1],"--help")==0)){
usage();
return -1;
}
if( stat(argv[1],&buf)==0){
if(!checkIso(argv[1])){
nrgSize = buf.st_size;
nrgFile=fopen(argv[1],"rb");
fseek (nrgFile, 307200, SEEK_SET);
isoFile=fopen(argv[2],"wb+");
while((i= fread( buffer, 1, sizeof(buffer), nrgFile ))>0){
fwrite(buffer,i,1,isoFile);
size+=i;
percent = (int)(size * 100.0 / nrgSize);
if(percent != old_percent) {
old_percent = percent;
printf("\r|");
for(l = 0; l < percent * NUM_OF_COLUMNS / 100; l++) {
printf("=");
}
printf(">[%d%%]",percent);
fflush(stdout);
}
}
printf("\r|");
for(l = 0; l < NUM_OF_COLUMNS; l++) {
printf("=");
}
printf(">[100%%]");
fflush(stdout);
fclose(nrgFile);
fclose(isoFile);
printf("\n%s written : %lu bytes\n",argv[2],size);
}
}
else
printf("%s : No such file\n",argv[1]);
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1