⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svcproc.cxx

📁 安装 H323需要的pwlib库
💻 CXX
📖 第 1 页 / 共 2 页
字号:
/* * svcproc.cxx * * Service process (daemon) 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): ______________________________________. * * $Log: svcproc.cxx,v $ * Revision 1.86  2004/06/01 07:42:19  csoutheren * Restored memory allocation checking * Added configure flag to enable, thanks to Derek Smithies * * Revision 1.85  2004/04/03 08:57:41  csoutheren * Replaced pseudo-RTTI with real RTTI * * Revision 1.84  2004/02/22 03:31:50  ykiryanov * Added current thread id routine to BeOS code * * Revision 1.83  2003/09/17 09:02:14  csoutheren * Removed memory leak detection code * * Revision 1.82  2003/01/14 04:43:21  robertj * Improved output on error in getting service status. * * Revision 1.81  2002/12/12 00:54:29  robertj * Fixed issue with setting max file handles causing a log file to be created *   as root (real uid) rather than as the user determined by the -u arg. * Utilised new PProcess functions for setting user and group. * * Revision 1.80  2002/12/02 08:27:43  robertj * Fixed incorrectly set #if statement from RTEMS patch. * * Revision 1.79  2002/12/02 03:57:18  robertj * More RTEMS support patches, thank you Vladimir Nesic. * * Revision 1.78  2002/11/02 00:32:21  robertj * Further fixes to VxWorks (Tornado) port, thanks Andreas Sikkema. * * Revision 1.77  2002/10/30 03:14:15  robertj * Added tab character between time and thread in system log (for db import). * * Revision 1.76  2002/10/23 04:26:27  robertj * Fixed extra debug levels in system log dump. * * Revision 1.75  2002/10/17 13:44:27  robertj * Port to RTEMS, thanks Vladimir Nesic. * * Revision 1.74  2002/10/17 12:57:24  robertj * Added ability to increase maximum file handles on a process. * * Revision 1.73  2002/10/10 04:43:44  robertj * VxWorks port, thanks Martijn Roest * * Revision 1.72  2002/10/03 01:27:51  robertj * Added fail safe _exit() as it appears raise(SIGQUIT) does not always dump *   core and exit the app causing endless SEGV's to appear the log file! * * Revision 1.71  2002/10/01 06:03:44  robertj * Attempt to prevent recursive signals for SEGV etc * * Revision 1.70  2002/09/06 13:29:06  robertj * Added missing help line for status command. * * Revision 1.69  2002/07/15 06:39:23  craigs * Added function to allow raising of per-process file handle limit * * Revision 1.68  2002/06/13 08:50:11  rogerh * GCC 3.1 uses slightly different #includes * * Revision 1.67  2002/06/05 12:29:16  craigs * Changes for gcc 3.1 * * Revision 1.66  2002/04/17 03:31:48  robertj * Renamed system log file member variable to be common with Windows version. * * Revision 1.65  2002/03/18 08:03:30  robertj * Fixed hex output of thread pid. * Added ability to have -tk option wich attempt to terminate a daemon and *   if no response in 10 seconds kills it. * Fixed leaving .pid file behind when using -k option. * * Revision 1.64  2002/02/19 07:12:36  rogerh * Mac Carbon fix * * Revision 1.63  2001/12/16 23:40:16  robertj * Fixed system log so does not crash if current thread not created by PWLib. * * Revision 1.62  2001/12/09 23:45:20  craigs * Set debugMode flag when in .... debug mode! * * Revision 1.61  2001/09/20 05:35:47  robertj * Fixed crash (race condition) if shutdown service via signal and exit main. * * Revision 1.60  2001/08/11 15:38:43  rogerh * Add Mac OS Carbon changes from John Woods <jfw@jfwhome.funhouse.com> * * Revision 1.59  2001/08/07 03:05:54  robertj * Expanded thread name field width in system log. * * Revision 1.58  2001/07/09 04:26:08  yurik * Fixed lack of pthread_self function on BeOS * * Revision 1.57  2001/07/04 08:54:23  robertj * Added dump of thread in SEGV signal handler, this one seems to work. * * Revision 1.56  2001/07/03 04:41:25  yurik * Corrections to Jac's submission from 6/28 * * Revision 1.55  2001/06/30 06:59:07  yurik * Jac Goudsmit from Be submit these changes 6/28. Implemented by Yuri Kiryanov * * Revision 1.54  2001/05/03 01:13:10  robertj * Closed stdin if in background, should never block in tty I/O if daemon! * * Revision 1.53  2001/04/20 05:41:35  craigs * Added ability to set core dump size from command line under Linux * * Revision 1.52  2001/04/20 05:08:42  robertj * Removed dump of thread in SEGV signal, it does not work. * * Revision 1.51  2001/04/17 03:13:21  robertj * Added dump of thread address in SEGV etc log output. * * Revision 1.50  2001/04/05 03:09:29  robertj * Changed so output to PError goes to system log. Useful for asserts. * * Revision 1.49  2001/03/29 03:25:03  robertj * Added dumping to log file of SEGV etc if running as daemon. * * Revision 1.48  2001/03/28 23:47:26  robertj * Added start log message and version numbers to start and stop log messages * * Revision 1.47  2001/03/28 05:36:14  robertj * Added milliseconds to system log time output. * * Revision 1.46  2001/03/24 00:49:02  robertj * Added status indication command for services * * Revision 1.45  2001/03/23 01:05:32  robertj * Added check that log file is writable after setuid but before fork. * * Revision 1.44  2001/03/22 22:48:25  robertj * Fixed errors in usage help text. * * Revision 1.43  2001/03/20 06:44:25  robertj * Lots of changes to fix the problems with terminating threads that are I/O *   blocked, especially when doing orderly shutdown of service via SIGTERM. * * Revision 1.42  2001/03/20 01:04:46  robertj * Fixed some difficulties with terminating a service process from signals or *   from simply dropping out of Main(). * * Revision 1.41  2001/03/19 02:41:13  robertj * Extra trace output on exiting service. * * Revision 1.40  2001/03/19 00:20:55  robertj * Added test for if deamon actually stops * * Revision 1.39  2001/03/19 00:11:03  robertj * Added information message when killing service. * * Revision 1.38  2001/03/14 01:30:35  robertj * Do setgid before so setuid, ie when still root. * * Revision 1.37  2001/03/14 01:16:11  robertj * Fixed signals processing, now uses housekeeping thread to handle signals *   synchronously. This also fixes issues with stopping PServiceProcess. * * Revision 1.36  2001/03/13 03:47:18  robertj * Added ability to set pid file from command line. * * Revision 1.35  2001/03/09 06:31:22  robertj * Added ability to set default PConfig file or path to find it. * * Revision 1.34  2000/05/02 03:17:13  robertj * Added display of thread name in SystemLog, thanks Ashley Unitt. * * Revision 1.33  2000/04/03 18:36:50  robertj * Fix for BeOS support (stupid prototype in system header files). * * Revision 1.32  1999/09/14 13:02:53  robertj * Fixed PTRACE to PSYSTEMLOG conversion problem under Unix. * * Revision 1.31  1999/08/17 09:29:22  robertj * Added long name versions of parameters. * * Revision 1.30  1999/08/12 12:12:47  robertj * GCC 2.95 compatibility. * * Revision 1.29  1999/06/23 14:19:46  robertj * Fixed core dump problem with SIGINT/SIGTERM terminating process. * * Revision 1.28  1999/05/13 04:44:18  robertj * Added SIGHUP and SIGWINCH handlers to increase and decrease the log levels. * * Revision 1.27  1999/03/02 05:41:59  robertj * More BeOS changes * * Revision 1.26  1999/01/11 12:10:32  robertj * Improved operating system version display. * * Revision 1.26  1999/01/11 05:20:12  robertj * Added OS to the -v display text. * * Revision 1.25  1998/12/21 06:37:14  robertj * Fixed GNu warning on solaris x86 * * Revision 1.24  1998/12/16 12:41:25  robertj * Fixed bug where .ini file is not written when service run as a daemon. * * Revision 1.23  1998/11/30 21:52:00  robertj * New directory structure. * * Revision 1.22  1998/11/06 03:44:55  robertj * Fixed bug in argument list parsing, not doing it to member variable. * Added check for daemon already running before starting a new daemon. * * Revision 1.21  1998/10/11 02:26:46  craigs * Added thread ID to output messages * * Revision 1.20  1998/09/24 04:12:20  robertj * Added open software license. * */#include <ptlib.h>#pragma implementation "svcproc.h"#include <ptlib/svcproc.h>#ifdef P_VXWORKS#include <logLib.h>#define LOG_EMERG			0#define LOG_ALERT			1#define LOG_CRIT			2#define LOG_ERR				3#define LOG_WARNING			4#define	LOG_NOTICE			5#define LOG_INFO			6#define LOG_DEBUG			7#else#include <syslog.h>#include <pwd.h>#include <grp.h>#endif#include <stdarg.h>#if (__GNUC__ >= 3)#include <fstream>#else#include <fstream.h>#endif#include <signal.h>#include "uerror.h"#ifdef P_LINUX#include <sys/resource.h>#endif#define new PNEW#define	MAX_LOG_LINE_LEN	1024#ifndef P_VXWORKSstatic int PwlibLogToUnixLog[PSystemLog::NumLogLevels] = {  LOG_CRIT,    // LogFatal,     LOG_ERR,     // LogError,     LOG_WARNING, // LogWarning,   LOG_INFO,    // LogInfo,      LOG_DEBUG,   // LogDebug  LOG_DEBUG,  LOG_DEBUG,  LOG_DEBUG,  LOG_DEBUG,  LOG_DEBUG};#endif // !P_VXWORKSstatic const char * const PLevelName[PSystemLog::NumLogLevels+1] = {  "Message",  "Fatal error",  "Error",  "Warning",  "Info",  "Debug",  "Debug2",  "Debug3",  "Debug4",  "Debug5",  "Debug6",};#ifdef P_MAC_MPTHREADS// alas, this can't be statically initialized// XXX This ought to be an MPCriticalRegionID, but they're broken in// XXX Mac OS X 10.0.x!static MPSemaphoreID logMutex;// yuck.static void SetUpLogMutex(){    if (logMutex == 0) {        MPSemaphoreID tempCrit;        long err = MPCreateSemaphore(1, 1, &tempCrit);        PAssertOS(err == 0);        if (!OTCompareAndSwap32(0, (UInt32)tempCrit, (UInt32*)&logMutex)) {            // lost the race            MPDeleteSemaphore(tempCrit);        }    }}#endif#ifdef P_PTHREADSstatic pthread_mutex_t logMutex = PTHREAD_MUTEX_INITIALIZER;#endifvoid PSystemLog::Output(Level level, const char * cmsg){  PString systemLogFileName = PServiceProcess::Current().systemLogFileName;  if (systemLogFileName.IsEmpty()) {#ifdef P_VXWORKS    printf("%s\n",cmsg);    logMsg((char *)(const char)cmsg,0,0,0,0,0,0);#else    syslog(PwlibLogToUnixLog[level], "%s", cmsg);#endif  }  else {#ifdef P_PTHREADS    pthread_mutex_lock(&logMutex);#endif#ifdef P_MAC_MPTHREADS    SetUpLogMutex();    (void)MPWaitOnSemaphore(logMutex, kDurationForever);#endif    ostream * out;    if (systemLogFileName == "-")      out = &cerr;    else      out = new ofstream(systemLogFileName, ios::app);    PTime now;    *out << now.AsString("yyyy/MM/dd hh:mm:ss.uuu\t");    PThread * thread = PThread::Current();    if (thread == NULL) {#ifdef P_MAC_MPTHREADS      unsigned tid = (unsigned)MPCurrentTaskID();#elif defined(P_VXWORKS)      unsigned tid = ::taskIdSelf();#elif defined(BE_THREADS)      thread_id tid = ::find_thread(NULL);#else      unsigned tid = (unsigned) pthread_self();#endif      *out << "ThreadID=0x"           << setfill('0') << ::hex           << setw(8) << tid           << setfill(' ') << ::dec;    } else {      PString threadName = thread->GetThreadName();      if (threadName.GetLength() <= 23)        *out << setw(23) << threadName;      else        *out << threadName.Left(10) << "..." << threadName.Right(10);    }    *out << '\t'         << PLevelName[level+1]         << '\t'         << cmsg << endl;    if (out != &cerr)      delete out;#ifdef P_PTHREADS    pthread_mutex_unlock(&logMutex);#endif#ifdef P_MAC_MPTHREADS    MPSignalSemaphore(logMutex);#endif  }}int PSystemLog::Buffer::overflow(int c){  if (pptr() >= epptr()) {    int ppos = pptr() - pbase();    char * newptr = string.GetPointer(string.GetSize() + 10);    setp(newptr, newptr + string.GetSize() - 1);    pbump(ppos);  }  if (c != EOF) {    *pptr() = (char)c;    pbump(1);  }  return 0;}int PSystemLog::Buffer::underflow(){  return EOF;}int PSystemLog::Buffer::sync(){  PSystemLog::Output(log->logLevel, string);  string = PString();  char * base = string.GetPointer(10);  setp(base, base + string.GetSize() - 1);  return 0;}PServiceProcess::PServiceProcess(const char * manuf,                                 const char * name,                                         WORD majorVersion,                                         WORD minorVersion,                                   CodeStatus status,                                         WORD buildNumber)  : PProcess(manuf, name, majorVersion, minorVersion, status, buildNumber){  currentLogLevel = PSystemLog::Warning;  isTerminating = FALSE;}PServiceProcess::~PServiceProcess(){  if (!pidFileToRemove)    PFile::Remove(pidFileToRemove);#ifndef P_VXWORKS  // close the system log  if (systemLogFileName.IsEmpty())    closelog();#endif // !P_VXWORKS}PServiceProcess & PServiceProcess::Current(){  PProcess & process = PProcess::Current();  PAssert(PIsDescendant(&process, PServiceProcess), "Not a service process!");  return (PServiceProcess &)process;}#ifndef P_VXWORKSstatic int KillProcess(int pid, int sig){  if (kill(pid, sig) != 0)    return -1;  cout << "Sent SIG";  if (sig == SIGTERM)    cout << "TERM";  else    cout << "KILL";  cout << " to daemon at pid " << pid << ' ' << flush;  for (PINDEX retry = 1; retry <= 10; retry++) {    PThread::Sleep(1000);    if (kill(pid, 0) != 0) {      cout << "\nDaemon stopped." << endl;      return 0;    }    cout << '.' << flush;  }  cout << "\nDaemon has not stopped." << endl;  return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -