📄 tlib.cxx
字号:
if (username[0] == '#') { PString s = username.Mid(1); if (strspn(s, "1234567890") == strlen(s)) 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 (strspn(username, "1234567890") == strlen(username)) uid = username.AsInteger(); } } if (uid < 0) return FALSE; 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}BOOL PProcess::SetGroupName(const PString & groupname, BOOL permanent){#ifdef P_VXWORKS PAssertAlways("PProcess::SetGroupName - not implemented for VxWorks"); return FALSE;#else if (groupname.IsEmpty()) return setegid(getgid()) != -1; int gid = -1; if (groupname[0] == '#') { PString s = groupname.Mid(1); if (strspn(s, "1234567890") == strlen(s)) 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 (strspn(groupname, "1234567890") == strlen(groupname)) gid = groupname.AsInteger(); } } if (gid < 0) return FALSE; if (permanent) return setgid(gid) != -1; return setegid(gid) != -1;#endif // P_VXWORKS}void PProcess::PXShowSystemWarning(PINDEX num){ PXShowSystemWarning(num, "");}void PProcess::PXShowSystemWarning(PINDEX num, const PString & str){ PProcess::Current()._PXShowSystemWarning(num, str);}void PProcess::_PXShowSystemWarning(PINDEX code, const PString & str){ PError << "PWLib " << GetOSClass() << " error #" << code << '-' << str << endl;}void PXSignalHandler(int sig){#ifdef SIGNALS_DEBUG fprintf(stderr,"\nSIGNAL<%u>\n",sig);#endif PProcess & process = PProcess::Current(); process.pxSignals |= 1 << sig; process.PXOnAsyncSignal(sig);#if defined(P_MAC_MPTHREADS) process.SignalTimerChange();#elif defined(P_PTHREADS) // Inform house keeping thread we have a signal to be processed BYTE ch; write(process.timerChangePipe[1], &ch, 1);#endif signal(sig, PXSignalHandler);}void PProcess::PXCheckSignals(){ if (pxSignals == 0) return;#ifdef SIGNALS_DEBUG fprintf(stderr,"\nCHKSIG<%x>\n",pxSignals);#endif for (int sig = 0; sig < 32; sig++) { int bit = 1 << sig; if ((pxSignals&bit) != 0) { pxSignals &= ~bit; PXOnSignal(sig); } }}void SetSignals(void (*handler)(int)){#ifdef SIGNALS_DEBUG fprintf(stderr,"\nSETSIG<%x>\n",(INT)handler);#endif if (handler == NULL) handler = SIG_DFL;#ifdef SIGHUP signal(SIGHUP, handler);#endif#ifdef SIGINT signal(SIGINT, handler);#endif#ifdef SIGUSR1 signal(SIGUSR1, handler);#endif#ifdef SIGUSR2 signal(SIGUSR2, handler);#endif#ifdef SIGPIPE signal(SIGPIPE, handler);#endif#ifdef SIGTERM signal(SIGTERM, handler);#endif#ifdef SIGWINCH signal(SIGWINCH, handler);#endif#ifdef SIGPROF signal(SIGPROF, handler);#endif}void PProcess::PXOnAsyncSignal(int sig){#ifdef SIGNALS_DEBUG fprintf(stderr,"\nASYNCSIG<%u>\n",sig);#endif switch (sig) { case SIGINT: case SIGTERM: case SIGHUP: raise(SIGKILL); break; default: return; }}void PProcess::PXOnSignal(int sig){#ifdef SIGNALS_DEBUG fprintf(stderr,"\nSYNCSIG<%u>\n",sig);#endif}void PProcess::CommonConstruct(){ // Setup signal handlers pxSignals = 0; SetSignals(&PXSignalHandler);#if !defined(P_VXWORKS) && !defined(P_RTEMS) // initialise the timezone information tzset();#endif CreateConfigFilesDictionary();}void PProcess::CommonDestruct(){ delete configFiles; configFiles = NULL; SetSignals(NULL);}// rtems fixes#ifdef P_RTEMSextern "C" {#include <netinet/in.h>#include <rtems/rtems_bsdnet.h> int socketpair(int d, int type, int protocol, int sv[2]){ static int port_count = IPPORT_USERRESERVED; int s; int addrlen; struct sockaddr_in addr1, addr2; static int network_status = 1; if (network_status>0) { printf("\"Network\" initializing!\n"); network_status = rtems_bsdnet_initialize_network(); if (network_status == 0) printf("\"Network\" initialized!\n"); else { printf("Error: %s\n", strerror(errno)); return -1; } } /* prepare sv */ sv[0]=sv[1]=-1; /* make socket */ s = socket( d, type, protocol); if (s<0) return -1; memset(&addr1, 0, sizeof addr1); addr1.sin_family = d; addr1.sin_port = htons(++port_count); addr1.sin_addr.s_addr = htonl(INADDR_LOOPBACK); if (bind(s, (struct sockaddr *)&addr1, sizeof addr1) < 0) { close(s); return -1; } if (listen(s, 2) < 0 ) { close(s); return -1; } sv[0] = socket(d, type, protocol); if (sv[0] < 0) { close(s); return -1; } memset(&addr2, 0, sizeof addr2); addr2.sin_family = d; addr2.sin_port = htons(++port_count); addr2.sin_addr.s_addr = htonl(INADDR_LOOPBACK); if (bind(sv[0], (struct sockaddr *)&addr2, sizeof addr2) < 0) { close(s); close(sv[0]); sv[0]=-1; return -1; } if (connect(sv[0], (struct sockaddr *)&addr1, sizeof addr1) < 0) { close(s); close(sv[0]); sv[0]=-1; return -1; } sv[1] = accept(s, (struct sockaddr *)&addr2, &addrlen); if (sv[1] < 0) { close(s); close(sv[0]); sv[0]=-1; return -1; } close(s); return 0;}/* * Loopback interface */extern int rtems_bsdnet_loopattach(rtems_bsdnet_ifconfig *);static struct rtems_bsdnet_ifconfig loopback_config = { "lo0", /* name */ rtems_bsdnet_loopattach, /* attach function */ NULL, /* link to next interface */ "127.0.0.1", /* IP address */ "255.0.0.0", /* IP net mask */};#include <bsp.h>#warning Change lines below to match Your system settings/* * Default network interface */static struct rtems_bsdnet_ifconfig netdriver_config = { RTEMS_BSP_NETWORK_DRIVER_NAME, /* name */ RTEMS_BSP_NETWORK_DRIVER_ATTACH, /* attach function */ &loopback_config, /* link to next interface */ "10.0.0.2", /* IP address */ "255.255.255.0", /* IP net mask */ NULL, /* Driver supplies hardware address */ 0 /* Use default driver parameters */};/* * Network configuration */struct rtems_bsdnet_config rtems_bsdnet_config = { &netdriver_config, NULL, /* no bootp function */ 1, /* Default network task priority */ 0, /* Default mbuf capacity */ 0, /* Default mbuf cluster capacity */ "computer.name", /* Host name */ "domain.name", /* Domain name */ "10.0.0.1", /* Gateway */ "10.0.0.1", /* Log host */ {"10.0.0.1" }, /* Name server(s) */ {"10.0.0.1" }, /* NTP server(s) */};#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER#define CONFIGURE_MICROSECONDS_PER_TICK 1000#define CONFIGURE_TICKS_PER_TIMESLICE 50#define CONFIGURE_MAXIMUM_TASKS rtems_resource_unlimited(50)#define CONFIGURE_MAXIMUM_TIMERS rtems_resource_unlimited(50)#define CONFIGURE_MAXIMUM_SEMAPHORES rtems_resource_unlimited(50)#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES rtems_resource_unlimited(50)#define CONFIGURE_MAXIMUM_MUTEXES rtems_resource_unlimited(50)#define CONFIGURE_MAXIMUM_POSIX_THREADS 500#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 500#define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 500#define CONFIGURE_MAXIMUM_POSIX_KEYS 500#define CONFIGURE_MAXIMUM_POSIX_TIMERS 500#define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 500#define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES 500#define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES 500#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 500#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM#define CONFIGURE_POSIX_INIT_THREAD_TABLE#define CONFIGURE_INIT_TASK_INITIAL_MODES (RTEMS_PREEMPT | RTEMS_TIMESLICE)#ifdef DEBUG#define STACK_CHECKER_ON#endifvoid* POSIX_Init(void*);#define CONFIGURE_INIT#include <confdefs.h>}#endif // P_RTEMS////////////////////////////////////////////////////////////////////// Non-PTHREAD based routines//#if defined(P_MAC_MPTHREADS)#include "tlibmpthrd.cxx"#elif defined(P_PTHREADS)#include "tlibthrd.cxx"#elif defined(BE_THREADS)#include "tlibbe.cxx"#elif defined(VX_TASKS)#include "tlibvx.cxx"#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -