00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <sys/types.h>
00019 #include <sys/stat.h>
00020 #include <fcntl.h>
00021 #include <unistd.h>
00022 #include <stdio.h>
00023 #include <string>
00024 #include <string.h>
00025 #include <stdlib.h>
00026 #include <errno.h>
00027
00028 using std::string;
00029
00030
00031 #define DEFAULT_BLOCK_SIZE 131072
00032 #define MAX_INPUT_BUFFER 60000
00033
00034
00035
00036 int main( int argc, char *argv[] )
00037 {
00038 int file_in, i, n_rep, c, a1, a2, a3, a4, a5;
00039
00040 int disk[ 30 ], file_out[ 10 ];
00041 FILE *arquivo_discos;
00042 int vetor_discos1[ 400 ];
00043 int vetor_blocos1[ 400 ];
00044 int vetor_discos2[ 400 ];
00045 int vetor_blocos2[ 400 ];
00046 int vetor_discos3[ 400 ];
00047 int vetor_blocos3[ 400 ];
00048 int vetor_discos4[ 400 ];
00049 int vetor_blocos4[ 400 ];
00050 int vetor_discos5[ 400 ];
00051 int vetor_blocos5[ 400 ];
00052
00053 char header[ 64 ];
00054 unsigned char buf[ DEFAULT_BLOCK_SIZE ];
00055 unsigned int source, block;
00056 char *linha;
00057 int lidos, escritos;
00058
00059
00060
00061
00062 fprintf( stdout, "AVISO: ESTA VERSAO DO dumpRIOObj SOMENTE FUNCIONA COM 1 DISCO POR STORAGE!\n" );
00063 fprintf( stdout, "E LEMBRE-SE DE SEMPRE APAGAR OS ARQUIVOS DE SAIDA,\n" );
00064 fprintf( stdout, "NAO SEI O QUE ACONTECE SE NAO FAZE-LO! SIM, EXISTE UM TODO PRA ISSO TB!\n\n" );
00065
00066 switch (argc)
00067 {
00068 case 1: fprintf( stdout, "\nPara utilizar o dumpRIOObj, use a sintaxe ./dumpRIOObj [OP��ES] [CAMINHO DO METADADO DO ARQUIVO]\n" );
00069 fprintf( stdout, "\nAs op��es v�lidas implementadas at� agora s�o:\n" );
00070 fprintf( stdout, "\n-r: N�mero de replica��es do arquivo (default = 1)\n" );
00071 return(0);
00072
00073 case 2: n_rep = 1;
00074 file_in = open( argv[ 1 ], O_RDONLY );
00075
00076 break;
00077
00078 case 4: n_rep = atoi( argv[2] );
00079 file_in = open( argv[ 3 ], O_RDONLY );
00080
00081 break;
00082
00083 default:fprintf( stdout, "\nN�mero de par�metros n�o suportado por esta vers�o do dumpRIOObj, contate o seu revendedor autorizado\n");
00084 return ( 0 );
00085 }
00086
00087
00088
00089
00090
00091
00092 arquivo_discos = fopen( "discos.conf", "r" );
00093
00094 if( arquivo_discos == NULL )
00095 {
00096 fprintf( stdout, "\nArquivo de configuracao dos discos nao encontrado!" );
00097 fprintf( stdout, "\nCrie um arquivo \"discos.conf\" no diretorio corrente" );
00098 fprintf( stdout, "\n com o caminho completo de um disco por linha\n\n" );
00099 return ( 0 );
00100 }
00101
00102 c = 0;
00103
00104
00105
00106 linha = (char *) malloc( sizeof(char) * MAX_INPUT_BUFFER );
00107 if( fgets( linha, MAX_INPUT_BUFFER, arquivo_discos ) == NULL )
00108 {
00109 fprintf( stderr, "main erro ao obter dados do arquivo discos.conf\n");
00110 }
00111 if( strlen( linha ) > 0 && linha[ strlen( linha ) - 1 ] == '\n' )
00112 linha[ strlen( linha ) - 1 ] = 0;
00113
00114 while( 1 )
00115 {
00116
00117 disk[ c ] = open( linha, O_RDONLY );
00118
00119 if( disk[ c ] < 0 )
00120 {
00121 fprintf( stdout, "\nERRO NO ARQUIVO! Disco nao existe: %s !\n", linha );
00122 return( 1 );
00123 }
00124
00125 if( fgets( linha, MAX_INPUT_BUFFER, arquivo_discos ) == NULL )
00126 {
00127 fprintf( stderr, "main erro ao obter dados do arquivo %s\n",
00128 linha );
00129 }
00130
00131 if( strlen( linha ) > 0 && linha[ strlen( linha ) - 1 ] == '\n' )
00132 linha[ strlen( linha ) - 1 ] = 0;
00133
00134 if( feof( arquivo_discos ) )
00135 {
00136 break;
00137 }
00138
00139 c += 4;
00140 }
00141
00142 fclose ( arquivo_discos );
00143
00144
00145 for( i = 0; i<n_rep; i++ )
00146 {
00147
00148 char str[ 100 ];
00149 sprintf( str,"%d",i );
00150 char str2[] = "RIOObj";
00151 char str3[] = ".mpg";
00152 strcat( str2, str );
00153 strcat( str2, str3 );
00154 file_out[ i ] = creat( str2, S_IRUSR );
00155
00156 }
00157
00158
00159
00160 lidos = read( file_in, (char *)&header, 64 );
00161
00162 if( lidos != 64 )
00163 {
00164 fprintf( stdout, "main erro ao ler o valor de header: lidos %u", lidos);
00165 fprintf( stdout, " bytes de um total de 64 bytes.\n" );
00166 }
00167 else if( lidos == -1 )
00168 {
00169 fprintf( stdout, "main erro %u (%s) ao ler o valor de header\n",
00170 errno, strerror( errno ) );
00171 }
00172
00173 i = 0;
00174 a1 = 0;
00175 a2 = 0;
00176 a3 = 0;
00177 a4 = 0;
00178 a5 = 0;
00179
00180 while( read( file_in, (char *)&source, 4 ) == 4 &&
00181 read( file_in, (char *)&block, 4 ) == 4 )
00182 {
00183 lseek( disk[ source - 1 ], DEFAULT_BLOCK_SIZE * block, SEEK_SET );
00184
00185
00186 if(i == 0) { vetor_discos1[a1] = source; vetor_blocos1[a1] = block; a1++; }
00187 if(i == 1) { vetor_discos2[a2] = source; vetor_blocos2[a2] = block; a2++; }
00188 if(i == 2) { vetor_discos3[a3] = source; vetor_blocos3[a3] = block; a3++; }
00189 if(i == 3) { vetor_discos4[a4] = source; vetor_blocos4[a4] = block; a4++; }
00190 if(i == 4) { vetor_discos5[a5] = source; vetor_blocos5[a5] = block; a5++; }
00191
00192
00193 if(read( disk[ source - 1 ], buf, DEFAULT_BLOCK_SIZE ) != DEFAULT_BLOCK_SIZE )
00194 {
00195 fprintf(stdout, "leu menos bytes! disco %6d bloco %6d\n", source, block);
00196 }
00197 else
00198 {
00199 escritos = write( file_out[ i ], buf, DEFAULT_BLOCK_SIZE );
00200 if( escritos != DEFAULT_BLOCK_SIZE )
00201 {
00202 fprintf( stdout, "main erro ao escrever o valor de buf: escritos %u",
00203 escritos);
00204 fprintf( stdout, " bytes de um total de %u bytes.\n",
00205 DEFAULT_BLOCK_SIZE);
00206 }
00207 else if( escritos == -1 )
00208 {
00209 fprintf( stdout, "main erro %u (%s) ao escrever o valor de buf\n",
00210 errno, strerror( errno ) );
00211 }
00212 }
00213
00214
00215
00216
00217
00218
00219
00220
00221 i++;
00222 i %= n_rep;
00223 }
00224
00225 close( file_in );
00226
00227 for( i = 0; i < n_rep; i++ )
00228 {
00229 close( file_out[ i ] );
00230 }
00231
00232 fprintf( stdout, "\nCOPIA1 \t-\t COPIA 2 \t-\t COPIA 3 \t-\t COPIA 4 \t-\t COPIA 5\t-\tno.bloco\n\n" );
00233 fprintf( stdout, "___________________________________________________________________________________________________________________\n" );
00234 for( i = 0; i < a1; i++ )
00235 {
00236 fprintf( stdout, "|disco %4d bloco %4d |disco %4d bloco %4d |disco %4d bloco %4d |disco %4d bloco %4d |disco %4d bloco %4d |#%4d\n", vetor_discos1[i], vetor_blocos1[i], vetor_discos2[i], vetor_blocos2[i], vetor_discos3[i], vetor_blocos3[i], vetor_discos4[i], vetor_blocos4[i], vetor_discos5[i], vetor_blocos5[i], i );
00237 }
00238 fprintf( stdout, "___________________________________________________________________________________________________________________\n" );
00239
00240
00241 return( 0 );
00242 }
00243
00244
00245