-
Notifications
You must be signed in to change notification settings - Fork 1
/
SystemD.xojo_code
167 lines (143 loc) · 4.64 KB
/
SystemD.xojo_code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#tag Module
Protected Module SystemD
#tag Method, Flags = &h1
Protected Sub Initialize()
SignalHandling.Initialize
send(states.Ready)
End Sub
#tag EndMethod
#tag Method, Flags = &h21
Private Function mSystemDIsAvailable() As Boolean
//int sd_watchdog_enabled(int unset_environment, uint64_t *usec);
#If TargetLinux
Soft Declare Function sd_watchdog_enabled Lib "libsystemd.so" (env As Integer, ByRef usec As UInt64) As Integer
If System.IsFunctionAvailable("sd_watchdog_enabled", "libsystemd.so") Then
Dim n As UInt64
Dim rv As Integer = sd_watchdog_enabled(0, n)
Return rv > 0
End If
#EndIf
Return False
End Function
#tag EndMethod
#tag Method, Flags = &h1, CompatibilityFlags = (TargetConsole and (Target32Bit or Target64Bit)) or (TargetWeb and (Target32Bit or Target64Bit))
Protected Sub Send(status as States)
Send(status, "1")
End Sub
#tag EndMethod
#tag Method, Flags = &h1, CompatibilityFlags = (TargetConsole and (Target32Bit or Target64Bit)) or (TargetWeb and (Target32Bit or Target64Bit))
Protected Sub Send(status as States, value as integer)
Send(status, str(value, "-0"))
End Sub
#tag EndMethod
#tag Method, Flags = &h1, CompatibilityFlags = (TargetConsole and (Target32Bit or Target64Bit)) or (TargetWeb and (Target32Bit or Target64Bit))
Protected Sub Send(status as States, statusmessage as string)
// int sd_notify(int unset_environment, const char *state);
#If TargetLinux And TargetConsole
If mSystemDIsAvailable Then
Soft Declare Sub sd_notify Lib "libsystemd.so" (env As Integer, state As CString)
If System.IsFunctionAvailable("sd_notify", "libsystemd.so") Then
Dim msg As String
If statusmessage = "" Then
statusmessage = "1"
End If
Select Case status
Case States.Ready
msg = "READY"
Case States.Stopping
msg = "STOPPING"
Case States.Status
msg = "STATUS"
Case States.MainPID
Soft Declare Function getpid Lib "libc" () As Integer
If System.IsFunctionAvailable("getpid", "libc") Then
msg = "MAINPID"
statusmessage = Str(getpid, "0")
End If
Case States.Watchdog
msg = "WATCHDOG"
// Check to see if watchdog is enabled
If System.IsFunctionAvailable("sd_watchdog_enabled", "libsystemd.so") Then
Soft Declare Function sd_watchdog_enabled Lib "libsystemd.so" (env As Integer, ByRef usec As UInt64) As Integer
Dim usec As UInt64
Dim sdEnabled As Integer = sd_watchdog_enabled(0, usec)
If sdEnabled < 1 Then
msg = ""
statusmessage = ""
End If
Else
stderr.WriteLine "watchdog is not enabled"
End If
End Select
If msg<>"" And statusmessage<>"" Then
sd_notify(0, msg + "=" + statusmessage)
stderr.WriteLine msg + "=" + statusmessage
End If
Else
stderr.WriteLine "sd_notify is unavailable"
End If
End If
#EndIf
End Sub
#tag EndMethod
#tag Method, Flags = &h1
Protected Sub SendWatchdog()
systemd.Send(systemd.States.Watchdog)
End Sub
#tag EndMethod
#tag Note, Name = README
1. Make your run loop include a check for SystemD.ShouldShutdown and do a clean exit if it returns true
2. Call SystemD.Initialize at the top of App.Run, once you are sure the app can run
3. Call SendWatchdog periodically to tell SystemD that your app is still running
#tag EndNote
#tag Enum, Name = States, Flags = &h1, Attributes = \""
Ready
Stopping
Status
MainPID
Watchdog
#tag EndEnum
#tag ViewBehavior
#tag ViewProperty
Name="Name"
Visible=true
Group="ID"
InitialValue=""
Type="String"
EditorType=""
#tag EndViewProperty
#tag ViewProperty
Name="Index"
Visible=true
Group="ID"
InitialValue="-2147483648"
Type="Integer"
EditorType=""
#tag EndViewProperty
#tag ViewProperty
Name="Super"
Visible=true
Group="ID"
InitialValue=""
Type="String"
EditorType=""
#tag EndViewProperty
#tag ViewProperty
Name="Left"
Visible=true
Group="Position"
InitialValue="0"
Type="Integer"
EditorType=""
#tag EndViewProperty
#tag ViewProperty
Name="Top"
Visible=true
Group="Position"
InitialValue="0"
Type="Integer"
EditorType=""
#tag EndViewProperty
#tag EndViewBehavior
End Module
#tag EndModule