Author: mladen.turk(a)jboss.com
Date: 2010-07-21 16:01:54 -0400 (Wed, 21 Jul 2010)
New Revision: 2689
Modified:
trunk/utils/windows/native/service/procrun/apps/prunmgr/prunmgr.c
trunk/utils/windows/native/service/procrun/apps/prunmgr/prunmgr.h
trunk/utils/windows/native/service/procrun/apps/prunmgr/prunmgr.rc
trunk/utils/windows/native/service/procrun/apps/prunsrv/prunsrv.c
trunk/utils/windows/native/service/procrun/apps/prunsrv/prunsrv.h
trunk/utils/windows/native/service/procrun/apps/prunsrv/prunsrv.rc
trunk/utils/windows/native/service/procrun/src/cmdline.c
trunk/utils/windows/native/service/procrun/src/handles.c
trunk/utils/windows/native/service/procrun/src/javajni.c
trunk/utils/windows/native/service/procrun/src/log.c
trunk/utils/windows/native/service/procrun/src/mclib.c
trunk/utils/windows/native/service/procrun/src/private.h
trunk/utils/windows/native/service/procrun/src/registry.c
trunk/utils/windows/native/service/procrun/src/rprocess.c
trunk/utils/windows/native/service/procrun/src/service.c
trunk/utils/windows/native/service/procrun/src/utils.c
Log:
Implement JBPAPP-4709
Modified: trunk/utils/windows/native/service/procrun/apps/prunmgr/prunmgr.c
===================================================================
--- trunk/utils/windows/native/service/procrun/apps/prunmgr/prunmgr.c 2010-06-16 10:02:46
UTC (rev 2688)
+++ trunk/utils/windows/native/service/procrun/apps/prunmgr/prunmgr.c 2010-07-21 20:01:54
UTC (rev 2689)
@@ -15,7 +15,7 @@
*/
/* ====================================================================
- * prunsrv -- Service Runner.
+ * prunmgr -- Service Manager Application.
* Contributed by Mladen Turk <mturk(a)apache.org>
* 05 Aug 2003
* ====================================================================
@@ -80,7 +80,7 @@
static LPCWSTR _s_start = L"Start";
static LPCWSTR _s_stop = L"Stop";
-/* Allowed procrun commands */
+/* Allowed prunmgr commands */
static LPCWSTR _commands[] = {
L"ES", /* 1 Manage Service (default)*/
L"MS", /* 2 Monitor Service */
@@ -285,8 +285,8 @@
BOOL __generalPropertySave(HWND hDlg)
{
- WCHAR szN[256];
- WCHAR szD[256];
+ WCHAR szN[SIZ_RESLEN];
+ WCHAR szD[SIZ_DESLEN];
DWORD dwStartType = SERVICE_NO_CHANGE;
int i;
@@ -296,8 +296,8 @@
if (IS_INVALID_HANDLE(hService))
return FALSE;
- GetDlgItemTextW(hDlg, IDC_PPSGDISP, szN, 255);
- GetDlgItemTextW(hDlg, IDC_PPSGDESC, szD, 1023);
+ GetDlgItemTextW(hDlg, IDC_PPSGDISP, szN, SIZ_RESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPSGDESC, szD, SIZ_DESMAX);
i = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_PPSGCMBST));
if (i == 0)
dwStartType = SERVICE_AUTO_START;
@@ -316,9 +316,9 @@
BOOL __generalLogonSave(HWND hDlg)
{
- WCHAR szU[64];
- WCHAR szP[64];
- WCHAR szC[64];
+ WCHAR szU[SIZ_RESLEN];
+ WCHAR szP[SIZ_RESLEN];
+ WCHAR szC[SIZ_RESLEN];
DWORD dwStartType = SERVICE_NO_CHANGE;
if (!(TST_BIT_FLAG(_propertyChanged, 2)))
@@ -327,13 +327,15 @@
if (IS_INVALID_HANDLE(hService))
return FALSE;
- GetDlgItemTextW(hDlg, IDC_PPSLUSER, szU, 63);
- GetDlgItemTextW(hDlg, IDC_PPSLPASS, szP, 63);
- GetDlgItemTextW(hDlg, IDC_PPSLCPASS, szC, 63);
+ GetDlgItemTextW(hDlg, IDC_PPSLUSER, szU, SIZ_RESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPSLPASS, szP, SIZ_RESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPSLCPASS, szC, SIZ_RESMAX);
if (lstrlenW(szU) && lstrcmpiW(szU, STAT_SYSTEM)) {
- if (szP[0] != L' ' && szC[0] != L' ' &&
!lstrcmpW(szP, szC))
+ if (szP[0] != L' ' && szC[0] != L' ' &&
!lstrcmpW(szP, szC)) {
apxServiceSetNames(hService, NULL, NULL, NULL, szU, szP);
+ lstrlcpyW(_currentEntry->szObjectName, SIZ_RESLEN, szU);
+ }
else {
MessageBoxW(hDlg, apxLoadResourceW(IDS_VALIDPASS, 0),
apxLoadResourceW(IDS_APPLICATION, 1),
@@ -343,6 +345,7 @@
}
else {
apxServiceSetNames(hService, NULL, NULL, NULL, STAT_SYSTEM, L"");
+ lstrlcpyW(_currentEntry->szObjectName, SIZ_RESLEN, STAT_SYSTEM);
if (IsDlgButtonChecked(hDlg, IDC_PPSLID) == BST_CHECKED)
apxServiceSetOptions(hService,
_currentEntry->stServiceStatus.dwServiceType |
SERVICE_INTERACTIVE_PROCESS,
@@ -374,6 +377,8 @@
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_log, L"Path", szB);
GetDlgItemTextW(hDlg, IDC_PPLGPREFIX, szB, SIZ_DESMAX);
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_log, L"Prefix",
szB);
+ GetDlgItemTextW(hDlg, IDC_PPLGPIDFILE, szB, SIZ_DESMAX);
+ apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_log, L"PidFile",
szB);
GetDlgItemTextW(hDlg, IDC_PPLGSTDOUT, szB, SIZ_DESMAX);
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_log, L"StdOutput",
szB);
GetDlgItemTextW(hDlg, IDC_PPLGSTDERR, szB, SIZ_DESMAX);
@@ -386,7 +391,7 @@
BOOL __generalJvmSave(HWND hDlg)
{
- WCHAR szB[SIZ_DESLEN];
+ WCHAR szB[SIZ_HUGLEN];
LPWSTR p, s;
DWORD l;
if (!(TST_BIT_FLAG(_propertyChanged, 4)))
@@ -396,12 +401,12 @@
if (IS_INVALID_HANDLE(hService))
return FALSE;
if (!IsDlgButtonChecked(hDlg, IDC_PPJAUTO)) {
- GetDlgItemTextW(hDlg, IDC_PPJJVM, szB, SIZ_DESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPJJVM, szB, SIZ_HUGMAX);
}
else
lstrcpyW(szB, L"auto");
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_java, L"Jvm", szB);
- GetDlgItemTextW(hDlg, IDC_PPJCLASSPATH, szB, SIZ_DESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPJCLASSPATH, szB, SIZ_HUGMAX);
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_java, L"Classpath",
szB);
l = GetWindowTextLength(GetDlgItem(hDlg, IDC_PPJOPTIONS));
@@ -411,7 +416,7 @@
apxFree(p);
apxRegistrySetMzStrW(hRegserv, APXREG_PARAMSOFTWARE,
_s_java, L"Options", s, l);
- if (!GetDlgItemTextW(hDlg, IDC_PPJMS, szB, SIZ_DESMAX))
+ if (!GetDlgItemTextW(hDlg, IDC_PPJMS, szB, SIZ_HUGMAX))
szB[0] = L'\0';
apxRegistrySetNumW(hRegserv, APXREG_PARAMSOFTWARE, _s_java, L"JvmMs",
@@ -432,7 +437,7 @@
BOOL __generalStartSave(HWND hDlg)
{
- WCHAR szB[SIZ_DESLEN];
+ WCHAR szB[SIZ_HUGLEN];
LPWSTR p, s;
DWORD l;
@@ -443,15 +448,15 @@
if (IS_INVALID_HANDLE(hService))
return FALSE;
- GetDlgItemTextW(hDlg, IDC_PPRCLASS, szB, SIZ_DESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPRCLASS, szB, SIZ_HUGMAX);
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_start, L"Class",
szB);
- GetDlgItemTextW(hDlg, IDC_PPRIMAGE, szB, SIZ_DESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPRIMAGE, szB, SIZ_HUGMAX);
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_start, L"Image",
szB);
- GetDlgItemTextW(hDlg, IDC_PPRWPATH, szB, SIZ_DESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPRWPATH, szB, SIZ_HUGMAX);
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_start,
L"WorkingPath", szB);
- GetDlgItemTextW(hDlg, IDC_PPRMETHOD, szB, SIZ_DESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPRMETHOD, szB, SIZ_HUGMAX);
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_start, L"Method",
szB);
- GetDlgItemTextW(hDlg, IDC_PPRMODE, szB, SIZ_DESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPRMODE, szB, SIZ_HUGMAX);
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_start, L"Mode",
szB);
l = GetWindowTextLength(GetDlgItem(hDlg, IDC_PPRARGS));
@@ -470,7 +475,7 @@
BOOL __generalStopSave(HWND hDlg)
{
- WCHAR szB[SIZ_DESLEN];
+ WCHAR szB[SIZ_HUGLEN];
LPWSTR p, s;
DWORD l;
@@ -481,17 +486,17 @@
if (IS_INVALID_HANDLE(hService))
return FALSE;
- GetDlgItemTextW(hDlg, IDC_PPSCLASS, szB, SIZ_DESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPSCLASS, szB, SIZ_HUGMAX);
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_stop, L"Class",
szB);
- GetDlgItemTextW(hDlg, IDC_PPSIMAGE, szB, SIZ_DESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPSIMAGE, szB, SIZ_HUGMAX);
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_stop, L"Image",
szB);
- GetDlgItemTextW(hDlg, IDC_PPSWPATH, szB, SIZ_DESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPSWPATH, szB, SIZ_HUGMAX);
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_stop, L"WorkingPath",
szB);
- GetDlgItemTextW(hDlg, IDC_PPSMETHOD, szB, SIZ_DESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPSMETHOD, szB, SIZ_HUGMAX);
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_stop, L"Method",
szB);
- GetDlgItemTextW(hDlg, IDC_PPSTIMEOUT, szB, SIZ_DESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPSTIMEOUT, szB, SIZ_HUGMAX);
apxRegistrySetNumW(hRegserv, APXREG_PARAMSOFTWARE, _s_stop, L"Timeout",
apxAtoulW(szB));
- GetDlgItemTextW(hDlg, IDC_PPSMODE, szB, SIZ_DESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPSMODE, szB, SIZ_HUGMAX);
apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_stop, L"Mode", szB);
l = GetWindowTextLength(GetDlgItem(hDlg, IDC_PPSARGS));
@@ -553,7 +558,7 @@
LPARAM lParam)
{
LPPSHNOTIFY lpShn;
- WCHAR szBuf[1024];
+ WCHAR szBuf[SIZ_DESLEN];
switch (uMessage) {
case WM_INITDIALOG:
@@ -566,8 +571,8 @@
startPage = 0;
if (!bEnableTry)
apxCenterWindow(GetParent(hDlg), NULL);
- SendMessage(GetDlgItem(hDlg, IDC_PPSGDISP), EM_LIMITTEXT, 255, 0);
- SendMessage(GetDlgItem(hDlg, IDC_PPSGDESC), EM_LIMITTEXT, 1023, 0);
+ SendMessage(GetDlgItem(hDlg, IDC_PPSGDISP), EM_LIMITTEXT, SIZ_RESMAX,
0);
+ SendMessage(GetDlgItem(hDlg, IDC_PPSGDESC), EM_LIMITTEXT, SIZ_DESMAX,
0);
ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPSGCMBST), START_AUTO);
ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPSGCMBST), START_MANUAL);
@@ -596,7 +601,7 @@
break;
case IDC_PPSGDISP:
if (HIWORD(wParam) == EN_CHANGE) {
- GetDlgItemTextW(hDlg, IDC_PPSGDISP, szBuf, 255);
+ GetDlgItemTextW(hDlg, IDC_PPSGDISP, szBuf, SIZ_RESMAX);
if (!lstrcmpW(szBuf,
_currentEntry->lpConfig->lpDisplayName)) {
PropSheet_UnChanged(GetParent(hDlg), hDlg);
CLR_BIT_FLAG(_propertyChanged, 1);
@@ -609,7 +614,7 @@
break;
case IDC_PPSGDESC:
if (HIWORD(wParam) == EN_CHANGE) {
- GetDlgItemTextW(hDlg, IDC_PPSGDESC, szBuf, 1023);
+ GetDlgItemTextW(hDlg, IDC_PPSGDESC, szBuf, SIZ_DESMAX);
if (!lstrcmpW(szBuf, _currentEntry->szServiceDescription)) {
PropSheet_UnChanged(GetParent(hDlg), hDlg);
CLR_BIT_FLAG(_propertyChanged, 1);
@@ -678,7 +683,7 @@
LPARAM lParam)
{
LPPSHNOTIFY lpShn;
- WCHAR szBuf[1024];
+ WCHAR szBuf[SIZ_DESLEN];
switch (uMessage) {
case WM_INITDIALOG:
{
@@ -764,7 +769,7 @@
break;
case IDC_PPSLUSER:
if (HIWORD(wParam) == EN_CHANGE) {
- GetDlgItemTextW(hDlg, IDC_PPSLUSER, szBuf, 63);
+ GetDlgItemTextW(hDlg, IDC_PPSLUSER, szBuf, SIZ_RESMAX);
if (!lstrcmpiW(szBuf, _currentEntry->szObjectName)) {
PropSheet_UnChanged(GetParent(hDlg), hDlg);
CLR_BIT_FLAG(_propertyChanged, 2);
@@ -778,10 +783,10 @@
case IDC_PPSLPASS:
case IDC_PPSLCPASS:
if (HIWORD(wParam) == EN_CHANGE) {
- WCHAR szP[64];
- WCHAR szC[64];
- GetDlgItemTextW(hDlg, IDC_PPSLPASS, szP, 63);
- GetDlgItemTextW(hDlg, IDC_PPSLCPASS, szC, 63);
+ WCHAR szP[SIZ_RESLEN];
+ WCHAR szC[SIZ_RESLEN];
+ GetDlgItemTextW(hDlg, IDC_PPSLPASS, szP, SIZ_RESMAX);
+ GetDlgItemTextW(hDlg, IDC_PPSLCPASS, szC, SIZ_RESMAX);
/* check for valid password match */
if (szP[0] == L' ' && szC[0] == L' ') {
PropSheet_UnChanged(GetParent(hDlg), hDlg);
@@ -858,13 +863,25 @@
apxFree(b);
}
else
- ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPLGLEVEL), 0);
+ ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPLGLEVEL), 1);
if ((b = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
_s_log, L"Path")) != NULL) {
SetDlgItemTextW(hDlg, IDC_PPLGPATH, b);
apxFree(b);
}
if ((b = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
+ _s_log, L"Prefix")) != NULL) {
+ SetDlgItemTextW(hDlg, IDC_PPLGPREFIX, b);
+ apxFree(b);
+ }
+ else
+ SetDlgItemTextW(hDlg, IDC_PPLGPREFIX, L"commons-daemon");
+ if ((b = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
+ _s_log, L"PidFile")) != NULL) {
+ SetDlgItemTextW(hDlg, IDC_PPLGPIDFILE, b);
+ apxFree(b);
+ }
+ if ((b = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
_s_log, L"StdOutput")) != NULL)
{
SetDlgItemTextW(hDlg, IDC_PPLGSTDOUT, b);
apxFree(b);
@@ -896,6 +913,12 @@
SET_BIT_FLAG(_propertyChanged, 3);
}
break;
+ case IDC_PPLGPIDFILE:
+ if (HIWORD(wParam) == EN_CHANGE) {
+ PropSheet_Changed(GetParent(hDlg), hDlg);
+ SET_BIT_FLAG(_propertyChanged, 3);
+ }
+ break;
case IDC_PPLGSTDERR:
if (HIWORD(wParam) == EN_CHANGE) {
PropSheet_Changed(GetParent(hDlg), hDlg);
@@ -1114,7 +1137,7 @@
apxCenterWindow(GetParent(hDlg), NULL);
bpropCentered = TRUE;
- ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPRMODE), L"");
+ ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPRMODE), L"exe");
ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPRMODE), L"jvm");
ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPRMODE), _s_java);
@@ -1253,7 +1276,7 @@
apxCenterWindow(GetParent(hDlg), NULL);
bpropCentered = TRUE;
- ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPSMODE), L"");
+ ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPSMODE), L"exe");
ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPSMODE), L"jvm");
ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPSMODE), _s_java);
@@ -1399,7 +1422,7 @@
{
PROPSHEETPAGEW psP[6];
PROPSHEETHEADERW psH;
- WCHAR szT[1024] = {0};
+ WCHAR szT[SIZ_DESLEN] = {0};
if (_propertyOpened) {
SetForegroundWindow(_gui_store->hMainWnd);
@@ -1419,10 +1442,10 @@
__stopProperty);
if (_currentEntry && _currentEntry->lpConfig)
- lstrcpyW(szT, _currentEntry->lpConfig->lpDisplayName);
+ lstrlcpyW(szT, SIZ_DESMAX, _currentEntry->lpConfig->lpDisplayName);
else
return;
- lstrcatW(szT, L" Properties");
+ lstrlcatW(szT, SIZ_DESMAX, L" Properties");
psH.dwSize = sizeof(PROPSHEETHEADER);
psH.dwFlags = PSH_PROPSHEETPAGE | PSH_USEICONID | PSH_USECALLBACK |
PSH_NOCONTEXTHELP;
@@ -1449,9 +1472,9 @@
WCHAR en[SIZ_DESLEN];
int i;
- lstrcpyW(en, L"Global\\");
- lstrcatW(en, szServiceName);
- lstrcatW(en, L"SIGNAL");
+ lstrlcpyW(en, SIZ_DESLEN, L"Global\\");
+ lstrlcatW(en, SIZ_DESLEN, szServiceName);
+ lstrlcatW(en, SIZ_DESLEN, L"SIGNAL");
for (i = 7; i < lstrlenW(en); i++) {
if (en[i] >= L'a' && en[i] <= L'z')
en[i] = en[i] - 32;
Modified: trunk/utils/windows/native/service/procrun/apps/prunmgr/prunmgr.h
===================================================================
--- trunk/utils/windows/native/service/procrun/apps/prunmgr/prunmgr.h 2010-06-16 10:02:46
UTC (rev 2688)
+++ trunk/utils/windows/native/service/procrun/apps/prunmgr/prunmgr.h 2010-07-21 20:01:54
UTC (rev 2689)
@@ -13,20 +13,20 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+
/* ====================================================================
- *
+ *
* Contributed by Mladen Turk <mturk(a)apache.org>
* 05 Aug 2003
- * ====================================================================
+ * ====================================================================
*/
#ifndef _PRUNMGR_H
#define _PRUNMGR_H
#undef PRG_VERSION
-#define PRG_VERSION "2.0.4.1"
-#define CSV_VERSION 2,0,4,1
+#define PRG_VERSION "2.0.5.1"
+#define CSV_VERSION 2,0,5,1
#define PRG_REGROOT L"JBoss\\JBoss Web 2"
#define IDM_TM_EXIT 2000
@@ -137,5 +137,5 @@
#define IDS_ERRSREG 3122
#define IDS_NOTIMPLEMENTED 3199
-
+
#endif /* _PRUNMGR_H */
Modified: trunk/utils/windows/native/service/procrun/apps/prunmgr/prunmgr.rc
===================================================================
--- trunk/utils/windows/native/service/procrun/apps/prunmgr/prunmgr.rc 2010-06-16 10:02:46
UTC (rev 2688)
+++ trunk/utils/windows/native/service/procrun/apps/prunmgr/prunmgr.rc 2010-07-21 20:01:54
UTC (rev 2689)
@@ -13,26 +13,26 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+
#include "apxwin.h"
#include "prunmgr.h"
#define RSTR_SCMATS "Service Manager is attempting to "
-#define STR_COPYRIGHT "Copyright � 2008 Red Hat Middleware, LLC. " \
+#define STR_COPYRIGHT "Copyright � 2010 Red Hat, Inc. " \
"or its licensors, as applicable."
#define STR_LICENSE "Distributable under LGPL license. " \
"See terms of license at gnu.org."
-#define STR_COMPANY "Red Hat�, Inc."
-#define STR_TRADEMARK "� Red Hat Inc."
+#define STR_COMPANY "Red Hat�, Inc."
+#define STR_TRADEMARK "� Red Hat Inc."
#define STR_PRODUCT "JBoss Web Service manager"
-IDI_MAINICON ICON "../../resources/jboss.ico"
-IDI_REDHATICON ICON "../../resources/redhat.ico"
-IDI_ICONSTOP ICON "../../resources/procruns.ico"
-IDI_ICONRUN ICON "../../resources/procrunr.ico"
+IDI_MAINICON ICON "../../resources/jboss.ico"
+IDI_REDHATICON ICON "../../resources/redhat.ico"
+IDI_ICONSTOP ICON "../../resources/procruns.ico"
+IDI_ICONRUN ICON "../../resources/procrunr.ico"
IDR_LICENSE RTF "../../resources/license.rtf"
BMP_JBOSSLOGO BITMAP "../../resources/jbosslogo.bmp"
@@ -44,17 +44,17 @@
FONT 8, "Microsoft Sans Serif", 400, 0, 0x0
BEGIN
DEFPUSHBUTTON "&OK",IDOK,285,150,50,14
- CONTROL "",IDC_LICENSE,"RichEdit20A",ES_MULTILINE |
+ CONTROL "",IDC_LICENSE,"RichEdit20A",ES_MULTILINE |
ES_READONLY | WS_BORDER | WS_VSCROLL,0,31,335,115
CONTROL
"BMP_JBOSSLOGO",IDC_STATIC,"Static",SS_BITMAP|0x00000040L,0,0,337,30
LTEXT " ",IDC_ABOUTAPP,2,150,270,12
- LTEXT "Copyright � 2008 Red Hat Middleware,
LLC.",IDC_STATIC,2,160,270,12
- LTEXT "http://www.jboss.org",IDC_STATIC,2,170,270,12
+ LTEXT "Copyright � 2008 Red Hat Middleware,
LLC.",IDC_STATIC,2,160,270,12
+ LTEXT "http://www.jboss.org",IDC_STATIC,2,170,270,12
PUSHBUTTON "&System Info",IAB_SYSINF,285,170,50,14
END
IDD_PROGRESS DIALOGEX 0, 0, 322, 92
-STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP |
+STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP |
WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_TOPMOST
CAPTION "JBoss Web Service Manager"
@@ -68,7 +68,7 @@
CONTROL
"",IDDP_PROGRESS,"msctls_progress32",WS_BORDER,10,50,302,
14
ICON IDI_MAINICON,IDC_STATIC,10,4,20,20,0,WS_EX_TRANSPARENT
-END
+END
IDD_SELUSER DIALOGEX 0, 0, 410, 201
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU |
@@ -82,10 +82,10 @@
DEFPUSHBUTTON "OK",IDOK,292,180,50,14,WS_DISABLED
PUSHBUTTON "Cancel",IDCANCEL,348,180,50,14
LTEXT "Look In:",IDC_STATIC,10,9,27,8
- CONTROL "",IDSU_LIST,"SysListView32",LVS_REPORT |
LVS_SINGLESEL |
- LVS_SORTASCENDING | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | WS_BORDER |
+ CONTROL "",IDSU_LIST,"SysListView32",LVS_REPORT |
LVS_SINGLESEL |
+ LVS_SORTASCENDING | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | WS_BORDER
|
WS_TABSTOP,0,26,410,149,WS_EX_CLIENTEDGE
- CONTROL "",IDSU_COMBO,"ComboBoxEx32",CBS_DROPDOWNLIST |
+ CONTROL "",IDSU_COMBO,"ComboBoxEx32",CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP,47,6,260,80
END
@@ -102,9 +102,9 @@
LTEXT "Pat&h to executable:",IDC_STATIC,10,63,66,8
EDITTEXT IDC_PPSGDEXE,10,75,240,12,ES_AUTOHSCROLL | WS_DISABLED
LTEXT "Startup typ&e:",IDC_STATIC,10,94,46,8
- COMBOBOX IDC_PPSGCMBST,70,93,180,80,CBS_DROPDOWNLIST | WS_VSCROLL |
+ COMBOBOX IDC_PPSGCMBST,70,93,180,80,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
- CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,10,128,240,1
+ CONTROL
"",IDC_STATIC,"Static",SS_ETCHEDHORZ,10,128,240,1
LTEXT "Service Status:",IDC_STATIC,10,138,52,8
LTEXT " ",IDC_PPSGSTATUS,70,138,240,8
PUSHBUTTON "&Start",IDC_PPSGSTART,10,160,55,14,WS_DISABLED
@@ -137,20 +137,23 @@
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
LTEXT "&Level:",IDC_STATIC,10,18,46,8
- COMBOBOX IDC_PPLGLEVEL,70,17,180,80,CBS_DROPDOWNLIST | WS_VSCROLL |
+ COMBOBOX IDC_PPLGLEVEL,70,17,180,80,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
LTEXT "Log &path: ",IDC_STATIC,10,33,50,8
EDITTEXT IDC_PPLGPATH,10,45,218,12,ES_AUTOHSCROLL
- PUSHBUTTON "...",IDC_PPLGBPATH,232,44,18,14
+ PUSHBUTTON "...",IDC_PPLGBPATH,232,44,18,14
LTEXT "Log prefix: ",IDC_STATIC,10,63,50,8
EDITTEXT IDC_PPLGPREFIX,70,62,158,12,ES_AUTOHSCROLL
-
- LTEXT "Redirect Stdout: ",IDC_STATIC,10,85,80,8
- EDITTEXT IDC_PPLGSTDOUT,10,97,218,12,ES_AUTOHSCROLL
- PUSHBUTTON "...",IDC_PPLGBSTDOUT,232,96,18,14
- LTEXT "Redirect Stderror: ",IDC_STATIC,10,115,80,8
- EDITTEXT IDC_PPLGSTDERR,10,127,218,12,ES_AUTOHSCROLL
- PUSHBUTTON "...",IDC_PPLGBSTDERR,232,126,18,14
+
+ LTEXT "Pid file: ",IDC_STATIC,10,81,50,8
+ EDITTEXT IDC_PPLGPIDFILE,70,82,158,12,ES_AUTOHSCROLL
+
+ LTEXT "Redirect Stdout: ",IDC_STATIC,10,105,80,8
+ EDITTEXT IDC_PPLGSTDOUT,10,117,218,12,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_PPLGBSTDOUT,232,116,18,14
+ LTEXT "Redirect Stderror: ",IDC_STATIC,10,135,80,8
+ EDITTEXT IDC_PPLGSTDERR,10,147,218,12,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_PPLGBSTDERR,232,146,18,14
END
IDD_PROPPAGE_JVM DIALOGEX 0, 0, 260, 186
@@ -161,11 +164,11 @@
WS_TABSTOP,10,8,72,12
LTEXT "Java Virtual Machine: ",IDC_STATIC,10,23,80,8
EDITTEXT IDC_PPJJVM,10,35,218,12,ES_AUTOHSCROLL
- PUSHBUTTON "...",IDC_PPJBJVM,232,34,18,14
+ PUSHBUTTON "...",IDC_PPJBJVM,232,34,18,14
LTEXT "Java Classpath:",IDC_STATIC,10,53,66,8
EDITTEXT IDC_PPJCLASSPATH,10,65,240,12,ES_AUTOHSCROLL
LTEXT "Java Options:",IDC_STATIC,10,83,66,8
- EDITTEXT IDC_PPJOPTIONS,10,95,240,40,ES_MULTILINE | ES_AUTOHSCROLL |
+ EDITTEXT IDC_PPJOPTIONS,10,95,240,40,ES_MULTILINE | ES_AUTOHSCROLL |
ES_WANTRETURN | WS_VSCROLL
LTEXT "Initial memory pool:",IDC_STATIC,10,140,80,8
EDITTEXT IDC_PPJMS,90,139,100,12,ES_AUTOHSCROLL | ES_NUMBER
@@ -186,20 +189,20 @@
EDITTEXT IDC_PPRCLASS,10,20,240,12,ES_AUTOHSCROLL
LTEXT "Image: ",IDC_STATIC,10,38,80,8
EDITTEXT IDC_PPRIMAGE,10,50,218,12,ES_AUTOHSCROLL | WS_DISABLED
- PUSHBUTTON "...",IDC_PPRBIMAGE,232,49,18,14,WS_DISABLED
+ PUSHBUTTON "...",IDC_PPRBIMAGE,232,49,18,14,WS_DISABLED
LTEXT "Working Path: ",IDC_STATIC,10,68,80,8
EDITTEXT IDC_PPRWPATH,10,80,218,12,ES_AUTOHSCROLL
PUSHBUTTON "...",IDC_PPRBWPATH,232,79,18,14
LTEXT "&Method: ",IDC_STATIC,10,98,50,8
EDITTEXT IDC_PPRMETHOD,70,97,180,12,ES_AUTOHSCROLL
LTEXT "&Arguments: ",IDC_STATIC,10,115,50,8
- EDITTEXT IDC_PPRARGS,70,114,180,30,ES_MULTILINE | ES_AUTOHSCROLL |
+ EDITTEXT IDC_PPRARGS,70,114,180,30,ES_MULTILINE | ES_AUTOHSCROLL |
ES_WANTRETURN | WS_VSCROLL
LTEXT "&Timeout: ",IDC_STATIC,10,150,50,8
EDITTEXT IDC_PPRTIMEOUT,70,149,100,12,ES_AUTOHSCROLL | WS_DISABLED
LTEXT "sec.",IDC_STATIC,175,150,25,8
LTEXT "&Mode: ",IDC_STATIC,10,168,50,8
- COMBOBOX IDC_PPRMODE,70,167,180,80,CBS_DROPDOWNLIST | WS_VSCROLL |
+ COMBOBOX IDC_PPRMODE,70,167,180,80,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
END
@@ -211,29 +214,29 @@
EDITTEXT IDC_PPSCLASS,10,20,240,12,ES_AUTOHSCROLL
LTEXT "Image: ",IDC_STATIC,10,38,80,8
EDITTEXT IDC_PPSIMAGE,10,50,218,12,ES_AUTOHSCROLL | WS_DISABLED
- PUSHBUTTON "...",IDC_PPSBIMAGE,232,49,18,14,WS_DISABLED
+ PUSHBUTTON "...",IDC_PPSBIMAGE,232,49,18,14,WS_DISABLED
LTEXT "Working Path: ",IDC_STATIC,10,68,80,8
EDITTEXT IDC_PPSWPATH,10,80,218,12,ES_AUTOHSCROLL
- PUSHBUTTON "...",IDC_PPSBWPATH,232,79,18,14
+ PUSHBUTTON "...",IDC_PPSBWPATH,232,79,18,14
LTEXT "&Method: ",IDC_STATIC,10,98,50,8
EDITTEXT IDC_PPSMETHOD,70,97,180,12,ES_AUTOHSCROLL
LTEXT "&Arguments: ",IDC_STATIC,10,115,50,8
- EDITTEXT IDC_PPSARGS,70,114,180,30,ES_MULTILINE | ES_AUTOHSCROLL |
+ EDITTEXT IDC_PPSARGS,70,114,180,30,ES_MULTILINE | ES_AUTOHSCROLL |
ES_WANTRETURN | WS_VSCROLL
LTEXT "&Timeout: ",IDC_STATIC,10,150,50,8
EDITTEXT IDC_PPSTIMEOUT,70,149,100,12,ES_AUTOHSCROLL | ES_NUMBER
LTEXT "sec.",IDC_STATIC,175,150,25,8
LTEXT "&Mode: ",IDC_STATIC,10,168,50,8
- COMBOBOX IDC_PPSMODE,70,167,180,80,CBS_DROPDOWNLIST | WS_VSCROLL |
+ COMBOBOX IDC_PPSMODE,70,167,180,80,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
END
-STRINGTABLE
+STRINGTABLE
BEGIN
IDS_APPLICATION STR_PRODUCT
- IDS_APPVERSION "Version 2.0.4"
+ IDS_APPVERSION "Version 2.0.5"
IDS_APPFULLNAME STR_PRODUCT " Version " PRG_VERSION
- IDS_APPCOPYRIGHT "Copyright � 2008 Red Hat Middleware, LLC."
+ IDS_APPCOPYRIGHT "Copyright � 2010 Red Hat, Inc."
IDS_APPDESCRIPTION "JBoss Web Service Management Tool"
IDS_ALREAY_RUNING "An instance of '%S' application is already
running"
IDS_ERRORCMD "Unknown command line option '%s'\nSee the manual
for command line usage."
@@ -241,23 +244,23 @@
IDS_HSSTOP RSTR_SCMATS "stop the following service ..."
IDS_HSRESTART RSTR_SCMATS "to restart the following service ..."
IDS_HSPAUSE RSTR_SCMATS "to pause the following service ..."
- IDS_VALIDPASS "Please enter a valid password"
+ IDS_VALIDPASS "Please enter a valid password"
IDS_PPGENERAL "General"
IDS_PPLOGON "Log On"
IDS_PPLOGGING "Logging"
IDS_PPJAVAVM "Java"
IDS_PPSTART "Startup"
IDS_PPSTOP "Shutdown"
- IDS_NOTIMPLEMENTED "Sorry, but this feature is not implemented yet"
+ IDS_NOTIMPLEMENTED "Sorry, but this feature is not implemented yet"
IDS_LGPATHTITLE "Select Log root folder"
IDS_ALLFILES "All Files (*.*)\0*.*\0"
IDS_DLLFILES "Dynamic Link Libraries (*.dll)\0*.dll\0"
IDS_EXEFILES "Executables (*.exe)\0*.exe\0"
IDS_LGSTDOUT "Select Stdoutput filename"
IDS_LGSTDERR "Select Stderror filename"
- IDS_PPJBJVM "Select Java Virtual Machine DLL"
- IDS_PPWPATH "Select Working path"
- IDS_PPIMAGE "Select Executable Image"
+ IDS_PPJBJVM "Select Java Virtual Machine DLL"
+ IDS_PPWPATH "Select Working path"
+ IDS_PPIMAGE "Select Executable Image"
IDS_ERRSREG "Unable to open the service registry key"
END
Modified: trunk/utils/windows/native/service/procrun/apps/prunsrv/prunsrv.c
===================================================================
--- trunk/utils/windows/native/service/procrun/apps/prunsrv/prunsrv.c 2010-06-16 10:02:46
UTC (rev 2688)
+++ trunk/utils/windows/native/service/procrun/apps/prunsrv/prunsrv.c 2010-07-21 20:01:54
UTC (rev 2689)
@@ -39,6 +39,7 @@
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
+#define ONE_MINUTE (60 * 1000)
#ifdef WIN64
#define KREG_WOW6432 KEY_WOW64_32KEY
@@ -50,12 +51,8 @@
LPCWSTR szLogPath;
LPCWSTR szStdOutFilename;
LPCWSTR szStdErrFilename;
- HANDLE hStdOutFile;
- HANDLE hStdErrFile;
- FILE *fpStdOutFile;
- FILE *fpStdErrFile;
- FILE fpStdOutSave;
- FILE fpStdErrSave;
+ FILE *fpStdOutFile;
+ FILE *fpStdErrFile;
} APX_STDWRAP;
/* Use static variables instead of #defines */
@@ -77,6 +74,8 @@
L"US", /* 4 Update Service parameters */
L"IS", /* 5 Install Service */
L"DS", /* 6 Delete Service */
+ L"?", /* 7 Help */
+ L"VS", /* 8 Version */
NULL
};
@@ -124,6 +123,8 @@
/* 33 */ { L"LogLevel", L"Level",
L"Log", APXCMDOPT_STR | APXCMDOPT_REG, NULL, 0},
/* 34 */ { L"StdError", L"StdError",
L"Log", APXCMDOPT_STE | APXCMDOPT_REG, NULL, 0},
/* 35 */ { L"StdOutput", L"StdOutput",
L"Log", APXCMDOPT_STE | APXCMDOPT_REG, NULL, 0},
+/* 36 */ { L"LogJniMessages", L"LogJniMessages",
L"Log", APXCMDOPT_INT | APXCMDOPT_REG, NULL, 1},
+/* 37 */ { L"PidFile", L"PidFile",
L"Log", APXCMDOPT_STR | APXCMDOPT_REG, NULL, 0},
/* NULL terminate the array */
{ NULL }
};
@@ -183,8 +184,10 @@
#define SO_STDERROR GET_OPT_V(34)
#define SO_STDOUTPUT GET_OPT_V(35)
+#define SO_JNIVFPRINTF GET_OPT_I(36)
+#define SO_PIDFILE GET_OPT_V(37)
-/* Main servic table entry
+/* Main service table entry
* filled at run-time
*/
static SERVICE_TABLE_ENTRYW _service_table[] = {
@@ -200,6 +203,10 @@
static BOOL _jni_startup = FALSE;
/* JVM used for shutdown */
static BOOL _jni_shutdown = FALSE;
+/* Java used as worker */
+static BOOL _java_startup = FALSE;
+/* Java used for shutdown */
+static BOOL _java_shutdown = FALSE;
/* Global variables and objects */
static APXHANDLE gPool;
static APXHANDLE gWorker;
@@ -211,14 +218,16 @@
static LPSTR _jni_classpath = NULL;
static LPCWSTR _jni_rparam = NULL; /* Startup arguments */
static LPCWSTR _jni_sparam = NULL; /* Shutdown arguments */
-static LPSTR _jni_rmethod = NULL; /* Startup arguments */
-static LPSTR _jni_smethod = NULL; /* Shutdown arguments */
-static CHAR _jni_rclass[SIZ_RESLEN] = {'\0'}; /* Startup class */
-static CHAR _jni_sclass[SIZ_RESLEN] = {'\0'}; /* Shutdown class */
+static LPSTR _jni_rmethod = NULL; /* Startup method */
+static LPSTR _jni_smethod = NULL; /* Shutdown method */
+static LPSTR _jni_rclass = NULL; /* Startup class */
+static LPSTR _jni_sclass = NULL; /* Shutdown class */
static HANDLE gShutdownEvent = NULL;
static HANDLE gSignalEvent = NULL;
static HANDLE gSignalThread = NULL;
+static HANDLE gPidfileHandle = NULL;
+static LPWSTR gPidfileName = NULL;
static BOOL gSignalValid = TRUE;
DWORD WINAPI eventThread(LPVOID lpParam)
@@ -247,136 +256,90 @@
BOOL aErr = FALSE;
BOOL aOut = FALSE;
- /* Clear up the handles */
- lpWrapper->fpStdErrFile = NULL;
- lpWrapper->fpStdOutFile = NULL;
-
- /* Save the original streams */
- lpWrapper->fpStdOutSave = *stdout;
- lpWrapper->fpStdErrSave = *stderr;
-
+ if (lpWrapper->szStdOutFilename || lpWrapper->szStdErrFilename)
+ AllocConsole();
/* redirect to file or console */
if (lpWrapper->szStdOutFilename) {
if (lstrcmpiW(lpWrapper->szStdOutFilename, PRSRV_AUTO) == 0) {
aOut = TRUE;
lpWrapper->szStdOutFilename = apxLogFile(gPool,
lpWrapper->szLogPath,
- NULL,
- L"stdout_");
+ L"service-stdout",
+ NULL, TRUE);
}
/* Delete the file if not in append mode
* XXX: See if we can use the params instead of that.
*/
if (!aOut)
DeleteFileW(lpWrapper->szStdOutFilename);
- lpWrapper->hStdOutFile = CreateFileW(lpWrapper->szStdOutFilename,
- GENERIC_WRITE | GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL,
- OPEN_ALWAYS,
- FILE_ATTRIBUTE_NORMAL,
- NULL);
- if (IS_INVALID_HANDLE(lpWrapper->hStdOutFile))
- return FALSE;
- /* Allways move to the end of file */
- SetFilePointer(lpWrapper->hStdOutFile, 0, NULL, FILE_END);
+ if ((lpWrapper->fpStdOutFile = _wfopen(lpWrapper->szStdOutFilename,
+ L"a"))) {
+ _dup2(_fileno(lpWrapper->fpStdOutFile), 1);
+ *stdout = *lpWrapper->fpStdOutFile;
+ setvbuf(stdout, NULL, _IONBF, 0);
+ }
}
- else {
- lpWrapper->hStdOutFile = CreateFileW(L"CONOUT$",
- GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL,
- OPEN_EXISTING,
- 0,
- NULL);
- if (IS_INVALID_HANDLE(lpWrapper->hStdOutFile))
- return FALSE;
- }
if (lpWrapper->szStdErrFilename) {
if (lstrcmpiW(lpWrapper->szStdErrFilename, PRSRV_AUTO) == 0) {
aErr = TRUE;
lpWrapper->szStdErrFilename = apxLogFile(gPool,
lpWrapper->szLogPath,
- NULL,
- L"stderr_");
+ L"service-stderr",
+ NULL, TRUE);
}
if (!aErr)
DeleteFileW(lpWrapper->szStdErrFilename);
- lpWrapper->hStdErrFile = CreateFileW(lpWrapper->szStdErrFilename,
- GENERIC_WRITE | GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL,
- OPEN_ALWAYS,
- FILE_ATTRIBUTE_NORMAL,
- NULL);
- if (IS_INVALID_HANDLE(lpWrapper->hStdErrFile))
- return FALSE;
- SetFilePointer(lpWrapper->hStdErrFile, 0, NULL, FILE_END);
+ if ((lpWrapper->fpStdErrFile = _wfopen(lpWrapper->szStdErrFilename,
+ L"a"))) {
+ _dup2(_fileno(lpWrapper->fpStdErrFile), 2);
+ *stderr = *lpWrapper->fpStdErrFile;
+ setvbuf(stderr, NULL, _IONBF, 0);
+ }
}
- else if (lpWrapper->szStdOutFilename) {
- /* Use the same file handle for stderr as for stdout */
- lpWrapper->szStdErrFilename = lpWrapper->szStdOutFilename;
- lpWrapper->hStdErrFile = lpWrapper->hStdOutFile;
+ else if (lpWrapper->fpStdOutFile) {
+ _dup2(_fileno(lpWrapper->fpStdOutFile), 2);
+ *stderr = *lpWrapper->fpStdOutFile;
+ setvbuf(stderr, NULL, _IONBF, 0);
}
- else {
- lpWrapper->hStdErrFile = lpWrapper->hStdOutFile;
- }
- /* Open the stream buffers
- * This will redirect all printf to go to the redirected files.
- * It is used for JNI vprintf functionality.
- */
- lpWrapper->fpStdOutFile = _fdopen(_open_osfhandle(
- (intptr_t)lpWrapper->hStdOutFile,
- _O_TEXT), "w");
- lpWrapper->fpStdErrFile = _fdopen(_open_osfhandle(
- (intptr_t)lpWrapper->hStdErrFile,
- _O_TEXT), "w");
- if (lpWrapper->fpStdOutFile) {
- *stdout = *lpWrapper->fpStdOutFile;
- setvbuf(stdout, NULL, _IONBF, 0);
- }
- if (lpWrapper->fpStdErrFile) {
- *stderr = *lpWrapper->fpStdErrFile;
- setvbuf(stderr, NULL, _IONBF, 0);
- }
return TRUE;
}
-static void cleanupStdStreams(APX_STDWRAP *lpWrapper)
-{
- /* Close the redirectied streams */
- if (lpWrapper->fpStdOutFile) {
- fclose(lpWrapper->fpStdOutFile);
- *stdout = lpWrapper->fpStdOutSave;
- }
- if (lpWrapper->fpStdErrFile) {
- fclose(lpWrapper->fpStdErrFile);
- *stderr = lpWrapper->fpStdErrSave;
- }
-}
-
/* Debugging functions */
-static void printUsage(LPAPXCMDLINE lpCmdline)
+static void printUsage(LPAPXCMDLINE lpCmdline, BOOL isHelp)
{
-#ifdef _DEBUG
int i = 0;
- fwprintf(stderr, L"Usage: %s //CMD//Servce [--options]\n",
+ fwprintf(stderr, L"Usage: %s //CMD//Service [--options]\n",
lpCmdline->szExecutable);
fwprintf(stderr, L" Commands:\n");
- fwprintf(stderr, L" //IS//ServiceName Install Service\n");
- fwprintf(stderr, L" //US//ServiceName Update Service parameters\n");
- fwprintf(stderr, L" //DS//ServiceName Delete Service\n");
- fwprintf(stderr, L" //RS//ServiceName Run Service\n");
- fwprintf(stderr, L" //SS//ServiceName Stop Service\n");
- fwprintf(stderr,
- L" //TS//ServiceName Run Service as console application\n");
+ if (isHelp)
+ fwprintf(stderr, L" //? This page\n");
+ fwprintf(stderr, L" //IS[//ServiceName] Install Service\n");
+ fwprintf(stderr, L" //US[//ServiceName] Update Service parameters\n");
+ fwprintf(stderr, L" //DS[//ServiceName] Delete Service\n");
+ fwprintf(stderr, L" //RS[//ServiceName] Run Service\n");
+ fwprintf(stderr, L" //SS[//ServiceName] Stop Service\n");
+ fwprintf(stderr, L" //TS[//ServiceName] Run Service as console
application\n");
+ fwprintf(stderr, L" //PP[//Num Seconds] Sleep for n Seconds (defaults to
60)\n");
+ fwprintf(stderr, L" //VS Display version\n");
fwprintf(stderr, L" Options:\n");
while (_options[i].szName) {
fwprintf(stderr, L" --%s\n", _options[i].szName);
++i;
}
+}
+
+static void printVersion(void)
+{
+#ifdef _WIN64
+ int b = 64;
+#else
+ int b = 32;
#endif
+ fwprintf(stderr, L"Commons Daemon Service Runner version %S/Win%d (%S)\n",
+ PRG_VERSION, b, __DATE__);
+ fwprintf(stderr, L"Copyright (c) 2000-2010 The Apache Software
Foundation.\n");
}
+
/* Display configuration parameters */
static void dumpCmdline()
{
@@ -424,7 +387,11 @@
lpCmdline->szApplication,
APXREG_SOFTWARE | APXREG_SERVICE);
if (IS_INVALID_HANDLE(hRegistry)) {
- apxLogWrite(APXLOG_MARK_SYSERR);
+ if (GetLastError() == ERROR_FILE_NOT_FOUND)
+ apxLogWrite(APXLOG_MARK_WARN "The system cannot find the Registry key
for service '%S'",
+ lpCmdline->szApplication);
+ else
+ apxLogWrite(APXLOG_MARK_SYSERR);
return FALSE;
}
/* browse through options */
@@ -554,18 +521,18 @@
/* Check if --Install is provided */
if (!SO_INSTALL) {
- lstrcpyW(szImage, lpCmdline->szExePath);
- lstrcatW(szImage, L"\\");
- lstrcatW(szImage, lpCmdline->szExecutable);
- lstrcatW(szImage, L".exe");
+ lstrlcpyW(szImage, SIZ_HUGLEN, lpCmdline->szExePath);
+ lstrlcatW(szImage, SIZ_HUGLEN, L"\\");
+ lstrlcatW(szImage, SIZ_HUGLEN, lpCmdline->szExecutable);
+ lstrlcatW(szImage, SIZ_HUGLEN, L".exe");
}
else
lstrcpyW(szImage, SO_INSTALL);
/* Replace not needed qoutes */
apxStrQuoteInplaceW(szImage);
/* Add run-service command line option */
- lstrcatW(szImage, L" //RS//");
- lstrcatW(szImage, lpCmdline->szApplication);
+ lstrlcatW(szImage, SIZ_HUGLEN, L" //RS//");
+ lstrlcatW(szImage, SIZ_HUGLEN, lpCmdline->szApplication);
SO_INSTALL = apxPoolStrdupW(gPool, szImage);
/* Ensure that option gets saved in the registry */
ST_INSTALL |= APXCMDOPT_FOUND;
@@ -607,11 +574,11 @@
apxCloseHandle(hService);
if (rv) {
saveConfiguration(lpCmdline);
- apxLogWrite(APXLOG_MARK_INFO "Service %S installed",
+ apxLogWrite(APXLOG_MARK_INFO "Service '%S' installed",
lpCmdline->szApplication);
}
else
- apxLogWrite(APXLOG_MARK_ERROR "Failed installing %S service",
+ apxLogWrite(APXLOG_MARK_ERROR "Failed installing '%S'
service",
lpCmdline->szApplication);
return rv;
@@ -632,8 +599,8 @@
if (apxServiceOpen(hService, lpCmdline->szApplication, SERVICE_ALL_ACCESS)) {
WCHAR szWndManagerClass[SIZ_RESLEN];
HANDLE hWndManager = NULL;
- lstrcpyW(szWndManagerClass, lpCmdline->szApplication);
- lstrcatW(szWndManagerClass, L"_CLASS");
+ lstrlcpyW(szWndManagerClass, SIZ_RESLEN, lpCmdline->szApplication);
+ lstrlcatW(szWndManagerClass, SIZ_RESLEN, L"_CLASS");
/* Close the monitor application if running */
if ((hWndManager = FindWindowW(szWndManagerClass, NULL)) != NULL) {
SendMessage(hWndManager, WM_CLOSE, 0, 0);
@@ -642,12 +609,12 @@
}
if (rv) {
/* Delete all service registry settings */
- apxDeleteRegistryW(PRG_REGROOT, lpCmdline->szApplication, TRUE);
- apxLogWrite(APXLOG_MARK_DEBUG "Service %S deleted",
+ apxDeleteRegistryW(PRG_REGROOT, lpCmdline->szApplication, KREG_WOW6432,
TRUE);
+ apxLogWrite(APXLOG_MARK_DEBUG "Service '%S' deleted",
lpCmdline->szApplication);
}
else {
- apxDisplayError(TRUE, NULL, 0, "Unable to delete %S service",
+ apxDisplayError(FALSE, NULL, 0, "Unable to delete '%S'
service",
lpCmdline->szApplication);
}
apxCloseHandle(hService);
@@ -660,7 +627,8 @@
APXHANDLE hService;
BOOL rv = FALSE;
- apxLogWrite(APXLOG_MARK_INFO "Stopping service...");
+ apxLogWrite(APXLOG_MARK_INFO "Stopping service '%S' ...",
+ lpCmdline->szApplication);
hService = apxCreateService(gPool, GENERIC_ALL, FALSE);
if (IS_INVALID_HANDLE(hService)) {
apxLogWrite(APXLOG_MARK_ERROR "Unable to open the Service Manager");
@@ -677,15 +645,15 @@
NULL,
NULL);
if (rv)
- apxLogWrite(APXLOG_MARK_INFO "Service %S stopped",
+ apxLogWrite(APXLOG_MARK_INFO "Service '%S' stopped",
lpCmdline->szApplication);
else
- apxLogWrite(APXLOG_MARK_ERROR "Failed to stop %S service",
+ apxLogWrite(APXLOG_MARK_ERROR "Failed to stop '%S'
service",
lpCmdline->szApplication);
}
else
- apxDisplayError(TRUE, NULL, 0, "Unable to open %S service",
+ apxDisplayError(FALSE, NULL, 0, "Unable to open '%S' service",
lpCmdline->szApplication);
apxCloseHandle(hService);
apxLogWrite(APXLOG_MARK_INFO "Stop service finished.");
@@ -695,7 +663,7 @@
static BOOL docmdUpdateService(LPAPXCMDLINE lpCmdline)
{
APXHANDLE hService;
- BOOL rv = FALSE;
+ BOOL rv = TRUE;
apxLogWrite(APXLOG_MARK_INFO "Updating service...");
@@ -706,7 +674,17 @@
}
SetLastError(0);
/* Open the service */
- if (apxServiceOpen(hService, lpCmdline->szApplication, SERVICE_ALL_ACCESS)) {
+ if (!apxServiceOpen(hService, lpCmdline->szApplication, SERVICE_ALL_ACCESS)) {
+ /* Close the existing manager handler.
+ * It will be reopened inside install.
+ */
+ apxCloseHandle(hService);
+ /* In case service doesn't exist try to install it.
+ * Install will fail if there is no minimum parameters required.
+ */
+ return docmdInstallService(lpCmdline);
+ }
+ else {
DWORD dwStart = SERVICE_NO_CHANGE;
DWORD dwType = SERVICE_NO_CHANGE;
LPCWSTR su = NULL;
@@ -721,12 +699,12 @@
apxLogWrite(APXLOG_MARK_DEBUG "Setting service password %S",
SO_SPASSWORD);
}
- apxServiceSetNames(hService,
- NULL, /* Never update the ImagePath */
- SO_DISPLAYNAME,
- SO_DESCRIPTION,
- su,
- sp);
+ rv = (rv && apxServiceSetNames(hService,
+ NULL, /* Never update the ImagePath
*/
+ SO_DISPLAYNAME,
+ SO_DESCRIPTION,
+ su,
+ sp));
/* Update the --Startup mode */
if (ST_STARTUP & APXCMDOPT_FOUND) {
if (!lstrcmpiW(SO_STARTUP, PRSRV_AUTO))
@@ -738,21 +716,22 @@
if (!lstrcmpiW(SO_TYPE, STYPE_INTERACTIVE))
dwType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS;
}
- apxServiceSetOptions(hService,
- dwType,
- dwStart,
- SERVICE_NO_CHANGE);
+ rv = (rv && apxServiceSetOptions(hService,
+ dwType,
+ dwStart,
+ SERVICE_NO_CHANGE));
- apxLogWrite(APXLOG_MARK_INFO "Service %S updated",
+ apxLogWrite(APXLOG_MARK_INFO "Service '%S' updated",
lpCmdline->szApplication);
- saveConfiguration(lpCmdline);
+ rv = (rv && saveConfiguration(lpCmdline));
}
+ apxCloseHandle(hService);
+ if (rv)
+ apxLogWrite(APXLOG_MARK_INFO "Update service finished.");
else
- apxDisplayError(TRUE, NULL, 0, "Unable to open %S service",
- lpCmdline->szApplication);
- apxCloseHandle(hService);
- apxLogWrite(APXLOG_MARK_INFO "Update service finished.");
+ apxLogWrite(APXLOG_MARK_INFO "Update service '%S' failed.",
+ lpCmdline->szApplication);
return rv;
}
@@ -835,7 +814,7 @@
return 1;
}
if (!apxJavaInitialize(hWorker, _jni_classpath, _jni_jvmoptions,
- SO_JVMMS, SO_JVMMX, SO_JVMSS)) {
+ SO_JVMMS, SO_JVMMX, SO_JVMSS, SO_JNIVFPRINTF)) {
rv = 2;
apxLogWrite(APXLOG_MARK_ERROR "Failed initializing java %s",
_jni_classpath);
goto cleanup;
@@ -880,7 +859,15 @@
goto cleanup;
}
/* Assemble the command line */
- nArgs = apxMultiSzToArrayW(gPool, SO_STOPPARAMS, &pArgs);
+ if (_java_shutdown) {
+ nArgs = apxJavaCmdInitialize(gPool, SO_CLASSPATH, SO_STOPCLASS,
+ SO_JVMOPTIONS, SO_JVMMS, SO_JVMMX,
+ SO_JVMSS, SO_STOPPARAMS, &pArgs);
+ }
+ else {
+ nArgs = apxMultiSzToArrayW(gPool, SO_STOPPARAMS, &pArgs);
+ }
+
/* Pass the argv to child process */
if (!apxProcessSetCommandArgsW(hWorker, SO_STOPIMAGE,
nArgs, pArgs)) {
@@ -903,7 +890,7 @@
apxLogWrite(APXLOG_MARK_ERROR "Failed executing process");
goto cleanup;
} else {
- apxLogWrite(APXLOG_MARK_DEBUG "Waiting stop worker to finish...");
+ apxLogWrite(APXLOG_MARK_DEBUG "Waiting for stop worker to
finish...");
apxHandleWait(hWorker, INFINITE, FALSE);
apxLogWrite(APXLOG_MARK_DEBUG "Stop worker finished.");
}
@@ -980,6 +967,14 @@
apxLogWrite(APXLOG_MARK_INFO "Worker is not defined");
return TRUE; /* Nothing to do */
}
+ if (SO_PIDFILE) {
+ gPidfileName = apxLogFile(gPool, SO_LOGPATH, SO_PIDFILE, NULL, FALSE);
+ if (GetFileAttributesW(gPidfileName) != INVALID_FILE_ATTRIBUTES) {
+ /* Pid file exists */
+ apxLogWrite(APXLOG_MARK_ERROR "Pid file '%S' exists",
gPidfileName);
+ return 1;
+ }
+ }
GetSystemTimeAsFileTime(&fts);
if (_jni_startup) {
if (SO_STARTPATH) {
@@ -995,7 +990,7 @@
return 1;
}
if (!apxJavaInitialize(gWorker, _jni_classpath, _jni_jvmoptions,
- SO_JVMMS, SO_JVMMX, SO_JVMSS)) {
+ SO_JVMMS, SO_JVMMX, SO_JVMSS, SO_JNIVFPRINTF)) {
rv = 2;
apxLogWrite(APXLOG_MARK_ERROR "Failed initializing java %s",
_jni_classpath);
goto cleanup;
@@ -1009,7 +1004,7 @@
apxJavaSetOut(gWorker, FALSE, gStdwrap.szStdOutFilename);
if (!apxJavaStart(gWorker)) {
rv = 4;
- apxLogWrite(APXLOG_MARK_ERROR "Failed starting Java");
+ apxLogWrite(APXLOG_MARK_ERROR "Failed to start Java");
goto cleanup;
}
apxLogWrite(APXLOG_MARK_DEBUG "Java started %s", _jni_rclass);
@@ -1023,7 +1018,7 @@
SO_PASSWORD,
FALSE);
if (IS_INVALID_HANDLE(gWorker)) {
- apxLogWrite(APXLOG_MARK_ERROR "Failed creating process");
+ apxLogWrite(APXLOG_MARK_ERROR "Failed to create process");
return 1;
}
if (!apxProcessSetExecutableW(gWorker, SO_STARTIMAGE)) {
@@ -1033,7 +1028,15 @@
goto cleanup;
}
/* Assemble the command line */
- nArgs = apxMultiSzToArrayW(gPool, SO_STARTPARAMS, &pArgs);
+ if (_java_startup) {
+ nArgs = apxJavaCmdInitialize(gPool, SO_CLASSPATH, SO_STARTCLASS,
+ SO_JVMOPTIONS, SO_JVMMS, SO_JVMMX,
+ SO_JVMSS, SO_STARTPARAMS, &pArgs);
+ }
+ else {
+ nArgs = apxMultiSzToArrayW(gPool, SO_STARTPARAMS, &pArgs);
+ }
+
/* Pass the argv to child process */
if (!apxProcessSetCommandArgsW(gWorker, SO_STARTIMAGE,
nArgs, pArgs)) {
@@ -1053,7 +1056,7 @@
*/
if (!apxProcessExecute(gWorker)) {
rv = 5;
- apxLogWrite(APXLOG_MARK_ERROR "Failed executing process");
+ apxLogWrite(APXLOG_MARK_ERROR "Failed to execute process");
goto cleanup;
}
}
@@ -1061,6 +1064,27 @@
FILETIME fte;
ULARGE_INTEGER s, e;
DWORD nms;
+ /* Create pidfile */
+ if (gPidfileName) {
+ char pids[32];
+ gPidfileHandle = CreateFileW(gPidfileName,
+ GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ,
+ NULL,
+ CREATE_NEW,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+
+ if (gPidfileHandle != INVALID_HANDLE_VALUE) {
+ DWORD wr = 0;
+ if (_jni_startup)
+ _snprintf(pids, 32, "%d\r\n", GetCurrentProcessId());
+ else
+ _snprintf(pids, 32, "%d\r\n", apxProcessGetPid(gWorker));
+ WriteFile(gPidfileHandle, pids, (DWORD)strlen(pids), &wr, NULL);
+ FlushFileBuffers(gPidfileName);
+ }
+ }
GetSystemTimeAsFileTime(&fte);
s.LowPart = fts.dwLowDateTime;
s.HighPart = fts.dwHighDateTime;
@@ -1166,12 +1190,12 @@
apxLogWrite(APXLOG_MARK_DEBUG "Inside ServiceMain...");
if (_service_name) {
- WCHAR en[SIZ_DESLEN];
+ WCHAR en[SIZ_HUGLEN];
int i;
PSECURITY_ATTRIBUTES sa = GetNullACL();
- lstrcpyW(en, L"Global\\");
- lstrcatW(en, _service_name);
- lstrcatW(en, PRSRV_SIGNAL);
+ lstrlcpyW(en, SIZ_DESLEN, L"Global\\");
+ lstrlcatW(en, SIZ_DESLEN, _service_name);
+ lstrlcatW(en, SIZ_DESLEN, PRSRV_SIGNAL);
for (i = 7; i < lstrlenW(en); i++) {
if (en[i] >= L'a' && en[i] <= L'z')
en[i] = en[i] - 32;
@@ -1188,19 +1212,26 @@
if (SO_STARTMODE) {
if (!lstrcmpiW(SO_STARTMODE, PRSRV_JVM)) {
_jni_startup = TRUE;
- WideToAscii(SO_STARTCLASS, _jni_rclass);
+ _jni_rclass = WideToUTF8(SO_STARTCLASS);
/* Exchange all dots with slashes */
apxStrCharReplaceA(_jni_rclass, '.', '/');
_jni_rparam = SO_STARTPARAMS;
}
else if (!lstrcmpiW(SO_STARTMODE, PRSRV_JAVA)) {
- LPWSTR jx = NULL, szJH = apxGetJavaSoftHome(gPool, FALSE);
+ LPWSTR jx = NULL, szJH = SO_JAVAHOME;
+ if (!szJH)
+ szJH = apxGetJavaSoftHome(gPool, FALSE);
if (szJH) {
jx = apxPoolAlloc(gPool, (lstrlenW(szJH) + 16) * sizeof(WCHAR));
lstrcpyW(jx, szJH);
lstrcatW(jx, PRSRV_JBIN);
SO_STARTPATH = szJH;
}
+ else {
+ apxLogWrite(APXLOG_MARK_ERROR "Unable to find Java Runtime
Environment.");
+ goto cleanup;
+ }
+ _java_startup = TRUE;
/* StartImage now contains the full path to the java.exe */
SO_STARTIMAGE = jx;
}
@@ -1209,18 +1240,25 @@
if (SO_STOPMODE) {
if (!lstrcmpiW(SO_STOPMODE, PRSRV_JVM)) {
_jni_shutdown = TRUE;
- WideToAscii(SO_STOPCLASS, _jni_sclass);
+ _jni_sclass = WideToUTF8(SO_STOPCLASS);
apxStrCharReplaceA(_jni_sclass, '.', '/');
_jni_sparam = SO_STOPPARAMS;
}
else if (!lstrcmpiW(SO_STOPMODE, PRSRV_JAVA)) {
- LPWSTR jx = NULL, szJH = apxGetJavaSoftHome(gPool, FALSE);
+ LPWSTR jx = NULL, szJH = SO_JAVAHOME;
+ if (!szJH)
+ szJH = apxGetJavaSoftHome(gPool, FALSE);
if (szJH) {
jx = apxPoolAlloc(gPool, (lstrlenW(szJH) + 16) * sizeof(WCHAR));
lstrcpyW(jx, szJH);
lstrcatW(jx, PRSRV_JBIN);
SO_STOPPATH = szJH;
}
+ else {
+ apxLogWrite(APXLOG_MARK_ERROR "Unable to find Java Runtime
Environment.");
+ goto cleanup;
+ }
+ _java_shutdown = TRUE;
/* StopImage now contains the full path to the java.exe */
SO_STOPIMAGE = jx;
}
@@ -1256,26 +1294,39 @@
/* Service is started */
DWORD rv;
reportServiceStatus(SERVICE_RUNNING, NO_ERROR, 0);
- apxLogWrite(APXLOG_MARK_DEBUG "Waiting worker to finish...");
+ apxLogWrite(APXLOG_MARK_DEBUG "Waiting for worker to finish...");
/* Set console handler to capture CTRL events */
SetConsoleCtrlHandler((PHANDLER_ROUTINE)console_handler, TRUE);
rv = apxHandleWait(gWorker, INFINITE, FALSE);
apxLogWrite(APXLOG_MARK_DEBUG "Worker finished.");
- reportServiceStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
- fflush(stdout);
}
else {
apxLogWrite(APXLOG_MARK_ERROR "ServiceStart returned %d", rc);
goto cleanup;
}
if (gShutdownEvent) {
+ reportServiceStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
/* Ensure that shutdown thread exits before us */
apxLogWrite(APXLOG_MARK_DEBUG "Waiting for ShutdownEvent");
- WaitForSingleObject(gShutdownEvent, 60 * 1000);
+ WaitForSingleObject(gShutdownEvent, ONE_MINUTE);
apxLogWrite(APXLOG_MARK_DEBUG "ShutdownEvent signaled");
CloseHandle(gShutdownEvent);
+ /* This will cause to wait for all threads to exit
+ */
+ apxLogWrite(APXLOG_MARK_DEBUG "Waiting 1 minute for all threads to
exit");
+ apxDestroyJvm(ONE_MINUTE);
}
+ else {
+ /* We came here without shutdown event
+ * Probably because main() returned without ensuring all threads
+ * have finished
+ */
+ apxLogWrite(APXLOG_MARK_DEBUG "Waiting for all threads to exit");
+ apxDestroyJvm(INFINITE);
+ reportServiceStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
+ }
+ apxLogWrite(APXLOG_MARK_DEBUG "JVM destroyed.");
reportServiceStatus(SERVICE_STOPPED, NO_ERROR, 0);
return;
@@ -1293,24 +1344,29 @@
_service_mode = FALSE;
_service_name = lpCmdline->szApplication;
- apxLogWrite(APXLOG_MARK_INFO "Debugging Service...");
+ apxLogWrite(APXLOG_MARK_INFO "Debugging '%S' Service...",
_service_name);
serviceMain(0, NULL);
apxLogWrite(APXLOG_MARK_INFO "Debug service finished.");
-
+ SAFE_CLOSE_HANDLE(gPidfileHandle);
+ if (gPidfileName)
+ DeleteFileW(gPidfileName);
return rv;
}
BOOL docmdRunService(LPAPXCMDLINE lpCmdline)
{
BOOL rv = FALSE;
+
_service_mode = TRUE;
-
- apxLogWrite(APXLOG_MARK_INFO "Running Service...");
_service_name = lpCmdline->szApplication;
+ apxLogWrite(APXLOG_MARK_INFO "Running '%S' Service...",
_service_name);
_service_table[0].lpServiceName = lpCmdline->szApplication;
_service_table[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTIONW)serviceMain;
- rv = (StartServiceCtrlDispatcherW(_service_table) == FALSE);
+ rv = (StartServiceCtrlDispatcherW(_service_table) != 0);
apxLogWrite(APXLOG_MARK_INFO "Run service finished.");
+ SAFE_CLOSE_HANDLE(gPidfileHandle);
+ if (gPidfileName)
+ DeleteFileW(gPidfileName);
return rv;
}
@@ -1320,6 +1376,18 @@
LPAPXCMDLINE lpCmdline;
+ if (argc > 1 && strncmp(argv[1], "//PP", 4) == 0) {
+ /* Handy sleep routine defaulting to 1 minute */
+ DWORD ss = 60;
+ if (argv[1][4] && argv[1][5] && argv[1][6]) {
+ int us = atoi(argv[1] + 6);
+ if (us > 0)
+ ss = (DWORD)us;
+ }
+ Sleep(ss * 1000);
+ ExitProcess(0);
+ return;
+ }
apxHandleManagerInitialize();
/* Create the main Pool */
gPool = apxPoolCreate(NULL, 0);
@@ -1331,17 +1399,19 @@
goto cleanup;
}
apxCmdlineLoadEnvVars(lpCmdline);
- if (lpCmdline->dwCmdIndex < 5 &&
- !loadConfiguration(lpCmdline)) {
- apxLogWrite(APXLOG_MARK_ERROR "Load configuration failed");
- rv = 2;
- goto cleanup;
+ if (lpCmdline->dwCmdIndex < 5) {
+ if (!loadConfiguration(lpCmdline) &&
+ lpCmdline->dwCmdIndex < 4) {
+ apxLogWrite(APXLOG_MARK_ERROR "Load configuration failed");
+ rv = 2;
+ goto cleanup;
+ }
}
apxLogOpen(gPool, SO_LOGPATH, SO_LOGPREFIX);
apxLogLevelSetW(NULL, SO_LOGLEVEL);
- apxLogWrite(APXLOG_MARK_DEBUG "Procrun log initialized");
- apxLogWrite(APXLOG_MARK_INFO "Procrun (%s) started", PRG_VERSION);
+ apxLogWrite(APXLOG_MARK_DEBUG "Commons Daemon procrun log initialized");
+ apxLogWrite(APXLOG_MARK_INFO "Commons Daemon procrun (%s) started",
PRG_VERSION);
AplZeroMemory(&gStdwrap, sizeof(APX_STDWRAP));
@@ -1352,6 +1422,18 @@
gStdwrap.szStdErrFilename = SO_STDERROR;
}
redirectStdStreams(&gStdwrap);
+ if (lpCmdline->dwCmdIndex == 2) {
+ SYSTEMTIME t;
+ GetLocalTime(&t);
+ fprintf(stdout, "\n%d-%02d-%02d %02d:%02d:%02d "
+ "Commons Daemon procrun stdout initialized\n",
+ t.wYear, t.wMonth, t.wDay,
+ t.wHour, t.wMinute, t.wSecond);
+ fprintf(stderr, "\n%d-%02d-%02d %02d:%02d:%02d "
+ "Commons Daemon procrun stderr initialized\n",
+ t.wYear, t.wMonth, t.wDay,
+ t.wHour, t.wMinute, t.wSecond);
+ }
switch (lpCmdline->dwCmdIndex) {
case 1: /* Run Service as console application */
if (!docmdDebugService(lpCmdline))
@@ -1377,23 +1459,33 @@
if (!docmdDeleteService(lpCmdline))
rv = 8;
break;
+ case 7: /* Print Usage and exit */
+ printUsage(lpCmdline, TRUE);
+ break;
+ case 8: /* Print version and exit */
+ printVersion();
+ break;
default:
/* Unknown command option */
apxLogWrite(APXLOG_MARK_ERROR "Unknown command line option");
- printUsage(lpCmdline);
+ printUsage(lpCmdline, FALSE);
rv = 99;
break;
}
cleanup:
- apxLogWrite(APXLOG_MARK_INFO "Procrun finished.");
+ if (rv)
+ apxLogWrite(APXLOG_MARK_ERROR "Commons Daemon procrun failed "
+ "with exit value: %d", rv);
+ else
+ apxLogWrite(APXLOG_MARK_INFO "Commons Daemon procrun finished");
if (lpCmdline)
apxCmdlineFree(lpCmdline);
if (_service_status_handle)
CloseHandle(_service_status_handle);
_service_status_handle = NULL;
+ _flushall();
apxLogClose(NULL);
apxHandleManagerDestroy();
- cleanupStdStreams(&gStdwrap);
ExitProcess(rv);
}
Modified: trunk/utils/windows/native/service/procrun/apps/prunsrv/prunsrv.h
===================================================================
--- trunk/utils/windows/native/service/procrun/apps/prunsrv/prunsrv.h 2010-06-16 10:02:46
UTC (rev 2688)
+++ trunk/utils/windows/native/service/procrun/apps/prunsrv/prunsrv.h 2010-07-21 20:01:54
UTC (rev 2689)
@@ -13,20 +13,20 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+
/* ====================================================================
* jar2exe -- convert .jar file to WIN32 executable.
* Contributed by Mladen Turk <mturk(a)apache.org>
* 05 Aug 2003
- * ====================================================================
+ * ====================================================================
*/
#ifndef _PRUNSRV_H
#define _PRUNSRV_H
#undef PRG_VERSION
-#define PRG_VERSION "2.0.4.1"
-#define CSV_VERSION 2,0,4,1
+#define PRG_VERSION "2.0.5.1"
+#define CSV_VERSION 2,0,5,1
#define PRG_REGROOT L"JBoss\\JBoss Web 2"
#endif /* _PRUNSRV_H */
Modified: trunk/utils/windows/native/service/procrun/apps/prunsrv/prunsrv.rc
===================================================================
--- trunk/utils/windows/native/service/procrun/apps/prunsrv/prunsrv.rc 2010-06-16 10:02:46
UTC (rev 2688)
+++ trunk/utils/windows/native/service/procrun/apps/prunsrv/prunsrv.rc 2010-07-21 20:01:54
UTC (rev 2689)
@@ -13,22 +13,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+
#include "apxwin.h"
#include "prunsrv.h"
-#define STR_COPYRIGHT "Copyright � 2007 Red Hat Middleware, LLC. " \
+#define STR_COPYRIGHT "Copyright � 2010 Red Hat, Inc. " \
"or its licensors, as applicable."
#define STR_LICENSE "Distributable under LGPL license. " \
"See terms of license at gnu.org."
-#define STR_COMPANY "Red Hat�, Inc."
-#define STR_TRADEMARK "� Red Hat Inc."
+#define STR_COMPANY "Red Hat�, Inc."
+#define STR_TRADEMARK "� Red Hat Inc."
#define STR_PRODUCT "JBoss Web Service wrapper"
-IDI_MAINICON ICON "../../resources/jboss.ico"
-IDI_REDHATICON ICON "../../resources/jboss.ico"
+IDI_MAINICON ICON "../../resources/jboss.ico"
+IDI_REDHATICON ICON "../../resources/jboss.ico"
1 VERSIONINFO
FILEVERSION CSV_VERSION
@@ -62,4 +62,4 @@
BEGIN
VALUE "Translation", 0x409, 1200
END
-END
+END
Modified: trunk/utils/windows/native/service/procrun/src/cmdline.c
===================================================================
--- trunk/utils/windows/native/service/procrun/src/cmdline.c 2010-06-16 10:02:46 UTC (rev
2688)
+++ trunk/utils/windows/native/service/procrun/src/cmdline.c 2010-07-21 20:01:54 UTC (rev
2689)
@@ -102,34 +102,38 @@
*p = L'\0';
}
}
- if (lpszCommands && _st_sys_argc > 1 && lstrlenW(_st_sys_argvw[1])
> 5) {
- if (_st_sys_argvw[1][0] == L'/' &&
- _st_sys_argvw[1][1] == L'/' &&
- _st_sys_argvw[1][5] == L'/') { /* allow max tree char command */
- l = 2;
- while (_st_sys_argvw[1][l] != L'/') {
- cmd[l - 2] = _st_sys_argvw[1][l];
+ if (lpszCommands && _st_sys_argc > 1 && lstrlenW(_st_sys_argvw[1])
> 2) {
+ LPWSTR ca = _st_sys_argvw[1];
+ if (ca[0] == L'/' && ca[1] == L'/') {
+ l = 0;
+ ca += 2;
+ while (*ca && *ca != L'/') {
+ cmd[l] = *ca;
if (l++ > 3)
break;
+ ca++;
}
- cmd[l - 2] = L'\0';
+ cmd[l] = L'\0';
while (lpszCommands[i]) {
if (lstrcmpW(lpszCommands[i++], cmd) == 0) {
lpCmdline->dwCmdIndex = i;
- s = 2;
break;
}
}
if (lpCmdline->dwCmdIndex) {
- _st_sys_argvw[1][l+1] = L'\0';
- lpCmdline->szApplication = &(_st_sys_argvw[1][l+2]);
- if (!lstrlenW(lpCmdline->szApplication))
+ while (*ca == '/')
+ *(ca++) = L'\0';
+ if (*ca == '\0')
lpCmdline->szApplication = _st_sys_argvw[0];
+ else
+ lpCmdline->szApplication = ca;
}
else {
- apxLogWrite(APXLOG_MARK_ERROR "Unrecognized cmd option %s",
cmd);
- s = 2;
+ apxLogWrite(APXLOG_MARK_ERROR "Unrecognized cmd option %S",
+ _st_sys_argvw[1]);
+ return NULL;
}
+ s = 2;
}
}
else {
@@ -218,6 +222,14 @@
break;
}
}
+ if (match == 0) {
+ /* --unknown option
+ *
+ */
+ apxLogWrite(APXLOG_MARK_ERROR "Unrecognized program option %S",
+ _st_sys_argvw[i]);
+ return NULL;
+ }
}
if (i < (DWORD)_st_sys_argc) {
lpCmdline->dwArgc = _st_sys_argc - i;
@@ -252,8 +264,8 @@
while (lpCmdline->lpOptions[i].szName) {
DWORD l;
WCHAR szVar[SIZ_HUGLEN];
- lstrcpyW(szEnv, L"PR_");
- lstrcatW(szEnv, lpCmdline->lpOptions[i].szName);
+ lstrlcpyW(szEnv, SIZ_HUGLEN, L"PR_");
+ lstrlcatW(szEnv, SIZ_HUGLEN, lpCmdline->lpOptions[i].szName);
l = GetEnvironmentVariableW(szEnv, szVar, SIZ_HUGMAX);
if (l == 0 && GetLastError() != ERROR_ENVVAR_NOT_FOUND) {
apxLogWrite(APXLOG_MARK_ERROR "Error geting environment variable
%S",
@@ -265,14 +277,17 @@
lpCmdline->lpOptions[i].szValue = apxPoolStrdupW(lpCmdline->hPool,
szVar);
lpCmdline->lpOptions[i].dwType |= APXCMDOPT_FOUND;
}
+ else if (l && (lpCmdline->lpOptions[i].dwType & APXCMDOPT_INT)) {
+ lpCmdline->lpOptions[i].dwValue = (DWORD)apxAtoulW(szVar);
+ lpCmdline->lpOptions[i].dwType |= APXCMDOPT_FOUND;
+ }
else if (l && (lpCmdline->lpOptions[i].dwType & APXCMDOPT_MSZ)) {
LPWSTR pp;
BOOL insquote = FALSE, indquote = FALSE;
DWORD sp = 0;
+ lpCmdline->lpOptions[i].dwValue = (lstrlenW(szVar) + 2) * sizeof(WCHAR);
lpCmdline->lpOptions[i].szValue = apxPoolCalloc(lpCmdline->hPool,
- (lstrlenW(szVar) + 2) *
- sizeof(WCHAR));
- lstrcpyW(lpCmdline->lpOptions[i].szValue, szVar);
+ lpCmdline->lpOptions[i].dwValue);
pp = szVar;
while(*pp) {
if (*pp == L'\'')
@@ -292,4 +307,5 @@
++i;
}
-}
\ No newline at end of file
+}
+
Modified: trunk/utils/windows/native/service/procrun/src/handles.c
===================================================================
--- trunk/utils/windows/native/service/procrun/src/handles.c 2010-06-16 10:02:46 UTC (rev
2688)
+++ trunk/utils/windows/native/service/procrun/src/handles.c 2010-07-21 20:01:54 UTC (rev
2689)
@@ -407,9 +407,12 @@
{
if (szSource) {
LPWSTR szDest;
- DWORD l = lstrlenA(szSource);
- szDest = apxPoolAlloc(hPool, (l + 1) * sizeof(WCHAR));
- AsciiToWide(szSource, szDest);
+ int cch = MultiByteToWideChar(CP_UTF8, 0, szSource, -1, NULL, 0);
+ szDest = (LPWSTR)apxPoolAlloc(hPool, cch * sizeof(WCHAR));
+ if (!MultiByteToWideChar(CP_UTF8, 0, szSource, -1, szDest, cch)) {
+ apxFree(szDest);
+ return NULL;
+ }
return szDest;
}
else
Modified: trunk/utils/windows/native/service/procrun/src/javajni.c
===================================================================
--- trunk/utils/windows/native/service/procrun/src/javajni.c 2010-06-16 10:02:46 UTC (rev
2688)
+++ trunk/utils/windows/native/service/procrun/src/javajni.c 2010-07-21 20:01:54 UTC (rev
2689)
@@ -45,13 +45,17 @@
DYNOLAD_TYPE_DECLARE(JNI_GetCreatedJavaVMs, JNICALL, jint)(JavaVM **, jsize, jsize *);
static DYNLOAD_FPTR_DECLARE(JNI_GetCreatedJavaVMs) = NULL;
-static HANDLE _st_sys_jvmDllHandle = NULL;
+static HANDLE _st_sys_jvmDllHandle = NULL;
+static JavaVM *_st_sys_jvm = NULL;
+DYNOLAD_TYPE_DECLARE(SetDllDirectoryW, WINAPI, BOOL)(LPCWSTR);
+static DYNLOAD_FPTR_DECLARE(SetDllDirectoryW) = NULL;
+
#define JVM_DELETE_CLAZZ(jvm, cl) \
APXMACRO_BEGIN \
- if ((jvm)->lpEnv && (jvm)->##cl.jClazz) {
\
- (*((jvm)->lpEnv))->DeleteGlobalRef((jvm)->lpEnv, (jvm)->##cl.jClazz);
\
- (jvm)->##cl.jClazz = NULL; \
+ if ((jvm)->lpEnv && (jvm)->cl.jClazz) {
\
+ (*((jvm)->lpEnv))->DeleteGlobalRef((jvm)->lpEnv, (jvm)->cl.jClazz);
\
+ (jvm)->cl.jClazz = NULL; \
} APXMACRO_END
#define JVM_EXCEPTION_CHECK(jvm) \
@@ -80,21 +84,23 @@
(*(lpJava->lpEnv))->DeleteLocalRef(lpJava->lpEnv, obj)
#define JNICALL_0(fName) \
- ((*(lpJava->lpEnv))->##fName(lpJava->lpEnv))
+ ((*(lpJava->lpEnv))->fName(lpJava->lpEnv))
#define JNICALL_1(fName, a1) \
- ((*(lpJava->lpEnv))->##fName(lpJava->lpEnv, (a1)))
+ ((*(lpJava->lpEnv))->fName(lpJava->lpEnv, (a1)))
#define JNICALL_2(fName, a1, a2) \
- ((*(lpJava->lpEnv))->##fName(lpJava->lpEnv, (a1), (a2)))
+ ((*(lpJava->lpEnv))->fName(lpJava->lpEnv, (a1), (a2)))
#define JNICALL_3(fName, a1, a2, a3) \
- ((*(lpJava->lpEnv))->##fName(lpJava->lpEnv, (a1), (a2), (a3)))
+ ((*(lpJava->lpEnv))->fName(lpJava->lpEnv, (a1), (a2), (a3)))
#define JNICALL_4(fName, a1, a2, a3, a4) \
- ((*(lpJava->lpEnv))->##fName(lpJava->lpEnv, (a1), (a2), (a3), (a4)))
+ ((*(lpJava->lpEnv))->fName(lpJava->lpEnv, (a1), (a2), (a3), (a4)))
typedef struct APXJAVASTDCLAZZ {
+ CHAR sClazz[1024];
+ CHAR sMethod[512];
jclass jClazz;
jmethodID jMethod;
jobject jObject;
@@ -117,11 +123,16 @@
} APXJAVAVM, *LPAPXJAVAVM;
#define JAVA_CLASSPATH "-Djava.class.path="
+#define JAVA_CLASSPATH_W L"-Djava.class.path="
#define JAVA_CLASSSTRING "java/lang/String"
static __inline BOOL __apxJvmAttach(LPAPXJAVAVM lpJava)
{
- jint _iStatus = (*(lpJava->lpJvm))->GetEnv(lpJava->lpJvm,
+ jint _iStatus;
+
+ if (!_st_sys_jvm)
+ return FALSE;
+ _iStatus = (*(lpJava->lpJvm))->GetEnv(lpJava->lpJvm,
(void **)&(lpJava->lpEnv),
lpJava->iVersion);
if (_iStatus != JNI_OK) {
@@ -139,8 +150,9 @@
static __inline BOOL __apxJvmDetach(LPAPXJAVAVM lpJava)
{
- jint _iStatus = (*(lpJava->lpJvm))->DetachCurrentThread(lpJava->lpJvm);
- if (_iStatus != JNI_OK) {
+ if (!_st_sys_jvm)
+ return FALSE;
+ if ((*(lpJava->lpJvm))->DetachCurrentThread(lpJava->lpJvm) != JNI_OK) {
lpJava->lpEnv = NULL;
return FALSE;
}
@@ -152,6 +164,7 @@
{
UINT errMode;
LPWSTR dllJvmPath = (LPWSTR)szJvmDllPath;
+ DYNLOAD_FPTR_DECLARE(SetDllDirectoryW);
if (!IS_INVALID_HANDLE(_st_sys_jvmDllHandle))
return TRUE; /* jvm.dll is already loaded */
@@ -168,6 +181,25 @@
if (IS_INVALID_HANDLE(_st_sys_jvmDllHandle))
_st_sys_jvmDllHandle = LoadLibraryExW(dllJvmPath, NULL,
LOAD_WITH_ALTERED_SEARCH_PATH);
+
+ if (IS_INVALID_HANDLE(_st_sys_jvmDllHandle)) {
+ WCHAR jreBinPath[SIZ_PATHLEN];
+ DWORD i, l = 0;
+
+ lstrlcpyW(jreBinPath, SIZ_PATHLEN, dllJvmPath);
+ DYNLOAD_FPTR_ADDRESS(SetDllDirectoryW, KERNEL32);
+ for (i = lstrlenW(jreBinPath); i > 0, l < 2; i--) {
+ if (jreBinPath[i] == L'\\' || jreBinPath[i] == L'/') {
+ jreBinPath[i] = L'\0';
+ DYNLOAD_CALL(SetDllDirectoryW)(jreBinPath);
+ l++;
+ }
+ }
+ _st_sys_jvmDllHandle = LoadLibraryExW(dllJvmPath, NULL, 0);
+ if (IS_INVALID_HANDLE(_st_sys_jvmDllHandle))
+ _st_sys_jvmDllHandle = LoadLibraryExW(dllJvmPath, NULL,
+ LOAD_WITH_ALTERED_SEARCH_PATH);
+ }
/* Restore the error mode signalization */
SetErrorMode(errMode);
if (IS_INVALID_HANDLE(_st_sys_jvmDllHandle)) {
@@ -200,7 +232,7 @@
lpJava = APXHANDLE_DATA(hObject);
switch (uMsg) {
case WM_CLOSE:
- if (lpJava->lpJvm) {
+ if (_st_sys_jvm && lpJava->lpJvm) {
if (!IS_INVALID_HANDLE(lpJava->hWorkerThread)) {
if (GetExitCodeThread(lpJava->hWorkerThread, &dwJvmRet)
&&
dwJvmRet == STILL_ACTIVE) {
@@ -214,11 +246,6 @@
__apxJvmDetach(lpJava);
/* Check if this is the jvm loader */
if (!lpJava->iVmCount && _st_sys_jvmDllHandle) {
-#if 0
- /* Do not destroy if we terminated the worker thread */
- if (dwJvmRet != STILL_ACTIVE)
- (*(lpJava->lpJvm))->DestroyJavaVM(lpJava->lpJvm);
-#endif
/* Unload JVM dll */
FreeLibrary(_st_sys_jvmDllHandle);
_st_sys_jvmDllHandle = NULL;
@@ -260,9 +287,44 @@
lpJava = APXHANDLE_DATA(hJava);
lpJava->lpJvm = lpJvm;
lpJava->iVmCount = iVmCount;
+ if (!_st_sys_jvm)
+ _st_sys_jvm = lpJvm;
return hJava;
}
+static DWORD WINAPI __apxJavaDestroyThread(LPVOID lpParameter)
+{
+ JavaVM *lpJvm = (JavaVM *)lpParameter;
+ (*lpJvm)->DestroyJavaVM(lpJvm);
+ return 0;
+}
+
+BOOL
+apxDestroyJvm(DWORD dwTimeout)
+{
+ if (_st_sys_jvm) {
+ DWORD tid;
+ HANDLE hWaiter;
+ BOOL rv = FALSE;
+ JavaVM *lpJvm = _st_sys_jvm;
+
+ _st_sys_jvm = NULL;
+ (*lpJvm)->DetachCurrentThread(lpJvm);
+ hWaiter = CreateThread(NULL, 0, __apxJavaDestroyThread,
+ (void *)lpJvm, 0, &tid);
+ if (IS_INVALID_HANDLE(hWaiter)) {
+ apxLogWrite(APXLOG_MARK_SYSERR);
+ return FALSE;
+ }
+ if (WaitForSingleObject(hWaiter, dwTimeout) == WAIT_OBJECT_0)
+ rv = TRUE;
+ CloseHandle(hWaiter);
+ return rv;
+ }
+ else
+ return FALSE;
+}
+
static DWORD __apxMultiSzToJvmOptions(APXHANDLE hPool,
LPCSTR lpString,
JavaVMOption **lppArray,
@@ -313,12 +375,12 @@
BOOL
apxJavaInitialize(APXHANDLE hJava, LPCSTR szClassPath,
LPCVOID lpOptions, DWORD dwMs, DWORD dwMx,
- DWORD dwSs)
+ DWORD dwSs, DWORD bJniVfprintf)
{
LPAPXJAVAVM lpJava;
JavaVMInitArgs vmArgs;
JavaVMOption *lpJvmOptions;
- DWORD i, nOptions, sOptions = 2;
+ DWORD i, nOptions, sOptions = 0;
BOOL rv = FALSE;
if (hJava->dwType != APXHANDLE_TYPE_JVM)
return FALSE;
@@ -355,17 +417,25 @@
++sOptions;
if (dwSs)
++sOptions;
+ if (bJniVfprintf)
+ ++sOptions;
+ if (szClassPath && *szClassPath)
+ ++sOptions;
nOptions = __apxMultiSzToJvmOptions(hJava->hPool, lpOptions,
&lpJvmOptions, sOptions);
- szCp = apxPoolAlloc(hJava->hPool, sizeof(JAVA_CLASSPATH) +
lstrlenA(szClassPath));
- lstrcpyA(szCp, JAVA_CLASSPATH);
- lstrcatA(szCp, szClassPath);
- lpJvmOptions[nOptions - sOptions].optionString = szCp;
- --sOptions;
- /* default JNI error printer */
- lpJvmOptions[nOptions - sOptions].optionString = "vfprintf";
- lpJvmOptions[nOptions - sOptions].extraInfo = __apxJniVfprintf;
- --sOptions;
+ if (szClassPath && *szClassPath) {
+ szCp = apxPoolAlloc(hJava->hPool, sizeof(JAVA_CLASSPATH) +
lstrlenA(szClassPath));
+ lstrcpyA(szCp, JAVA_CLASSPATH);
+ lstrcatA(szCp, szClassPath);
+ lpJvmOptions[nOptions - sOptions].optionString = szCp;
+ --sOptions;
+ }
+ if (bJniVfprintf) {
+ /* default JNI error printer */
+ lpJvmOptions[nOptions - sOptions].optionString = "vfprintf";
+ lpJvmOptions[nOptions - sOptions].extraInfo = __apxJniVfprintf;
+ --sOptions;
+ }
if (dwMs) {
wsprintfA(iB[0], "-Xms%dm", dwMs);
lpJvmOptions[nOptions - sOptions].optionString = iB[0];
@@ -395,8 +465,11 @@
apxLogWrite(APXLOG_MARK_ERROR "CreateJavaVM Failed");
rv = FALSE;
}
- else
+ else {
rv = TRUE;
+ if (!_st_sys_jvm)
+ _st_sys_jvm = lpJava->lpJvm;
+ }
apxFree(szCp);
apxFree(lpJvmOptions);
}
@@ -420,6 +493,100 @@
return FALSE;
}
+/* ANSI version only */
+DWORD
+apxJavaCmdInitialize(APXHANDLE hPool, LPCWSTR szClassPath, LPCWSTR szClass,
+ LPCWSTR szOptions, DWORD dwMs, DWORD dwMx,
+ DWORD dwSs, LPCWSTR szCmdArgs, LPWSTR **lppArray)
+{
+
+ DWORD i, nJVM, nCmd, nTotal, lJVM, lCmd;
+ LPWSTR p;
+
+ /* Calculate the number of all arguments */
+ nTotal = 0;
+ if (szClassPath)
+ ++nTotal;
+ if (szClass)
+ ++nTotal;
+ lJVM = __apxGetMultiSzLengthW(szOptions, &nJVM);
+ nTotal += nJVM;
+ lCmd = __apxGetMultiSzLengthW(szCmdArgs, &nCmd);
+ nTotal += nCmd;
+ if (dwMs)
+ ++nTotal;
+ if (dwMx)
+ ++nTotal;
+ if (dwSs)
+ ++nTotal;
+
+ if (nTotal == 0)
+ return 0;
+
+ /* Allocate the array to store all arguments' pointers
+ */
+ *lppArray = (LPWSTR *)apxPoolAlloc(hPool, (nTotal + 2) * sizeof(LPWSTR));
+
+ /* Process JVM options */
+ if (nJVM && lJVM) {
+ p = (LPWSTR)apxPoolAlloc(hPool, (lJVM + 1) * sizeof(WCHAR));
+ AplCopyMemory(p, szOptions, (lJVM + 1) * sizeof(WCHAR) + sizeof(WCHAR));
+ for (i = 0; i < nJVM; i++) {
+ (*lppArray)[i] = p;
+ while (*p)
+ p++;
+ p++;
+ }
+ }
+
+ /* Process the 3 extra JVM options */
+ if (dwMs) {
+ p = (LPWSTR)apxPoolAlloc(hPool, 64 * sizeof(WCHAR));
+ wsprintfW(p, L"-Xms%dm", dwMs);
+ (*lppArray)[i++] = p;
+ }
+ if (dwMx) {
+ p = (LPWSTR)apxPoolAlloc(hPool, 64 * sizeof(WCHAR));
+ wsprintfW(p, L"-Xmx%dm", dwMx);
+ (*lppArray)[i++] = p;
+ }
+ if (dwSs) {
+ p = (LPWSTR)apxPoolAlloc(hPool, 64 * sizeof(WCHAR));
+ wsprintfW(p, L"-Xss%dk", dwSs);
+ (*lppArray)[i++] = p;
+ }
+
+ /* Process the classpath and class */
+ if (szClassPath) {
+ p = (LPWSTR)apxPoolAlloc(hPool, (lstrlenW(JAVA_CLASSPATH_W) +
lstrlenW(szClassPath)) * sizeof(WCHAR));
+ lstrcpyW(p, JAVA_CLASSPATH_W);
+ lstrcatW(p, szClassPath);
+ (*lppArray)[i++] = p;
+ }
+ if (szClass) {
+ p = (LPWSTR)apxPoolAlloc(hPool, (lstrlenW(szClass)) * sizeof(WCHAR));
+ lstrcpyW(p, szClass);
+ (*lppArray)[i++] = p;
+ }
+
+ /* Process command arguments */
+ if (nCmd && lCmd) {
+ p = (LPWSTR)apxPoolAlloc(hPool, (lCmd + 1) * sizeof(WCHAR));
+ AplCopyMemory(p, szCmdArgs, (lCmd + 1) * sizeof(WCHAR) + sizeof(WCHAR));
+ for (; i < nTotal; i++) {
+ (*lppArray)[i] = p;
+ while (*p)
+ p++;
+ p++;
+ }
+ }
+
+ (*lppArray)[++i] = NULL;
+
+ return nTotal;
+}
+
+
BOOL
apxJavaLoadMainClass(APXHANDLE hJava, LPCSTR szClassName,
LPCSTR szMethodName,
@@ -447,24 +614,24 @@
lpJava->clWorker.jClazz = JNICALL_1(NewGlobalRef, jClazz);
JNI_LOCAL_UNREF(jClazz);
- if (szMethodName)
- lpJava->clWorker.jMethod = JNICALL_3(GetStaticMethodID,
- lpJava->clWorker.jClazz,
- szMethodName,
"([Ljava/lang/String;)V");
- else
- lpJava->clWorker.jMethod = JNICALL_3(GetStaticMethodID,
- lpJava->clWorker.jClazz,
- "main",
"([Ljava/lang/String;)V");
+ if (!szMethodName)
+ szMethodName = "main";
+ lstrlcpyA(lpJava->clWorker.sClazz, 1024, szClassName);
+ lstrlcpyA(lpJava->clWorker.sMethod, 512, szMethodName);
+ lpJava->clWorker.jMethod = JNICALL_3(GetStaticMethodID,
+ lpJava->clWorker.jClazz,
+ szMethodName,
"([Ljava/lang/String;)V");
if (!lpJava->clWorker.jMethod) {
JVM_EXCEPTION_CLEAR(lpJava);
- apxLogWrite(APXLOG_MARK_ERROR "Static method 'void main(String[])'
in Class %s not found", szClassName);
+ apxLogWrite(APXLOG_MARK_ERROR "Method 'static void %s(String[])' not
found in Class %s",
+ szMethodName, szClassName);
return FALSE;
}
nArgs = apxMultiSzToArrayW(hJava->hPool, lpArguments, &lpArgs);
+ lpJava->clWorker.jArgs = JNICALL_3(NewObjectArray, nArgs,
+ lpJava->clString.jClazz, NULL);
if (nArgs) {
DWORD i;
- lpJava->clWorker.jArgs = JNICALL_3(NewObjectArray, nArgs,
- lpJava->clString.jClazz, NULL);
for (i = 0; i < nArgs; i++) {
jstring arg = JNICALL_2(NewString, lpArgs[i], lstrlenW(lpArgs[i]));
JNICALL_3(SetObjectArrayElement, lpJava->clWorker.jArgs, i, arg);
@@ -475,7 +642,6 @@
return TRUE;
}
-
/* Main java application worker thread
* It will launch Java main and wait until
* it finishes.
@@ -495,6 +661,8 @@
WORKER_EXIT(2);
if (!__apxJvmAttach(lpJava))
WORKER_EXIT(3);
+ apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread started %s:%s",
+ lpJava->clWorker.sClazz, lpJava->clWorker.sMethod);
lpJava->dwWorkerStatus = 1;
JNICALL_3(CallStaticVoidMethod,
lpJava->clWorker.jClazz,
@@ -503,9 +671,12 @@
JVM_EXCEPTION_CLEAR(lpJava);
__apxJvmDetach(lpJava);
+ apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread %s:%s finished",
+ lpJava->clWorker.sClazz, lpJava->clWorker.sMethod);
finished:
lpJava->dwWorkerStatus = 0;
- apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread finished");
+ apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread finished %s:%s",
+ lpJava->clWorker.sClazz, lpJava->clWorker.sMethod);
ExitThread(rv);
/* never gets here but keep the compiler happy */
return 0;
@@ -536,6 +707,20 @@
}
DWORD
+apxJavaSetOptions(APXHANDLE hJava, DWORD dwOptions)
+{
+ DWORD dwOrgOptions;
+ LPAPXJAVAVM lpJava;
+
+ if (hJava->dwType != APXHANDLE_TYPE_JVM)
+ return 0;
+ lpJava = APXHANDLE_DATA(hJava);
+ dwOrgOptions = lpJava->dwOptions;
+ lpJava->dwOptions = dwOptions;
+ return dwOrgOptions;
+}
+
+DWORD
apxJavaWait(APXHANDLE hJava, DWORD dwMilliseconds, BOOL bKill)
{
DWORD rv;
@@ -782,3 +967,4 @@
return TRUE;
}
+
Modified: trunk/utils/windows/native/service/procrun/src/log.c
===================================================================
--- trunk/utils/windows/native/service/procrun/src/log.c 2010-06-16 10:02:46 UTC (rev
2688)
+++ trunk/utils/windows/native/service/procrun/src/log.c 2010-07-21 20:01:54 UTC (rev
2689)
@@ -12,12 +12,14 @@
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
- */
+ */
#include "apxwin.h"
#include "private.h"
+#include <stdio.h>
#define LINE_SEP "\n"
+#define LOGF_EXT L".%04d-%02d-%02d.log"
static LPCSTR _log_level[] = {
"[debug] ",
@@ -32,7 +34,7 @@
DWORD dwLogLevel;
BOOL bRotate;
SYSTEMTIME sysTime;
- WCHAR szPath[MAX_PATH + 1];
+ WCHAR szPath[SIZ_PATHLEN];
WCHAR szPrefix[MAX_PATH];
} apx_logfile_st;
@@ -46,50 +48,52 @@
APXHANDLE hPool,
LPCWSTR szPath,
LPCWSTR szPrefix,
- LPCWSTR szName)
+ LPCWSTR szName,
+ BOOL bTimeStamp)
{
LPWSTR sRet;
- WCHAR sPath[MAX_PATH+1];
- WCHAR sName[MAX_PATH+1];
+ WCHAR sPath[SIZ_PATHLEN];
+ WCHAR sName[SIZ_PATHLEN];
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
if (!szPath) {
if (GetSystemDirectoryW(sPath, MAX_PATH) == 0)
return INVALID_HANDLE_VALUE;
- lstrcatW(sPath, L"\\LogFiles\\");
- if (!szPrefix)
- lstrcatW(sPath, L"Apache");
- else
- lstrcatW(sPath, szPrefix);
- wsprintfW(sName, L"\\%s%04d%02d%02d.log",
+ lstrlcatW(sPath, MAX_PATH, L"\\LogFiles\\Apache");
+ }
+ else {
+ lstrlcpyW(sPath, MAX_PATH, szPath);
+ }
+ if (!szPrefix)
+ szPrefix = L"";
+ if (!szName)
+ szName = L"";
+ if (bTimeStamp)
+ wsprintfW(sName,
+ L"\\%s%s" LOGF_EXT,
+ szPrefix,
szName,
sysTime.wYear,
sysTime.wMonth,
sysTime.wDay);
- }
- else {
- lstrcpyW(sPath, szPath);
- if (szPrefix)
- wsprintfW(sName, L"\\%s", szPrefix);
- else
- wsprintfW(sName, L"\\%s%04d%02d%02d.log",
- szName,
- sysTime.wYear,
- sysTime.wMonth,
- sysTime.wDay);
- }
- sRet = apxPoolAlloc(hPool, (MAX_PATH + 1) * sizeof(WCHAR));
+ else
+ wsprintfW(sName,
+ L"\\%s%s",
+ szPrefix,
+ szName);
+
+ sRet = apxPoolAlloc(hPool, (SIZ_PATHLEN) * sizeof(WCHAR));
/* Set default level to info */
CreateDirectoryW(sPath, NULL);
-
- lstrcpyW(sRet, sPath);
- lstrcatW(sRet, sName);
+ lstrlcpyW(sRet, SIZ_PATHMAX, sPath);
+ lstrlcatW(sRet, SIZ_PATHMAX, sName);
+
return sRet;
}
-/* Open the log file
+/* Open the log file
* TODO: format like standard apache error.log
* Add the EventLogger
*/
@@ -99,8 +103,8 @@
LPCWSTR szPrefix)
{
- WCHAR sPath[MAX_PATH+1];
- WCHAR sName[MAX_PATH+1];
+ WCHAR sPath[SIZ_PATHLEN];
+ WCHAR sName[SIZ_PATHLEN];
SYSTEMTIME sysTime;
apx_logfile_st *h;
@@ -108,43 +112,34 @@
if (!szPath) {
if (GetSystemDirectoryW(sPath, MAX_PATH) == 0)
return INVALID_HANDLE_VALUE;
- lstrcatW(sPath, L"\\LogFiles\\");
- if (!szPrefix)
- lstrcatW(sPath, L"Apache");
- else
- lstrcatW(sPath, szPrefix);
- wsprintfW(sName, L"\\%04d%02d%02d.log",
- sysTime.wYear,
- sysTime.wMonth,
- sysTime.wDay);
+ lstrlcatW(sPath, MAX_PATH, L"\\LogFiles\\Apache");
}
else {
- lstrcpyW(sPath, szPath);
- if (szPrefix)
- wsprintfW(sName, L"\\%s", szPrefix);
- else
- wsprintfW(sName, L"\\jakarta_service_%04d%02d%02d.log",
- sysTime.wYear,
- sysTime.wMonth,
- sysTime.wDay);
+ lstrlcpyW(sPath, MAX_PATH, szPath);
}
+ if (!szPrefix)
+ szPrefix = L"commons-daemon";
+ wsprintfW(sName, L"\\%s" LOGF_EXT,
+ szPrefix,
+ sysTime.wYear,
+ sysTime.wMonth,
+ sysTime.wDay);
if (!(h = (apx_logfile_st *)apxPoolCalloc(hPool, sizeof(apx_logfile_st))))
return NULL;
/* Set default level to info */
h->dwLogLevel = APXLOG_LEVEL_INFO;
CreateDirectoryW(sPath, NULL);
-
+
h->sysTime = sysTime;
- lstrcpyW(h->szPath, sPath);
- lstrcatW(sPath, sName);
- if (szPrefix)
- lstrcpyW(h->szPrefix, szPrefix);
+ lstrlcpyW(h->szPath, MAX_PATH, sPath);
+ lstrlcatW(sPath, MAX_PATH, sName);
+ lstrlcpyW(h->szPrefix, MAX_PATH, szPrefix);
h->hFile = CreateFileW(sPath,
GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
- FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH |
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
/* Set this file as system log file */
if (!_st_sys_loghandle)
@@ -198,16 +193,16 @@
static BOOL apx_log_rotate(apx_logfile_st *l,
LPSYSTEMTIME lpCtime)
{
- WCHAR sPath[MAX_PATH+1];
-
+ WCHAR sPath[SIZ_PATHLEN];
+
/* rotate on daily basis */
if (l->sysTime.wDay == lpCtime->wDay)
return TRUE;
FlushFileBuffers(l->hFile);
- CloseHandle(l->hFile);
+ CloseHandle(l->hFile);
l->sysTime = *lpCtime;
- wsprintfW(sPath, L"%s\\%s%04d%02d%02d.log",
+ wsprintfW(sPath, L"%s\\%s" LOGF_EXT,
l->szPath,
l->szPrefix,
l->sysTime.wYear,
@@ -217,7 +212,7 @@
GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
- FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
+ FILE_FLAG_NO_BUFFERING | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if (IS_INVALID_HANDLE(l->hFile))
return FALSE;
@@ -240,12 +235,13 @@
LPSTR szBp;
int len = 0;
LPCSTR f = szFile;
- CHAR sb[MAX_PATH+1];
+ CHAR sb[SIZ_PATHLEN];
DWORD wr;
DWORD err;
BOOL dolock = TRUE;
apx_logfile_st *lf = (apx_logfile_st *)hFile;
+ err = GetLastError(); /* save the last Error code */
if (IS_INVALID_HANDLE(lf))
lf = _st_sys_loghandle;
if (IS_INVALID_HANDLE(lf)) {
@@ -255,20 +251,16 @@
}
if (dwLevel < lf->dwLogLevel)
return 0;
- err = GetLastError(); /* save the last Error code */
if (f) {
- f = (szFile + lstrlenA(szFile) - 1);
+ f = (szFile + lstrlenA(szFile) - 1);
while(f != szFile && '\\' != *f && '/' != *f)
f--;
if(f != szFile)
f++;
}
- lstrcpyA(buffer, _log_level[dwLevel]);
- if (!dolock)
- lstrcatA(buffer, "\n");
- szBp = &buffer[lstrlenA(buffer)];
+ szBp = &buffer[0];
if (!szFormat) {
- FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |
+ FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
err,
@@ -300,18 +292,20 @@
APX_LOGLOCK(lf->hFile);
}
if (bTimeStamp) {
- wsprintfA(sb, "[%d-%02d-%02d %02d:%02d:%02d] ",
+ wsprintfA(sb, "[%d-%02d-%02d %02d:%02d:%02d] ",
t.wYear, t.wMonth, t.wDay,
t.wHour, t.wMinute, t.wSecond);
WriteFile(lf->hFile, sb, lstrlenA(sb), &wr, NULL);
}
- if (f) {
- wsprintfA(sb, "[%-4d %s] ", dwLine, f);
+ WriteFile(lf->hFile, _log_level[dwLevel],
+ strlen(_log_level[dwLevel]), &wr, NULL);
+ if (f && lf->dwLogLevel == APXLOG_LEVEL_DEBUG) {
+ wsprintfA(sb, "(%10s:%-4d) ", f, dwLine);
WriteFile(lf->hFile, sb, lstrlenA(sb), &wr, NULL);
}
-
WriteFile(lf->hFile, buffer, len, &wr, NULL);
- /* Terminate the line */
+
+ /* Terminate the line */
WriteFile(lf->hFile, LINE_SEP, sizeof(LINE_SEP) - 1, &wr, NULL);
#ifdef _DEBUG_FULL
FlushFileBuffers(lf->hFile);
@@ -323,7 +317,7 @@
#ifdef _DEBUG_FULL
{
char tid[1024 + 16];
- wsprintfA(tid, "[%04X] %s", GetCurrentThreadId(), buffer);
+ wsprintfA(tid, "[%04d] %s", GetCurrentThreadId(), buffer);
OutputDebugStringA(tid);
}
#endif
@@ -342,7 +336,7 @@
lf = _st_sys_loghandle;
if (IS_INVALID_HANDLE(lf))
return;
-
+
FlushFileBuffers(lf->hFile);
CloseHandle(lf->hFile);
if (lf == _st_sys_loghandle)
@@ -359,13 +353,13 @@
...)
{
va_list args;
- CHAR buffer[1024+16];
- CHAR sysbuf[2048];
+ CHAR buffer[SIZ_HUGLEN];
+ CHAR sysbuf[SIZ_HUGLEN];
int len = 0, nRet;
LPCSTR f = szFile;
DWORD err = GetLastError(); /* save the last Error code */
if (f) {
- f = (szFile + lstrlenA(szFile) - 1);
+ f = (szFile + lstrlenA(szFile) - 1);
while(f != szFile && '\\' != *f && '/' != *f)
f--;
if(f != szFile)
@@ -373,36 +367,51 @@
}
sysbuf[0] = '\0';
if (err != ERROR_SUCCESS) {
- len = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |
+ len = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
sysbuf,
- 1000,
+ SIZ_DESLEN,
NULL);
- sysbuf[len] = 0;
+ if (len > 0) {
+ sysbuf[len] = '\0';
+ if (sysbuf[len - 1] == '\n') {
+ sysbuf[len - 1] = '\0';
+ --len;
+ }
+ }
+ else
+ sysbuf[0] = '\0';
}
if (szFormat) {
va_start(args, szFormat);
wvsprintfA(buffer, szFormat, args);
va_end(args);
if (f) {
- CHAR sb[MAX_PATH+1];
- wsprintfA(sb, "\n%s (%d)", f, dwLine);
+ CHAR sb[SIZ_PATHLEN];
+ wsprintfA(sb, "%s (%d)", f, dwLine);
lstrcatA(sysbuf, sb);
}
- lstrcatA(sysbuf, "\n");
- lstrcatA(sysbuf, buffer);
+ lstrlcatA(sysbuf, SIZ_HUGLEN, "\n");
+ lstrlcatA(sysbuf, SIZ_HUGLEN, buffer);
}
len = lstrlenA(sysbuf);
#ifdef _DEBUG_FULL
OutputDebugStringA(sysbuf);
#endif
- if (len > 0 && bDisplay) {
- nRet = MessageBoxA(NULL, sysbuf,
- "Application System Error",
- MB_ICONERROR | MB_OK | MB_SYSTEMMODAL);
+ if (len > 0) {
+ if (bDisplay) {
+ nRet = MessageBoxA(NULL, sysbuf,
+ "Application System Error",
+ MB_ICONERROR | MB_OK | MB_SYSTEMMODAL);
+ }
+ else {
+ fputs(sysbuf, stderr);
+ fputc('\n', stderr);
+ fflush(stderr);
+ }
}
/* Restore the last Error code */
SetLastError(err);
Modified: trunk/utils/windows/native/service/procrun/src/mclib.c
===================================================================
--- trunk/utils/windows/native/service/procrun/src/mclib.c 2010-06-16 10:02:46 UTC (rev
2688)
+++ trunk/utils/windows/native/service/procrun/src/mclib.c 2010-07-21 20:01:54 UTC (rev
2689)
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+
/*
* Copyright (c) 1994
* The Regents of the University of California. All rights reserved.
@@ -54,7 +54,7 @@
#define wmask (wsize - 1)
LPVOID AplFillMemory(PVOID Destination, SIZE_T Length, BYTE Fill)
-{
+{
SIZE_T t;
#ifdef WIN64
@@ -119,11 +119,11 @@
do {
*dst++ = Fill;
} while (--t != 0);
- return (Destination);
+ return (Destination);
}
void AplZeroMemory(PVOID Destination, SIZE_T Length)
-{
+{
SIZE_T t;
LPBYTE dst;
@@ -237,7 +237,7 @@
}
done:
return (Destination);
-}
+}
INT
@@ -252,7 +252,7 @@
} while (--nBytes != 0);
}
return 0;
-}
+}
/*
* Find the first occurrence of lpFind in lpMem.
@@ -277,7 +277,7 @@
s--;
}
return (LPBYTE)s;
-}
+}
LPSTR
AplRindexA(LPCSTR lpStr, int ch)
@@ -289,6 +289,121 @@
save = (LPSTR)lpStr;
if (!*lpStr)
return save;
- }
+ }
/* NOTREACHED */
-}
+}
+
+/*
+ * Appends src to string dst of size siz (unlike strncat, siz is the
+ * full size of dst, not space left). At most siz-1 characters
+ * will be copied. Always NUL terminates (unless siz <= strlen(dst)).
+ * Returns strlen(src) + MIN(siz, strlen(initial dst)).
+ * If retval >= siz, truncation occurred.
+ */
+LPSTR
+lstrlcatA(LPSTR dst, int siz, LPCSTR src)
+{
+ LPSTR d = dst;
+ LPCSTR s = src;
+ int n = siz;
+ int dlen;
+
+ /* Find the end of dst and adjust bytes left but don't go past end */
+ while (n-- != 0 && *d != '\0')
+ d++;
+ dlen = d - dst;
+ n = siz - dlen;
+
+ if (n == 0)
+ return NULL;
+ while (*s != '\0') {
+ if (n != 1) {
+ *d++ = *s;
+ n--;
+ }
+ s++;
+ }
+ *d = '\0';
+
+ return dst;
+}
+
+LPWSTR
+lstrlcatW(LPWSTR dst, int siz, LPCWSTR src)
+{
+ LPWSTR d = dst;
+ LPCWSTR s = src;
+ int n = siz;
+ int dlen;
+
+ /* Find the end of dst and adjust bytes left but don't go past end */
+ while (n-- != 0 && *d != '\0')
+ d++;
+ dlen = d - dst;
+ n = siz - dlen;
+
+ if (n == 0)
+ return NULL;
+ while (*s != L'\0') {
+ if (n != 1) {
+ *d++ = *s;
+ n--;
+ }
+ s++;
+ }
+ *d = L'\0';
+
+ return dst;
+}
+
+LPSTR
+lstrlcpyA(LPSTR dst, int siz, LPCSTR src)
+{
+ LPSTR d = dst;
+ LPCSTR s = src;
+ int n = siz;
+
+ /* Copy as many bytes as will fit */
+ if (n != 0) {
+ while (--n != 0) {
+ if ((*d++ = *s++) == '\0')
+ break;
+ }
+ }
+
+ /* Not enough room in dst, add NUL and traverse rest of src */
+ if (n == 0) {
+ if (siz != 0)
+ *d = '\0'; /* NUL-terminate dst */
+ while (*s++)
+ ;
+ }
+
+ return d;
+}
+
+LPWSTR
+lstrlcpyW(LPWSTR dst, int siz, LPCWSTR src)
+{
+ LPWSTR d = dst;
+ LPCWSTR s = src;
+ int n = siz;
+
+ /* Copy as many bytes as will fit */
+ if (n != 0) {
+ while (--n != 0) {
+ if ((*d++ = *s++) == L'\0')
+ break;
+ }
+ }
+
+ /* Not enough room in dst, add NUL and traverse rest of src */
+ if (n == 0) {
+ if (siz != 0)
+ *d = L'\0'; /* NUL-terminate dst */
+ while (*s++)
+ ;
+ }
+
+ return d;
+}
Modified: trunk/utils/windows/native/service/procrun/src/private.h
===================================================================
--- trunk/utils/windows/native/service/procrun/src/private.h 2010-06-16 10:02:46 UTC (rev
2688)
+++ trunk/utils/windows/native/service/procrun/src/private.h 2010-07-21 20:01:54 UTC (rev
2689)
@@ -234,11 +234,6 @@
#define APX_GET_OSLEVEL() ((_st_apx_oslevel == APX_WINVER_UNK) ? apxGetOsLevel() :
_st_apx_oslevel)
-#ifdef _DEBUG
-void ErrorMessage(LPCTSTR szError, BOOL bFatal);
-#else
-#define ErrorMessage(szError, bFatal) ((void)0)
-#endif
/* zero separated, double zero terminated string */
struct APXMULTISZ {
DWORD dwAllocated; /* length including terminators */
Modified: trunk/utils/windows/native/service/procrun/src/registry.c
===================================================================
--- trunk/utils/windows/native/service/procrun/src/registry.c 2010-06-16 10:02:46 UTC (rev
2688)
+++ trunk/utils/windows/native/service/procrun/src/registry.c 2010-07-21 20:01:54 UTC (rev
2689)
@@ -454,7 +454,7 @@
DWORD rc, dwType = REG_BINARY;
rc = RegQueryValueExA(hKey, szValueName, NULL, &dwType, lpData, lpdwLength);
if (rc != ERROR_SUCCESS || dwType != REG_BINARY) {
- ErrorMessage(NULL, FALSE);
+ apxLogWrite(APXLOG_MARK_SYSERR);
return NULL;
}
lpReg->pCurrVal = lpData;
@@ -705,7 +705,7 @@
return FALSE;
}
else if (RegSetValueExA(hKey, szValueName, 0, dwType,
- (LPBYTE)szValue, lstrlenA(szValue)) != ERROR_SUCCESS)
+ (LPBYTE)szValue, lstrlenA(szValue) + 1) != ERROR_SUCCESS)
return FALSE;
return TRUE;
@@ -743,7 +743,7 @@
}
else if (RegSetValueExW(hKey, szValueName, 0, dwType,
(LPBYTE)szValue,
- lstrlenW(szValue) * sizeof(WCHAR)) != ERROR_SUCCESS)
+ (lstrlenW(szValue) + 1) * sizeof(WCHAR)) != ERROR_SUCCESS)
return FALSE;
return TRUE;
@@ -815,39 +815,86 @@
}
+LONG apxDeleteRegistryRecursive(HKEY hKeyRoot, LPCWSTR szSubKey) {
+ LONG rc = ERROR_SUCCESS;
+ DWORD dwSize = 0;
+ WCHAR szName[SIZ_BUFLEN];
+ HKEY hKey = NULL;
+
+ if (ERROR_SUCCESS == RegDeleteKey(hKeyRoot, szSubKey)) {
+ return ERROR_SUCCESS;
+ }
+
+ rc = RegOpenKeyExW(hKeyRoot, szSubKey, 0, KEY_ENUMERATE_SUB_KEYS | DELETE,
&hKey);
+ if (rc != ERROR_SUCCESS) {
+ if (rc == ERROR_FILE_NOT_FOUND) {
+ return ERROR_SUCCESS;
+ } else {
+ return rc;
+ }
+ }
+ while (rc == ERROR_SUCCESS) {
+ dwSize = SIZ_BUFLEN;
+ rc = RegEnumKeyExW(hKey, 0, szName, &dwSize, NULL, NULL, NULL, NULL );
+
+ if (rc == ERROR_NO_MORE_ITEMS) {
+ rc = RegDeleteKeyW(hKeyRoot, szSubKey);
+ break;
+ } else {
+ rc = apxDeleteRegistryRecursive(hKey, szName);
+ if (rc != ERROR_SUCCESS) {
+ break; // abort when we start failing
+ }
+ }
+ }
+ RegCloseKey(hKey);
+ return rc;
+}
+
+
BOOL
apxDeleteRegistryW(LPCWSTR szRoot,
LPCWSTR szKeyName,
- BOOL bDeleteEmpty)
+ REGSAM samDesired,
+ BOOL bDeleteEmptyRoot)
{
WCHAR buff[SIZ_BUFLEN];
- BOOL rv;
+ LONG rc = ERROR_SUCCESS;
+ HKEY hKey = NULL;
+ BOOL rv = TRUE;
+ HKEY hives[] = {HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER, NULL}, *hive = NULL;
if (!szKeyName || lstrlenW(szKeyName) > SIZ_RESMAX)
return FALSE;
if (szRoot && lstrlenW(szRoot) > SIZ_RESMAX)
return FALSE;
- lstrcpyW(buff, REGSOFTWARE_ROOT);
if (szRoot)
- lstrcatW(buff, szRoot);
+ lstrcpyW(buff, szRoot);
else
- lstrcatW(buff, REGAPACHE_ROOT);
+ lstrcpyW(buff, REGAPACHE_ROOT);
lstrcatW(buff, REGSEPARATOR);
- lstrcatW(buff, szKeyName);
- rv = SHDeleteKeyW(HKEY_LOCAL_MACHINE, buff);
- rv += SHDeleteKeyW(HKEY_CURRENT_USER, buff);
+ for (hive = &hives[0]; *hive; hive++) {
+ HKEY hkeySoftware = NULL;
- if (bDeleteEmpty) {
- lstrcpyW(buff, REGSOFTWARE_ROOT);
- if (szRoot)
- lstrcatW(buff, szRoot);
- else
- lstrcatW(buff, REGAPACHE_ROOT);
-
- SHDeleteEmptyKeyW(HKEY_LOCAL_MACHINE, buff);
- SHDeleteEmptyKeyW(HKEY_CURRENT_USER, buff);
+ rc = RegOpenKeyExW(*hive, REGSOFTWARE_ROOT, 0, KEY_READ | samDesired,
&hkeySoftware);
+ if (rc != ERROR_SUCCESS) {
+ rv = FALSE;
+ } else {
+ rc = RegOpenKeyExW(hkeySoftware, buff, 0, samDesired | KEY_ENUMERATE_SUB_KEYS
| DELETE, &hKey);
+ if (rc == ERROR_SUCCESS) {
+ rc = apxDeleteRegistryRecursive(hKey, szKeyName);
+ RegCloseKey(hKey);
+ hKey = NULL;
+ rv |= (rc == ERROR_SUCCESS);
+ }
+ if (bDeleteEmptyRoot) {
+ // will fail if there are subkeys, just like we want
+ RegDeleteKeyW(hkeySoftware, buff);
+ }
+ RegCloseKey(hkeySoftware);
+ }
}
return rv;
}
@@ -855,7 +902,8 @@
BOOL
apxDeleteRegistryA(LPCSTR szRoot,
LPCSTR szKeyName,
- BOOL bDeleteEmpty)
+ REGSAM samDesired,
+ BOOL bDeleteEmptyRoot)
{
WCHAR wcRoot[SIZ_RESLEN];
WCHAR wcKey[SIZ_RESLEN];
@@ -866,7 +914,7 @@
}
AsciiToWide(szKeyName, wcKey);
- return apxDeleteRegistryW(wsRoot, wcKey, bDeleteEmpty);
+ return apxDeleteRegistryW(wsRoot, wcKey, samDesired, bDeleteEmptyRoot);
}
@@ -1030,10 +1078,10 @@
}
rc = RegSetValueExW(hKey, REGDESCRIPTION, 0, REG_SZ, (CONST BYTE *)szDescription,
- lstrlenW(szDescription) * sizeof(WCHAR));
+ (lstrlenW(szDescription) + 1) * sizeof(WCHAR));
SAFE_CLOSE_KEY(hKey);
- return rc = ERROR_SUCCESS;
+ return rc == ERROR_SUCCESS;
}
BOOL apxGetServiceDescriptionW(LPCWSTR szServiceName, LPWSTR szDescription,
Modified: trunk/utils/windows/native/service/procrun/src/rprocess.c
===================================================================
--- trunk/utils/windows/native/service/procrun/src/rprocess.c 2010-06-16 10:02:46 UTC (rev
2688)
+++ trunk/utils/windows/native/service/procrun/src/rprocess.c 2010-07-21 20:01:54 UTC (rev
2689)
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+
#include "apxwin.h"
#include "private.h"
@@ -24,7 +24,7 @@
#define CHILD_TERMINATE_CODE 19640323 /* Could be any value like my birthday
;-)*/
DYNOLAD_TYPE_DECLARE(CreateRemoteThread,
- __stdcall, HANDLE)(HANDLE, LPSECURITY_ATTRIBUTES,
+ __stdcall, HANDLE)(HANDLE, LPSECURITY_ATTRIBUTES,
DWORD, LPTHREAD_START_ROUTINE,
LPVOID, DWORD, LPDWORD);
@@ -83,13 +83,13 @@
HANDLE hChildInpWr;
HANDLE hChildOutRd;
HANDLE hChildErrRd;
- /* Saved console pipes */
+ /* Saved console pipes */
HANDLE hParentStdSave[3];
HANDLE hWorkerThreads[3];
HANDLE hUserToken;
HANDLE hCurrentProcess;
BOOL bSaveHandles;
- /** callback function */
+ /** callback function */
LPAPXFNCALLBACK fnUserCallback;
LPSECURITY_ATTRIBUTES lpSA;
LPVOID lpSD;
@@ -135,13 +135,13 @@
LPAPXPROCESS lpProc;
APXCALLHOOK *lpCall;
INT ch;
- DWORD dwReaded;
+ DWORD dwReaded;
lpProc = APXHANDLE_DATA(hProcess);
while (lpProc->dwChildStatus & CHILD_RUNNING) {
ch = 0;
if (!ReadFile(lpProc->hChildOutRd, &ch, lpProc->chSize,
&dwReaded, NULL) || !dwReaded) {
-
+
break;
}
if (lpProc->fnUserCallback)
@@ -162,7 +162,7 @@
LPAPXPROCESS lpProc;
APXCALLHOOK *lpCall;
INT ch;
- DWORD dwReaded;
+ DWORD dwReaded;
lpProc = APXHANDLE_DATA(hProcess);
while (lpProc->dwChildStatus & CHILD_RUNNING) {
if (!ReadFile(lpProc->hChildErrRd, &ch, lpProc->chSize,
@@ -193,7 +193,7 @@
return 1;
}
}
-
+
return 0;
}
@@ -221,7 +221,7 @@
break;
}
}
-
+
return n;
}
@@ -231,7 +231,7 @@
DWORD n = 0;
if (!lpData || !dwLen)
return 0;
-
+
if (lpProc->dwChildStatus & CHILD_RUNNING) {
DWORD wr = 0;
while (lpProc->dwChildStatus & CHILD_RUNNING) {
@@ -249,7 +249,7 @@
break;
}
}
-
+
return n;
}
@@ -261,38 +261,38 @@
if (!CreatePipe(&(lpProc->hChildStdInp),
&(lpProc->hChildInpWr),
lpProc->lpSA, 0)) {
- ErrorMessage(NULL, FALSE);
+ apxLogWrite(APXLOG_MARK_SYSERR);
goto cleanup;
}
if (!SetHandleInformation(lpProc->hChildInpWr,
HANDLE_FLAG_INHERIT, 0)) {
- ErrorMessage(NULL, FALSE);
+ apxLogWrite(APXLOG_MARK_SYSERR);
goto cleanup;
}
if (!CreatePipe(&(lpProc->hChildOutRd),
&(lpProc->hChildStdOut),
lpProc->lpSA, 0)) {
- ErrorMessage(NULL, FALSE);
+ apxLogWrite(APXLOG_MARK_SYSERR);
goto cleanup;
}
if (!SetHandleInformation(lpProc->hChildOutRd,
HANDLE_FLAG_INHERIT, 0)) {
- ErrorMessage(NULL, FALSE);
+ apxLogWrite(APXLOG_MARK_SYSERR);
goto cleanup;
}
if (!CreatePipe(&(lpProc->hChildErrRd),
&(lpProc->hChildStdErr),
lpProc->lpSA, 0)) {
- ErrorMessage(NULL, FALSE);
+ apxLogWrite(APXLOG_MARK_SYSERR);
goto cleanup;
}
if (!SetHandleInformation(lpProc->hChildErrRd,
HANDLE_FLAG_INHERIT, 0)) {
- ErrorMessage(NULL, FALSE);
+ apxLogWrite(APXLOG_MARK_SYSERR);
goto cleanup;
}
rv = TRUE;
@@ -316,33 +316,33 @@
lpProc = APXHANDLE_DATA(hProcess);
CHECK_IF_ACTIVE(lpProc);
-
+
/* Try to close the child's stdin first */
SAFE_CLOSE_HANDLE(lpProc->hChildInpWr);
- /* Wait 1 sec for child process to
+ /* Wait 1 sec for child process to
* recognize that the stdin has been closed.
*/
if (WaitForSingleObject(lpProc->stProcInfo.hProcess, 1000) == WAIT_OBJECT_0)
goto cleanup;
CHECK_IF_ACTIVE(lpProc);
-
+
/* Try to create the remote thread in the child address space */
DYNLOAD_FPTR_ADDRESS(CreateRemoteThread, KERNEL32);
- if (DuplicateHandle(lpProc->hCurrentProcess,
- lpProc->stProcInfo.hProcess,
- lpProc->hCurrentProcess,
- &hDup,
- PROCESS_ALL_ACCESS,
+ if (DuplicateHandle(lpProc->hCurrentProcess,
+ lpProc->stProcInfo.hProcess,
+ lpProc->hCurrentProcess,
+ &hDup,
+ PROCESS_ALL_ACCESS,
FALSE, 0)) {
DYNLOAD_FPTR_ADDRESS(ExitProcess, KERNEL32);
/* Now call the ExitProcess from inside the client
* This will safely unload all the dll's.
*/
- hRemote = DYNLOAD_CALL(CreateRemoteThread)(hDup,
- NULL, 0,
+ hRemote = DYNLOAD_CALL(CreateRemoteThread)(hDup,
+ NULL, 0,
(LPTHREAD_START_ROUTINE)DYNLOAD_FPTR(ExitProcess),
- (PVOID)&uExitCode, 0, NULL);
+ (PVOID)&uExitCode, 0, NULL);
if (!IS_INVALID_HANDLE(hRemote)) {
if (WaitForSingleObject(lpProc->stProcInfo.hProcess,
2000) == WAIT_OBJECT_0) {
@@ -356,9 +356,9 @@
CloseHandle(hDup);
goto cleanup;
}
-
+
TerminateProcess(lpProc->stProcInfo.hProcess, CHILD_TERMINATE_CODE);
-
+
cleanup:
/* Close the process handle */
SAFE_CLOSE_HANDLE(lpProc->stProcInfo.hProcess);
@@ -384,8 +384,8 @@
}
SAFE_CLOSE_HANDLE(lpProc->stProcInfo.hProcess);
- /* Close parent side of the pipes */
- SAFE_CLOSE_HANDLE(lpProc->hChildInpWr);
+ /* Close parent side of the pipes */
+ SAFE_CLOSE_HANDLE(lpProc->hChildInpWr);
SAFE_CLOSE_HANDLE(lpProc->hChildOutRd);
SAFE_CLOSE_HANDLE(lpProc->hChildErrRd);
@@ -401,7 +401,7 @@
if (lpProc->lpEnvironment)
FreeEnvironmentStringsW(lpProc->lpEnvironment);
- case WM_QUIT:
+ case WM_QUIT:
/* The process has finished
* This is a WorkerThread message
*/
@@ -414,7 +414,7 @@
if (wParam)
__apxProcessWrite(lpProc, (LPCVOID)lParam, (DWORD)wParam);
else
- __apxProcessPuts(lpProc, (LPCTSTR)lParam);
+ __apxProcessPuts(lpProc, (LPCTSTR)lParam);
break;
default:
break;
@@ -439,8 +439,8 @@
#ifndef _UNICODE
WCHAR wsUsername[256];
WCHAR wsPassword[256];
- AsciiToWide(szUsername, wsUsername);
- AsciiToWide(szPassword, wsPassword);
+ AsciiToWide(szUsername, wsUsername);
+ AsciiToWide(szPassword, wsPassword);
#else
LPCWSTR wsUsername = szUsername;
LPCWSTR wsPassword = szPassword;
@@ -459,8 +459,8 @@
if (szUsername && szPassword) {
WCHAR wsUsername[256];
WCHAR wsPassword[256];
- AsciiToWide(szUsername, wsUsername);
- AsciiToWide(szPassword, wsPassword);
+ AsciiToWide(szUsername, wsUsername);
+ AsciiToWide(szPassword, wsPassword);
return apxCreateProcessW(hPool, dwOptions, fnCallback,
wsUsername, wsPassword, bLogonAsService);
}
@@ -481,32 +481,32 @@
/* CreateProcessAsUser is supported only on NT */
if (szUsername && (APX_GET_OSLEVEL() >= APX_WINVER_NT_4)) {
HANDLE hUser;
- if (!LogonUserW(szUsername,
- NULL,
- szPassword,
+ if (!LogonUserW(szUsername,
+ NULL,
+ szPassword,
bLogonAsService ? LOGON32_LOGON_SERVICE : LOGON32_LOGON_NETWORK,
LOGON32_PROVIDER_DEFAULT,
&hUser)) {
/* Logon Failed */
- ErrorMessage(NULL, TRUE);
+ apxLogWrite(APXLOG_MARK_SYSERR);
return NULL;
}
- if (!DuplicateTokenEx(hUser,
- TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY,
+ if (!DuplicateTokenEx(hUser,
+ TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY,
NULL,
SecurityImpersonation,
TokenPrimary,
&hUserToken)) {
CloseHandle(hUser);
/* Failed to duplicate the user token */
- ErrorMessage(NULL, TRUE);
+ apxLogWrite(APXLOG_MARK_SYSERR);
return NULL;
}
if (!ImpersonateLoggedOnUser(hUserToken)) {
CloseHandle(hUser);
CloseHandle(hUserToken);
/* failed to impersonate the logged user */
- ErrorMessage(NULL, TRUE);
+ apxLogWrite(APXLOG_MARK_SYSERR);
return NULL;
}
CloseHandle(hUser);
@@ -534,7 +534,7 @@
&lpProc->hCurrentProcess,
PROCESS_ALL_ACCESS,
FALSE,
- 0);
+ 0);
#else
lpProc->hCurrentProcess = GetCurrentProcess();
#endif
@@ -551,7 +551,7 @@
return hProcess;
}
-static WCHAR _desktop_name[] =
+static WCHAR _desktop_name[] =
{'W', 'i', 'n', 's', 't', 'a',
'0', '\\', 'D', 'e', 'f', 'a',
'u', 'l', 't', 0};
BOOL
@@ -564,7 +564,7 @@
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return FALSE;
-
+
lpProc = APXHANDLE_DATA(hProcess);
/* don't allow multiple execute calls on the same object */
if (lpProc->dwChildStatus & PROC_INITIALIZED)
@@ -582,7 +582,7 @@
/* Set the redirected handles */
si.hStdOutput = lpProc->hChildStdOut;
si.hStdError = lpProc->hChildStdErr;
- si.hStdInput = lpProc->hChildStdInp;
+ si.hStdInput = lpProc->hChildStdInp;
if (lpProc->lpEnvironment)
FreeEnvironmentStringsW(lpProc->lpEnvironment);
@@ -618,7 +618,7 @@
&(lpProc->stProcInfo));
}
/* Close unused sides of pipes */
- SAFE_CLOSE_HANDLE(lpProc->hChildStdInp);
+ SAFE_CLOSE_HANDLE(lpProc->hChildStdInp);
SAFE_CLOSE_HANDLE(lpProc->hChildStdOut);
SAFE_CLOSE_HANDLE(lpProc->hChildStdErr);
if (!bS)
@@ -627,10 +627,10 @@
lpProc->dwChildStatus |= (CHILD_RUNNING | PROC_INITIALIZED);
lpProc->hWorkerThreads[0] = CreateThread(NULL, 0, __apxProcStdoutThread,
- hProcess, 0, &id);
+ hProcess, 0, &id);
lpProc->hWorkerThreads[1] = CreateThread(NULL, 0, __apxProcStderrThread,
- hProcess, 0, &id);
- ResumeThread(lpProc->stProcInfo.hThread);
+ hProcess, 0, &id);
+ ResumeThread(lpProc->stProcInfo.hThread);
lpProc->hWorkerThreads[2] = CreateThread(NULL, 0, __apxProcWorkerThread,
hProcess, 0, &id);
@@ -638,8 +638,8 @@
/* Close child handles first */
return TRUE;
cleanup:
- /* Close parent side of the pipes */
- SAFE_CLOSE_HANDLE(lpProc->hChildInpWr);
+ /* Close parent side of the pipes */
+ SAFE_CLOSE_HANDLE(lpProc->hChildInpWr);
SAFE_CLOSE_HANDLE(lpProc->hChildOutRd);
SAFE_CLOSE_HANDLE(lpProc->hChildErrRd);
@@ -653,7 +653,7 @@
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return FALSE;
-
+
lpProc = APXHANDLE_DATA(hProcess);
apxFree(lpProc->szApplicationExec);
lpProc->szApplicationExec = apxPoolWStrdupA(hProcess->hPool, szName);
@@ -668,7 +668,7 @@
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return FALSE;
-
+
lpProc = APXHANDLE_DATA(hProcess);
apxFree(lpProc->szApplicationExec);
lpProc->szApplicationExec = apxPoolStrdupW(hProcess->hPool, szName);
@@ -683,11 +683,11 @@
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return FALSE;
-
+
lpProc = APXHANDLE_DATA(hProcess);
apxFree(lpProc->szCommandLine);
lpProc->szCommandLine = apxPoolWStrdupA(hProcess->hPool, szCmdline);
-
+
return lpProc->szCommandLine != NULL;
}
@@ -698,11 +698,11 @@
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return FALSE;
-
+
lpProc = APXHANDLE_DATA(hProcess);
apxFree(lpProc->szCommandLine);
lpProc->szCommandLine = apxPoolStrdupW(hProcess->hPool, szCmdline);
-
+
return lpProc->szCommandLine != NULL;
}
@@ -713,11 +713,11 @@
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return FALSE;
-
+
lpProc = APXHANDLE_DATA(hProcess);
apxFree(lpProc->szWorkingPath);
lpProc->szWorkingPath = apxPoolWStrdupA(hProcess->hPool, szPath);
-
+
return lpProc->szWorkingPath != NULL;
}
@@ -728,7 +728,7 @@
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return FALSE;
-
+
lpProc = APXHANDLE_DATA(hProcess);
apxFree(lpProc->szWorkingPath);
if (!szPath) {
@@ -737,7 +737,7 @@
return TRUE;
}
lpProc->szWorkingPath = apxPoolWStrdupW(hProcess->hPool, szPath);
-
+
return lpProc->szWorkingPath != NULL;
}
@@ -748,7 +748,7 @@
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return 0;
-
+
lpProc = APXHANDLE_DATA(hProcess);
return __apxProcessPutc(lpProc, ch, sizeof(CHAR));
}
@@ -760,7 +760,7 @@
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return 0;
-
+
lpProc = APXHANDLE_DATA(hProcess);
return __apxProcessPutc(lpProc, ch, sizeof(WCHAR));
}
@@ -807,7 +807,7 @@
LPAPXPROCESS lpProc;
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return 0;
-
+
lpProc = APXHANDLE_DATA(hProcess);
return __apxProcessWrite(lpProc, lpData, dwLen);
@@ -820,13 +820,13 @@
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return FALSE;
-
+
lpProc = APXHANDLE_DATA(hProcess);
-
+
if (lpProc->dwChildStatus & CHILD_RUNNING) {
return FlushFileBuffers(lpProc->hChildInpWr);
}
-
+
return FALSE;
}
@@ -847,9 +847,9 @@
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return WAIT_ABANDONED;
-
+
lpProc = APXHANDLE_DATA(hProcess);
-
+
if (lpProc->dwChildStatus & CHILD_RUNNING) {
DWORD rv = WaitForMultipleObjects(3, lpProc->hWorkerThreads,
TRUE, dwMilliseconds);
@@ -869,34 +869,45 @@
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return FALSE;
-
+
lpProc = APXHANDLE_DATA(hProcess);
-
- return (lpProc->dwChildStatus & CHILD_RUNNING);
+
+ return (lpProc->dwChildStatus & CHILD_RUNNING);
}
+DWORD
+apxProcessGetPid(APXHANDLE hProcess)
+{
+ LPAPXPROCESS lpProc;
+
+ if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
+ return 0;
+
+ lpProc = APXHANDLE_DATA(hProcess);
+
+ return lpProc->stProcInfo.dwProcessId;
+}
+
static LPWSTR __apxStrQuote(LPWSTR lpDest, LPCWSTR szSrc)
{
LPWSTR p;
- BOOL q = FALSE;
+ BOOL space = FALSE, quote = FALSE;
- /* Find if string has embeded spaces
+ /* Find if string has embeded spaces, add quotes only if no quotes found
*/
for (p = (LPWSTR)szSrc; *p; p++) {
- if (*p == L' ' || *p == '\t' ||
- *p == '"' || *p == '\\') {
- q = TRUE;
- break;
+ if (*p == L' ' || *p == '\t') {
+ space = TRUE;
+ } else if (*p == L'"') {
+ quote = TRUE;
}
}
p = lpDest;
- if (q) *p++ = L'"';
+ if (space && !quote) *p++ = L'"';
while (*szSrc) {
- if (*szSrc == '"' || *szSrc == '\\')
- *p++ = L'\\';
*p++ = *szSrc++;
}
- if (q) *p++ = L'"';
+ if (space && !quote) *p++ = L'"';
return p;
}
@@ -909,22 +920,14 @@
LPWSTR p;
if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
return FALSE;
-
+
lpProc = APXHANDLE_DATA(hProcess);
apxFree(lpProc->szCommandLine);
-
+
l = lstrlenW(szTitle) + 3;
- for (i = 0; i < (DWORD)lstrlenW(szTitle); i++) {
- if (szTitle[i] == L'"')
- ++l;
- }
for (i = 0; i < dwArgc; i++) {
- int x, q = 0;
+ int q = 0;
l += (lstrlenW(lpArgs[i]) + 3);
- for (x = 0; x < lstrlenW(lpArgs[i]); x++) {
- if (lpArgs[i][x] == L'"')
- ++q;
- }
l += q;
}
p = lpProc->szCommandLine = apxPoolAlloc(hProcess->hPool, l * sizeof(WCHAR));
@@ -937,3 +940,4 @@
OutputDebugStringW(lpProc->szCommandLine);
return lpProc->szCommandLine != NULL;
}
+
Modified: trunk/utils/windows/native/service/procrun/src/service.c
===================================================================
--- trunk/utils/windows/native/service/procrun/src/service.c 2010-06-16 10:02:46 UTC (rev
2688)
+++ trunk/utils/windows/native/service/procrun/src/service.c 2010-07-21 20:01:54 UTC (rev
2689)
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+
#include "apxwin.h"
#include "private.h"
@@ -34,7 +34,7 @@
/* Handle to the current service */
SC_HANDLE hService;
/* Handle of the Service manager */
- SC_HANDLE hManager;
+ SC_HANDLE hManager;
APXSERVENTRY stServiceEntry;
} APXSERVICE, *LPAPXSERVICE;
@@ -43,7 +43,7 @@
{
do {
if (!IsCharAlphaNumericW(*szServiceName)) {
- apxDisplayError(TRUE, NULL, 0, "NonAlpha %d", *szServiceName);
+ apxDisplayError(FALSE, NULL, 0, "NonAlpha %d", *szServiceName);
return FALSE;
}
} while( *(++szServiceName));
@@ -74,7 +74,7 @@
{
APXHANDLE hService;
LPAPXSERVICE lpService;
- SC_HANDLE hManager;
+ SC_HANDLE hManager;
if (!(hManager = OpenSCManager(NULL, NULL, dwOptions))) {
apxLogWrite(APXLOG_MARK_SYSERR);
@@ -126,17 +126,17 @@
apxLogWrite(APXLOG_MARK_SYSERR);
return FALSE;
}
- lstrcpyW(lpService->stServiceEntry.szServiceName, szServiceName);
+ lstrlcpyW(lpService->stServiceEntry.szServiceName, SIZ_RESLEN, szServiceName);
if (!apxGetServiceDescriptionW(szServiceName,
lpService->stServiceEntry.szServiceDescription,
SIZ_DESLEN)) {
- apxLogWrite(APXLOG_MARK_WARN "Failed obtaing service description");
+ apxLogWrite(APXLOG_MARK_WARN "Failed to obtain service description");
lpService->stServiceEntry.szServiceDescription[0] = L'\0';
}
if (!apxGetServiceUserW(szServiceName,
lpService->stServiceEntry.szObjectName,
SIZ_RESLEN)) {
- apxLogWrite(APXLOG_MARK_WARN "Failed obtaing service user name");
+ apxLogWrite(APXLOG_MARK_WARN "Failed to obtain service user name");
lpService->stServiceEntry.szObjectName[0] = L'\0';
}
if (!QueryServiceConfigW(lpService->hService, NULL, 0, &dwNeeded)) {
@@ -173,7 +173,7 @@
return &lpService->stServiceEntry;
}
-/* Set the service names etc...
+/* Set the service names etc...
* If the ImagePath contains a space, it must be quoted
*/
BOOL
@@ -235,6 +235,104 @@
NULL, NULL);
}
+static BOOL
+__apxStopDependentServices(LPAPXSERVICE lpService)
+{
+ DWORD i;
+ DWORD dwBytesNeeded;
+ DWORD dwCount;
+
+ LPENUM_SERVICE_STATUS lpDependencies = NULL;
+ ENUM_SERVICE_STATUS ess;
+ SC_HANDLE hDepService;
+ SERVICE_STATUS_PROCESS ssp;
+
+ DWORD dwStartTime = GetTickCount();
+ /* Use the 30-second time-out */
+ DWORD dwTimeout = 30000;
+
+ /* Pass a zero-length buffer to get the required buffer size.
+ */
+ if (EnumDependentServices(lpService->hService,
+ SERVICE_ACTIVE,
+ lpDependencies, 0,
+ &dwBytesNeeded,
+ &dwCount)) {
+ /* If the Enum call succeeds, then there are no dependent
+ * services, so do nothing.
+ */
+ return TRUE;
+ }
+ else {
+ if (GetLastError() != ERROR_MORE_DATA)
+ return FALSE; // Unexpected error
+
+ /* Allocate a buffer for the dependencies.
+ */
+ lpDependencies = (LPENUM_SERVICE_STATUS) HeapAlloc(GetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ dwBytesNeeded);
+ if (!lpDependencies)
+ return FALSE;
+
+ __try {
+ /* Enumerate the dependencies. */
+ if (!EnumDependentServices(lpService->hService,
+ SERVICE_ACTIVE,
+ lpDependencies,
+ dwBytesNeeded,
+ &dwBytesNeeded,
+ &dwCount))
+ return FALSE;
+
+ for (i = 0; i < dwCount; i++) {
+ ess = *(lpDependencies + i);
+ /* Open the service. */
+ hDepService = OpenService(lpService->hManager,
+ ess.lpServiceName,
+ SERVICE_STOP | SERVICE_QUERY_STATUS);
+
+ if (!hDepService)
+ return FALSE;
+
+ __try {
+ /* Send a stop code. */
+ if (!ControlService(hDepService,
+ SERVICE_CONTROL_STOP,
+ (LPSERVICE_STATUS) &ssp))
+ return FALSE;
+
+ /* Wait for the service to stop. */
+ while (ssp.dwCurrentState != SERVICE_STOPPED) {
+ Sleep(ssp.dwWaitHint);
+ if (!QueryServiceStatusEx(hDepService,
+ SC_STATUS_PROCESS_INFO,
+ (LPBYTE)&ssp,
+ sizeof(SERVICE_STATUS_PROCESS),
+ &dwBytesNeeded))
+ return FALSE;
+
+ if (ssp.dwCurrentState == SERVICE_STOPPED)
+ break;
+
+ if (GetTickCount() - dwStartTime > dwTimeout)
+ return FALSE;
+ }
+ }
+ __finally {
+ /* Always release the service handle. */
+ CloseServiceHandle(hDepService);
+ }
+ }
+ }
+ __finally {
+ /* Always free the enumeration buffer. */
+ HeapFree(GetProcessHeap(), 0, lpDependencies);
+ }
+ }
+ return TRUE;
+}
+
BOOL
apxServiceControl(APXHANDLE hService, DWORD dwControl, UINT uMsg,
LPAPXFNCALLBACK fnControlCallback,
@@ -255,7 +353,7 @@
/* Manager mode cannot handle services */
if (lpService->bManagerMode)
return FALSE;
- /* Check if the ServixeOpen has been called */
+ /* Check if the ServiceOpen has been called */
if (IS_INVALID_HANDLE(lpService->hService))
return FALSE;
switch (dwControl) {
@@ -298,7 +396,7 @@
break;
default:
break;
- }
+ }
}
if (!dwPending && !dwState)
return FALSE;
@@ -310,20 +408,28 @@
/* signal that we are about to control the service */
if (fnControlCallback)
(*fnControlCallback)(lpCbData, uMsg, (WPARAM)1, (LPARAM)dwState);
- if (dwControl == SERVICE_CONTROL_CONTINUE &&
+ if (dwControl == SERVICE_CONTROL_CONTINUE &&
stStatus.dwCurrentState != SERVICE_PAUSED)
bStatus = StartService(lpService->hService, 0, NULL);
- else
- bStatus = ControlService(lpService->hService, dwControl, &stStatus);
+ else {
+ bStatus = TRUE;
+ if (dwControl == SERVICE_CONTROL_STOP) {
+ /* First stop dependent services
+ */
+ bStatus = __apxStopDependentServices(lpService);
+ }
+ if (bStatus)
+ bStatus = ControlService(lpService->hService, dwControl, &stStatus);
+ }
dwStart = GetTickCount();
dwCheck = stStatus.dwCheckPoint;
if (bStatus) {
Sleep(100); /* Initial Sleep period */
while (QueryServiceStatus(lpService->hService, &stStatus)) {
if (stStatus.dwCurrentState == dwPending) {
- /* Do not wait longer than the wait hint. A good interval is
- * one tenth the wait hint, but no less than 1 second and no
- * more than 10 seconds.
+ /* Do not wait longer than the wait hint. A good interval is
+ * one tenth the wait hint, but no less than 1 second and no
+ * more than 10 seconds.
*/
dwWait = stStatus.dwWaitHint / 10;
@@ -354,7 +460,7 @@
}
else
break;
- }
+ }
}
/* signal that we are done with controling the service */
if (fnControlCallback)
@@ -418,12 +524,11 @@
if (IS_INVALID_HANDLE(lpService->hService)) {
apxLogWrite(APXLOG_MARK_SYSERR);
-
- ErrorMessage(NULL, FALSE);
return FALSE;
}
else {
- lstrcpyW(lpService->stServiceEntry.szServiceName, szServiceName);
+ lstrlcpyW(lpService->stServiceEntry.szServiceName,
+ SIZ_RESLEN, szServiceName);
lpService->stServiceEntry.dwStart = dwStartType;
return TRUE;
}
@@ -451,7 +556,7 @@
rv = DeleteService(lpService->hService);
SAFE_CLOSE_SCH(lpService->hService);
SAFE_CLOSE_SCH(lpService->hManager);
-
+
return rv;
}
return FALSE;
@@ -459,7 +564,7 @@
/* Browse the services */
DWORD
-apxServiceBrowse(APXHANDLE hService,
+apxServiceBrowse(APXHANDLE hService,
LPCWSTR szIncludeNamePattern,
LPCWSTR szIncludeImagePattern,
LPCWSTR szExcludeNamePattern,
@@ -484,7 +589,6 @@
if (IS_INVALID_HANDLE(hLock)) {
apxLogWrite(APXLOG_MARK_SYSERR);
- ErrorMessage(NULL, FALSE);
return 0;
}
AplZeroMemory(&stEnum, sizeof(APXREGENUM));
@@ -539,7 +643,7 @@
if (_st_apx_oslevel >= 4) {
DWORD dwNeed;
QueryServiceStatusEx(hSrv, SC_STATUS_PROCESS_INFO,
-
(LPBYTE)(&(stEntry.stStatusProcess)),
+
(LPBYTE)(&(stEntry.stStatusProcess)),
sizeof(SERVICE_STATUS_PROCESS),
&dwNeed);
}
Modified: trunk/utils/windows/native/service/procrun/src/utils.c
===================================================================
--- trunk/utils/windows/native/service/procrun/src/utils.c 2010-06-16 10:02:46 UTC (rev
2688)
+++ trunk/utils/windows/native/service/procrun/src/utils.c 2010-07-21 20:01:54 UTC (rev
2689)
@@ -81,8 +81,8 @@
if (!(wsRet = apxPoolAlloc(hPool, (rc + 1) * sizeof(WCHAR))))
return NULL;
if (!GetEnvironmentVariableW(wsName, wsRet, rc)) {
+ apxLogWrite(APXLOG_MARK_SYSERR);
apxFree(wsRet);
- ErrorMessage(NULL, FALSE);
return NULL;
}
return wsRet;
@@ -100,8 +100,8 @@
if (!(szRet = apxPoolAlloc(hPool, rc + 1)))
return NULL;
if (!GetEnvironmentVariableA(szName, szRet, rc)) {
+ apxLogWrite(APXLOG_MARK_SYSERR);
apxFree(szRet);
- ErrorMessage(NULL, FALSE);
return NULL;
}
return szRet;
@@ -149,6 +149,19 @@
return s;
}
+LPWSTR UTF8ToWide(LPCSTR cs)
+{
+
+ LPWSTR s;
+ int cch = MultiByteToWideChar(CP_UTF8, 0, cs, -1, NULL, 0);
+ s = (LPWSTR)apxAlloc(cch * sizeof(WCHAR));
+ if (!MultiByteToWideChar(CP_UTF8, 0, cs, -1, s, cch)) {
+ apxFree(s);
+ return NULL;
+ }
+ return s;
+}
+
LPSTR MzWideToAscii(LPCWSTR ws, LPSTR s)
{
LPSTR pszSave = s;
@@ -197,39 +210,6 @@
return str;
}
-#ifdef _DEBUG
-
-void ErrorMessage(LPCTSTR szError, BOOL bFatal)
-{
- LPVOID lpMsgBuf = NULL;
- UINT nType;
- int nRet;
- DWORD dwErr = GetLastError();
- if (bFatal)
- nType = MB_ICONERROR | MB_ABORTRETRYIGNORE | MB_SYSTEMMODAL;
- else
- nType = MB_ICONEXCLAMATION | MB_OK;
- if (szError) {
- nRet = MessageBox(NULL, szError, TEXT("Application Error"), nType);
- }
- else {
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- dwErr,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
- (LPTSTR) &lpMsgBuf, 0, NULL);
- nRet = MessageBox(NULL, (LPCTSTR)lpMsgBuf,
- TEXT("Application System Error"), nType);
- LocalFree(lpMsgBuf);
- }
- if (bFatal && (nRet == IDCANCEL || nRet == IDABORT)) {
- ExitProcess(dwErr);
- }
-}
-#endif /* _DEBUG */
-
DWORD __apxGetMultiSzLengthA(LPCSTR lpStr, LPDWORD lpdwCount)
{
LPCSTR p = lpStr;
@@ -1011,13 +991,13 @@
}
SetLastError(0);
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)
- || GetLastError()) {
+ || GetLastError()) {
LocalFree( pSD );
LocalFree( sa );
return NULL;
}
if (!SetSecurityDescriptorDacl(pSD, TRUE, (PACL) NULL, FALSE)
- || GetLastError()) {
+ || GetLastError()) {
LocalFree( pSD );
LocalFree( sa );
return NULL;