Salome HOME
Revert "Synchronize adm files"
[modules/kernel.git] / src / Utils / Utils_Identity.cxx
1 // Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 //  SALOME Utils : general SALOME's definitions and tools
24 //  File   : Utils_Identity.cxx
25 //  Author : Pascale NOYRET, EDF
26 //  Module : SALOME
27 //  $Header$
28 //
29 # include <iostream>
30 # include "utilities.h"
31 # include "Utils_Identity.hxx"
32
33 extern "C"
34 {
35 # include <string.h>
36
37 #ifndef WIN32 /* unix functionality */
38 # include <pwd.h>
39 #endif
40 }
41
42 #ifndef WIN32 /* unix functionality */
43
44 # include <arpa/inet.h>
45 # include <netinet/in.h>
46 # include <sys/types.h>
47 # include <netdb.h>
48
49 const char* duplicate( const char *const str ) ;
50
51 const struct utsname get_uname( void )
52 {
53         struct utsname          hostid;
54 #if defined(_DEBUG_) || defined(_DEBUG)
55         const int retour=uname(&hostid);
56         ASSERT(retour>=0);
57 #else
58         uname(&hostid);
59 #endif
60         return hostid ;
61 }
62
63 const char* get_adip( void )
64 {
65         struct utsname  hostid;
66 #if defined(_DEBUG_) || defined(_DEBUG)
67         const int retour=uname(&hostid);
68         ASSERT(retour>=0);
69 #else
70         uname(&hostid);
71 #endif
72
73         const hostent* pour_adip=gethostbyname(hostid.nodename);
74         ASSERT(pour_adip!=NULL);
75         const in_addr ip_addr=*(struct in_addr*)(pour_adip->h_addr) ;
76         return duplicate(inet_ntoa(ip_addr));
77 }
78 const char* const get_pwname( void )
79 {
80         struct passwd *papa = getpwuid(getuid());
81         return papa->pw_name ;
82 }
83
84 #else /* Windows functionality */
85
86 #include <windows.h>
87 #include <direct.h>
88 #include <process.h>
89
90 const char* duplicate( const char *const str ) ;
91
92 const char* get_uname( void )
93 {
94         static std::string hostName(256, 0);
95         static DWORD nSize = hostName.length();
96         static int res = ::GetComputerNameEx(ComputerNameDnsFullyQualified, &hostName[0], &nSize);
97         ASSERT( res );
98         return hostName.c_str();
99 }
100
101 const char* get_adip( void )
102 {
103         //#include <Nspapi.h>
104         //#include <Svcguid.h>
105         //static GUID sType = SVCID_HOSTNAME;
106         //static CSADDR_INFO* ips = new CSADDR_INFO[8]; // in case multiple IP addresses are returned
107         //static DWORD nSize = 1024;
108         //static std::string uname = get_uname();
109         //static int res = ::GetAddressByName( NS_DEFAULT, &sType, &uname[0], 0, 0, 0, ips, &nSize, 0, 0 );
110         //if ( res )
111         //  return ips[0].LocalAddr.lpSockaddr->sa_data;
112
113         static hostent* he = ::gethostbyname( get_uname() );
114         if ( he && he->h_addr_list && he->h_length >0 ) {
115           static char str[16];
116       unsigned i1 = (unsigned char)he->h_addr_list[0][0];
117       unsigned i2 = (unsigned char)he->h_addr_list[0][1];
118       unsigned i3 = (unsigned char)he->h_addr_list[0][2];
119       unsigned i4 = (unsigned char)he->h_addr_list[0][3];
120       sprintf ( str, "%03u.%03u.%03u.%03u", i1, i2, i3, i4 );
121                 return str;
122         }
123         return "<unknown>";
124 }
125
126 const char* const get_pwname( void )
127 {
128   static std::string retVal(256, 0);
129   static DWORD  dwSize = retVal.length() + 1;
130   static int res = GetUserName( &retVal[0], &dwSize );
131   ASSERT( res );
132   return retVal.c_str();
133 }
134
135 PSID getuid() {
136         PSID         retVal        = NULL;
137         HANDLE       hProcessToken = INVALID_HANDLE_VALUE;
138         PTOKEN_OWNER pTKowner      = NULL;
139         LPVOID buffer = NULL;
140         DWORD dwsize = 0;
141         
142         if (  !OpenProcessToken ( GetCurrentProcess (), TOKEN_QUERY, &hProcessToken )) return 0;
143         if (!GetTokenInformation(hProcessToken, TokenOwner, buffer, dwsize, &dwsize)) return 0;
144         pTKowner = (PTOKEN_OWNER)buffer;
145         if ( pTKowner != NULL ) {
146                 retVal = pTKowner->Owner;
147         }
148         if ( hProcessToken != INVALID_HANDLE_VALUE ) CloseHandle ( hProcessToken );
149         
150         return retVal;
151 }
152
153 #define getcwd _getcwd
154 #define getpid _getpid
155
156 #endif /* WIN32 */
157
158
159 Identity::Identity( const char *name ): _name(duplicate(name)),\
160                                                         _hostid(get_uname()),\
161                                                         _adip(get_adip()),\
162                                                         _uid(getuid()) ,\
163                                                         _pwname(get_pwname()) ,\
164                                                         _dir(getcwd(NULL,256)),\
165                                                         _pid(getpid()) ,\
166                                                         _start(time(NULL)),\
167                                                         _cstart(ctime(&_start))
168 //CCRT
169 {
170         ASSERT(strlen(_dir)<256);
171 }
172
173
174 Identity::~Identity(void)
175 {
176         delete [] (char*)_name ;
177         (char*&)_name = NULL ;
178
179         //delete [] (char*)_dir ;
180         //(char*&)_dir = NULL ;
181         free((char*)_dir);
182 #ifndef WIN32   
183   // free the memory only on Unix
184   // becasue at Windows it is the same static variable
185   // (function get_adip() returns the same char* as get_uname() )
186         delete [] (char*)_adip ;
187 #endif
188         (char*&)_adip = NULL ;
189
190 }
191
192 /*------------*/
193 /* Accessors  */
194 /*------------*/
195
196 const char* const Identity::name (void) const
197 {
198         return  _name ;
199 }
200 #ifndef WIN32
201         const pid_t& Identity::pid(void) const
202 #else
203         const DWORD& Identity::pid(void) const
204 #endif
205 {
206         return _pid ;
207 }
208
209 #ifndef WIN32
210         const struct utsname &Identity::hostid(void) const
211 #else
212         const char* const Identity::hostid(void) const
213 #endif
214 {
215     return _hostid ;
216 }
217
218 #ifndef WIN32
219         const uid_t& Identity::uid(void) const
220 #else
221         const PSID& Identity::uid(void) const
222 #endif
223 {
224         return _uid ;
225 }
226 const time_t &Identity::start(void) const
227 {
228         return _start ;
229 }
230 const char* const Identity::rep (void) const
231 {
232         return  _dir ;
233 }
234 const char* const Identity::pwname (void) const
235 {
236         return  _pwname ;
237 }
238 const char* const Identity::adip (void) const
239 {
240         return _adip ;
241 }
242
243 /*------------------*/
244 /* Other methods    */
245 /*------------------*/
246
247 const char* Identity::host_char( void ) const
248 {
249 #ifndef WIN32
250         return _hostid.nodename;
251 #else
252         return _hostid;
253 #endif
254 }
255
256 const char* Identity::start_char(void) const
257 {
258         return ctime(&_start) ;
259 }
260
261 std::ostream & operator<< ( std::ostream& os , const Identity& monid )
262 {
263         ASSERT(monid._name!=NULL) ;
264         os << "Identity :" << std::endl ;
265         os << '\t' << "Component name : " << monid._name << std::endl ;
266         os << '\t' << "Numero de PID :  " << monid._pid << std::endl;
267         os << '\t' << "Uid utilisateur  : "   << monid._uid << std::endl;
268         os << '\t' << "nom utilisateur  : "   << monid._pwname << std::endl;
269 #ifndef WIN32
270         os << '\t' << "Nom de machine : " << monid._hostid.nodename << std::endl;
271 #else
272         os << '\t' << "Nom de machine : " << monid._hostid << std::endl;
273 #endif
274         os << '\t' << "Adresse IP : " << monid._adip << std::endl;
275         os << '\t' << "Heure de lancement : " << monid._cstart ; //ctime(&monid._start) ;
276         os << '\t' << "Dans le repertoire : " << monid._dir << std::endl;
277
278         return os ;
279 }