(file) Return to SystemVms.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

  1 carson.hovey 1.3 //%2005////////////////////////////////////////////////////////////////////////
  2 gs.keenan    1.1 //
  3 carson.hovey 1.3 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4                  // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5                  // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6 gs.keenan    1.1 // IBM Corp.; EMC Corporation, The Open Group.
  7 carson.hovey 1.3 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8                  // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9                  // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10                  // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 gs.keenan    1.1 //
 12                  // Permission is hereby granted, free of charge, to any person obtaining a copy
 13                  // of this software and associated documentation files (the "Software"), to
 14                  // deal in the Software without restriction, including without limitation the
 15                  // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 16                  // sell copies of the Software, and to permit persons to whom the Software is
 17                  // furnished to do so, subject to the following conditions:
 18                  // 
 19                  // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 20                  // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 21                  // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 22                  // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 23                  // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 24                  // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 25                  // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 26                  // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 27                  //
 28                  //==============================================================================
 29                  //
 30                  // Author: Mike Brasher (mbrasher@bmc.com)
 31                  //
 32 gs.keenan    1.6 // Modified By: Sean Keenan (sean.keenan@hp.com)
 33 gs.keenan    1.1 //
 34                  //%/////////////////////////////////////////////////////////////////////////////
 35                  
 36                  #include "System.h"
 37                  
 38                  #include <dlfcn.h>
 39                  #include <unistd.h>
 40                  #include <dirent.h>
 41                  #include <pwd.h>
 42                  #include <errno.h>
 43                  #include <sys/stat.h>
 44                  #include <sys/types.h>
 45                  #include <cstdio>
 46                  #include <time.h>
 47                  #include <lib$routines.h>
 48                  #include <sys/time.h>
 49                  #include <netdb.h>
 50                  #include <prvdef.h>
 51                  #include <descrip.h>
 52 gs.keenan    1.6 #include <iodef.h>
 53 gs.keenan    1.1 #include <stsdef.h>
 54                  #include <ssdef.h>
 55 gs.keenan    1.6 #include <ttdef.h>
 56                  #include <tt2def.h>
 57 gs.keenan    1.1 #include <starlet.h>
 58                  #include <libdef.h>
 59                  #include <cxx_exception.h>
 60                  
 61                  #include <Pegasus/Common/Tracer.h>
 62                  #include <Pegasus/Common/InternalException.h>
 63                  #include <Pegasus/Config/ConfigManager.h>
 64                  
 65                  PEGASUS_NAMESPACE_BEGIN
 66                  
 67 gs.keenan    1.7 #define MAX_PASS_LEN 32
 68                  #define CR 0x0d
 69                  #define LF 0x0a
 70                  
 71 gs.keenan    1.1 inline void sleep_wrapper(Uint32 seconds)
 72                  {
 73 gs.keenan    1.6   sleep(seconds);
 74 gs.keenan    1.1 }
 75                  
 76 gs.keenan    1.6 void System::getCurrentTime(Uint32 & seconds, Uint32 & milliseconds)
 77 gs.keenan    1.1 {
 78 gs.keenan    1.6   timeval tv;
 79                    gettimeofday(&tv, 0);
 80                    seconds = Uint32(tv.tv_sec);
 81                    milliseconds = Uint32(tv.tv_usec) / 1000;
 82 gs.keenan    1.1 }
 83                  
 84                  String System::getCurrentASCIITime()
 85                  {
 86 gs.keenan    1.6   char str[50];
 87                    time_t rawTime;
 88 gs.keenan    1.1 
 89 gs.keenan    1.6   time(&rawTime);
 90                    strftime(str, 40, "%m/%d/%Y-%T", localtime(&rawTime));
 91                    String time = str;
 92                    return time;
 93 gs.keenan    1.1 }
 94                  
 95                  void System::sleep(Uint32 seconds)
 96                  {
 97 gs.keenan    1.6   sleep_wrapper(seconds);
 98 gs.keenan    1.1 }
 99                  
100 gs.keenan    1.6 Boolean System::exists(const char *path)
101 gs.keenan    1.1 {
102 gs.keenan    1.6   return access(path, F_OK) == 0;
103 gs.keenan    1.1 }
104                  
105 gs.keenan    1.6 Boolean System::canRead(const char *path)
106 gs.keenan    1.1 {
107 gs.keenan    1.6   return access(path, R_OK) == 0;
108 gs.keenan    1.1 }
109                  
110 gs.keenan    1.6 Boolean System::canWrite(const char *path)
111 gs.keenan    1.1 {
112 gs.keenan    1.6   return access(path, W_OK) == 0;
113 gs.keenan    1.1 }
114                  
115 gs.keenan    1.6 Boolean System::getCurrentDirectory(char *path, Uint32 size)
116 gs.keenan    1.1 {
117 gs.keenan    1.6   return getcwd(path, size) != NULL;
118 gs.keenan    1.1 }
119                  
120 gs.keenan    1.6 Boolean System::isDirectory(const char *path)
121 gs.keenan    1.1 {
122 gs.keenan    1.6   struct stat st;
123 gs.keenan    1.1 
124 gs.keenan    1.6   if (stat(path, &st) != 0)
125                    {
126                      return false;
127                    }
128                    return S_ISDIR(st.st_mode);
129 gs.keenan    1.1 }
130                  
131 gs.keenan    1.6 Boolean System::changeDirectory(const char *path)
132 gs.keenan    1.1 {
133 gs.keenan    1.6   return chdir(path) == 0;
134 gs.keenan    1.1 }
135                  
136 gs.keenan    1.6 Boolean System::makeDirectory(const char *path)
137 gs.keenan    1.1 {
138 gs.keenan    1.6   return mkdir(path, 0777) == 0;
139 gs.keenan    1.1 }
140                  
141 gs.keenan    1.6 Boolean System::getFileSize(const char *path, Uint32 & size)
142 gs.keenan    1.1 {
143 gs.keenan    1.6   struct stat st;
144 gs.keenan    1.1 
145 gs.keenan    1.6   if (stat(path, &st) != 0)
146                    {
147                      return false;
148                    }
149                    size = st.st_size;
150                    return true;
151 gs.keenan    1.1 }
152                  
153 gs.keenan    1.6 Boolean System::removeDirectory(const char *path)
154 gs.keenan    1.1 {
155 gs.keenan    1.6   return rmdir(path) == 0;
156 gs.keenan    1.1 }
157                  
158 gs.keenan    1.6 Boolean System::removeFile(const char *path)
159 gs.keenan    1.1 {
160 gs.keenan    1.6   return unlink(path) == 0;
161 gs.keenan    1.1 }
162                  
163 gs.keenan    1.6 Boolean System::renameFile(const char *oldPath, const char *newPath)
164 gs.keenan    1.1 {
165 gs.keenan    1.6   if (rename(oldPath, newPath) != 0)
166                    {
167                      return false;
168                    }
169                    return true;
170 gs.keenan    1.1 }
171                  
172 gs.keenan    1.6 DynamicLibraryHandle System::loadDynamicLibrary(const char *fileName)
173 gs.keenan    1.1 {
174 gs.keenan    1.6   PEG_METHOD_ENTER(TRC_OS_ABSTRACTION, "System::loadDynamicLibrary()");
175 gs.keenan    1.1 
176 gs.keenan    1.6   Tracer:: trace(TRC_OS_ABSTRACTION, Tracer::LEVEL2,
177                  	"Attempting to load library %s - 1", fileName);
178 gs.keenan    1.1 
179 gs.keenan    1.6   PEG_METHOD_EXIT();
180 gs.keenan    1.8   return DynamicLibraryHandle(dlopen(fileName, RTLD_NOW));
181 gs.keenan    1.1 }
182                  
183                  void System::unloadDynamicLibrary(DynamicLibraryHandle libraryHandle)
184                  {
185 gs.keenan    1.6   // ATTN: Should this method indicate success/failure?
186 gs.keenan    1.1 
187 gs.keenan    1.6   dlclose(libraryHandle);
188 gs.keenan    1.1 }
189                  
190 gs.keenan    1.6 String System::dynamicLoadError()
191                  {
192                    // ATTN: Is this safe in a multi-threaded process?  Should this string
193                    // be returned from loadDynamicLibrary?
194 gs.keenan    1.1 
195 gs.keenan    1.8   String dlerr = dlerror();
196                    return dlerr;
197 gs.keenan    1.1 }
198                  
199                  DynamicSymbolHandle System::loadDynamicSymbol(
200 gs.keenan    1.6 				      DynamicLibraryHandle libraryHandle,
201                  					       const char *symbolName)
202 gs.keenan    1.1 {
203 gs.keenan    1.8   char* Errorout;
204                    void* Dsh;
205 gs.keenan    1.1 
206 gs.keenan    1.8   if ((Dsh = dlsym(libraryHandle, (char*)symbolName)) == 0)
207 gs.keenan    1.1   {
208 gs.keenan    1.8     Errorout = dlerror();
209 gs.keenan    1.1   }
210 gs.keenan    1.8   return (DynamicSymbolHandle)Dsh;
211 gs.keenan    1.1 }
212                  
213                  String System::getHostName()
214                  {
215 gs.keenan    1.6   static char hostname[PEGASUS_MAXHOSTNAMELEN];
216 gs.keenan    1.1 
217 gs.keenan    1.6   if (!*hostname)
218                    {
219                      gethostname(hostname, sizeof (hostname));
220                    }
221                    return hostname;
222 gs.keenan    1.1 }
223                  
224 gs.keenan    1.6 String System::getFullyQualifiedHostName()
225 gs.keenan    1.1 {
226 gs.keenan    1.6   char hostName[PEGASUS_MAXHOSTNAMELEN];
227                    struct hostent *he;
228                    String fqName;
229 gs.keenan    1.1 
230 gs.keenan    1.6   if (gethostname(hostName, PEGASUS_MAXHOSTNAMELEN) != 0)
231                    {
232                    return String::EMPTY;
233                    }
234 gs.keenan    1.1 
235 gs.keenan    1.6   if (he = gethostbyname(hostName))
236                    {
237                      strcpy(hostName, he->h_name);
238                    }
239 gs.keenan    1.1 
240 gs.keenan    1.6   fqName.assign(hostName);
241 gs.keenan    1.1 
242 gs.keenan    1.6   return fqName;
243 gs.keenan    1.1 }
244                  
245 gs.keenan    1.6 String System::getSystemCreationClassName()
246 gs.keenan    1.1 {
247 gs.keenan    1.6   return "CIM_ComputerSystem";
248 gs.keenan    1.1 }
249                  
250                  Uint32 System::lookupPort(
251 gs.keenan    1.6 			    const char *serviceName,
252                  			    Uint32 defaultPort)
253 gs.keenan    1.1 {
254 gs.keenan    1.6   Uint32 localPort;
255 gs.keenan    1.1 
256 gs.keenan    1.6   struct servent *serv;
257 gs.keenan    1.1 
258 gs.keenan    1.6   //
259                    // Get wbem-local port from /etc/services
260                    //
261                    if ((serv = getservbyname(serviceName, TCP)) != NULL)
262                    {
263                      localPort = htons((uint16_t) serv->s_port);
264                    }
265                    else
266                    {
267                      localPort = defaultPort;
268                    }
269 gs.keenan    1.1 
270 gs.keenan    1.6   return localPort;
271 gs.keenan    1.1 }
272                  
273 gs.keenan    1.6 String System::getPassword(const char *prompt)
274 gs.keenan    1.1 {
275 gs.keenan    1.6   struct
276                    {
277                      short int numbuf;
278                      char frst_char;
279                      char rsv1;
280                      long rsv2;
281                    }
282                    tahead;
283                  
284                    typedef struct
285 gs.keenan    1.7   {				// I/O status block     
286                      short i_cond;		// Condition value      
287                      short i_xfer;		// Transfer count     
288                      long i_info;		// Device information     
289 gs.keenan    1.6   }
290                    iosb;
291                  
292                    typedef struct
293 gs.keenan    1.7   {				// Terminal characteristics   
294                      char t_class;		// Terminal class     
295                      char t_type;		// Terminal type      
296                      short t_width;		// Terminal width in characters   
297                      long t_mandl;		// Terminal's mode and length   
298                      long t_extend;		// Extended terminal characteristics  
299 gs.keenan    1.6   }
300                    termb;
301                  
302                    termb otermb;
303                    termb ntermb;
304                  
305 gs.keenan    1.7   static long ichan;		// Gets channel number for TT:  
306 gs.keenan    1.6 
307                    register int errorcode;
308 gs.keenan    1.7   int kbdflgs;			// saved keyboard fd flags  
309                    int kbdpoll;			// in O_NDELAY mode         
310                    int kbdqp = false;		// there is a char in kbdq  
311                    int psize;			// size of the prompt 
312 gs.keenan    1.6 
313                    static char buf[MAX_PASS_LEN];
314 gs.keenan    1.7   char kbdq;			// char we've already read  
315 gs.keenan    1.6 
316                    iosb iostatus;
317                  
318                    static long termset[2] =
319 gs.keenan    1.7   {0, 0};			// No terminator                
320 gs.keenan    1.6 
321 gs.keenan    1.7   $DESCRIPTOR(inpdev, "TT");	// Terminal to use for input    
322 gs.keenan    1.6 
323                    //
324 gs.keenan    1.7   // Get a channel for the terminal
325 gs.keenan    1.6   //
326                  
327                    buf[0] = 0;
328 gs.keenan    1.1 
329 gs.keenan    1.8   errorcode = sys$assign(&inpdev,	// Device name 
330                  			  &ichan,	// Channel assigned 
331                  			  0,		// request KERNEL mode access 
332                  			  0);		// No mailbox assigned 
333                  
334                    if (errorcode != SS$_NORMAL)
335 gs.keenan    1.6   {
336 gs.keenan    1.8     return buf;
337 gs.keenan    1.6   }
338                  
339 gs.keenan    1.7   //
340                    // Read current terminal settings
341                    //
342 gs.keenan    1.6 
343 gs.keenan    1.8   errorcode = sys$qiow(0,	// Wait on event flag zero  
344                  			ichan,	// Channel to input terminal  
345                  			IO$_SENSEMODE,	// Function - Sense Mode 
346                  			&iostatus,	// Status after operation 
347                  			0, 0,	// No AST service   
348                  			&otermb,	// [P1] Address of Char Buffer 
349                  			sizeof (otermb),	// [P2] Size of Char Buffer 
350                  			0, 0, 0, 0);	// [P3] - [P6] 
351                  
352                    if (errorcode != SS$_NORMAL)
353 gs.keenan    1.6   {
354 gs.keenan    1.8     return buf;
355 gs.keenan    1.6   }
356 gs.keenan    1.7 
357                    //
358                    // setup new settings   
359                    //
360 gs.keenan    1.6 
361                    ntermb = otermb;
362                  
363 gs.keenan    1.7   //
364                    // turn on passthru and nobroadcast 
365                    //
366 gs.keenan    1.6 
367                    ntermb.t_extend |= TT2$M_PASTHRU;
368                    ntermb.t_mandl |= TT$M_NOBRDCST;
369                  
370 gs.keenan    1.7   //
371                    // Write out new terminal settings 
372                    //
373 gs.keenan    1.6 
374 gs.keenan    1.8   errorcode = sys$qiow(0,	// Wait on event flag zero  
375                  			ichan,	// Channel to input terminal  
376                  			IO$_SETMODE,	// Function - Set Mode 
377                  			&iostatus,	// Status after operation 
378                  			0, 0,	// No AST service   
379                  			&ntermb,	// [P1] Address of Char Buffer 
380                  			sizeof (ntermb),	// [P2] Size of Char Buffer 
381                  			0, 0, 0, 0);	// [P3] - [P6] 
382                  
383                    if (errorcode != SS$_NORMAL)
384 gs.keenan    1.6   {
385 gs.keenan    1.8     return buf;
386 gs.keenan    1.6   }
387                  
388 gs.keenan    1.7   //
389                    // Write a prompt, read characters from the terminal, performing no editing
390                    //  and doing no echo at all.
391                    //
392                  
393                    psize = strlen(prompt);
394                  
395 gs.keenan    1.8   errorcode = sys$qiow(0,		// Event flag 
396                  			ichan,		// Input channel 
397                  			IO$_READPROMPT | IO$M_NOECHO | IO$M_NOFILTR | IO$M_TRMNOECHO,
398 gs.keenan    1.9 					// Read with prompt, no echo, no translate, no termination character echo
399 gs.keenan    1.8 			&iostatus,	// I/O status block 
400                  			NULL,		// AST block (none) 
401                  			0,		// AST parameter 
402                  			&buf,		// P1 - input buffer 
403                  			MAX_PASS_LEN,	// P2 - buffer length 
404                  			0,		// P3 - ignored (timeout) 
405                  			0,		// P4 - ignored (terminator char set) 
406                  			prompt,		// P5 - prompt buffer 
407                  			psize);		// P6 - prompt size 
408                  
409                    if (errorcode != SS$_NORMAL)
410 gs.keenan    1.7   {
411 gs.keenan    1.8     return buf;
412 gs.keenan    1.7   }
413                  
414                    //
415                    // Write out old terminal settings 
416                    //
417 gs.keenan    1.6 
418 gs.keenan    1.8   errorcode = sys$qiow(0,	// Wait on event flag zero  
419                  			ichan,	// Channel to input terminal  
420                  			IO$_SETMODE,	// Function - Set Mode 
421                  			&iostatus,	// Status after operation 
422                  			0, 0,	// No AST service   
423                  			&otermb,	// [P1] Address of Char Buffer 
424                  			sizeof (otermb),	// [P2] Size of Char Buffer 
425                  			0, 0, 0, 0);	// [P3] - [P6] 
426                  
427                    if (errorcode != SS$_NORMAL)
428 gs.keenan    1.6   {
429 gs.keenan    1.8     return buf;
430 gs.keenan    1.6   }
431 gs.keenan    1.8 
432                    //
433                    // Start new line
434                    //
435                  
436 gs.keenan    1.7   fputc (CR, stdout);
437                    fputc (LF, stdout);
438 gs.keenan    1.6 
439 gs.keenan    1.9   // 
440                    // Remove the termination character
441                    // 
442                  
443                    psize = strlen(buf);
444                    buf[psize-1] = 0;
445 gs.keenan    1.6   return buf;
446 gs.keenan    1.1 }
447                  
448                  String System::getEffectiveUserName()
449                  {
450 gs.keenan    1.6   String userName = String::EMPTY;
451                    struct passwd *pwd = NULL;
452 gs.keenan    1.1 
453 gs.keenan    1.6   //
454                    //  get the currently logged in user's UID.
455                    //
456                    pwd = getpwuid(geteuid());
457                    if (pwd == NULL)
458                    {
459                    Tracer:: trace(TRC_OS_ABSTRACTION, Tracer::LEVEL4,
460                  	"getpwuid failure, user may have been removed just after login");
461                    }
462                    else
463                    {
464 gs.keenan    1.1     //
465 gs.keenan    1.6     //  get the user name
466 gs.keenan    1.1     //
467 gs.keenan    1.6     userName.assign(pwd->pw_name);
468                    }
469                    return (userName);
470                  }
471                  
472                  String System::encryptPassword(const char *password, const char *salt)
473                  {
474                    char pbBuffer[MAX_PASS_LEN] = {0};
475                    int dwByteCount;
476                    char pcSalt[3] = {0};
477                  
478                    strncpy(pcSalt, salt, 2);
479                    dwByteCount = strlen(password);
480                    memcpy(pbBuffer, password, dwByteCount);
481                    for (int i=0; (i<dwByteCount) || (i>=MAX_PASS_LEN); i++)
482                    {
483                      (i%2 == 0) ? pbBuffer[i] ^= pcSalt[1] : pbBuffer[i] ^= pcSalt[0];
484                    }
485                  
486                    return String(pcSalt) + String((char *)pbBuffer);
487 gs.keenan    1.1 }
488                  
489 gs.keenan    1.6 Boolean System::isSystemUser(const char *userName)
490 gs.keenan    1.1 {
491 gs.keenan    1.6   //
492                    //  get the password entry for the user
493                    //
494                    struct passwd *result;
495                  
496                    result = getpwnam(userName);
497                  
498                    if (result == NULL)
499                    {
500                      return false;
501                    }
502                    return true;
503 gs.keenan    1.1 }
504                  
505 gs.keenan    1.6 Boolean System::isPrivilegedUser(const String & userName)
506 gs.keenan    1.1 {
507 gs.keenan    1.6   //
508                    // Check if the given user is a privileged user
509                    //
510                    int retStat;
511                  
512                    unsigned long int prvPrv = 0;
513                  
514                    retStat = sys$setprv(0, 0, 0, &prvPrv);
515                    if (!$VMS_STATUS_SUCCESS(retStat))
516                    {
517                      return false;
518                    }
519                    if ((PRV$M_SETPRV && prvPrv) == 1)
520                    {
521 gs.keenan    1.1     return true;
522 gs.keenan    1.6   }
523                    else
524                    {
525                      return false;
526                    }
527 gs.keenan    1.1 }
528                  
529 gs.keenan    1.6 String System::getPrivilegedUserName()
530 gs.keenan    1.1 {
531 gs.keenan    1.6   static String userName = String::EMPTY;
532                  
533                  if (userName == String::EMPTY)
534                    {
535                      struct passwd *pwd = NULL;
536 gs.keenan    1.1     //
537 gs.keenan    1.6     //  get the privileged user's UID.
538 gs.keenan    1.1     //
539                  
540 gs.keenan    1.6     pwd = getpwuid(geteuid());
541                      if (pwd != NULL)
542 gs.keenan    1.1     {
543 gs.keenan    1.6       //
544                        //  get the user name
545                        //
546                        userName.assign(pwd->pw_name);
547 gs.keenan    1.1     }
548                      else
549                      {
550 gs.keenan    1.6     Tracer:: trace(TRC_OS_ABSTRACTION, Tracer::LEVEL4,
551                  	    "Could not find entry.");
552                        PEGASUS_ASSERT(0);
553 gs.keenan    1.1     }
554 gs.keenan    1.6   }
555                    return (userName);
556 gs.keenan    1.1 }
557                  
558                  #ifdef PEGASUS_ENABLE_USERGROUP_AUTHORIZATION
559                  
560 gs.keenan    1.6 Boolean System::isGroupMember(const char *userName, const char *groupName)
561 gs.keenan    1.1 {
562 gs.keenan    1.6   struct group grp;
563                    char *member;
564                    Boolean retVal = false;
565                    const unsigned int PWD_BUFF_SIZE = 1024;
566                    const unsigned int GRP_BUFF_SIZE = 1024;
567                    struct passwd pwd;
568                    struct passwd *result;
569                    struct group *grpresult;
570                    char pwdBuffer[PWD_BUFF_SIZE];
571                    char grpBuffer[GRP_BUFF_SIZE];
572                  
573                    //
574                    // Search Primary group information.
575                    //
576 gs.keenan    1.1 
577 gs.keenan    1.6   // Find the entry that matches "userName"
578 gs.keenan    1.1 
579 gs.keenan    1.6   if (getpwnam_r(userName, &pwd, pwdBuffer, PWD_BUFF_SIZE, &result) != 0)
580                    {
581                      String errorMsg = String("getpwnam_r failure : ") +
582                      String(strerror(errno));
583                    Tracer:: PEG_TRACE_STRING(TRC_OS_ABSTRACTION, Tracer::LEVEL2,
584                  		     errorMsg);
585                    Logger:: put(Logger:: STANDARD_LOG, "CIMServer", Logger::WARNING,
586                  	errorMsg);
587                      throw InternalSystemError();
588                    }
589 gs.keenan    1.1 
590 gs.keenan    1.6   if (result != NULL)
591                    {
592                      // User found, check for group information.
593                      gid_t group_id;
594                      group_id = pwd.pw_gid;
595                  
596                      // Get the group name using group_id and compare with group passed.
597                      if (getgrgid_r(group_id, &grp,
598                  		   grpBuffer, GRP_BUFF_SIZE, &grpresult) != 0)
599                      {
600                        String errorMsg = String("getgrgid_r failure : ") +
601                        String(strerror(errno));
602                      Tracer:: PEG_TRACE_STRING(TRC_OS_ABSTRACTION, Tracer::LEVEL2,
603                  		       errorMsg);
604                      Logger:: put(Logger:: STANDARD_LOG, "CIMServer", Logger::WARNING,
605                  	  errorMsg);
606                        throw InternalSystemError();
607 gs.keenan    1.1     }
608                  
609 gs.keenan    1.6     // Compare the user's group name to groupName.
610                      if (strcmp(grp.gr_name, groupName) == 0)
611 gs.keenan    1.1     {
612 gs.keenan    1.6       // User is a member of the group.
613                        return true;
614 gs.keenan    1.1     }
615 gs.keenan    1.6   }
616 gs.keenan    1.1 
617 gs.keenan    1.6   //
618                    // Search supplemental groups.
619                    // Get a user group entry
620                    //
621                    if (getgrnam_r(groupName, &grp,
622                  		 grpBuffer, GRP_BUFF_SIZE, &grpresult) != 0)
623                  
624                    {
625                      String errorMsg = String("getgrnam_r failure : ") +
626                      String(strerror(errno));
627                    Tracer:: PEG_TRACE_STRING(TRC_OS_ABSTRACTION, Tracer::LEVEL2,
628                  		     errorMsg);
629                    Logger:: put(Logger:: STANDARD_LOG, "CIMServer", Logger::WARNING,
630                  	errorMsg);
631                      throw InternalSystemError();
632                    }
633 gs.keenan    1.1 
634 gs.keenan    1.6   // Check if the requested group was found.
635                    if (grpresult == NULL)
636                    {
637                      return false;
638                    }
639 gs.keenan    1.1 
640 gs.keenan    1.6   Uint32 j = 0;
641 gs.keenan    1.1 
642 gs.keenan    1.6   //
643                    // Get all the members of the group
644                    //
645                    member = grp.gr_mem[j++];
646 gs.keenan    1.1 
647 gs.keenan    1.6   while (member)
648                    {
649 gs.keenan    1.1     //
650 gs.keenan    1.6     // Check if the user is a member of the group
651 gs.keenan    1.1     //
652 gs.keenan    1.6     if (strcmp(userName, member) == 0)
653 gs.keenan    1.1     {
654 gs.keenan    1.6       retVal = true;
655                        break;
656 gs.keenan    1.1     }
657 gs.keenan    1.6     member = grp.gr_mem[j++];
658                    }
659 gs.keenan    1.1 
660 gs.keenan    1.6   return retVal;
661 gs.keenan    1.1 }
662                  
663                  #endif
664                  
665 gs.keenan    1.6 Boolean System::changeUserContext(const char *userName)
666 gs.keenan    1.1 {
667 gs.keenan    1.6   const unsigned int PWD_BUFF_SIZE = 1024;
668                    struct passwd pwd;
669                    struct passwd *result;
670                    char pwdBuffer[PWD_BUFF_SIZE];
671 gs.keenan    1.1 
672 gs.keenan    1.6   int rc = getpwnam_r(userName, &pwd, pwdBuffer, PWD_BUFF_SIZE, &result);
673 gs.keenan    1.1 
674 gs.keenan    1.6   if (rc != 0)
675                    {
676                    PEG_TRACE_STRING(TRC_OS_ABSTRACTION, Tracer::LEVEL2,
677                  		String("getpwnam_r failed: ") + String(strerror(errno)));
678                      return false;
679                    }
680 gs.keenan    1.1 
681 gs.keenan    1.6   if (result == 0)
682                    {
683                    Tracer:: PEG_TRACE_STRING(TRC_OS_ABSTRACTION, Tracer::LEVEL2,
684                  		     "getpwnam_r failed.");
685                      return false;
686                    }
687 gs.keenan    1.1 
688 gs.keenan    1.6 Tracer:: trace(TRC_OS_ABSTRACTION, Tracer::LEVEL4,
689                  	"Changing user context to: uid = %d, gid = %d",
690                  	(int) pwd.pw_uid, (int) pwd.pw_gid);
691 gs.keenan    1.1 
692 gs.keenan    1.6   if (setgid(pwd.pw_gid) != 0)
693                    {
694                    PEG_TRACE_STRING(TRC_OS_ABSTRACTION, Tracer::LEVEL2,
695                  		     String("setgid failed: ") + String(strerror(errno)));
696                      return false;
697                    }
698 gs.keenan    1.1 
699 gs.keenan    1.6   if (setuid(pwd.pw_uid) != 0)
700                    {
701                    PEG_TRACE_STRING(TRC_OS_ABSTRACTION, Tracer::LEVEL2,
702                  		     String("setuid failed: ") + String(strerror(errno)));
703                      return false;
704                    }
705 gs.keenan    1.1 
706 gs.keenan    1.6   return true;
707 gs.keenan    1.1 }
708                  
709                  Uint32 System::getPID()
710                  {
711 gs.keenan    1.6   //
712                    // Get the Process ID
713                    //
714                    Uint32 pid = getpid();
715 gs.keenan    1.1 
716 gs.keenan    1.6   return pid;
717 gs.keenan    1.1 }
718                  
719                  Boolean System::truncateFile(
720 gs.keenan    1.6 			      const char *path,
721                  			      size_t newSize)
722 gs.keenan    1.1 {
723 gs.keenan    1.6   return (truncate(path, newSize) == 0);
724 gs.keenan    1.1 }
725                  
726                  // Is absolute path?
727                  Boolean System::is_absolute_path(const char *path)
728                  {
729                    if (path == NULL)
730                      return false;
731 gs.keenan    1.6 
732 gs.keenan    1.1   if (path[0] == '/')
733                      return true;
734 gs.keenan    1.6 
735 gs.keenan    1.1   return false;
736                  }
737                  
738                  // Changes file permissions on the given file.
739 gs.keenan    1.6 Boolean System::changeFilePermissions(const char *path, mode_t mode)
740 gs.keenan    1.1 {
741 gs.keenan    1.6   Sint32 ret = 0;
742 gs.keenan    1.1 
743 gs.keenan    1.6   const char *tmp = path;
744                    ret = chmod(tmp, mode);
745                    return (ret != -1);
746 gs.keenan    1.1 }
747                  
748 gs.keenan    1.6 Boolean System::verifyFileOwnership(const char *path)
749 gs.keenan    1.1 {
750 gs.keenan    1.6   struct stat st;
751 gs.keenan    1.1 
752 kumpf        1.11   if (lstat(path, &st) != 0)
753 gs.keenan    1.6    {
754                       return false;
755                     }
756 kumpf        1.10 
757                     return ((st.st_uid == geteuid()) &&    // Verify the file owner
758                             S_ISREG(st.st_mode) &&         // Verify it is a regular file
759                             (st.st_nlink == 1));           // Verify it is not a hard link
760 gs.keenan    1.1  }
761                   
762 gs.keenan    1.6  void System::syslog(const String & ident, Uint32 severity, const char *message)
763 gs.keenan    1.1  {
764 gs.keenan    1.6    // Not implemented
765 gs.keenan    1.1  }
766                   
767                   // System ID constants for Logger::put and Logger::trace
768                   
769 gs.keenan    1.6  const String System::CIMSERVER = "cimserver";	// Server system ID
770                   
771 gs.keenan    1.1  PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2