Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
niml_uuid.c
Go to the documentation of this file.00001 #include "niml_private.h"
00002
00003
00004
00005
00006
00007 #include <sys/utsname.h>
00008 #include <time.h>
00009
00010 static char *get_MAC_addr(void) ;
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 static char * get_UNIQ_string(void)
00024 {
00025 static struct utsname ubuf ;
00026 static int ncall=0 ;
00027 struct timeval tv ;
00028 int nn , ii ;
00029 int nbuf ;
00030 char *buf ;
00031 #define NURR 32
00032 #ifdef NURR
00033 static int nurr=0 ;
00034 static byte urr[NURR] ;
00035 #endif
00036
00037
00038
00039 if( ncall == 0 ){
00040 nn = uname( &ubuf ) ;
00041 if( nn == -1 ){
00042 strcpy( ubuf.nodename , "E" ) ;
00043 strcpy( ubuf.sysname , "L" ) ;
00044 strcpy( ubuf.release , "V" ) ;
00045 strcpy( ubuf.version , "I" ) ;
00046 strcpy( ubuf.machine , "S" ) ;
00047 }
00048 }
00049
00050
00051
00052 nbuf = strlen(ubuf.nodename)+strlen(ubuf.sysname)
00053 +strlen(ubuf.release )+strlen(ubuf.version)+strlen(ubuf.machine) ;
00054
00055 buf = (char *)malloc(nbuf+222) ;
00056 strcpy(buf,ubuf.nodename) ;
00057 strcat(buf,ubuf.sysname ) ;
00058 strcat(buf,ubuf.release ) ;
00059 strcat(buf,ubuf.version ) ;
00060 strcat(buf,ubuf.machine ) ;
00061
00062
00063
00064 nn = gettimeofday( &tv , NULL ) ;
00065 if( nn == -1 ){
00066 tv.tv_sec = (long) time(NULL) ;
00067 tv.tv_usec = (long) buf ;
00068 }
00069
00070
00071
00072
00073 sprintf( buf+nbuf,"%d%d%d%d%d%d",
00074 (int)tv.tv_sec,(int)tv.tv_usec,
00075 (int)getpid(),(int)getppid(),(int)getuid(),
00076 ncall ) ;
00077 ncall++ ;
00078
00079
00080
00081 strcat(buf,get_MAC_addr()) ;
00082
00083 #ifdef NURR
00084
00085
00086
00087 if( nurr >= 0 ){
00088 if( nurr == 0 ){
00089 FILE *ufp=fopen("/dev/urandom","rb") ;
00090 if( ufp == NULL ){
00091 nurr = -1; goto URR_DONE;
00092 } else {
00093 fread( &urr , 1,NURR, ufp ); fclose(ufp);
00094 }
00095 }
00096 nbuf = strlen(buf); sprintf(buf+nbuf,"%02x",(int)urr[nurr]);
00097 nurr = (nurr+1) % NURR ;
00098 URR_DONE: ;
00099 }
00100 #endif
00101
00102 return buf ;
00103 }
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 char * UNIQ_idcode(void)
00122 {
00123 char *buf , *idc ;
00124
00125
00126
00127 buf = get_UNIQ_string() ;
00128
00129
00130
00131 idc = UNIQ_hashcode( buf ) ;
00132
00133
00134
00135 free(buf) ; return idc ;
00136 }
00137
00138
00139
00140
00141
00142
00143
00144 char * UNIQ_hashcode( char *str )
00145 {
00146 char *idc , *eee ;
00147 int ii , nn ;
00148
00149 idc = (char *)calloc(1,32) ;
00150
00151 eee = getenv("IDCODE_PREFIX") ;
00152 if( eee != NULL && isalpha(eee[0]) ){
00153 for( ii=0 ; ii < 3 && isalnum(eee[ii]) ; ii++ )
00154 idc[ii] = eee[ii] ;
00155 } else {
00156 strcpy(idc,"XYZ") ;
00157 }
00158 strcat(idc,"_") ;
00159
00160 if( str == NULL || str[0] == '\0' ) str = "Onen i Estel Edain" ;
00161 eee = MD5_B64_string(str) ;
00162 nn = strlen(eee) ;
00163 for( ii=0 ; ii < nn ; ii++ ){
00164 if( eee[ii] == '/' ) eee[ii] = '-' ;
00165 else if( eee[ii] == '+' ) eee[ii] = '_' ;
00166 }
00167 strcat(idc,eee) ; free(eee) ; return idc ;
00168 }
00169
00170
00171
00172
00173
00174
00175 void UNIQ_idcode_fill( char *idc )
00176 {
00177 char *bbb ;
00178 if( idc == NULL ) return ;
00179 bbb = UNIQ_idcode() ;
00180 strcpy(idc,bbb) ; free(bbb) ; return ;
00181 }
00182
00183
00184
00185
00186
00187
00188 char *UUID_hashcode( char *str )
00189 {
00190 MD5_CTX context;
00191 unsigned char digest[16];
00192 char *idc ;
00193 int ii , nn ;
00194
00195 if( str == NULL || str[0] == '\0' ) str = "Onen i Estel Edain" ;
00196
00197 MD5Init( &context ) ;
00198 MD5Update( &context, (unsigned char *)str, strlen(str) ) ;
00199 MD5Final( digest, &context ) ;
00200
00201 idc = (char *)calloc(1,48) ;
00202 sprintf(idc,
00203 "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x" ,
00204 digest[0] , digest[1] , digest[2] , digest[3] , digest[4] ,
00205 digest[5] , digest[6] , digest[7] , digest[8] , digest[9] ,
00206 digest[10], digest[11], digest[12], digest[13], digest[14],
00207 digest[15]
00208 ) ;
00209
00210 return idc ;
00211 }
00212
00213
00214
00215
00216
00217
00218
00219 char * UUID_idcode(void)
00220 {
00221 char *buf , *idc ;
00222
00223
00224
00225 buf = get_UNIQ_string() ;
00226
00227
00228
00229 idc = UUID_hashcode( buf ) ;
00230
00231
00232
00233 free(buf) ; return idc ;
00234 }
00235
00236
00237 #include <sys/ioctl.h>
00238 #include <net/if.h>
00239 static char *get_MAC_addr(void)
00240 {
00241 static char str[64] = "?" ;
00242 #if defined(LINUX) && defined(SIOCGIFHWADDR)
00243 static int ncall=0 ;
00244
00245 if( ncall == 0 ){
00246 int sd ;
00247 sd = socket(AF_INET, SOCK_DGRAM, 0);
00248 if( sd >= 0 ){
00249 struct ifreq ifr ;
00250 strcpy(ifr.ifr_name, "eth0") ;
00251 if( ioctl(sd,SIOCGIFHWADDR,&ifr) >= 0 ){
00252 sprintf(str ,
00253 "%02x:%02x:%02x:%02x:%02x:%02x",
00254 (byte)ifr.ifr_hwaddr.sa_data[0], (byte)ifr.ifr_hwaddr.sa_data[1],
00255 (byte)ifr.ifr_hwaddr.sa_data[2], (byte)ifr.ifr_hwaddr.sa_data[3],
00256 (byte)ifr.ifr_hwaddr.sa_data[4], (byte)ifr.ifr_hwaddr.sa_data[5] ) ;
00257 }
00258 close(sd) ;
00259 }
00260 ncall = 1 ;
00261 }
00262 #endif
00263 return str ;
00264 }