📄 tlib.cxx
字号:
/*
* tlib.cxx
*
* Miscelaneous class implementation
*
* Portable Windows Library
*
* Copyright (c) 1993-1998 Equivalence Pty. Ltd.
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is Portable Windows Library.
*
* The Initial Developer of the Original Code is Equivalence Pty. Ltd.
*
* Portions are Copyright (C) 1993 Free Software Foundation, Inc.
* All Rights Reserved.
*
* Contributor(s): ______________________________________.
*
* $Revision: 19008 $
* $Author: rjongbloed $
* $Date: 2007-11-29 09:17:41 +0000 (Thu, 29 Nov 2007) $
*/
#define _OSUTIL_CXX
//#define SIGNALS_DEBUG
#pragma implementation "args.h"
#pragma implementation "pprocess.h"
#pragma implementation "thread.h"
#pragma implementation "semaphor.h"
#pragma implementation "mutex.h"
#pragma implementation "critsec.h"
#pragma implementation "psync.h"
#pragma implementation "syncpoint.h"
#pragma implementation "syncthrd.h"
#include "ptlib.h"
#include <ptlib/pprocess.h>
#ifdef P_VXWORKS
#include <sys/times.h>
#include <time.h>
#include <hostLib.h>
#include <remLib.h>
#include <taskLib.h>
#include <intLib.h>
#else
#include <sys/time.h>
#include <pwd.h>
#include <grp.h>
#endif // P_VXWORKS
#include <signal.h>
#include <sys/wait.h>
#include <errno.h>
#if defined(P_LINUX)
#include <sys/cdefs.h>
#include <sys/types.h>
#include <sys/mman.h>
#endif
#if defined(P_LINUX) || defined(P_SUN4) || defined(P_SOLARIS) || defined(P_FREEBSD) || defined(P_OPENBSD) || defined(P_NETBSD) || defined(P_MACOSX) || defined(P_MACOS) || defined (P_AIX) || defined(__BEOS__) || defined(P_IRIX) || defined(P_QNX)
#include <sys/utsname.h>
#define HAS_UNAME
#elif defined(P_RTEMS)
extern "C" {
#include <sys/utsname.h>
}
#define HAS_UNAME
#endif
#include "uerror.h"
#if defined(P_HPUX9)
#define SELECT(p1,p2,p3,p4,p5) select(p1,(int *)(p2),(int *)(p3),(int *)(p4),p5)
#else
#define SELECT(p1,p2,p3,p4,p5) select(p1,p2,p3,p4,p5)
#endif
#if defined(P_SUN4)
extern "C" void bzero(void *, int);
extern "C" int select(int width,
fd_set *readfds,
fd_set *writefds,
fd_set *exceptfds,
struct timeval *timeout);
#endif
#ifdef __BEOS__
#include "OS.h"
#endif
#include "../common/pglobalstatic.cxx"
PString PProcess::GetOSClass()
{
#ifndef __BEOS__
return PString("Unix");
#elif defined P_VXWORKS
return PString("VxWorks");
#else
return PString("Be Inc.");
#endif
}
PString PProcess::GetOSName()
{
#if defined(HAS_UNAME)
struct utsname info;
uname(&info);
#ifdef P_SOLARIS
return PString(info.sysname) & info.release;
#else
return PString(info.sysname);
#endif
#elif defined(P_VXWORKS)
return PString::Empty();
#else
#warning No GetOSName specified
return PString("Unknown");
#endif
}
PString PProcess::GetOSHardware()
{
#if defined(HAS_UNAME)
struct utsname info;
uname(&info);
return PString(info.machine);
#elif defined(P_VXWORKS)
return PString(sysModel());
#else
#warning No GetOSHardware specified
return PString("unknown");
#endif
}
PString PProcess::GetOSVersion()
{
#if defined(HAS_UNAME)
struct utsname info;
uname(&info);
#ifdef P_SOLARIS
return PString(info.version);
#else
return PString(info.release);
#endif
#elif defined(P_VXWORKS)
return PString(sysBspRev());
#else
#warning No GetOSVersion specified
return PString("?.?");
#endif
}
PDirectory PProcess::GetOSConfigDir()
{
#ifdef P_VXWORKS
return "./";
#else
return "/etc";
#endif // P_VXWORKS
}
PDirectory PProcess::PXGetHomeDir ()
{
#ifdef P_VXWORKS
return "./";
#else
PString dest;
char *ptr;
struct passwd *pw = NULL;
#if defined(P_PTHREADS) && !defined(P_THREAD_SAFE_CLIB)
struct passwd pwd;
char buffer[1024];
#if defined (P_LINUX) || defined(P_AIX) || defined(P_IRIX) || (__GNUC__>=3 && defined(P_SOLARIS)) || defined(P_RTEMS)
::getpwuid_r(geteuid(), &pwd,
buffer, 1024,
&pw);
#else
pw = ::getpwuid_r(geteuid(), &pwd, buffer, 1024);
#endif
#else
pw = ::getpwuid(geteuid());
#endif
if (pw != NULL && pw->pw_dir != NULL)
dest = pw->pw_dir;
else if ((ptr = getenv ("HOME")) != NULL)
dest = ptr;
else
dest = ".";
if (dest.GetLength() > 0 && dest[dest.GetLength()-1] != '/')
dest += "/";
return dest;
#endif
}
///////////////////////////////////////////////////////////////////////////////
//
// PProcess
//
// Return the effective user name of the process, eg "root" etc.
PString PProcess::GetUserName() const
{
#ifdef P_VXWORKS
char pnamebuf[1024];
int len = 1024;
STATUS gethostresult;
gethostresult =::gethostname(pnamebuf,len);
if (gethostresult == OK)
return PString(pnamebuf,len);
else
return PString("VxWorks");
#else
#if defined(P_PTHREADS) && !defined(P_THREAD_SAFE_CLIB)
struct passwd pwd;
char buffer[1024];
struct passwd * pw = NULL;
#if defined (P_LINUX) || defined (P_AIX) || defined(P_IRIX) || (__GNUC__>=3 && defined(P_SOLARIS)) || defined(P_RTEMS)
::getpwuid_r(geteuid(), &pwd, buffer, 1024, &pw);
#else
pw = ::getpwuid_r(geteuid(), &pwd, buffer, 1024);
#endif
#else
struct passwd * pw = ::getpwuid(geteuid());
#endif
char * ptr;
if (pw != NULL && pw->pw_name != NULL)
return PString(pw->pw_name);
else if ((ptr = getenv("USER")) != NULL)
return PString(ptr);
else
return PString("user");
#endif // P_VXWORKS
}
PBoolean PProcess::SetUserName(const PString & username, PBoolean permanent)
{
#ifdef P_VXWORKS
PAssertAlways("PProcess::SetUserName - not implemented for VxWorks");
return PFalse;
#else
if (username.IsEmpty())
return seteuid(getuid()) != -1;
int uid = -1;
if (username[0] == '#') {
PString s = username.Mid(1);
if (s.FindSpan("1234567890") == P_MAX_INDEX)
uid = s.AsInteger();
}
else {
#if defined(P_PTHREADS) && !defined(P_THREAD_SAFE_CLIB)
struct passwd pwd;
char buffer[1024];
struct passwd * pw = NULL;
#if defined (P_LINUX) || defined (P_AIX) || defined(P_IRIX) || (__GNUC__>=3 && defined(P_SOLARIS)) || defined(P_RTEMS)
::getpwnam_r(username, &pwd, buffer, 1024, &pw);
#else
pw = ::getpwnam_r(username, &pwd, buffer, 1024);
#endif
#else
struct passwd * pw = ::getpwnam(username);
#endif
if (pw != NULL && pw->pw_name != NULL)
uid = pw->pw_uid;
else {
if (username.FindSpan("1234567890") == P_MAX_INDEX)
uid = username.AsInteger();
}
}
if (uid < 0)
return PFalse;
if (permanent)
return setuid(uid) != -1;
return seteuid(uid) != -1;
#endif // P_VXWORKS
}
///////////////////////////////////////////////////////////////////////////////
//
// PProcess
//
// Return the effective group name of the process, eg "wheel" etc.
PString PProcess::GetGroupName() const
{
#ifdef P_VXWORKS
return PString("VxWorks");
#else
#if defined(P_PTHREADS) && !defined(P_THREAD_SAFE_CLIB)
struct group grp;
char buffer[1024];
struct group * gr = NULL;
#if defined (P_LINUX) || defined (P_AIX) || defined(P_IRIX) || (__GNUC__>=3 && defined(P_SOLARIS)) || defined(P_RTEMS)
::getgrgid_r(getegid(), &grp, buffer, 1024, &gr);
#else
gr = ::getgrgid_r(getegid(), &grp, buffer, 1024);
#endif
#else
struct group * gr = ::getgrgid(getegid());
#endif
char * ptr;
if (gr != NULL && gr->gr_name != NULL)
return PString(gr->gr_name);
else if ((ptr = getenv("GROUP")) != NULL)
return PString(ptr);
else
return PString("group");
#endif // P_VXWORKS
}
PBoolean PProcess::SetGroupName(const PString & groupname, PBoolean permanent)
{
#ifdef P_VXWORKS
PAssertAlways("PProcess::SetGroupName - not implemented for VxWorks");
return PFalse;
#else
if (groupname.IsEmpty())
return setegid(getgid()) != -1;
int gid = -1;
if (groupname[0] == '#') {
PString s = groupname.Mid(1);
if (s.FindSpan("1234567890") == P_MAX_INDEX)
gid = s.AsInteger();
}
else {
#if defined(P_PTHREADS) && !defined(P_THREAD_SAFE_CLIB)
struct group grp;
char buffer[1024];
struct group * gr = NULL;
#if defined (P_LINUX) || defined (P_AIX) || defined(P_IRIX) || (__GNUC__>=3 && defined(P_SOLARIS)) || defined(P_RTEMS)
::getgrnam_r(groupname, &grp, buffer, 1024, &gr);
#else
gr = ::getgrnam_r(groupname, &grp, buffer, 1024);
#endif
#else
struct group * gr = ::getgrnam(groupname);
#endif
if (gr != NULL && gr->gr_name != NULL)
gid = gr->gr_gid;
else {
if (groupname.FindSpan("1234567890") == P_MAX_INDEX)
gid = groupname.AsInteger();
}
}
if (gid < 0)
return PFalse;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -