Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
fa823857
Commit
fa823857
authored
Oct 06, 2003
by
monty@narttu.mysql.fi
Browse files
Options
Browse Files
Download
Plain Diff
Merge with 3.23.58
parents
9df504d2
0a241aa2
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1463 additions
and
1201 deletions
+1463
-1201
VC++Files/libmysql/libmysql.def
VC++Files/libmysql/libmysql.def
+94
-0
VC++Files/mysqlshutdown/mysql.ico
VC++Files/mysqlshutdown/mysql.ico
+0
-0
VC++Files/mysqlshutdown/mysqlshutdown.c
VC++Files/mysqlshutdown/mysqlshutdown.c
+198
-198
VC++Files/mysqlshutdown/mysqlshutdown.rc
VC++Files/mysqlshutdown/mysqlshutdown.rc
+2
-2
VC++Files/mysqlwatch/mysqlwatch.c
VC++Files/mysqlwatch/mysqlwatch.c
+745
-745
VC++Files/thr_test/thr_test.c
VC++Files/thr_test/thr_test.c
+250
-250
extra/resolveip.c
extra/resolveip.c
+1
-3
mytest-old.c
mytest-old.c
+169
-0
scripts/Makefile.am
scripts/Makefile.am
+4
-3
No files found.
VC++Files/libmysql/libmysql.def
0 → 100755
View file @
fa823857
LIBRARY LIBMYSQL
DESCRIPTION 'MySQL 3.23 Client Library'
VERSION 2.5
EXPORTS
mysql_affected_rows
mysql_close
mysql_connect
mysql_create_db
mysql_data_seek
mysql_debug
mysql_drop_db
mysql_dump_debug_info
mysql_eof
mysql_errno
mysql_error
mysql_escape_string
mysql_fetch_field
mysql_fetch_field_direct
mysql_fetch_fields
mysql_fetch_lengths
mysql_fetch_row
mysql_field_count
mysql_field_seek
mysql_field_tell
mysql_free_result
mysql_get_client_info
mysql_get_host_info
mysql_get_proto_info
mysql_get_server_info
mysql_info
mysql_init
mysql_insert_id
mysql_kill
mysql_list_dbs
mysql_list_fields
mysql_list_processes
mysql_list_tables
mysql_num_fields
mysql_num_rows
mysql_odbc_escape_string
mysql_options
mysql_ping
mysql_query
mysql_real_connect
mysql_real_query
mysql_refresh
mysql_row_seek
mysql_row_tell
mysql_select_db
mysql_shutdown
mysql_stat
mysql_store_result
mysql_thread_id
mysql_use_result
bmove_upp
delete_dynamic
_dig_vec
init_dynamic_array
insert_dynamic
int2str
is_prefix
list_add
list_delete
max_allowed_packet
my_casecmp
my_init
my_end
my_strdup
my_malloc
my_memdup
my_no_flags_free
my_realloc
my_thread_end
my_thread_init
net_buffer_length
set_dynamic
strcend
strdup_root
strfill
strinstr
strmake
strmov
strxmov
myodbc_remove_escape
mysql_thread_safe
mysql_character_set_name
mysql_change_user
mysql_send_query
mysql_read_query_result
mysql_real_escape_string
load_defaults
free_defaults
VC++Files/mysqlshutdown/mysql.ico
0 → 100644
View file @
fa823857
318 Bytes
VC++Files/mysqlshutdown/mysqlshutdown.c
View file @
fa823857
/****************************************************************************
MySqlShutdown - shutdown MySQL on system shutdown (Win95/98)
----------------------------------------------------------------------------
Revision History :
Version Author Date Description
001.00 Irena 21-12-99
*****************************************************************************/
#include <windows.h>
//-----------------------------------------------------------------------
// Local data
//-----------------------------------------------------------------------
static
char
szAppName
[]
=
"MySqlShutdown"
;
static
HINSTANCE
hInstance
;
#define MYWM_NOTIFYICON (WM_APP+100)
//-----------------------------------------------------------------------
// Exported functions
//-----------------------------------------------------------------------
LRESULT
CALLBACK
MainWindowProc
(
HWND
,
UINT
,
WPARAM
,
LPARAM
);
//-----------------------------------------------------------------------
// Local functions
//-----------------------------------------------------------------------
static
BOOL
InitAppClass
(
HINSTANCE
hInstance
);
BOOL
TrayMessageAdd
(
HWND
hWnd
,
DWORD
dwMessage
)
{
BOOL
res
;
HICON
hIcon
=
LoadIcon
(
hInstance
,
"MySql"
);
char
*
szTip
=
"MySql Shutdown"
;
NOTIFYICONDATA
tnd
;
tnd
.
cbSize
=
sizeof
(
NOTIFYICONDATA
);
tnd
.
hWnd
=
hWnd
;
tnd
.
uID
=
101
;
tnd
.
uFlags
=
NIF_MESSAGE
|
NIF_ICON
|
NIF_TIP
;
tnd
.
uCallbackMessage
=
MYWM_NOTIFYICON
;
tnd
.
hIcon
=
hIcon
;
strcpy
(
tnd
.
szTip
,
szTip
);
res
=
Shell_NotifyIcon
(
dwMessage
,
&
tnd
);
if
(
hIcon
)
DestroyIcon
(
hIcon
);
return
res
;
}
//-----------------------------------------------------------------------
// Name: WinMain
// Purpose: Main application entry point
//-----------------------------------------------------------------------
int
WINAPI
WinMain
(
HINSTANCE
hInst
,
HINSTANCE
hPrevInstance
,
LPSTR
lpCmdLine
,
int
nCmdShow
)
{
HWND
hWnd
;
MSG
Msg
;
hInstance
=
hInst
;
// Register application class if needed
if
(
InitAppClass
(
hInstance
)
==
FALSE
)
return
(
0
);
hWnd
=
CreateWindow
(
szAppName
,
"MySql"
,
WS_OVERLAPPEDWINDOW
|
WS_MINIMIZE
,
0
,
0
,
GetSystemMetrics
(
SM_CXSCREEN
)
/
4
,
GetSystemMetrics
(
SM_CYSCREEN
)
/
4
,
0
,
0
,
hInstance
,
NULL
);
if
(
!
hWnd
)
{
return
(
0
);
}
ShowWindow
(
hWnd
,
SW_HIDE
);
UpdateWindow
(
hWnd
);
while
(
GetMessage
(
&
Msg
,
0
,
0
,
0
))
{
TranslateMessage
(
&
Msg
);
DispatchMessage
(
&
Msg
);
}
return
((
int
)
(
Msg
.
wParam
));
}
//-----------------------------------------------------------------------
// Name: InitAppClass
// Purpose: Register the main application window class
//-----------------------------------------------------------------------
static
BOOL
InitAppClass
(
HINSTANCE
hInstance
)
{
WNDCLASS
cls
;
if
(
GetClassInfo
(
hInstance
,
szAppName
,
&
cls
)
==
0
)
{
cls
.
style
=
CS_HREDRAW
|
CS_VREDRAW
;;
cls
.
lpfnWndProc
=
(
WNDPROC
)
MainWindowProc
;
cls
.
cbClsExtra
=
0
;
cls
.
cbWndExtra
=
sizeof
(
HWND
);
cls
.
hInstance
=
hInstance
;
cls
.
hIcon
=
LoadIcon
(
hInstance
,
"MySql"
);
cls
.
hCursor
=
LoadCursor
(
NULL
,
IDC_ARROW
);
cls
.
hbrBackground
=
GetStockObject
(
WHITE_BRUSH
)
;
cls
.
lpszMenuName
=
0
;
//szAppName;
cls
.
lpszClassName
=
szAppName
;
return
RegisterClass
(
&
cls
);
}
return
(
TRUE
);
}
//-----------------------------------------------------------------------
// Name: MainWindowProc
// Purpose: Window procedure for main application window.
//-----------------------------------------------------------------------
LRESULT
CALLBACK
MainWindowProc
(
HWND
hWnd
,
UINT
Msg
,
WPARAM
wParam
,
LPARAM
lParam
)
{
static
RECT
rect
;
HDC
hdc
;
PAINTSTRUCT
ps
;
static
BOOL
bShutdown
=
FALSE
;
switch
(
Msg
)
{
case
WM_CREATE
:
TrayMessageAdd
(
hWnd
,
NIM_ADD
);
return
TRUE
;
/***************
case WM_SYSCOMMAND:
if(wParam==SC_CLOSE)
{ HANDLE hEventShutdown;
bShutdown=TRUE;
InvalidateRect(hWnd,NULL,TRUE);
ShowWindow (hWnd, SW_NORMAL);
UpdateWindow(hWnd);
hEventShutdown=OpenEvent(EVENT_MODIFY_STATE, 0, "MySqlShutdown");
if(hEventShutdown)
{
SetEvent(hEventShutdown);
CloseHandle(hEventShutdown);
Sleep(1000);
MessageBox(hWnd,"Shutdown", "MySql", MB_OK);
}
TrayMessageAdd(hWnd, NIM_DELETE);
}
break;
**************/
case
WM_DESTROY
:
TrayMessageAdd
(
hWnd
,
NIM_DELETE
);
PostQuitMessage
(
0
);
return
0
;
case
WM_SIZE
:
GetClientRect
(
hWnd
,
&
rect
)
;
return
0
;
case
WM_PAINT
:
hdc
=
BeginPaint
(
hWnd
,
&
ps
)
;
if
(
bShutdown
)
DrawText
(
hdc
,
"MySql shutdown in progress..."
,
-
1
,
&
rect
,
DT_WORDBREAK
)
;
EndPaint
(
hWnd
,
&
ps
)
;
return
0
;
case
WM_QUERYENDSESSION
:
//Shutdown MySql
{
HANDLE
hEventShutdown
;
bShutdown
=
TRUE
;
InvalidateRect
(
hWnd
,
NULL
,
TRUE
);
ShowWindow
(
hWnd
,
SW_NORMAL
);
UpdateWindow
(
hWnd
);
hEventShutdown
=
OpenEvent
(
EVENT_MODIFY_STATE
,
0
,
"MySqlShutdown"
);
if
(
hEventShutdown
)
{
SetEvent
(
hEventShutdown
);
CloseHandle
(
hEventShutdown
);
Sleep
(
1000
);
MessageBox
(
hWnd
,
"Shutdown"
,
"MySql"
,
MB_OK
);
}
}
return
1
;
case
MYWM_NOTIFYICON
:
switch
(
lParam
)
{
case
WM_LBUTTONDOWN
:
case
WM_RBUTTONDOWN
:
ShowWindow
(
hWnd
,
SW_SHOWNORMAL
);
SetForegroundWindow
(
hWnd
);
// make us come to the front
break
;
default:
break
;
}
break
;
}
return
DefWindowProc
(
hWnd
,
Msg
,
wParam
,
lParam
);
}
// ----------------------- The end ------------------------------------------
/****************************************************************************
MySqlShutdown - shutdown MySQL on system shutdown (Win95/98)
----------------------------------------------------------------------------
Revision History :
Version Author Date Description
001.00 Irena 21-12-99
*****************************************************************************/
#include <windows.h>
//-----------------------------------------------------------------------
// Local data
//-----------------------------------------------------------------------
static
char
szAppName
[]
=
"MySqlShutdown"
;
static
HINSTANCE
hInstance
;
#define MYWM_NOTIFYICON (WM_APP+100)
//-----------------------------------------------------------------------
// Exported functions
//-----------------------------------------------------------------------
LRESULT
CALLBACK
MainWindowProc
(
HWND
,
UINT
,
WPARAM
,
LPARAM
);
//-----------------------------------------------------------------------
// Local functions
//-----------------------------------------------------------------------
static
BOOL
InitAppClass
(
HINSTANCE
hInstance
);
BOOL
TrayMessageAdd
(
HWND
hWnd
,
DWORD
dwMessage
)
{
BOOL
res
;
HICON
hIcon
=
LoadIcon
(
hInstance
,
"MySql"
);
char
*
szTip
=
"MySql Shutdown"
;
NOTIFYICONDATA
tnd
;
tnd
.
cbSize
=
sizeof
(
NOTIFYICONDATA
);
tnd
.
hWnd
=
hWnd
;
tnd
.
uID
=
101
;
tnd
.
uFlags
=
NIF_MESSAGE
|
NIF_ICON
|
NIF_TIP
;
tnd
.
uCallbackMessage
=
MYWM_NOTIFYICON
;
tnd
.
hIcon
=
hIcon
;
strcpy
(
tnd
.
szTip
,
szTip
);
res
=
Shell_NotifyIcon
(
dwMessage
,
&
tnd
);
if
(
hIcon
)
DestroyIcon
(
hIcon
);
return
res
;
}
//-----------------------------------------------------------------------
// Name: WinMain
// Purpose: Main application entry point
//-----------------------------------------------------------------------
int
WINAPI
WinMain
(
HINSTANCE
hInst
,
HINSTANCE
hPrevInstance
,
LPSTR
lpCmdLine
,
int
nCmdShow
)
{
HWND
hWnd
;
MSG
Msg
;
hInstance
=
hInst
;
// Register application class if needed
if
(
InitAppClass
(
hInstance
)
==
FALSE
)
return
(
0
);
hWnd
=
CreateWindow
(
szAppName
,
"MySql"
,
WS_OVERLAPPEDWINDOW
|
WS_MINIMIZE
,
0
,
0
,
GetSystemMetrics
(
SM_CXSCREEN
)
/
4
,
GetSystemMetrics
(
SM_CYSCREEN
)
/
4
,
0
,
0
,
hInstance
,
NULL
);
if
(
!
hWnd
)
{
return
(
0
);
}
ShowWindow
(
hWnd
,
SW_HIDE
);
UpdateWindow
(
hWnd
);
while
(
GetMessage
(
&
Msg
,
0
,
0
,
0
))
{
TranslateMessage
(
&
Msg
);
DispatchMessage
(
&
Msg
);
}
return
((
int
)
(
Msg
.
wParam
));
}
//-----------------------------------------------------------------------
// Name: InitAppClass
// Purpose: Register the main application window class
//-----------------------------------------------------------------------
static
BOOL
InitAppClass
(
HINSTANCE
hInstance
)
{
WNDCLASS
cls
;
if
(
GetClassInfo
(
hInstance
,
szAppName
,
&
cls
)
==
0
)
{
cls
.
style
=
CS_HREDRAW
|
CS_VREDRAW
;;
cls
.
lpfnWndProc
=
(
WNDPROC
)
MainWindowProc
;
cls
.
cbClsExtra
=
0
;
cls
.
cbWndExtra
=
sizeof
(
HWND
);
cls
.
hInstance
=
hInstance
;
cls
.
hIcon
=
LoadIcon
(
hInstance
,
"MySql"
);
cls
.
hCursor
=
LoadCursor
(
NULL
,
IDC_ARROW
);
cls
.
hbrBackground
=
GetStockObject
(
WHITE_BRUSH
)
;
cls
.
lpszMenuName
=
0
;
//szAppName;
cls
.
lpszClassName
=
szAppName
;
return
RegisterClass
(
&
cls
);
}
return
(
TRUE
);
}
//-----------------------------------------------------------------------
// Name: MainWindowProc
// Purpose: Window procedure for main application window.
//-----------------------------------------------------------------------
LRESULT
CALLBACK
MainWindowProc
(
HWND
hWnd
,
UINT
Msg
,
WPARAM
wParam
,
LPARAM
lParam
)
{
static
RECT
rect
;
HDC
hdc
;
PAINTSTRUCT
ps
;
static
BOOL
bShutdown
=
FALSE
;
switch
(
Msg
)
{
case
WM_CREATE
:
TrayMessageAdd
(
hWnd
,
NIM_ADD
);
return
TRUE
;
/***************
case WM_SYSCOMMAND:
if(wParam==SC_CLOSE)
{ HANDLE hEventShutdown;
bShutdown=TRUE;
InvalidateRect(hWnd,NULL,TRUE);
ShowWindow (hWnd, SW_NORMAL);
UpdateWindow(hWnd);
hEventShutdown=OpenEvent(EVENT_MODIFY_STATE, 0, "MySqlShutdown");
if(hEventShutdown)
{
SetEvent(hEventShutdown);
CloseHandle(hEventShutdown);
Sleep(1000);
MessageBox(hWnd,"Shutdown", "MySql", MB_OK);
}
TrayMessageAdd(hWnd, NIM_DELETE);
}
break;
**************/
case
WM_DESTROY
:
TrayMessageAdd
(
hWnd
,
NIM_DELETE
);
PostQuitMessage
(
0
);
return
0
;
case
WM_SIZE
:
GetClientRect
(
hWnd
,
&
rect
)
;
return
0
;
case
WM_PAINT
:
hdc
=
BeginPaint
(
hWnd
,
&
ps
)
;
if
(
bShutdown
)
DrawText
(
hdc
,
"MySql shutdown in progress..."
,
-
1
,
&
rect
,
DT_WORDBREAK
)
;
EndPaint
(
hWnd
,
&
ps
)
;
return
0
;
case
WM_QUERYENDSESSION
:
//Shutdown MySql
{
HANDLE
hEventShutdown
;
bShutdown
=
TRUE
;
InvalidateRect
(
hWnd
,
NULL
,
TRUE
);
ShowWindow
(
hWnd
,
SW_NORMAL
);
UpdateWindow
(
hWnd
);
hEventShutdown
=
OpenEvent
(
EVENT_MODIFY_STATE
,
0
,
"MySqlShutdown"
);
if
(
hEventShutdown
)
{
SetEvent
(
hEventShutdown
);
CloseHandle
(
hEventShutdown
);
Sleep
(
1000
);
MessageBox
(
hWnd
,
"Shutdown"
,
"MySql"
,
MB_OK
);
}
}
return
1
;
case
MYWM_NOTIFYICON
:
switch
(
lParam
)
{
case
WM_LBUTTONDOWN
:
case
WM_RBUTTONDOWN
:
ShowWindow
(
hWnd
,
SW_SHOWNORMAL
);
SetForegroundWindow
(
hWnd
);
// make us come to the front
break
;
default:
break
;
}
break
;
}
return
DefWindowProc
(
hWnd
,
Msg
,
wParam
,
lParam
);
}
// ----------------------- The end ------------------------------------------
VC++Files/mysqlshutdown/mysqlshutdown.rc
View file @
fa823857
MySql ICON DISCARDABLE "MYSQL.ICO"
MySql ICON DISCARDABLE "MYSQL.ICO"
VC++Files/mysqlwatch/mysqlwatch.c
View file @
fa823857
/****************************************************************************
MySqlWatch - WinNT service program MySQL
- Re-start MySql server in case of failure
*****************************************************************************/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <tchar.h>
// name of the executable
#define SZAPPNAME "mysqlwatch"
// internal name of the service
#define SZSERVICENAME "MySqlWatch"
// displayed name of the service
#define SZSERVICEDISPLAYNAME "MySqlWatch"
// list of service dependencies - "dep1\0dep2\0\0"
#define SZDEPENDENCIES ""
VOID
ServiceStart
(
DWORD
dwArgc
,
LPTSTR
*
lpszArgv
);
VOID
ServiceStop
(
void
);
BOOL
ReportStatusToSCMgr
(
DWORD
dwCurrentState
,
DWORD
dwWin32ExitCode
,
DWORD
dwWaitHint
);
void
AddToMessageLog
(
LPTSTR
lpszMsg
);
// internal variables
SERVICE_STATUS
ssStatus
;
// current status of the service
SERVICE_STATUS_HANDLE
sshStatusHandle
;
DWORD
dwErr
=
0
;
BOOL
bDebug
=
FALSE
;
TCHAR
szErr
[
256
];
// internal function prototypes
void
WINAPI
service_ctrl
(
DWORD
dwCtrlCode
);
void
WINAPI
service_main
(
DWORD
dwArgc
,
LPTSTR
*
lpszArgv
);
void
CmdInstallService
(
void
);
void
CmdRemoveService
(
void
);
void
CmdDebugService
(
int
argc
,
char
**
argv
);
BOOL
WINAPI
ControlHandler
(
DWORD
dwCtrlType
);
LPTSTR
GetLastErrorText
(
LPTSTR
lpszBuf
,
DWORD
dwSize
);
//
// FUNCTION: main
//
// PURPOSE: entrypoint for service
//
// PARAMETERS:
// argc - number of command line arguments
// argv - array of command line arguments
//
// RETURN VALUE:
// none
//
// COMMENTS:
// main() either performs the command line task, or
// call StartServiceCtrlDispatcher to register the
// main service thread. When the this call returns,
// the service has stopped, so exit.
//
void
main
(
int
argc
,
char
**
argv
)
{
SERVICE_TABLE_ENTRY
dispatchTable
[]
=
{
{
TEXT
(
SZSERVICENAME
),
(
LPSERVICE_MAIN_FUNCTION
)
service_main
},
{
NULL
,
NULL
}
};
if
(
(
argc
>
1
)
&&
((
*
argv
[
1
]
==
'-'
)
||
(
*
argv
[
1
]
==
'/'
))
)
{
if
(
stricmp
(
"install"
,
argv
[
1
]
+
1
)
==
0
)
{
CmdInstallService
();
}
else
if
(
stricmp
(
"remove"
,
argv
[
1
]
+
1
)
==
0
)
{
CmdRemoveService
();
}
else
if
(
stricmp
(
"debug"
,
argv
[
1
]
+
1
)
==
0
)
{
bDebug
=
TRUE
;
CmdDebugService
(
argc
,
argv
);
}
else
{
goto
dispatch
;
}
exit
(
0
);
}
// if it doesn't match any of the above parameters
// the service control manager may be starting the service
// so we must call StartServiceCtrlDispatcher
dispatch:
// this is just to be friendly
printf
(
"%s -install to install the service
\n
"
,
SZAPPNAME
);
printf
(
"%s -remove to remove the service
\n
"
,
SZAPPNAME
);
printf
(
"%s -debug <params> to run as a console app for debugging
\n
"
,
SZAPPNAME
);
printf
(
"
\n
StartServiceCtrlDispatcher being called.
\n
"
);
printf
(
"This may take several seconds. Please wait.
\n
"
);
if
(
!
StartServiceCtrlDispatcher
(
dispatchTable
))
AddToMessageLog
(
TEXT
(
"StartServiceCtrlDispatcher failed."
));
}
//
// FUNCTION: service_main
//
// PURPOSE: To perform actual initialization of the service
//
// PARAMETERS:
// dwArgc - number of command line arguments
// lpszArgv - array of command line arguments
//
// RETURN VALUE:
// none
//
// COMMENTS:
// This routine performs the service initialization and then calls
// the user defined ServiceStart() routine to perform majority
// of the work.
//
void
WINAPI
service_main
(
DWORD
dwArgc
,
LPTSTR
*
lpszArgv
)
{
// register our service control handler:
//
sshStatusHandle
=
RegisterServiceCtrlHandler
(
TEXT
(
SZSERVICENAME
),
service_ctrl
);
if
(
!
sshStatusHandle
)
goto
cleanup
;
// SERVICE_STATUS members that don't change in example
//
ssStatus
.
dwServiceType
=
SERVICE_WIN32_OWN_PROCESS
;
ssStatus
.
dwServiceSpecificExitCode
=
0
;
// report the status to the service control manager.
//
if
(
!
ReportStatusToSCMgr
(
SERVICE_START_PENDING
,
// service state
NO_ERROR
,
// exit code
3000
))
// wait hint
goto
cleanup
;
ServiceStart
(
dwArgc
,
lpszArgv
);
cleanup:
// try to report the stopped status to the service control manager.
//
if
(
sshStatusHandle
)
ReportStatusToSCMgr
(
SERVICE_STOPPED
,
dwErr
,
0
);
return
;
}
//
// FUNCTION: service_ctrl
//
// PURPOSE: This function is called by the SCM whenever
// ControlService() is called on this service.
//
// PARAMETERS:
// dwCtrlCode - type of control requested
//
// RETURN VALUE:
// none
//
// COMMENTS:
//
void
WINAPI
service_ctrl
(
DWORD
dwCtrlCode
)
{
// Handle the requested control code.
//
switch
(
dwCtrlCode
)
{
// Stop the service.
//
case
SERVICE_CONTROL_STOP
:
ssStatus
.
dwCurrentState
=
SERVICE_STOP_PENDING
;
ServiceStop
();
break
;
// Update the service status.
//
case
SERVICE_CONTROL_INTERROGATE
:
break
;
// invalid control code
//
default:
break
;
}
ReportStatusToSCMgr
(
ssStatus
.
dwCurrentState
,
NO_ERROR
,
0
);
}
//
// FUNCTION: ReportStatusToSCMgr()
//
// PURPOSE: Sets the current status of the service and
// reports it to the Service Control Manager
//
// PARAMETERS:
// dwCurrentState - the state of the service
// dwWin32ExitCode - error code to report
// dwWaitHint - worst case estimate to next checkpoint
//
// RETURN VALUE:
// TRUE - success
// FALSE - failure
//
// COMMENTS:
//
BOOL
ReportStatusToSCMgr
(
DWORD
dwCurrentState
,
DWORD
dwWin32ExitCode
,
DWORD
dwWaitHint
)
{
static
DWORD
dwCheckPoint
=
1
;
BOOL
fResult
=
TRUE
;
if
(
!
bDebug
)
// when debugging we don't report to the SCM
{
if
(
dwCurrentState
==
SERVICE_START_PENDING
)
ssStatus
.
dwControlsAccepted
=
0
;
else
ssStatus
.
dwControlsAccepted
=
SERVICE_ACCEPT_STOP
;
ssStatus
.
dwCurrentState
=
dwCurrentState
;
ssStatus
.
dwWin32ExitCode
=
dwWin32ExitCode
;
ssStatus
.
dwWaitHint
=
dwWaitHint
;
if
(
(
dwCurrentState
==
SERVICE_RUNNING
)
||
(
dwCurrentState
==
SERVICE_STOPPED
)
)
ssStatus
.
dwCheckPoint
=
0
;
else
ssStatus
.
dwCheckPoint
=
dwCheckPoint
++
;
// Report the status of the service to the service control manager.
//
if
(
!
(
fResult
=
SetServiceStatus
(
sshStatusHandle
,
&
ssStatus
)))
{
AddToMessageLog
(
TEXT
(
"SetServiceStatus"
));
}
}
return
fResult
;
}
//
// FUNCTION: AddToMessageLog(LPTSTR lpszMsg)
//
// PURPOSE: Allows any thread to log an error message
//
// PARAMETERS:
// lpszMsg - text for message
//
// RETURN VALUE:
// none
//
// COMMENTS:
//
void
AddToMessageLog
(
LPTSTR
lpszMsg
)
{
TCHAR
szMsg
[
256
];
HANDLE
hEventSource
;
LPTSTR
lpszStrings
[
2
];
if
(
!
bDebug
)
{
dwErr
=
GetLastError
();
// Use event logging to log the error.
//
hEventSource
=
RegisterEventSource
(
NULL
,
TEXT
(
SZSERVICENAME
));
_stprintf
(
szMsg
,
TEXT
(
"%s error: %d"
),
TEXT
(
SZSERVICENAME
),
dwErr
);
lpszStrings
[
0
]
=
szMsg
;
lpszStrings
[
1
]
=
lpszMsg
;
if
(
hEventSource
!=
NULL
)
{
ReportEvent
(
hEventSource
,
// handle of event source
EVENTLOG_ERROR_TYPE
,
// event type
0
,
// event category
0
,
// event ID
NULL
,
// current user's SID
2
,
// strings in lpszStrings
0
,
// no bytes of raw data
lpszStrings
,
// array of error strings
NULL
);
// no raw data
DeregisterEventSource
(
hEventSource
);
}
}
}
///////////////////////////////////////////////////////////////////
//
// The following code handles service installation and removal
//
//
// FUNCTION: CmdInstallService()
//
// PURPOSE: Installs the service
//
// PARAMETERS:
// none
//
// RETURN VALUE:
// none
//
// COMMENTS:
//
void
CmdInstallService
()
{
SC_HANDLE
schService
;
SC_HANDLE
schSCManager
;
TCHAR
szPath
[
512
];
if
(
GetModuleFileName
(
NULL
,
szPath
,
512
)
==
0
)
{
_tprintf
(
TEXT
(
"Unable to install %s - %s
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
),
GetLastErrorText
(
szErr
,
256
));
return
;
}
schSCManager
=
OpenSCManager
(
NULL
,
// machine (NULL == local)
NULL
,
// database (NULL == default)
SC_MANAGER_ALL_ACCESS
// access required
);
if
(
schSCManager
)
{
schService
=
CreateService
(
schSCManager
,
// SCManager database
TEXT
(
SZSERVICENAME
),
// name of service
TEXT
(
SZSERVICEDISPLAYNAME
),
// name to display
SERVICE_ALL_ACCESS
,
// desired access
SERVICE_WIN32_OWN_PROCESS
,
// service type
SERVICE_DEMAND_START
,
// start type
SERVICE_ERROR_NORMAL
,
// error control type
szPath
,
// service's binary
NULL
,
// no load ordering group
NULL
,
// no tag identifier
TEXT
(
SZDEPENDENCIES
),
// dependencies
NULL
,
// LocalSystem account
NULL
);
// no password
if
(
schService
)
{
_tprintf
(
TEXT
(
"%s installed.
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
)
);
CloseServiceHandle
(
schService
);
}
else
{
_tprintf
(
TEXT
(
"CreateService failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
}
CloseServiceHandle
(
schSCManager
);
}
else
_tprintf
(
TEXT
(
"OpenSCManager failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
}
//
// FUNCTION: CmdRemoveService()
//
// PURPOSE: Stops and removes the service
//
// PARAMETERS:
// none
//
// RETURN VALUE:
// none
//
// COMMENTS:
//
void
CmdRemoveService
()
{
SC_HANDLE
schService
;
SC_HANDLE
schSCManager
;
schSCManager
=
OpenSCManager
(
NULL
,
// machine (NULL == local)
NULL
,
// database (NULL == default)
SC_MANAGER_ALL_ACCESS
// access required
);
if
(
schSCManager
)
{
schService
=
OpenService
(
schSCManager
,
TEXT
(
SZSERVICENAME
),
SERVICE_ALL_ACCESS
);
if
(
schService
)
{
// try to stop the service
if
(
ControlService
(
schService
,
SERVICE_CONTROL_STOP
,
&
ssStatus
)
)
{
_tprintf
(
TEXT
(
"Stopping %s."
),
TEXT
(
SZSERVICEDISPLAYNAME
));
Sleep
(
1000
);
while
(
QueryServiceStatus
(
schService
,
&
ssStatus
)
)
{
if
(
ssStatus
.
dwCurrentState
==
SERVICE_STOP_PENDING
)
{
_tprintf
(
TEXT
(
"."
));
Sleep
(
1000
);
}
else
break
;
}
if
(
ssStatus
.
dwCurrentState
==
SERVICE_STOPPED
)
_tprintf
(
TEXT
(
"
\n
%s stopped.
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
)
);
else
_tprintf
(
TEXT
(
"
\n
%s failed to stop.
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
)
);
}
// now remove the service
if
(
DeleteService
(
schService
)
)
_tprintf
(
TEXT
(
"%s removed.
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
)
);
else
_tprintf
(
TEXT
(
"DeleteService failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
CloseServiceHandle
(
schService
);
}
else
_tprintf
(
TEXT
(
"OpenService failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
CloseServiceHandle
(
schSCManager
);
}
else
_tprintf
(
TEXT
(
"OpenSCManager failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
}
//
// FUNCTION: CmdRestartService()
//
// PURPOSE: Stops and removes the service
//
// PARAMETERS:
// none
//
// RETURN VALUE:
// none
//
// COMMENTS:
//
void
CmdRestartService
(
char
*
szServiceName
)
{
SC_HANDLE
schService
;
SC_HANDLE
schSCManager
;
schSCManager
=
OpenSCManager
(
NULL
,
// machine (NULL == local)
NULL
,
// database (NULL == default)
SC_MANAGER_ALL_ACCESS
// access required
);
if
(
schSCManager
)
{
schService
=
OpenService
(
schSCManager
,
TEXT
(
szServiceName
),
SERVICE_ALL_ACCESS
);
if
(
schService
)
{
if
(
!
ControlService
(
schService
,
SERVICE_CONTROL_INTERROGATE
,
&
ssStatus
)
)
//if(QueryServiceStatus( schService, &ssStatus )==0)
{
if
(
GetLastError
()
==
ERROR_SERVICE_NOT_ACTIVE
)
{
//AddToMessageLog(TEXT("Start service..."));
StartService
(
schService
,
0
,
NULL
);
}
else
{
;
//AddToMessageLog(TEXT("QueryService..."));
//AddToMessageLog(TEXT(GetLastErrorText(szErr,256)));
}
}
CloseServiceHandle
(
schService
);
}
else
{
_tprintf
(
TEXT
(
"OpenService failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
AddToMessageLog
(
TEXT
(
"OpenService..."
));
AddToMessageLog
(
TEXT
(
GetLastErrorText
(
szErr
,
256
)));
}
CloseServiceHandle
(
schSCManager
);
}
else
{
_tprintf
(
TEXT
(
"OpenSCManager failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
AddToMessageLog
(
TEXT
(
"OpenSCMManager.."
));
}
}
///////////////////////////////////////////////////////////////////
//
// The following code is for running the service as a console app
//
//
// FUNCTION: CmdDebugService(int argc, char ** argv)
//
// PURPOSE: Runs the service as a console application
//
// PARAMETERS:
// argc - number of command line arguments
// argv - array of command line arguments
//
// RETURN VALUE:
// none
//
// COMMENTS:
//
void
CmdDebugService
(
int
argc
,
char
**
argv
)
{
DWORD
dwArgc
;
LPTSTR
*
lpszArgv
;
#ifdef UNICODE
lpszArgv
=
CommandLineToArgvW
(
GetCommandLineW
(),
&
(
dwArgc
)
);
#else
dwArgc
=
(
DWORD
)
argc
;
lpszArgv
=
argv
;
#endif
_tprintf
(
TEXT
(
"Debugging %s.
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
));
SetConsoleCtrlHandler
(
ControlHandler
,
TRUE
);
ServiceStart
(
dwArgc
,
lpszArgv
);
}
//
// FUNCTION: ControlHandler ( DWORD dwCtrlType )
//
// PURPOSE: Handled console control events
//
// PARAMETERS:
// dwCtrlType - type of control event
//
// RETURN VALUE:
// True - handled
// False - unhandled
//
// COMMENTS:
//
BOOL
WINAPI
ControlHandler
(
DWORD
dwCtrlType
)
{
switch
(
dwCtrlType
)
{
case
CTRL_BREAK_EVENT
:
// use Ctrl+C or Ctrl+Break to simulate
case
CTRL_C_EVENT
:
// SERVICE_CONTROL_STOP in debug mode
_tprintf
(
TEXT
(
"Stopping %s.
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
));
ServiceStop
();
return
TRUE
;
break
;
}
return
FALSE
;
}
//
// FUNCTION: GetLastErrorText
//
// PURPOSE: copies error message text to string
//
// PARAMETERS:
// lpszBuf - destination buffer
// dwSize - size of buffer
//
// RETURN VALUE:
// destination buffer
//
// COMMENTS:
//
LPTSTR
GetLastErrorText
(
LPTSTR
lpszBuf
,
DWORD
dwSize
)
{
DWORD
dwRet
;
LPTSTR
lpszTemp
=
NULL
;
dwRet
=
FormatMessage
(
FORMAT_MESSAGE_ALLOCATE_BUFFER
|
FORMAT_MESSAGE_FROM_SYSTEM
|
FORMAT_MESSAGE_ARGUMENT_ARRAY
,
NULL
,
GetLastError
(),
LANG_NEUTRAL
,
(
LPTSTR
)
&
lpszTemp
,
0
,
NULL
);
// supplied buffer is not long enough
if
(
!
dwRet
||
(
(
long
)
dwSize
<
(
long
)
dwRet
+
14
)
)
lpszBuf
[
0
]
=
TEXT
(
'\0'
);
else
{
lpszTemp
[
lstrlen
(
lpszTemp
)
-
2
]
=
TEXT
(
'\0'
);
//remove cr and newline character
_stprintf
(
lpszBuf
,
TEXT
(
"%s (0x%x)"
),
lpszTemp
,
GetLastError
()
);
}
if
(
lpszTemp
)
LocalFree
((
HLOCAL
)
lpszTemp
);
return
lpszBuf
;
}
//-------------------------------------------------
// this event is signalled when the
// service should end
//-------------------------------------------------
HANDLE
hServerStopEvent
=
NULL
;
//-------------------------------------------------
// FUNCTION: ServiceStart
//
// PURPOSE: Actual code of the service
// that does the work.
//-------------------------------------------------
void
ServiceStart
(
DWORD
dwArgc
,
LPTSTR
*
lpszArgv
)
{
DWORD
dwWait
,
dwTimeout
=
1000
*
60
*
1
;
if
(
!
ReportStatusToSCMgr
(
SERVICE_START_PENDING
,
// service state
NO_ERROR
,
// exit code
3000
))
// wait hint
goto
cleanup
;
// create the event object. The control handler function signals
// this event when it receives the "stop" control code.
//
hServerStopEvent
=
CreateEvent
(
NULL
,
// no security attributes
TRUE
,
// manual reset event
FALSE
,
// not-signalled
NULL
);
// no name
if
(
hServerStopEvent
==
NULL
)
goto
cleanup
;
// report the status to the service control manager.
//
if
(
!
ReportStatusToSCMgr
(
SERVICE_START_PENDING
,
// service state
NO_ERROR
,
// exit code
3000
))
// wait hint
goto
cleanup
;
// report the status to the service control manager.
//
if
(
!
ReportStatusToSCMgr
(
SERVICE_START_PENDING
,
// service state
NO_ERROR
,
// exit code
3000
))
// wait hint
goto
cleanup
;
// report the status to the service control manager.
//
if
(
!
ReportStatusToSCMgr
(
SERVICE_RUNNING
,
// service state
NO_ERROR
,
// exit code
0
))
// wait hint
goto
cleanup
;
//
// End of initialization
// Service is now running, perform work until shutdown
//
while
(
1
)
{
dwWait
=
WaitForSingleObject
(
hServerStopEvent
,
dwTimeout
);
if
(
dwWait
==
WAIT_FAILED
)
{
AddToMessageLog
(
TEXT
(
"Error in WaitForSingleObject"
));
break
;
}
else
if
(
dwWait
==
WAIT_TIMEOUT
)
{
CmdRestartService
(
"MySql"
);
}
else
{
break
;
//shutdown
}
}
cleanup:
if
(
hServerStopEvent
)
CloseHandle
(
hServerStopEvent
);
}
//-------------------------------------------------
// FUNCTION: ServiceStop
//
// PURPOSE: Stops the service
//-------------------------------------------------
void
ServiceStop
()
{
if
(
hServerStopEvent
)
SetEvent
(
hServerStopEvent
);
}
//-the end ----------------------------------------
/****************************************************************************
MySqlWatch - WinNT service program MySQL
- Re-start MySql server in case of failure
*****************************************************************************/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <tchar.h>
// name of the executable
#define SZAPPNAME "mysqlwatch"
// internal name of the service
#define SZSERVICENAME "MySqlWatch"
// displayed name of the service
#define SZSERVICEDISPLAYNAME "MySqlWatch"
// list of service dependencies - "dep1\0dep2\0\0"
#define SZDEPENDENCIES ""
VOID
ServiceStart
(
DWORD
dwArgc
,
LPTSTR
*
lpszArgv
);
VOID
ServiceStop
(
void
);
BOOL
ReportStatusToSCMgr
(
DWORD
dwCurrentState
,
DWORD
dwWin32ExitCode
,
DWORD
dwWaitHint
);
void
AddToMessageLog
(
LPTSTR
lpszMsg
);
// internal variables
SERVICE_STATUS
ssStatus
;
// current status of the service
SERVICE_STATUS_HANDLE
sshStatusHandle
;
DWORD
dwErr
=
0
;
BOOL
bDebug
=
FALSE
;
TCHAR
szErr
[
256
];
// internal function prototypes
void
WINAPI
service_ctrl
(
DWORD
dwCtrlCode
);
void
WINAPI
service_main
(
DWORD
dwArgc
,
LPTSTR
*
lpszArgv
);
void
CmdInstallService
(
void
);
void
CmdRemoveService
(
void
);
void
CmdDebugService
(
int
argc
,
char
**
argv
);
BOOL
WINAPI
ControlHandler
(
DWORD
dwCtrlType
);
LPTSTR
GetLastErrorText
(
LPTSTR
lpszBuf
,
DWORD
dwSize
);
//
// FUNCTION: main
//
// PURPOSE: entrypoint for service
//
// PARAMETERS:
// argc - number of command line arguments
// argv - array of command line arguments
//
// RETURN VALUE:
// none
//
// COMMENTS:
// main() either performs the command line task, or
// call StartServiceCtrlDispatcher to register the
// main service thread. When the this call returns,
// the service has stopped, so exit.
//
void
main
(
int
argc
,
char
**
argv
)
{
SERVICE_TABLE_ENTRY
dispatchTable
[]
=
{
{
TEXT
(
SZSERVICENAME
),
(
LPSERVICE_MAIN_FUNCTION
)
service_main
},
{
NULL
,
NULL
}
};
if
(
(
argc
>
1
)
&&
((
*
argv
[
1
]
==
'-'
)
||
(
*
argv
[
1
]
==
'/'
))
)
{
if
(
stricmp
(
"install"
,
argv
[
1
]
+
1
)
==
0
)
{
CmdInstallService
();
}
else
if
(
stricmp
(
"remove"
,
argv
[
1
]
+
1
)
==
0
)
{
CmdRemoveService
();
}
else
if
(
stricmp
(
"debug"
,
argv
[
1
]
+
1
)
==
0
)
{
bDebug
=
TRUE
;
CmdDebugService
(
argc
,
argv
);
}
else
{
goto
dispatch
;
}
exit
(
0
);
}
// if it doesn't match any of the above parameters
// the service control manager may be starting the service
// so we must call StartServiceCtrlDispatcher
dispatch:
// this is just to be friendly
printf
(
"%s -install to install the service
\n
"
,
SZAPPNAME
);
printf
(
"%s -remove to remove the service
\n
"
,
SZAPPNAME
);
printf
(
"%s -debug <params> to run as a console app for debugging
\n
"
,
SZAPPNAME
);
printf
(
"
\n
StartServiceCtrlDispatcher being called.
\n
"
);
printf
(
"This may take several seconds. Please wait.
\n
"
);
if
(
!
StartServiceCtrlDispatcher
(
dispatchTable
))
AddToMessageLog
(
TEXT
(
"StartServiceCtrlDispatcher failed."
));
}
//
// FUNCTION: service_main
//
// PURPOSE: To perform actual initialization of the service
//
// PARAMETERS:
// dwArgc - number of command line arguments
// lpszArgv - array of command line arguments
//
// RETURN VALUE:
// none
//
// COMMENTS:
// This routine performs the service initialization and then calls
// the user defined ServiceStart() routine to perform majority
// of the work.
//
void
WINAPI
service_main
(
DWORD
dwArgc
,
LPTSTR
*
lpszArgv
)
{
// register our service control handler:
//
sshStatusHandle
=
RegisterServiceCtrlHandler
(
TEXT
(
SZSERVICENAME
),
service_ctrl
);
if
(
!
sshStatusHandle
)
goto
cleanup
;
// SERVICE_STATUS members that don't change in example
//
ssStatus
.
dwServiceType
=
SERVICE_WIN32_OWN_PROCESS
;
ssStatus
.
dwServiceSpecificExitCode
=
0
;
// report the status to the service control manager.
//
if
(
!
ReportStatusToSCMgr
(
SERVICE_START_PENDING
,
// service state
NO_ERROR
,
// exit code
3000
))
// wait hint
goto
cleanup
;
ServiceStart
(
dwArgc
,
lpszArgv
);
cleanup:
// try to report the stopped status to the service control manager.
//
if
(
sshStatusHandle
)
ReportStatusToSCMgr
(
SERVICE_STOPPED
,
dwErr
,
0
);
return
;
}
//
// FUNCTION: service_ctrl
//
// PURPOSE: This function is called by the SCM whenever
// ControlService() is called on this service.
//
// PARAMETERS:
// dwCtrlCode - type of control requested
//
// RETURN VALUE:
// none
//
// COMMENTS:
//
void
WINAPI
service_ctrl
(
DWORD
dwCtrlCode
)
{
// Handle the requested control code.
//
switch
(
dwCtrlCode
)
{
// Stop the service.
//
case
SERVICE_CONTROL_STOP
:
ssStatus
.
dwCurrentState
=
SERVICE_STOP_PENDING
;
ServiceStop
();
break
;
// Update the service status.
//
case
SERVICE_CONTROL_INTERROGATE
:
break
;
// invalid control code
//
default:
break
;
}
ReportStatusToSCMgr
(
ssStatus
.
dwCurrentState
,
NO_ERROR
,
0
);
}
//
// FUNCTION: ReportStatusToSCMgr()
//
// PURPOSE: Sets the current status of the service and
// reports it to the Service Control Manager
//
// PARAMETERS:
// dwCurrentState - the state of the service
// dwWin32ExitCode - error code to report
// dwWaitHint - worst case estimate to next checkpoint
//
// RETURN VALUE:
// TRUE - success
// FALSE - failure
//
// COMMENTS:
//
BOOL
ReportStatusToSCMgr
(
DWORD
dwCurrentState
,
DWORD
dwWin32ExitCode
,
DWORD
dwWaitHint
)
{
static
DWORD
dwCheckPoint
=
1
;
BOOL
fResult
=
TRUE
;
if
(
!
bDebug
)
// when debugging we don't report to the SCM
{
if
(
dwCurrentState
==
SERVICE_START_PENDING
)
ssStatus
.
dwControlsAccepted
=
0
;
else
ssStatus
.
dwControlsAccepted
=
SERVICE_ACCEPT_STOP
;
ssStatus
.
dwCurrentState
=
dwCurrentState
;
ssStatus
.
dwWin32ExitCode
=
dwWin32ExitCode
;
ssStatus
.
dwWaitHint
=
dwWaitHint
;
if
(
(
dwCurrentState
==
SERVICE_RUNNING
)
||
(
dwCurrentState
==
SERVICE_STOPPED
)
)
ssStatus
.
dwCheckPoint
=
0
;
else
ssStatus
.
dwCheckPoint
=
dwCheckPoint
++
;
// Report the status of the service to the service control manager.
//
if
(
!
(
fResult
=
SetServiceStatus
(
sshStatusHandle
,
&
ssStatus
)))
{
AddToMessageLog
(
TEXT
(
"SetServiceStatus"
));
}
}
return
fResult
;
}
//
// FUNCTION: AddToMessageLog(LPTSTR lpszMsg)
//
// PURPOSE: Allows any thread to log an error message
//
// PARAMETERS:
// lpszMsg - text for message
//
// RETURN VALUE:
// none
//
// COMMENTS:
//
void
AddToMessageLog
(
LPTSTR
lpszMsg
)
{
TCHAR
szMsg
[
256
];
HANDLE
hEventSource
;
LPTSTR
lpszStrings
[
2
];
if
(
!
bDebug
)
{
dwErr
=
GetLastError
();
// Use event logging to log the error.
//
hEventSource
=
RegisterEventSource
(
NULL
,
TEXT
(
SZSERVICENAME
));
_stprintf
(
szMsg
,
TEXT
(
"%s error: %d"
),
TEXT
(
SZSERVICENAME
),
dwErr
);
lpszStrings
[
0
]
=
szMsg
;
lpszStrings
[
1
]
=
lpszMsg
;
if
(
hEventSource
!=
NULL
)
{
ReportEvent
(
hEventSource
,
// handle of event source
EVENTLOG_ERROR_TYPE
,
// event type
0
,
// event category
0
,
// event ID
NULL
,
// current user's SID
2
,
// strings in lpszStrings
0
,
// no bytes of raw data
lpszStrings
,
// array of error strings
NULL
);
// no raw data
DeregisterEventSource
(
hEventSource
);
}
}
}
///////////////////////////////////////////////////////////////////
//
// The following code handles service installation and removal
//
//
// FUNCTION: CmdInstallService()
//
// PURPOSE: Installs the service
//
// PARAMETERS:
// none
//
// RETURN VALUE:
// none
//
// COMMENTS:
//
void
CmdInstallService
()
{
SC_HANDLE
schService
;
SC_HANDLE
schSCManager
;
TCHAR
szPath
[
512
];
if
(
GetModuleFileName
(
NULL
,
szPath
,
512
)
==
0
)
{
_tprintf
(
TEXT
(
"Unable to install %s - %s
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
),
GetLastErrorText
(
szErr
,
256
));
return
;
}
schSCManager
=
OpenSCManager
(
NULL
,
// machine (NULL == local)
NULL
,
// database (NULL == default)
SC_MANAGER_ALL_ACCESS
// access required
);
if
(
schSCManager
)
{
schService
=
CreateService
(
schSCManager
,
// SCManager database
TEXT
(
SZSERVICENAME
),
// name of service
TEXT
(
SZSERVICEDISPLAYNAME
),
// name to display
SERVICE_ALL_ACCESS
,
// desired access
SERVICE_WIN32_OWN_PROCESS
,
// service type
SERVICE_DEMAND_START
,
// start type
SERVICE_ERROR_NORMAL
,
// error control type
szPath
,
// service's binary
NULL
,
// no load ordering group
NULL
,
// no tag identifier
TEXT
(
SZDEPENDENCIES
),
// dependencies
NULL
,
// LocalSystem account
NULL
);
// no password
if
(
schService
)
{
_tprintf
(
TEXT
(
"%s installed.
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
)
);
CloseServiceHandle
(
schService
);
}
else
{
_tprintf
(
TEXT
(
"CreateService failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
}
CloseServiceHandle
(
schSCManager
);
}
else
_tprintf
(
TEXT
(
"OpenSCManager failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
}
//
// FUNCTION: CmdRemoveService()
//
// PURPOSE: Stops and removes the service
//
// PARAMETERS:
// none
//
// RETURN VALUE:
// none
//
// COMMENTS:
//
void
CmdRemoveService
()
{
SC_HANDLE
schService
;
SC_HANDLE
schSCManager
;
schSCManager
=
OpenSCManager
(
NULL
,
// machine (NULL == local)
NULL
,
// database (NULL == default)
SC_MANAGER_ALL_ACCESS
// access required
);
if
(
schSCManager
)
{
schService
=
OpenService
(
schSCManager
,
TEXT
(
SZSERVICENAME
),
SERVICE_ALL_ACCESS
);
if
(
schService
)
{
// try to stop the service
if
(
ControlService
(
schService
,
SERVICE_CONTROL_STOP
,
&
ssStatus
)
)
{
_tprintf
(
TEXT
(
"Stopping %s."
),
TEXT
(
SZSERVICEDISPLAYNAME
));
Sleep
(
1000
);
while
(
QueryServiceStatus
(
schService
,
&
ssStatus
)
)
{
if
(
ssStatus
.
dwCurrentState
==
SERVICE_STOP_PENDING
)
{
_tprintf
(
TEXT
(
"."
));
Sleep
(
1000
);
}
else
break
;
}
if
(
ssStatus
.
dwCurrentState
==
SERVICE_STOPPED
)
_tprintf
(
TEXT
(
"
\n
%s stopped.
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
)
);
else
_tprintf
(
TEXT
(
"
\n
%s failed to stop.
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
)
);
}
// now remove the service
if
(
DeleteService
(
schService
)
)
_tprintf
(
TEXT
(
"%s removed.
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
)
);
else
_tprintf
(
TEXT
(
"DeleteService failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
CloseServiceHandle
(
schService
);
}
else
_tprintf
(
TEXT
(
"OpenService failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
CloseServiceHandle
(
schSCManager
);
}
else
_tprintf
(
TEXT
(
"OpenSCManager failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
}
//
// FUNCTION: CmdRestartService()
//
// PURPOSE: Stops and removes the service
//
// PARAMETERS:
// none
//
// RETURN VALUE:
// none
//
// COMMENTS:
//
void
CmdRestartService
(
char
*
szServiceName
)
{
SC_HANDLE
schService
;
SC_HANDLE
schSCManager
;
schSCManager
=
OpenSCManager
(
NULL
,
// machine (NULL == local)
NULL
,
// database (NULL == default)
SC_MANAGER_ALL_ACCESS
// access required
);
if
(
schSCManager
)
{
schService
=
OpenService
(
schSCManager
,
TEXT
(
szServiceName
),
SERVICE_ALL_ACCESS
);
if
(
schService
)
{
if
(
!
ControlService
(
schService
,
SERVICE_CONTROL_INTERROGATE
,
&
ssStatus
)
)
//if(QueryServiceStatus( schService, &ssStatus )==0)
{
if
(
GetLastError
()
==
ERROR_SERVICE_NOT_ACTIVE
)
{
//AddToMessageLog(TEXT("Start service..."));
StartService
(
schService
,
0
,
NULL
);
}
else
{
;
//AddToMessageLog(TEXT("QueryService..."));
//AddToMessageLog(TEXT(GetLastErrorText(szErr,256)));
}
}
CloseServiceHandle
(
schService
);
}
else
{
_tprintf
(
TEXT
(
"OpenService failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
AddToMessageLog
(
TEXT
(
"OpenService..."
));
AddToMessageLog
(
TEXT
(
GetLastErrorText
(
szErr
,
256
)));
}
CloseServiceHandle
(
schSCManager
);
}
else
{
_tprintf
(
TEXT
(
"OpenSCManager failed - %s
\n
"
),
GetLastErrorText
(
szErr
,
256
));
AddToMessageLog
(
TEXT
(
"OpenSCMManager.."
));
}
}
///////////////////////////////////////////////////////////////////
//
// The following code is for running the service as a console app
//
//
// FUNCTION: CmdDebugService(int argc, char ** argv)
//
// PURPOSE: Runs the service as a console application
//
// PARAMETERS:
// argc - number of command line arguments
// argv - array of command line arguments
//
// RETURN VALUE:
// none
//
// COMMENTS:
//
void
CmdDebugService
(
int
argc
,
char
**
argv
)
{
DWORD
dwArgc
;
LPTSTR
*
lpszArgv
;
#ifdef UNICODE
lpszArgv
=
CommandLineToArgvW
(
GetCommandLineW
(),
&
(
dwArgc
)
);
#else
dwArgc
=
(
DWORD
)
argc
;
lpszArgv
=
argv
;
#endif
_tprintf
(
TEXT
(
"Debugging %s.
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
));
SetConsoleCtrlHandler
(
ControlHandler
,
TRUE
);
ServiceStart
(
dwArgc
,
lpszArgv
);
}
//
// FUNCTION: ControlHandler ( DWORD dwCtrlType )
//
// PURPOSE: Handled console control events
//
// PARAMETERS:
// dwCtrlType - type of control event
//
// RETURN VALUE:
// True - handled
// False - unhandled
//
// COMMENTS:
//
BOOL
WINAPI
ControlHandler
(
DWORD
dwCtrlType
)
{
switch
(
dwCtrlType
)
{
case
CTRL_BREAK_EVENT
:
// use Ctrl+C or Ctrl+Break to simulate
case
CTRL_C_EVENT
:
// SERVICE_CONTROL_STOP in debug mode
_tprintf
(
TEXT
(
"Stopping %s.
\n
"
),
TEXT
(
SZSERVICEDISPLAYNAME
));
ServiceStop
();
return
TRUE
;
break
;
}
return
FALSE
;
}
//
// FUNCTION: GetLastErrorText
//
// PURPOSE: copies error message text to string
//
// PARAMETERS:
// lpszBuf - destination buffer
// dwSize - size of buffer
//
// RETURN VALUE:
// destination buffer
//
// COMMENTS:
//
LPTSTR
GetLastErrorText
(
LPTSTR
lpszBuf
,
DWORD
dwSize
)
{
DWORD
dwRet
;
LPTSTR
lpszTemp
=
NULL
;
dwRet
=
FormatMessage
(
FORMAT_MESSAGE_ALLOCATE_BUFFER
|
FORMAT_MESSAGE_FROM_SYSTEM
|
FORMAT_MESSAGE_ARGUMENT_ARRAY
,
NULL
,
GetLastError
(),
LANG_NEUTRAL
,
(
LPTSTR
)
&
lpszTemp
,
0
,
NULL
);
// supplied buffer is not long enough
if
(
!
dwRet
||
(
(
long
)
dwSize
<
(
long
)
dwRet
+
14
)
)
lpszBuf
[
0
]
=
TEXT
(
'\0'
);
else
{
lpszTemp
[
lstrlen
(
lpszTemp
)
-
2
]
=
TEXT
(
'\0'
);
//remove cr and newline character
_stprintf
(
lpszBuf
,
TEXT
(
"%s (0x%x)"
),
lpszTemp
,
GetLastError
()
);
}
if
(
lpszTemp
)
LocalFree
((
HLOCAL
)
lpszTemp
);
return
lpszBuf
;
}
//-------------------------------------------------
// this event is signalled when the
// service should end
//-------------------------------------------------
HANDLE
hServerStopEvent
=
NULL
;
//-------------------------------------------------
// FUNCTION: ServiceStart
//
// PURPOSE: Actual code of the service
// that does the work.
//-------------------------------------------------
void
ServiceStart
(
DWORD
dwArgc
,
LPTSTR
*
lpszArgv
)
{
DWORD
dwWait
,
dwTimeout
=
1000
*
60
*
1
;
if
(
!
ReportStatusToSCMgr
(
SERVICE_START_PENDING
,
// service state
NO_ERROR
,
// exit code
3000
))
// wait hint
goto
cleanup
;
// create the event object. The control handler function signals
// this event when it receives the "stop" control code.
//
hServerStopEvent
=
CreateEvent
(
NULL
,
// no security attributes
TRUE
,
// manual reset event
FALSE
,
// not-signalled
NULL
);
// no name
if
(
hServerStopEvent
==
NULL
)
goto
cleanup
;
// report the status to the service control manager.
//
if
(
!
ReportStatusToSCMgr
(
SERVICE_START_PENDING
,
// service state
NO_ERROR
,
// exit code
3000
))
// wait hint
goto
cleanup
;
// report the status to the service control manager.
//
if
(
!
ReportStatusToSCMgr
(
SERVICE_START_PENDING
,
// service state
NO_ERROR
,
// exit code
3000
))
// wait hint
goto
cleanup
;
// report the status to the service control manager.
//
if
(
!
ReportStatusToSCMgr
(
SERVICE_RUNNING
,
// service state
NO_ERROR
,
// exit code
0
))
// wait hint
goto
cleanup
;
//
// End of initialization
// Service is now running, perform work until shutdown
//
while
(
1
)
{
dwWait
=
WaitForSingleObject
(
hServerStopEvent
,
dwTimeout
);
if
(
dwWait
==
WAIT_FAILED
)
{
AddToMessageLog
(
TEXT
(
"Error in WaitForSingleObject"
));
break
;
}
else
if
(
dwWait
==
WAIT_TIMEOUT
)
{
CmdRestartService
(
"MySql"
);
}
else
{
break
;
//shutdown
}
}
cleanup:
if
(
hServerStopEvent
)
CloseHandle
(
hServerStopEvent
);
}
//-------------------------------------------------
// FUNCTION: ServiceStop
//
// PURPOSE: Stops the service
//-------------------------------------------------
void
ServiceStop
()
{
if
(
hServerStopEvent
)
SetEvent
(
hServerStopEvent
);
}
//-the end ----------------------------------------
VC++Files/thr_test/thr_test.c
View file @
fa823857
/* Testing of thread creation to find memory allocation bug
** This is coded to use as few extern functions as possible!
**
** The program must be compiled to be multithreaded !
**
** The problem is that when this program is run it will allocate more and more
** memory, so there is a memory leak in the thread handling. The problem is how
** to avoid is !
**
** It looks like the bug is that the std library doesn't free thread
** specific variables if one uses a thread variable.
** If one compiles this program with -DREMOVE_BUG
** there is no memory leaks anymore!
**
** This program is tested with Microsofts VC++ 5.0, but BC5.2 is also
** reported to have this bug.
*/
#include <windows.h>
#include <process.h>
#include <stdio.h>
#define TEST_COUNT 100000
/*****************************************************************************
** The following is to emulate the posix thread interface
*****************************************************************************/
typedef
HANDLE
pthread_t
;
typedef
struct
thread_attr
{
DWORD
dwStackSize
;
DWORD
dwCreatingFlag
;
int
priority
;
}
pthread_attr_t
;
typedef
struct
{
int
dummy
;
}
pthread_condattr_t
;
typedef
struct
{
unsigned
int
msg
;
pthread_t
thread
;
DWORD
thread_id
;
}
pthread_cond_t
;
typedef
CRITICAL_SECTION
pthread_mutex_t
;
#define pthread_mutex_init(A,B) InitializeCriticalSection(A)
#define pthread_mutex_lock(A) (EnterCriticalSection(A),0)
#define pthread_mutex_unlock(A) LeaveCriticalSection(A)
#define pthread_mutex_destroy(A) DeleteCriticalSection(A)
#define pthread_handler_decl(A,B) unsigned __cdecl A(void *B)
typedef
unsigned
(
__cdecl
*
pthread_handler
)(
void
*
);
#define pthread_self() GetCurrentThread()
static
unsigned
int
thread_count
;
static
pthread_cond_t
COND_thread_count
;
static
pthread_mutex_t
LOCK_thread_count
;
pthread_mutex_t
THR_LOCK_malloc
,
THR_LOCK_open
,
THR_LOCK_keycache
,
THR_LOCK_lock
,
THR_LOCK_isam
;
/*
** We have tried to use '_beginthreadex' instead of '_beginthread' here
** but in this case the program leaks about 512 characters for each
** created thread !
*/
int
pthread_create
(
pthread_t
*
thread_id
,
pthread_attr_t
*
attr
,
pthread_handler
func
,
void
*
param
)
{
HANDLE
hThread
;
hThread
=
(
HANDLE
)
_beginthread
(
func
,
attr
->
dwStackSize
?
attr
->
dwStackSize
:
65535
,
param
);
if
((
long
)
hThread
==
-
1L
)
{
return
(
errno
?
errno
:
-
1
);
}
*
thread_id
=
hThread
;
return
(
0
);
}
void
pthread_exit
(
unsigned
A
)
{
_endthread
();
}
/*
** The following simple implementation of conds works as long as
** only one thread uses pthread_cond_wait at a time.
** This is coded very carefully to work with thr_lock.
*/
static
unsigned
int
WIN32_WAIT_SIGNAL
=
30000
;
/* Start message to use */
int
pthread_cond_init
(
pthread_cond_t
*
cond
,
const
pthread_condattr_t
*
attr
)
{
cond
->
msg
=
WIN32_WAIT_SIGNAL
++
;
cond
->
thread
=
(
pthread_t
)
pthread_self
();
/* For global conds */
//IRENA
cond
->
thread_id
=
GetCurrentThreadId
();
return
0
;
}
int
pthread_cond_wait
(
pthread_cond_t
*
cond
,
pthread_mutex_t
*
mutex
)
{
MSG
msg
;
unsigned
int
msgCode
=
cond
->
msg
;
cond
->
thread
=
(
pthread_t
)
pthread_self
();
//IRENA
//??? cond->thread_id=GetCurrentThreadId();
//VOID(ReleaseMutex(*mutex));
LeaveCriticalSection
(
mutex
);
do
{
WaitMessage
()
;
if
(
!
PeekMessage
(
&
msg
,
NULL
,
1
,
65534
,
PM_REMOVE
))
{
return
errno
=
GetLastError
()
;
}
}
while
(
msg
.
message
!=
msgCode
)
;
EnterCriticalSection
(
mutex
);
return
0
;
}
int
pthread_cond_signal
(
pthread_cond_t
*
cond
)
{
if
(
!
PostThreadMessage
(
cond
->
thread_id
,
cond
->
msg
,
0
,
0
))
{
return
errno
=
GetLastError
()
;
}
return
0
;
}
int
pthread_attr_init
(
pthread_attr_t
*
connect_att
)
{
connect_att
->
dwStackSize
=
0
;
connect_att
->
dwCreatingFlag
=
0
;
connect_att
->
priority
=
0
;
return
0
;
}
int
pthread_attr_setstacksize
(
pthread_attr_t
*
connect_att
,
DWORD
stack
)
{
connect_att
->
dwStackSize
=
stack
;
return
0
;
}
int
pthread_attr_setprio
(
pthread_attr_t
*
connect_att
,
int
priority
)
{
connect_att
->
priority
=
priority
;
return
0
;
}
int
pthread_attr_destroy
(
pthread_attr_t
*
connect_att
)
{
return
0
;
}
/* from my_pthread.c */
#ifndef REMOVE_BUG
__declspec
(
thread
)
int
THR_KEY_my_errno
;
int
_my_errno
(
void
)
{
return
THR_KEY_my_errno
;
}
#endif
/*****************************************************************************
** The test program
*****************************************************************************/
pthread_handler_decl
(
test_thread
,
arg
)
{
pthread_mutex_lock
(
&
LOCK_thread_count
);
thread_count
--
;
pthread_cond_signal
(
&
COND_thread_count
);
/* Tell main we are ready */
pthread_mutex_unlock
(
&
LOCK_thread_count
);
pthread_exit
(
0
);
return
0
;
}
int
main
(
int
argc
,
char
**
argv
)
{
pthread_t
tid
;
pthread_attr_t
thr_attr
;
int
i
,
error
;
if
((
error
=
pthread_cond_init
(
&
COND_thread_count
,
NULL
)))
{
fprintf
(
stderr
,
"Got error: %d from pthread_cond_init (errno: %d)"
,
error
,
errno
);
exit
(
1
);
}
pthread_mutex_init
(
&
LOCK_thread_count
,
NULL
);
if
((
error
=
pthread_attr_init
(
&
thr_attr
)))
{
fprintf
(
stderr
,
"Got error: %d from pthread_attr_init (errno: %d)"
,
error
,
errno
);
exit
(
1
);
}
if
((
error
=
pthread_attr_setstacksize
(
&
thr_attr
,
65536L
)))
{
fprintf
(
stderr
,
"Got error: %d from pthread_attr_setstacksize (errno: %d)"
,
error
,
errno
);
exit
(
1
);
}
printf
(
"Init ok. Creating %d threads
\n
"
,
TEST_COUNT
);
for
(
i
=
1
;
i
<=
TEST_COUNT
;
i
++
)
{
int
*
param
=
&
i
;
if
((
i
%
100
)
==
0
)
{
printf
(
"%8d"
,
i
);
fflush
(
stdout
);
}
if
((
error
=
pthread_mutex_lock
(
&
LOCK_thread_count
)))
{
fprintf
(
stderr
,
"
\n
Got error: %d from pthread_mutex_lock (errno: %d)"
,
error
,
errno
);
exit
(
1
);
}
if
((
error
=
pthread_create
(
&
tid
,
&
thr_attr
,
test_thread
,(
void
*
)
param
)))
{
fprintf
(
stderr
,
"
\n
Got error: %d from pthread_create (errno: %d)
\n
"
,
error
,
errno
);
pthread_mutex_unlock
(
&
LOCK_thread_count
);
exit
(
1
);
}
thread_count
++
;
pthread_mutex_unlock
(
&
LOCK_thread_count
);
if
((
error
=
pthread_mutex_lock
(
&
LOCK_thread_count
)))
fprintf
(
stderr
,
"
\n
Got error: %d from pthread_mutex_lock
\n
"
,
error
);
while
(
thread_count
)
{
if
((
error
=
pthread_cond_wait
(
&
COND_thread_count
,
&
LOCK_thread_count
)))
fprintf
(
stderr
,
"
\n
Got error: %d from pthread_cond_wait
\n
"
,
error
);
}
pthread_mutex_unlock
(
&
LOCK_thread_count
);
}
pthread_attr_destroy
(
&
thr_attr
);
printf
(
"
\n
end
\n
"
);
return
0
;
}
/* Testing of thread creation to find memory allocation bug
** This is coded to use as few extern functions as possible!
**
** The program must be compiled to be multithreaded !
**
** The problem is that when this program is run it will allocate more and more
** memory, so there is a memory leak in the thread handling. The problem is how
** to avoid is !
**
** It looks like the bug is that the std library doesn't free thread
** specific variables if one uses a thread variable.
** If one compiles this program with -DREMOVE_BUG
** there is no memory leaks anymore!
**
** This program is tested with Microsofts VC++ 5.0, but BC5.2 is also
** reported to have this bug.
*/
#include <windows.h>
#include <process.h>
#include <stdio.h>
#define TEST_COUNT 100000
/*****************************************************************************
** The following is to emulate the posix thread interface
*****************************************************************************/
typedef
HANDLE
pthread_t
;
typedef
struct
thread_attr
{
DWORD
dwStackSize
;
DWORD
dwCreatingFlag
;
int
priority
;
}
pthread_attr_t
;
typedef
struct
{
int
dummy
;
}
pthread_condattr_t
;
typedef
struct
{
unsigned
int
msg
;
pthread_t
thread
;
DWORD
thread_id
;
}
pthread_cond_t
;
typedef
CRITICAL_SECTION
pthread_mutex_t
;
#define pthread_mutex_init(A,B) InitializeCriticalSection(A)
#define pthread_mutex_lock(A) (EnterCriticalSection(A),0)
#define pthread_mutex_unlock(A) LeaveCriticalSection(A)
#define pthread_mutex_destroy(A) DeleteCriticalSection(A)
#define pthread_handler_decl(A,B) unsigned __cdecl A(void *B)
typedef
unsigned
(
__cdecl
*
pthread_handler
)(
void
*
);
#define pthread_self() GetCurrentThread()
static
unsigned
int
thread_count
;
static
pthread_cond_t
COND_thread_count
;
static
pthread_mutex_t
LOCK_thread_count
;
pthread_mutex_t
THR_LOCK_malloc
,
THR_LOCK_open
,
THR_LOCK_keycache
,
THR_LOCK_lock
,
THR_LOCK_isam
;
/*
** We have tried to use '_beginthreadex' instead of '_beginthread' here
** but in this case the program leaks about 512 characters for each
** created thread !
*/
int
pthread_create
(
pthread_t
*
thread_id
,
pthread_attr_t
*
attr
,
pthread_handler
func
,
void
*
param
)
{
HANDLE
hThread
;
hThread
=
(
HANDLE
)
_beginthread
(
func
,
attr
->
dwStackSize
?
attr
->
dwStackSize
:
65535
,
param
);
if
((
long
)
hThread
==
-
1L
)
{
return
(
errno
?
errno
:
-
1
);
}
*
thread_id
=
hThread
;
return
(
0
);
}
void
pthread_exit
(
unsigned
A
)
{
_endthread
();
}
/*
** The following simple implementation of conds works as long as
** only one thread uses pthread_cond_wait at a time.
** This is coded very carefully to work with thr_lock.
*/
static
unsigned
int
WIN32_WAIT_SIGNAL
=
30000
;
/* Start message to use */
int
pthread_cond_init
(
pthread_cond_t
*
cond
,
const
pthread_condattr_t
*
attr
)
{
cond
->
msg
=
WIN32_WAIT_SIGNAL
++
;
cond
->
thread
=
(
pthread_t
)
pthread_self
();
/* For global conds */
//IRENA
cond
->
thread_id
=
GetCurrentThreadId
();
return
0
;
}
int
pthread_cond_wait
(
pthread_cond_t
*
cond
,
pthread_mutex_t
*
mutex
)
{
MSG
msg
;
unsigned
int
msgCode
=
cond
->
msg
;
cond
->
thread
=
(
pthread_t
)
pthread_self
();
//IRENA
//??? cond->thread_id=GetCurrentThreadId();
//VOID(ReleaseMutex(*mutex));
LeaveCriticalSection
(
mutex
);
do
{
WaitMessage
()
;
if
(
!
PeekMessage
(
&
msg
,
NULL
,
1
,
65534
,
PM_REMOVE
))
{
return
errno
=
GetLastError
()
;
}
}
while
(
msg
.
message
!=
msgCode
)
;
EnterCriticalSection
(
mutex
);
return
0
;
}
int
pthread_cond_signal
(
pthread_cond_t
*
cond
)
{
if
(
!
PostThreadMessage
(
cond
->
thread_id
,
cond
->
msg
,
0
,
0
))
{
return
errno
=
GetLastError
()
;
}
return
0
;
}
int
pthread_attr_init
(
pthread_attr_t
*
connect_att
)
{
connect_att
->
dwStackSize
=
0
;
connect_att
->
dwCreatingFlag
=
0
;
connect_att
->
priority
=
0
;
return
0
;
}
int
pthread_attr_setstacksize
(
pthread_attr_t
*
connect_att
,
DWORD
stack
)
{
connect_att
->
dwStackSize
=
stack
;
return
0
;
}
int
pthread_attr_setprio
(
pthread_attr_t
*
connect_att
,
int
priority
)
{
connect_att
->
priority
=
priority
;
return
0
;
}
int
pthread_attr_destroy
(
pthread_attr_t
*
connect_att
)
{
return
0
;
}
/* from my_pthread.c */
#ifndef REMOVE_BUG
__declspec
(
thread
)
int
THR_KEY_my_errno
;
int
_my_errno
(
void
)
{
return
THR_KEY_my_errno
;
}
#endif
/*****************************************************************************
** The test program
*****************************************************************************/
pthread_handler_decl
(
test_thread
,
arg
)
{
pthread_mutex_lock
(
&
LOCK_thread_count
);
thread_count
--
;
pthread_cond_signal
(
&
COND_thread_count
);
/* Tell main we are ready */
pthread_mutex_unlock
(
&
LOCK_thread_count
);
pthread_exit
(
0
);
return
0
;
}
int
main
(
int
argc
,
char
**
argv
)
{
pthread_t
tid
;
pthread_attr_t
thr_attr
;
int
i
,
error
;
if
((
error
=
pthread_cond_init
(
&
COND_thread_count
,
NULL
)))
{
fprintf
(
stderr
,
"Got error: %d from pthread_cond_init (errno: %d)"
,
error
,
errno
);
exit
(
1
);
}
pthread_mutex_init
(
&
LOCK_thread_count
,
NULL
);
if
((
error
=
pthread_attr_init
(
&
thr_attr
)))
{
fprintf
(
stderr
,
"Got error: %d from pthread_attr_init (errno: %d)"
,
error
,
errno
);
exit
(
1
);
}
if
((
error
=
pthread_attr_setstacksize
(
&
thr_attr
,
65536L
)))
{
fprintf
(
stderr
,
"Got error: %d from pthread_attr_setstacksize (errno: %d)"
,
error
,
errno
);
exit
(
1
);
}
printf
(
"Init ok. Creating %d threads
\n
"
,
TEST_COUNT
);
for
(
i
=
1
;
i
<=
TEST_COUNT
;
i
++
)
{
int
*
param
=
&
i
;
if
((
i
%
100
)
==
0
)
{
printf
(
"%8d"
,
i
);
fflush
(
stdout
);
}
if
((
error
=
pthread_mutex_lock
(
&
LOCK_thread_count
)))
{
fprintf
(
stderr
,
"
\n
Got error: %d from pthread_mutex_lock (errno: %d)"
,
error
,
errno
);
exit
(
1
);
}
if
((
error
=
pthread_create
(
&
tid
,
&
thr_attr
,
test_thread
,(
void
*
)
param
)))
{
fprintf
(
stderr
,
"
\n
Got error: %d from pthread_create (errno: %d)
\n
"
,
error
,
errno
);
pthread_mutex_unlock
(
&
LOCK_thread_count
);
exit
(
1
);
}
thread_count
++
;
pthread_mutex_unlock
(
&
LOCK_thread_count
);
if
((
error
=
pthread_mutex_lock
(
&
LOCK_thread_count
)))
fprintf
(
stderr
,
"
\n
Got error: %d from pthread_mutex_lock
\n
"
,
error
);
while
(
thread_count
)
{
if
((
error
=
pthread_cond_wait
(
&
COND_thread_count
,
&
LOCK_thread_count
)))
fprintf
(
stderr
,
"
\n
Got error: %d from pthread_cond_wait
\n
"
,
error
);
}
pthread_mutex_unlock
(
&
LOCK_thread_count
);
}
pthread_attr_destroy
(
&
thr_attr
);
printf
(
"
\n
end
\n
"
);
return
0
;
}
extra/resolveip.c
View file @
fa823857
...
...
@@ -37,12 +37,10 @@ extern int h_errno;
#endif
#ifndef HAVE_IN_ADDR_T
#define in_addr_t u
_
long
#define in_addr_t ulong
#endif
static
my_bool
silent
;
static
struct
my_option
my_long_options
[]
=
{
{
"help"
,
'?'
,
"Displays this help and exits."
,
...
...
mytest-old.c
0 → 100644
View file @
fa823857
/*C4*/
/****************************************************************/
/* Author: Jethro Wright, III TS : 3/ 4/1998 9:15 */
/* Date: 02/18/1998 */
/* mytest.c : do some testing of the libmySQL.DLL.... */
/* */
/* History: */
/* 02/18/1998 jw3 also sprach zarathustra.... */
/****************************************************************/
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <mysql.h>
#define DEFALT_SQL_STMT "SELECT * FROM db"
#ifndef offsetof
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
/********************************************************
**
** main :-
**
********************************************************/
int
main
(
int
argc
,
char
*
argv
[]
)
{
char
szSQL
[
200
],
aszFlds
[
25
][
25
],
*
pszT
,
szDB
[
50
]
;
int
i
,
j
,
k
,
l
,
x
;
MYSQL
*
myData
;
MYSQL_RES
*
res
;
MYSQL_FIELD
*
fd
;
MYSQL_ROW
row
;
//....just curious....
printf
(
"sizeof( MYSQL ) == %d
\n
"
,
sizeof
(
MYSQL
)
)
;
if
(
argc
==
2
)
{
strcpy
(
szDB
,
argv
[
1
]
)
;
strcpy
(
szSQL
,
DEFALT_SQL_STMT
)
;
if
(
!
strcmp
(
szDB
,
"--debug"
))
{
strcpy
(
szDB
,
"mysql"
)
;
printf
(
"Some mysql struct information (size and offset):
\n
"
);
printf
(
"net:
\t
%3d %3d
\n
"
,
sizeof
(
myData
->
net
),
offsetof
(
MYSQL
,
net
));
printf
(
"host:
\t
%3d %3d
\n
"
,
sizeof
(
myData
->
host
),
offsetof
(
MYSQL
,
host
));
printf
(
"port:
\t
%3d %3d
\n
"
,
sizeof
(
myData
->
port
),
offsetof
(
MYSQL
,
port
));
printf
(
"protocol_version:
\t
%3d %3d
\n
"
,
sizeof
(
myData
->
protocol_version
),
offsetof
(
MYSQL
,
protocol_version
));
printf
(
"thread_id:
\t
%3d %3d
\n
"
,
sizeof
(
myData
->
thread_id
),
offsetof
(
MYSQL
,
thread_id
));
printf
(
"affected_rows:
\t
%3d %3d
\n
"
,
sizeof
(
myData
->
affected_rows
),
offsetof
(
MYSQL
,
affected_rows
));
printf
(
"packet_length:
\t
%3d %3d
\n
"
,
sizeof
(
myData
->
packet_length
),
offsetof
(
MYSQL
,
packet_length
));
printf
(
"status:
\t
%3d %3d
\n
"
,
sizeof
(
myData
->
status
),
offsetof
(
MYSQL
,
status
));
printf
(
"fields:
\t
%3d %3d
\n
"
,
sizeof
(
myData
->
fields
),
offsetof
(
MYSQL
,
fields
));
printf
(
"field_alloc:
\t
%3d %3d
\n
"
,
sizeof
(
myData
->
field_alloc
),
offsetof
(
MYSQL
,
field_alloc
));
printf
(
"free_me:
\t
%3d %3d
\n
"
,
sizeof
(
myData
->
free_me
),
offsetof
(
MYSQL
,
free_me
));
printf
(
"options:
\t
%3d %3d
\n
"
,
sizeof
(
myData
->
options
),
offsetof
(
MYSQL
,
options
));
puts
(
""
);
}
}
else
if
(
argc
>
2
)
{
strcpy
(
szDB
,
argv
[
1
]
)
;
strcpy
(
szSQL
,
argv
[
2
]
)
;
}
else
{
strcpy
(
szDB
,
"mysql"
)
;
strcpy
(
szSQL
,
DEFALT_SQL_STMT
)
;
}
//....
if
(
(
myData
=
mysql_init
((
MYSQL
*
)
0
))
&&
mysql_real_connect
(
myData
,
NULL
,
NULL
,
NULL
,
NULL
,
MYSQL_PORT
,
NULL
,
0
)
)
{
if
(
mysql_select_db
(
myData
,
szDB
)
<
0
)
{
printf
(
"Can't select the %s database !
\n
"
,
szDB
)
;
mysql_close
(
myData
)
;
return
2
;
}
}
else
{
printf
(
"Can't connect to the mysql server on port %d !
\n
"
,
MYSQL_PORT
)
;
mysql_close
(
myData
)
;
return
1
;
}
//....
if
(
!
mysql_query
(
myData
,
szSQL
)
)
{
res
=
mysql_store_result
(
myData
)
;
i
=
(
int
)
mysql_num_rows
(
res
)
;
l
=
1
;
printf
(
"Query: %s
\n
Number of records found: %ld
\n
"
,
szSQL
,
i
)
;
//....we can get the field-specific characteristics here....
for
(
x
=
0
;
fd
=
mysql_fetch_field
(
res
)
;
x
++
)
strcpy
(
aszFlds
[
x
],
fd
->
name
)
;
//....
while
(
row
=
mysql_fetch_row
(
res
)
)
{
j
=
mysql_num_fields
(
res
)
;
printf
(
"Record #%ld:-
\n
"
,
l
++
)
;
for
(
k
=
0
;
k
<
j
;
k
++
)
printf
(
" Fld #%d (%s): %s
\n
"
,
k
+
1
,
aszFlds
[
k
],
(((
row
[
k
]
==
NULL
)
||
(
!
strlen
(
row
[
k
])))
?
"NULL"
:
row
[
k
]))
;
puts
(
"==============================
\n
"
)
;
}
mysql_free_result
(
res
)
;
}
else
printf
(
"Couldn't execute %s on the server !
\n
"
,
szSQL
)
;
//....
puts
(
"==== Diagnostic info ===="
)
;
pszT
=
mysql_get_client_info
()
;
printf
(
"Client info: %s
\n
"
,
pszT
)
;
//....
pszT
=
mysql_get_host_info
(
myData
)
;
printf
(
"Host info: %s
\n
"
,
pszT
)
;
//....
pszT
=
mysql_get_server_info
(
myData
)
;
printf
(
"Server info: %s
\n
"
,
pszT
)
;
//....
res
=
mysql_list_processes
(
myData
)
;
l
=
1
;
if
(
res
)
{
for
(
x
=
0
;
fd
=
mysql_fetch_field
(
res
)
;
x
++
)
strcpy
(
aszFlds
[
x
],
fd
->
name
)
;
while
(
row
=
mysql_fetch_row
(
res
)
)
{
j
=
mysql_num_fields
(
res
)
;
printf
(
"Process #%ld:-
\n
"
,
l
++
)
;
for
(
k
=
0
;
k
<
j
;
k
++
)
printf
(
" Fld #%d (%s): %s
\n
"
,
k
+
1
,
aszFlds
[
k
],
(((
row
[
k
]
==
NULL
)
||
(
!
strlen
(
row
[
k
])))
?
"NULL"
:
row
[
k
]))
;
puts
(
"==============================
\n
"
)
;
}
}
else
{
printf
(
"Got error %s when retreiving processlist
\n
"
,
mysql_error
(
myData
));
}
//....
res
=
mysql_list_tables
(
myData
,
"%"
)
;
l
=
1
;
for
(
x
=
0
;
fd
=
mysql_fetch_field
(
res
)
;
x
++
)
strcpy
(
aszFlds
[
x
],
fd
->
name
)
;
while
(
row
=
mysql_fetch_row
(
res
)
)
{
j
=
mysql_num_fields
(
res
)
;
printf
(
"Table #%ld:-
\n
"
,
l
++
)
;
for
(
k
=
0
;
k
<
j
;
k
++
)
printf
(
" Fld #%d (%s): %s
\n
"
,
k
+
1
,
aszFlds
[
k
],
(((
row
[
k
]
==
NULL
)
||
(
!
strlen
(
row
[
k
])))
?
"NULL"
:
row
[
k
]))
;
puts
(
"==============================
\n
"
)
;
}
//....
pszT
=
mysql_stat
(
myData
)
;
puts
(
pszT
)
;
//....
mysql_close
(
myData
)
;
return
0
;
}
scripts/Makefile.am
View file @
fa823857
...
...
@@ -17,7 +17,6 @@
## Process this file with automake to create Makefile.in
bin_SCRIPTS
=
@server_scripts@
\
make_win_src_distribution
\
msql2mysql
\
mysql_config
\
mysql_fix_privilege_tables
\
...
...
@@ -33,7 +32,8 @@ bin_SCRIPTS = @server_scripts@ \
mysqldumpslow
\
mysql_explain_log
\
mysql_tableinfo
\
mysqld_multi
mysqld_multi
\
make_win_src_distribution
EXTRA_SCRIPTS
=
make_binary_distribution.sh
\
make_win_src_distribution.sh
\
...
...
@@ -79,7 +79,8 @@ CLEANFILES = @server_scripts@ \
mysql_find_rows
\
mysqlhotcopy
\
mysqldumpslow
\
mysqld_multi
mysqld_multi
\
make_win_src_distribution
SUPERCLEANFILES
=
mysqlbug
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment