Salome HOME
Move MEDWrapper to MED module
[modules/kernel.git] / src / Utils / Utils_Identity.cxx
1 //  SALOME Utils : general SALOME's definitions and tools
2 //
3 //  Copyright (C) 2003  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. 
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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
21 //
22 //
23 //
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 WNT /* unix functionality */
38 # include <pwd.h>
39 #endif
40 }
41
42 #ifndef WNT /* 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         const int retour=uname(&hostid);
55         ASSERT(retour>=0);
56         return hostid ;
57 }
58
59 const char* get_adip( void )
60 {
61         struct utsname  hostid;
62         const int retour=uname(&hostid);
63         ASSERT(retour>=0);
64
65         const hostent* pour_adip=gethostbyname(hostid.nodename);
66         ASSERT(pour_adip!=NULL);
67         const in_addr ip_addr=*(struct in_addr*)(pour_adip->h_addr) ;
68         return duplicate(inet_ntoa(ip_addr));
69 }
70 const char* const get_pwname( void )
71 {
72         struct passwd *papa = getpwuid( getuid() ) ;
73         return papa->pw_name ;
74 }
75
76 #else /* Windows functionality */
77
78 #include <windows.h>
79 #include <direct.h>
80 #include <process.h>
81
82 const char* duplicate( const char *const str ) ;
83
84 const char* get_uname( void )
85 {
86         char* hostName = new char[256];
87         DWORD nSize = 256;
88         ASSERT(GetComputerName(hostName, &nSize));
89         return hostName;
90 }
91
92 const char* get_adip( void )
93 {
94   return get_uname();
95 }
96
97 const char* const get_pwname( void )
98 {
99   DWORD                   dwSize = 256 + 1;
100   char* retVal = new char[256];
101   ASSERT(GetUserName ( retVal, &dwSize ));
102   return retVal;
103 }
104
105 PSID getuid() {
106         PSID         retVal        = NULL;
107         HANDLE       hProcessToken = INVALID_HANDLE_VALUE;
108         PTOKEN_OWNER pTKowner      = NULL;
109         LPVOID buffer = NULL;
110         DWORD dwsize = 0;
111         
112         if (  !OpenProcessToken ( GetCurrentProcess (), TOKEN_QUERY, &hProcessToken )) return 0;
113         if (!GetTokenInformation(hProcessToken, TokenOwner, buffer, dwsize, &dwsize)) return 0;
114         pTKowner = (PTOKEN_OWNER)buffer;
115         if ( pTKowner != NULL ) {
116                 retVal = pTKowner->Owner;
117         }
118         if ( hProcessToken != INVALID_HANDLE_VALUE ) CloseHandle ( hProcessToken );
119         
120         return retVal;
121 }
122
123 #define getcwd _getcwd
124 #define getpid _getpid
125
126 #endif /* WNT */
127
128
129 Identity::Identity( const char *name ): _name(duplicate(name)),\
130                                                         _hostid(get_uname()),\
131                                                         _adip(get_adip()),\
132                                                         _uid(getuid()) ,\
133                                                         _pwname(get_pwname()) ,\
134                                                         _dir(getcwd(NULL,256)),\
135                                                         _pid(getpid()) ,\
136                                                         _start(time(NULL)),\
137                                                         _cstart(ctime(&_start))
138 //CCRT
139 {
140         ASSERT(strlen(_dir)<256);
141 }
142
143
144 Identity::~Identity(void)
145 {
146         delete [] (char*)_name ;
147         (char*&)_name = NULL ;
148
149         //delete [] (char*)_dir ;
150         //(char*&)_dir = NULL ;
151         free((char*)_dir);
152         
153         delete [] (char*)_adip ;
154         (char*&)_adip = NULL ;
155 }
156
157 /*------------*/
158 /* Accessors  */
159 /*------------*/
160
161 const char* const Identity::name (void) const
162 {
163         return  _name ;
164 }
165 #ifndef WNT
166         const pid_t& Identity::pid(void) const
167 #else
168         const DWORD& Identity::pid(void) const
169 #endif
170 {
171         return _pid ;
172 }
173
174 #ifndef WNT
175         const struct utsname &Identity::hostid(void) const
176 #else
177         const char* const hostid(void) const
178 #endif
179 {
180     return _hostid ;
181 }
182
183 #ifndef WNT
184         const uid_t& Identity::uid(void) const
185 #else
186         const PSID& Identity::uid(void) const
187 #endif
188 {
189         return _uid ;
190 }
191 const time_t &Identity::start(void) const
192 {
193         return _start ;
194 }
195 const char* const Identity::rep (void) const
196 {
197         return  _dir ;
198 }
199 const char* const Identity::pwname (void) const
200 {
201         return  _pwname ;
202 }
203 const char* const Identity::adip (void) const
204 {
205         return _adip ;
206 }
207
208 /*------------------*/
209 /* Other methods    */
210 /*------------------*/
211
212 const char* Identity::host_char( void ) const
213 {
214 #ifndef WNT
215         return _hostid.nodename;
216 #else
217         return _hostid;
218 #endif
219 }
220
221 const char* Identity::start_char(void) const
222 {
223         return ctime(&_start) ;
224 }
225
226 std::ostream & operator<< ( std::ostream& os , const Identity& monid )
227 {
228         ASSERT(monid._name!=NULL) ;
229         os << "Identity :" << std::endl ;
230         os << '\t' << "Component name : " << monid._name << std::endl ;
231         os << '\t' << "Numero de PID :  " << monid._pid << std::endl;
232         os << '\t' << "Uid utilisateur  : "   << monid._uid << std::endl;
233         os << '\t' << "nom utilisateur  : "   << monid._pwname << std::endl;
234 #ifndef WNT
235         os << '\t' << "Nom de machine : " << monid._hostid.nodename << std::endl;
236 #else
237         os << '\t' << "Nom de machine : " << monid._hostid << std::endl;
238 #endif
239         os << '\t' << "Adresse IP : " << monid._adip << std::endl;
240         os << '\t' << "Heure de lancement : " << monid._cstart ; //ctime(&monid._start) ;
241         os << '\t' << "Dans le repertoire : " << monid._dir << std::endl;
242
243         return os ;
244 }