Hi,

I have to write a Dump Tool for a file on UNIX. I have never written a dump tool before. Can anyone please guide me how to proceed??

jazz

you will have to be a little more specific about the requirements -- a "Dump tool" can mean almost anything. My interpretation would be a program that displays the contents of database tables. Yours might be something else entirely.

A dump program takes a file as argument, reads that file and gives a text dump of the file.

I know there have been lots of those written -- google will show you a few, such as this one. It was written for dumping contents of RAM but you should be able to easily modify it for files.

Hi,

The Dump Tool i wrote takes a binary file as an argument , reads it and gives a txt file as an output. But there is some problem with the code can anyone help me?

FILE     *fp_inFile; 
   FILE    *fp_outFile;
   static int iGetABCFile(char*);
   static int iGetXYZFile(char*);
   char ctype; /* Two types of files can be passed as aruments file of type ABC or of type XYZ */
   char caoutfile[512]; 
     int main( int argc, char **argv ) {
                 /* Checking for correct number of arguments */ 
               if((argc == NULL)||(argc > 3)) {
               printf("\tErr -> command line\n");
               printf("\tUSAGE : DumpFile Type Filename\n");
                           exit(NG);
     }
     else {
               printf("\tCommand accepted  -> Type :[%s] FileName :(%s)\n",argv[1],argv[2]);
     }
     /* Copying the inputfile name and concatinating ".txt" to the output file - If the inputfile is ABC then the output file should be ABC.txt*/  
     strcpy(caoutfile, argv[2]);
     strcat(caoutfile,".txt");
     printf("\tNew FileName = %s\n",caoutfile);
     /* fopen */
               if(NULL==(fp_inFile=fopen(argv[2],"rb"))) {
               printf(“IN File Open Err! -> %s\n",argv[2]);
               exit(NG);
               } 
               if ((fp_outFile=fopen(caoutfile, "w")) == NULL) {
               printf( "OutFile Open Error\n" );
               exit( NG );
               }
                  if(strcmp(argv[1],"ABC") == 0) {
                            ctype=0;
                  }
                 else if(strcmp(argv[1],"XYZ") == 0) {
                              ctype=1;
                  }
 
               /* recognising the type of File Entered at command line.  */
               switch(ctype)
                 {
                 case 0 :
                             iGetABCFile(char*)
                            break;
               case 1 :
                             if(NULL == iGetXYZFile(char*)
                             exit(NG);
                           break;
                 default : printf("\tError -> Type must be one of the following – ABC or XYX \n");
                           break;
                 }
                  /* fclose */
                  fclose(fp_inFile);
                  fclose(fp_outFile);
         exit( OK );
   }
 /*======================================================================
        FUNCTION     : Get ABC File
        RETURN       : OK / NG
 =====================================================================*/
   int iGetABCFile(char *acABCFile)
   {
               FILE     *fp;
               int        i,j;
               unsigned long  ulRecordCount, ulDatabaseID, ulAlbumID, ulVolumeID;
               unsigned long  ulDatasetID, ulSectionID, ulLayerID, ulRecordID, ulNameCount;
               unsigned short usNameType;
               unsigned char  ucLanguageCode;
               char           acString[40];
                     if ((fp=fopen(acABCFile, "rb")) == NULL) {
                           return ( NG );
               }
                   fread(ulRecordCount,8,1,fp);
               fprint(fp_outFile, "Record Count : %lu\n", ulRecordCount);
                   for(i = 0; i< ulRecordCount; i++){
                           fread(ulDatabaseID, 8, 1, fp);
                           fread(ulAlbumID, 8, 1, fp);
                           fread(ulVolumeID, 8, 1, fp);
                           fread(ulSectionID, 8, 1, fp);
                           fread(ulLayerID, 8, 1, fp);
                           fread(ulNameCount, 8, 1, fp);
                           for(j =0; j<ulNameRecordCount; j++) {
                             fread(ucLanguageCode, 1, 1, fp);
                             fread(usNameType, 2, 1, fp);
                             fread(acString, 40, 1, fp);
                   fprint(fp_outFile, "DBID:%lu\t AlbumID:%ul\t VolID:%lu\t SecID:%lu\t LayID:%lu\t \n NameCount:%lu\n LangCode:%s\t NameType:%s\t String:%s\n", ulDatabaseID,ulAlbumID,ulVolumeID,ulDatasetID, ulSectionID,ulLayerID,usTypeCode,usSubTypeCode,usFeatureClassCode,ulNameRecordCount,aucAttributeType,ucLanguageCode,ucFont,usNameType,acString);
                               }
               }
              fclose( fp);             
             return( OK );
   }
    
 /*======================================================================
        FUNCTION     : Get XYZ File
        RETURN       : OK / NG
 ======================================================================*/
   int iGetXYZFile(char *acXYZFile)
   {
               FILE     *fp;
               int        i;
               unsigned long  ulRecordCount, ulDatabaseID, ulAlbumID, ulVolumeID;
               unsigned long  ulDatasetID, ulSectionID, ulLayerID;
               if ((fp=fopen(acXYZFile, "rb")) == NULL) {
                           return ( NG );
               }
               fread(ulRecordCount,8,1,fp);
               fprint(fp_outFile, "Record Count : %lu\n", ulRecordCount);
               for(i = 0; i< ulRecordCount; i++) {
                           fread(ulDatabaseID, 8, 1, fp);
                           fread(ulAlbumID, 8, 1, fp);
                           fread(ulVolumeID, 8, 1, fp);
                           fread(ulDatasetID, 8, 1, fp);
                           fread(ulSectionID, 8, 1, fp);
                           fread(ulLayerID, 8, 1, fp);
              fprint(fp_outFile, "DBID:%lu\t AlbumID:%ul\t VolID:%lu\t DatasetID:%lu\t SecID:%lu\t LayID:%lu \n", 
   ulDatabaseID,ulAlbumID,ulVolumeID,ulDatasetID, ulSectionID,ulLayerID);
               }
              fclose( fp);              return( OK );
   }

>> But there is some problem with the code can anyone help me?

Some problem? Ok whats this iGetABCFile(char*)? You can't call functions like this
You have bunch of variables wich are not declared like:
ulNameRecordCount, usSubTypeCode, usSubTypeCode, usFeatureClassCode, aucAttributeType, ucFont.
You try to fprintf them to file but not readed from binary file.

Hi,

I have modified the program, It is compiling with out any errrors, but giving a segmentation fault while running it. Can anyone help??

FILE     *fp_inFile; 
   FILE    *fp_outFile;
   static int iGetSUNFile(FILE*, FILE*);
   static int iGetSTARFile(FILE*, FILE*);
   static int iGetMOONFile(FILE*, FILE*);
   char ctype;
   char caoutfile[50]; //output file
   /******* Sample main function ********/
   int main( int argc, char **argv ) {
               /* Checking for correct number of arguments */ 
               if((argc == NULL)||(argc > 3)||(argc < 3)) {
               printf("\tErr -> command line\n");
               printf("\tUSAGE : FilesDump Type Filename\n");
                           exit(NG);
     }
     else {
               printf("\tCommand accepted  -> Type :[%s] FileName :(%s)\n",argv[1],argv[2]);
     }
     /* fopen */
               if(NULL==(fp_inFile=fopen(argv[2],"rb"))) {
               printf("IN File Open Err! -> %s\n",argv[2]);
               exit(NG);
               } 
     /* Copying the inputfile name and concatinating ".txt" to the output file */  
     strcpy(caoutfile, argv[2]);
     strcat(caoutfile,".txt");
     strcat(caoutfile, "\0");
     printf("\tNew FileName = %s\n",caoutfile);
               if ((fp_outFile=fopen(caoutfile, "w")) == NULL) {
               printf( "OutFile Open Error\n" );
               exit( NG );
               }
                  if(strcmp(argv[1],"SUN") == 0) {
                            ctype=0;
                  }
                            else if(strcmp(argv[1],"STAR") == 0) {
                              ctype=1;
                            }
                              else if(strcmp(argv[1],"MOON") == 0) {
                                        ctype=2;
                              }
               /* recognising the type of File Entered at command line */
               switch(ctype)
                 {
                 case 0 :
                           if(NULL == iGetSUNFile(fp_inFile, fp_outFile))
                             exit(NG);
                           break;
                           
                 case 1 :
                             if(NULL == iGetSTARFile(fp_inFile, fp_outFile))
                             exit(NG);
                           break;
    
                 case 2 :
                           if(NULL == iGetMOONFile(fp_inFile, fp_outFile))
                             exit(NG);
                           break;
    
                 default : printf("\tError -> Type must be one of the following – SUN, STAR, MOON \n");
                           break;
                 }
       exit( OK );
   }
   /*======================================================================
        FUNCTION     : Get SUN File
        RETURN       : OK / NG
   ======================================================================*/
   int iGetSUNFile(FILE* fp_inFile, FILE* fp_outFile)
   {
               int        i,j;
               unsigned long  ulRecordCount=0, ulDatabaseID=0, ulAlbumID=0, ulVolumeID=0;
               unsigned long  ulSectionID=0, ulLayerID=0, ulRecordID=0, ulNameRecordCount=0;
               unsigned short usNameType=0;
               unsigned char  ucLanguageCode;
               char           acString[40];
               fread((void *)ulRecordCount,8,1,fp_inFile);
               fprintf(fp_outFile, "Record Count : %lu\n", ulRecordCount);
               for(i = 0; i< ulRecordCount; i++){
                           fread((void *)ulDatabaseID, 8, 1, fp_inFile);
                           fread((void *)ulAlbumID, 8, 1, fp_inFile);
                           fread((void *)ulVolumeID, 8, 1, fp_inFile);
                           fread((void *)ulSectionID, 8, 1, fp_inFile);
                           fread((void *)ulLayerID, 8, 1, fp_inFile);
                           fread((void *)ulNameRecordCount, 8, 1, fp_inFile);
                           for(j =0; j<ulNameRecordCount; j++) {
                             fread((void *)ucLanguageCode, 1, 1, fp_inFile);
                             fread((void *)usNameType, 2, 1, fp_inFile);
                             fread((void *)acString, 40, 1, fp_inFile);
               fprintf(fp_outFile, "DBID:%lu\t AlbumID:%ul\t VolID:%lu\t SecID:%lu\t LayID:%lu\t \n NameRecordCount:%lu\n LangCode:%us\t NameType:%us\t String:%s\n", ulDatabaseID,ulAlbumID,ulVolumeID, ulSectionID,ulLayerID, ulNameRecordCount, ucLanguageCode, usNameType,acString);
                           }
               }
               fclose( fp_inFile);
               fclose(fp_outFile);
               return( OK );
   }
   /*======================================================================
        FUNCTION     : Get STAR File
        RETURN       : OK / NG
   ======================================================================*/
   int iGetSTARFile(FILE* fp_inFile, FILE* fp_outFile)
   {
               int        i;
               unsigned long  ulRecordCount=0, ulDatabaseID=0, ulAlbumID=0, ulVolumeID=0;
               unsigned long  ulDatasetID=0, ulSectionID=0, ulLayerID=0, ulRecordID=0;
               fread((void *)ulRecordCount,8,1,fp_inFile);
               fprintf(fp_outFile, "Record Count : %lu\n", ulRecordCount);
               for(i = 0; i< ulRecordCount; i++) {
                           fread((void *)ulDatabaseID, 8, 1, fp_inFile);
                           fread((void *)ulAlbumID, 8, 1, fp_inFile);
                           fread((void *)ulVolumeID, 8, 1, fp_inFile);
                           fread((void *)ulDatasetID, 8, 1, fp_inFile);
                           fread((void *)ulSectionID, 8, 1, fp_inFile);
                           fread((void *)ulLayerID, 8, 1, fp_inFile);
    
               fprintf(fp_outFile, "DBID:%lu\t AlbumID:%ul\t VolID:%lu\t DatasetID:%lu\t SecID:%lu\t LayID:%lu\t \n", ulDatabaseID,ulAlbumID,ulVolumeID,ulDatasetID, ulSectionID,ulLayerID);
               }
               fclose( fp_inFile);
               fclose(fp_outFile);
               return( OK );
   }
   /*======================================================================
        FUNCTION     : Get MOON File
        RETURN       : OK / NG
   ======================================================================*/
   int iGetMOONFile(FILE* fp_inFile, FILE* fp_outFile)
   {
               int        i;
               unsigned long  ulRecordCount=0, ulDatabaseID=0, ulAlbumID=0, ulVolumeID=0;
               unsigned long  ulDatasetID=0, ulSectionID=0, ulLayerID=0, ulRecordID=0;
               long    lLatitude=0, lLongitude=0, lAltitude=0;
               fread((void *)ulRecordCount, 8,1,fp_inFile);
               fprintf(fp_outFile, "Record Count : %lu\n", ulRecordCount);
               for(i = 0; i< ulRecordCount; i++) {
                           fread((void *)ulDatabaseID, 8, 1, fp_inFile);
                           fread((void *)ulAlbumID, 8, 1, fp_inFile);
                           fread((void *)ulVolumeID, 8, 1, fp_inFile);
                           fread((void *)ulDatasetID, 8, 1, fp_inFile);
                           fread((void *)ulSectionID, 8, 1, fp_inFile);
                           fread((void *)ulLayerID, 8, 1, fp_inFile);
                           fread((void *)lLatitude, 8, 1, fp_inFile);
                           fread((void *)lLongitude, 8, 1, fp_inFile);
                           fread((void *)lAltitude, 8, 1, fp_inFile);
    
               fprintf(fp_outFile, "DBID:%lu\t AlbumID:%lu\t VolID:%lu\t DatasetID:%lu\t SecID:%lu\t LayID:%lu\t \n Lat:%d\t Long:%d\t Alt:%d\n", ulDatabaseID,ulAlbumID,ulVolumeID,ulDatasetID, ulSectionID,ulLayerID,lLatitude,lLongitude,lAltitude);
               }
               fclose( fp_inFile);
               fclose(fp_outFile);
               
               return( OK );
   }

This is wrong
fread((void *)ucLanguageCode, 1, 1, fp_inFile);
instead you should correct to
fread(&ucLanguageCode, 1, 1, fp_inFile);
So all (void *) in fread correct to &

This article has been dead for over six months. Start a new discussion instead.