#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 |
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.
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. |
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).
FileName | nome do arquivo a ser alterado pela funcao RIOmktemp | |
FileId | ponteiro para o inteiro nao sinalizado de 64 bits que armazenara o identificador. |
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 }
const char padchar[] [static] |
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
Definition at line 15 of file CommonLibraries.cpp.
const unsigned int padcharlen = 62 [static] |
Definition at line 18 of file CommonLibraries.cpp.