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
|