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 }