win32-service 2.2.0 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef70f0e8d16323dd531f4a6558b910121fa02ed62a432e5e82a70bfa19736805
4
- data.tar.gz: f1128b7daa3ec6d64cb374c554c291b222f37dd10079865f5be6ae930287c0bc
3
+ metadata.gz: 746b781ce8ab92f9ef2f38854781e593281687956b171bd4aa57054e02b68648
4
+ data.tar.gz: 55ac6d06feb8f47751ffee8edee887420001d4b11ba5e5cce16daae343c80e1b
5
5
  SHA512:
6
- metadata.gz: a9bb4ac05263a141d2a4fc1030e16b9d6df66af501917f3403fa082412055bd6c1118404e06b35531845bcbaa55ecd3f89e8677ec57c422b40c7cfa61d3a8e3d
7
- data.tar.gz: be2e0f6108dd0093e582659ef201d78266cbcaa428e08eac3624146695bdc46337edbb3b5823179f3f5c541b881bb0e3d95c64fe1ef92ef636f1521a72053ef7
6
+ metadata.gz: 3cd8d485dae8159f1d0d788baa22c30fb5b98ab71623ef935c7b27535c100e6fa4b33cc59aa9617c313c3d33a637ab1dc8034aac236f5231e0fb09d2487fa308
7
+ data.tar.gz: e8410fc1cd05028d99b6f3c1822e635e85e50eb3b08f48e291fb20cfa06ad1c98bce740fc25af51eea7aa1a18b990f78727be0eed7ddc648d4f4b3875ac5c6fa
data/lib/win32/daemon.rb CHANGED
@@ -1,7 +1,7 @@
1
- require_relative 'windows/constants'
2
- require_relative 'windows/structs'
3
- require_relative 'windows/functions'
4
- require_relative 'windows/version'
1
+ require_relative "windows/constants"
2
+ require_relative "windows/structs"
3
+ require_relative "windows/functions"
4
+ require_relative "windows/version"
5
5
 
6
6
  # The Win32 module serves as a namespace only.
7
7
  module Win32
@@ -18,8 +18,6 @@ module Win32
18
18
  # The version of this library
19
19
  VERSION = Win32::Service::VERSION
20
20
 
21
- private
22
-
23
21
  # Service is not running
24
22
  STOPPED = SERVICE_STOPPED
25
23
 
@@ -73,16 +71,16 @@ module Win32
73
71
  IDLE = 0
74
72
 
75
73
  # Wraps SetServiceStatus.
76
- SetTheServiceStatus = Proc.new do |dwCurrentState, dwWin32ExitCode,dwCheckPoint, dwWaitHint|
77
- ss = SERVICE_STATUS.new # Current status of the service.
74
+ SetTheServiceStatus = Proc.new do |dwCurrentState, dwWin32ExitCode, dwCheckPoint, dwWaitHint|
75
+ ss = SERVICE_STATUS.new # Current status of the service.
78
76
 
79
77
  # Disable control requests until the service is started.
80
78
  if dwCurrentState == SERVICE_START_PENDING
81
79
  ss[:dwControlsAccepted] = 0
82
80
  else
83
81
  ss[:dwControlsAccepted] =
84
- SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN|
85
- SERVICE_ACCEPT_PAUSE_CONTINUE|SERVICE_ACCEPT_PARAMCHANGE
82
+ SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN |
83
+ SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_PARAMCHANGE
86
84
  end
87
85
 
88
86
  # Initialize ss structure.
@@ -96,7 +94,7 @@ module Win32
96
94
  @@dwServiceState = dwCurrentState
97
95
 
98
96
  # Send status of the service to the Service Controller.
99
- if !SetServiceStatus(@@ssh, ss)
97
+ unless SetServiceStatus(@@ssh, ss)
100
98
  SetEvent(@@hStopEvent)
101
99
  end
102
100
  end
@@ -104,8 +102,8 @@ module Win32
104
102
  ERROR_CALL_NOT_IMPLEMENTED = 0x78
105
103
 
106
104
  # Handles control signals from the service control manager.
107
- Service_Ctrl_ex = Proc.new do |dwCtrlCode,dwEventType,lpEventData,lpContext|
108
- @@waiting_control_code = dwCtrlCode;
105
+ Service_Ctrl_ex = Proc.new do |dwCtrlCode, dwEventType, lpEventData, lpContext|
106
+ @@waiting_control_code = dwCtrlCode
109
107
  return_value = NO_ERROR
110
108
 
111
109
  begin
@@ -120,8 +118,8 @@ module Win32
120
118
  dwState = SERVICE_PAUSED
121
119
  when SERVICE_CONTROL_CONTINUE
122
120
  dwState = SERVICE_RUNNING
123
- #else
124
- # TODO: Handle other control codes? Retain the current state?
121
+ # else
122
+ # TODO: Handle other control codes? Retain the current state?
125
123
  end
126
124
 
127
125
  # Set the status of the service except on interrogation.
@@ -143,18 +141,18 @@ module Win32
143
141
  end
144
142
 
145
143
  # Called by the service control manager after the call to StartServiceCtrlDispatcher.
146
- Service_Main = FFI::Function.new(:void, [:ulong, :pointer], :blocking => false) do |dwArgc,lpszArgv|
144
+ Service_Main = FFI::Function.new(:void, %i{ulong pointer}, blocking: false) do |dwArgc, lpszArgv|
147
145
  begin
148
146
  # Obtain the name of the service.
149
- if lpszArgv.address!=0
150
- argv = lpszArgv.get_array_of_string(0,dwArgc)
147
+ if lpszArgv.address != 0
148
+ argv = lpszArgv.get_array_of_string(0, dwArgc)
151
149
  lpszServiceName = argv[0]
152
150
  else
153
- lpszServiceName = ''
151
+ lpszServiceName = ""
154
152
  end
155
153
 
156
154
  # Args passed to Service.start
157
- if(dwArgc > 1)
155
+ if dwArgc > 1
158
156
  @@Argv = argv[1..-1]
159
157
  else
160
158
  @@Argv = nil
@@ -176,11 +174,11 @@ module Win32
176
174
  SetEvent(@@hStartEvent)
177
175
 
178
176
  # Main loop for the service.
179
- while(WaitForSingleObject(@@hStopEvent, 1000) != WAIT_OBJECT_0) do
177
+ while WaitForSingleObject(@@hStopEvent, 1000) != WAIT_OBJECT_0
180
178
  end
181
179
 
182
180
  # Main loop for the service.
183
- while(WaitForSingleObject(@@hStopCompletedEvent, 1000) != WAIT_OBJECT_0) do
181
+ while WaitForSingleObject(@@hStopCompletedEvent, 1000) != WAIT_OBJECT_0
184
182
  end
185
183
  ensure
186
184
  # Stop the service.
@@ -188,11 +186,11 @@ module Win32
188
186
  end
189
187
  end
190
188
 
191
- ThreadProc = FFI::Function.new(:ulong,[:pointer]) do |lpParameter|
189
+ ThreadProc = FFI::Function.new(:ulong, [:pointer]) do |lpParameter|
192
190
  ste = FFI::MemoryPointer.new(SERVICE_TABLE_ENTRY, 2)
193
191
 
194
192
  s = SERVICE_TABLE_ENTRY.new(ste[0])
195
- s[:lpServiceName] = FFI::MemoryPointer.from_string('')
193
+ s[:lpServiceName] = FFI::MemoryPointer.from_string("")
196
194
  s[:lpServiceProc] = lpParameter
197
195
 
198
196
  s = SERVICE_TABLE_ENTRY.new(ste[1])
@@ -200,19 +198,17 @@ module Win32
200
198
  s[:lpServiceProc] = nil
201
199
 
202
200
  # No service to step, no service handle, no ruby exceptions, just terminate the thread..
203
- if !StartServiceCtrlDispatcher(ste)
201
+ unless StartServiceCtrlDispatcher(ste)
204
202
  return 1
205
203
  end
206
204
 
207
205
  return 0
208
206
  end
209
207
 
210
- public
211
-
212
208
  # This is a shortcut for Daemon.new + Daemon#mainloop.
213
209
  #
214
210
  def self.mainloop
215
- self.new.mainloop
211
+ new.mainloop
216
212
  end
217
213
 
218
214
  # This is the method that actually puts your code into a loop and allows it
@@ -225,9 +221,9 @@ module Win32
225
221
 
226
222
  # Redirect STDIN, STDOUT and STDERR to the NUL device if they're still
227
223
  # associated with a tty. This helps newbs avoid Errno::EBADF errors.
228
- STDIN.reopen('NUL') if STDIN.isatty
229
- STDOUT.reopen('NUL') if STDOUT.isatty
230
- STDERR.reopen('NUL') if STDERR.isatty
224
+ STDIN.reopen("NUL") if STDIN.isatty
225
+ STDOUT.reopen("NUL") if STDOUT.isatty
226
+ STDERR.reopen("NUL") if STDERR.isatty
231
227
 
232
228
  # Calling init here so that init failures never even tries to start the
233
229
  # service. Of course that means that init methods must be very quick
@@ -235,44 +231,44 @@ module Win32
235
231
  # init's running.
236
232
  #
237
233
  # TODO: Fix?
238
- service_init() if respond_to?('service_init')
234
+ service_init if respond_to?("service_init")
239
235
 
240
236
  # Create the event to signal the service to start.
241
237
  @@hStartEvent = CreateEvent(nil, 1, 0, nil)
242
238
 
243
239
  if @@hStartEvent == 0
244
- raise SystemCallError.new('CreateEvent', FFI.errno)
240
+ raise SystemCallError.new("CreateEvent", FFI.errno)
245
241
  end
246
242
 
247
243
  # Create the event to signal the service to stop.
248
244
  @@hStopEvent = CreateEvent(nil, 1, 0, nil)
249
245
 
250
246
  if @@hStopEvent == 0
251
- raise SystemCallError.new('CreateEvent', FFI.errno)
247
+ raise SystemCallError.new("CreateEvent", FFI.errno)
252
248
  end
253
249
 
254
250
  # Create the event to signal the service that stop has completed
255
251
  @@hStopCompletedEvent = CreateEvent(nil, 1, 0, nil)
256
252
 
257
253
  if @@hStopCompletedEvent == 0
258
- raise SystemCallError.new('CreateEvent', FFI.errno)
254
+ raise SystemCallError.new("CreateEvent", FFI.errno)
259
255
  end
260
256
 
261
257
  hThread = CreateThread(nil, 0, ThreadProc, Service_Main, 0, nil)
262
258
 
263
259
  if hThread == 0
264
- raise SystemCallError.new('CreateThread', FFI.errno)
260
+ raise SystemCallError.new("CreateThread", FFI.errno)
265
261
  end
266
262
 
267
263
  events = FFI::MemoryPointer.new(:pointer, 2)
268
264
  events.put_pointer(0, FFI::Pointer.new(hThread))
269
265
  events.put_pointer(FFI::Pointer.size, FFI::Pointer.new(@@hStartEvent))
270
266
 
271
- while ((index = WaitForMultipleObjects(2, events, 0, 1000)) == WAIT_TIMEOUT) do
267
+ while (index = WaitForMultipleObjects(2, events, 0, 1000)) == WAIT_TIMEOUT
272
268
  end
273
269
 
274
270
  if index == WAIT_FAILED
275
- raise SystemCallError.new('WaitForMultipleObjects', FFI.errno)
271
+ raise SystemCallError.new("WaitForMultipleObjects", FFI.errno)
276
272
  end
277
273
 
278
274
  # The thread exited, so the show is off.
@@ -282,38 +278,46 @@ module Win32
282
278
 
283
279
  thr = Thread.new do
284
280
  begin
285
- while(WaitForSingleObject(@@hStopEvent, 1000) == WAIT_TIMEOUT)
281
+ while WaitForSingleObject(@@hStopEvent, 1000) == WAIT_TIMEOUT
286
282
  # Check to see if anything interesting has been signaled
287
283
  case @@waiting_control_code
288
284
  when SERVICE_CONTROL_PAUSE
289
- service_pause() if respond_to?('service_pause')
285
+ service_pause if respond_to?("service_pause")
290
286
  when SERVICE_CONTROL_CONTINUE
291
- service_resume() if respond_to?('service_resume')
287
+ service_resume if respond_to?("service_resume")
292
288
  when SERVICE_CONTROL_INTERROGATE
293
- service_interrogate() if respond_to?('service_interrogate')
289
+ service_interrogate if respond_to?("service_interrogate")
294
290
  when SERVICE_CONTROL_SHUTDOWN
295
- service_shutdown() if respond_to?('service_shutdown')
291
+ service_shutdown if respond_to?("service_shutdown")
296
292
  when SERVICE_CONTROL_PARAMCHANGE
297
- service_paramchange() if respond_to?('service_paramchange')
293
+ service_paramchange if respond_to?("service_paramchange")
298
294
  when SERVICE_CONTROL_NETBINDADD
299
- service_netbindadd() if respond_to?('service_netbindadd')
295
+ service_netbindadd if respond_to?("service_netbindadd")
300
296
  when SERVICE_CONTROL_NETBINDREMOVE
301
- service_netbindremove() if respond_to?('service_netbindremove')
297
+ service_netbindremove if respond_to?("service_netbindremove")
302
298
  when SERVICE_CONTROL_NETBINDENABLE
303
- service_netbindenable() if respond_to?('service_netbindenable')
299
+ service_netbindenable if respond_to?("service_netbindenable")
304
300
  when SERVICE_CONTROL_NETBINDDISABLE
305
- service_netbinddisable() if respond_to?('service_netbinddisable')
301
+ service_netbinddisable if respond_to?("service_netbinddisable")
306
302
  end
303
+
304
+ # handle user defined control codes
305
+ if @@waiting_control_code >= 128 && @@waiting_control_code <= 255
306
+ if respond_to?("service_user_defined_control")
307
+ service_user_defined_control(@@waiting_control_code)
308
+ end
309
+ end
310
+
307
311
  @@waiting_control_code = IDLE_CONTROL_CODE
308
312
  end
309
313
 
310
- service_stop() if respond_to?('service_stop')
314
+ service_stop if respond_to?("service_stop")
311
315
  ensure
312
316
  SetEvent(@@hStopCompletedEvent)
313
317
  end
314
318
  end
315
319
 
316
- if respond_to?('service_main')
320
+ if respond_to?("service_main")
317
321
  service_main(*@@Argv)
318
322
  end
319
323