CommonLibraries.cpp File Reference

#include "CommonLibraries.h"
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h>

Go to the source code of this file.

Functions

bool RIOmktemp (char *temp_file_template)
 RIOmktemp recebe um char* do tipo [<path>/]blablablaXXXXXX com no minimo 6 X's, e retorna um nome de arquivo valido substituindo os X's por uma sequencia de caracteres aleatarios de mesmo tamanho da cadeia de X's e acrescentando o path do diretorio de arquivos temporartios, se nao existir um path no nome.
bool RIOmktempAndID (char *temp_file_template, unsigned long long int *temp_file_id)
 Funcao para retornar alterar o nome do arquivo passado como parametro (usando a funcao RIOmktemp dada acima) e retornar um identificador unico para este nome.
bool IdRandomName (unsigned long long int NameId, char *RandomName, unsigned int RandomNameSize)
 Funcao para retornar a parte aleatoria de um arquivo correspondente a identificacao passada como parametro (esta identificacao foi provavelmente obtida ao chamar a funcao RIOmktempAndID.

Variables

static const char padchar []
static const unsigned int padcharlen = 62

Function Documentation

bool IdRandomName ( unsigned long long int  NameId,
char *  RandomName,
unsigned int  RandomNameSize 
)

Funcao para retornar a parte aleatoria de um arquivo correspondente a identificacao passada como parametro (esta identificacao foi provavelmente obtida ao chamar a funcao RIOmktempAndID.

Parameters:
RandomId identificacao associada a parte aleatoria do nome retornado por RIOmktempAndID.
RandomName ponteiro para a string com a parte aleatoria do nome. A string deve ter espaco para armazenar pelo menos RandomNameSize + 1 caracteres (os RandomNameSize do nome aleatorio mais o terminador).
RandomNameSize Tamanho desejado para o nome aleatorio.
Returns:
true se a conversao foi feita com sucesso e false se algum erro ocorreu (no caso, o identificador e muito grande e nao esta associado a nenhuma parte aleatoria do nome que usa no maximo 10 caracteres aleatorios).

Definition at line 192 of file CommonLibraries.cpp.

00194 {
00195     // Valor auxiliar usado para armazenar o identificador.
00196     unsigned long long int TempId;
00197     unsigned int RandomCharPos, TotalChars;
00198     
00199     // Inicializa o nome com o primeiro caractere do vetor aleatorio (necessario
00200     // para tratar o caso em que o nome do arquivo termina com um ou mais destes
00201     // caracteres).
00202     for( unsigned int i = 0; i < RandomNameSize; i++ )
00203         RandomName[ i ] = padchar[ 0 ];
00204     RandomName[ RandomNameSize ] = 0;        
00205     
00206     TotalChars = 0;
00207     TempId = NameId;    
00208 
00209     // Converte o identificador em um nome randomico.
00210     while( TempId )
00211     {
00212         if( TotalChars >= 10 )
00213             return false;        
00214 
00215         RandomCharPos = ( unsigned int ) ( TempId % padcharlen );
00216         RandomName[ TotalChars ] = padchar[ RandomCharPos ];
00217         TempId = TempId / padcharlen;
00218         TotalChars++;
00219     }
00220     // Finaliza o nome randomico.
00221     //RandomName[ TotalChars ] = 0;
00222     
00223     return true;
00224 }

bool RIOmktemp ( char *  temp_file_template  ) 

RIOmktemp recebe um char* do tipo [<path>/]blablablaXXXXXX com no minimo 6 X's, e retorna um nome de arquivo valido substituindo os X's por uma sequencia de caracteres aleatarios de mesmo tamanho da cadeia de X's e acrescentando o path do diretorio de arquivos temporartios, se nao existir um path no nome.

Ex: rio_XXXXXX retorna /tmp/rio_5tKp9q. Se a cadeia de X's tiver menos de 6 caracteres ou lstat falhar por outro motivo, que nao a inexistencia de um arquivo com o nome aleatorio gerado, a funcao retorna false (caso o nome aleatorio gerado ja exista, RIOmktemp insiste ate conseguir um que ainda nao exista).

Definition at line 31 of file CommonLibraries.cpp.

00032 {
00033     int          len;
00034     int     randnum;
00035     char        *trv;
00036     char        *random_file;
00037     char        *temp_dir;
00038     char        *endpath, *filename;
00039     struct stat  mystat;
00040     bool         status = true;
00041     bool         remove_temp_dir;
00042 
00043     //Se n�o tiver ao menos 6 X's no template, n�o criar o nome aleat�rio
00044     len = strlen( temp_file_template );
00045     if( len < 6 || strcmp( &temp_file_template[len - 6], "XXXXXX" ) )
00046         return false;
00047         
00048     // Verifica se existe o caminho em temp_file_template, procurando a posicao
00049     // da ultima "/" no nome.
00050     endpath = strrchr( temp_file_template, '/' );
00051     remove_temp_dir = false; 
00052     if( endpath == NULL )
00053     { 
00054         // Try to get TMPDIR environment variable
00055         // If failed, set to '/tmp/'
00056         temp_dir = getenv( "TMPDIR" );
00057 
00058         if( ( temp_dir == NULL ) || ( strlen( temp_dir ) == 0 ) )
00059         {
00060             temp_dir = strdup( "/tmp" );
00061             remove_temp_dir = true;
00062         }
00063         filename = temp_file_template;
00064     }
00065     else
00066     {
00067         // Substitui temporariamente o '/' por '\0', para podermos duplicar o
00068         // nome do caminho.
00069         *endpath = 0; 
00070         // Salva o inicio do nome do arquivo no caminho.
00071         filename = endpath + 1;
00072         temp_dir = strdup( temp_file_template );
00073         // Recoloca no nome o caractere '/' temporariamente removido.
00074         *endpath = '/';
00075         remove_temp_dir = true;
00076     } 
00077     // Assembly random file template
00078     random_file = (char *)malloc( sizeof( char ) *
00079                                   ( strlen( temp_dir ) + 2 + // '/' e '\0'
00080                                     strlen( filename )
00081                                   )
00082                                 );
00083     while( status )
00084     {
00085         strcpy( random_file, temp_dir           );
00086         strcat( random_file, "/"                );
00087         strcat( random_file, filename           );
00088 
00089         // Randomize file name
00090         srandom( time(NULL) );
00091 
00092         for( trv = random_file + strlen( random_file ) - 1;
00093              *trv == 'X';
00094              trv--
00095            )
00096         {
00097             randnum = random() % ( sizeof( padchar ) - 1 );
00098             *trv    = padchar[ randnum ];
00099         }
00100 
00101         if( lstat( random_file, &mystat ) < 0 )
00102         {
00103             if( errno == ENOENT )//arquivo n�o existe, nome pode ser usado
00104                 break;
00105             else //erro n�o trat�vel (neste caso ) no lstat
00106                 status = false;
00107         }
00108     }
00109 
00110     if( status )
00111         strcpy( temp_file_template, random_file );
00112 
00113     free( random_file );
00114 
00115     if( remove_temp_dir )
00116         free( temp_dir );
00117 
00118     return status;
00119 }

bool RIOmktempAndID ( char *  temp_file_template,
unsigned long long int *  temp_file_id 
)

Funcao para retornar alterar o nome do arquivo passado como parametro (usando a funcao RIOmktemp dada acima) e retornar um identificador unico para este nome.

Para que a funcao seja executada com sucesso, o numero de caracteres a serem substituidos pela funcao RIOmktemp deve ser entre 6 (o valor minimo aceito pela funcao) ate 10 (o valor maximo de caracteres para podermos criar um identificador unico de 64 bits para o arquivo).

Parameters:
FileName nome do arquivo a ser alterado pela funcao RIOmktemp
FileId ponteiro para o inteiro nao sinalizado de 64 bits que armazenara o identificador.
Returns:
true se o nome e o identificador forem criados com sucesso e false, em caso contrario.

Definition at line 134 of file CommonLibraries.cpp.

00136 {
00137     bool status;
00138     unsigned int TotalRandomChars;
00139     const char *PosRandomName, *PosRandomChar;
00140     
00141     // Se nao tiver ao menos 6 X's no template e mais do que 10 X's, nao criar o
00142     // nome aleatorio. Para isso, precisamos descobrir o numero de caracteres
00143     // usados pelo nome aleatorio.
00144     TotalRandomChars = 0;
00145     for( int i = strlen( temp_file_template ) - 1; i >=0; i-- )
00146     {
00147         if( temp_file_template[ i ] != 'X' )
00148             break;
00149         TotalRandomChars++;    
00150     }  
00151     
00152     if( ( TotalRandomChars < 6 ) || ( TotalRandomChars > 10 ) )
00153         return false;
00154     
00155     // Chama a funcao RIOmktemp para criar um nome aleatorio    
00156     status = RIOmktemp( temp_file_template  );
00157     if( status )
00158     {
00159         *temp_file_id = 0;
00160         PosRandomName = temp_file_template + strlen( temp_file_template ) - 1;
00161         for( unsigned int i = 0; i < TotalRandomChars; i++ )
00162         {
00163            *temp_file_id = *temp_file_id * padcharlen;
00164            PosRandomChar = strchr( padchar, *PosRandomName );
00165            if( PosRandomChar == NULL )
00166            {
00167                // Se isso ocorrer, existe um erro no nome do arquivo.
00168                *temp_file_id = 0;
00169                return false;
00170            }
00171            *temp_file_id = *temp_file_id + ( PosRandomChar - padchar ); 
00172            PosRandomName--;
00173         }
00174     } 
00175     return true;
00176 }


Variable Documentation

const char padchar[] [static]
Initial value:
               "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

Definition at line 15 of file CommonLibraries.cpp.

const unsigned int padcharlen = 62 [static]

Definition at line 18 of file CommonLibraries.cpp.

Generated on Wed Jul 4 16:03:29 2012 for RIO by  doxygen 1.6.3