2c84919087c60c143ad09d5ad4f4558535866397
[openafs.git] / src / WINNT / afsclass / c_svc.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <winsock2.h>
11 #include <ws2tcpip.h>
12
13 extern "C" {
14 #include <afsconfig.h>
15 #include <afs/param.h>
16 #include <afs/stds.h>
17 #include <roken.h>
18 }
19
20 #include <WINNT/afsclass.h>
21 #include "internal.h"
22
23
24 /*
25  * DEFINITIONS ________________________________________________________________
26  *
27  */
28
29
30 /*
31  * VARIABLES __________________________________________________________________
32  *
33  */
34
35
36 /*
37  * PROTOTYPES _________________________________________________________________
38  *
39  */
40
41
42 /*
43  * ROUTINES ___________________________________________________________________
44  *
45  */
46
47
48 SERVICE::SERVICE (LPSERVER lpServerParent, LPTSTR pszName)
49 {
50    m_lpiServer = lpServerParent->GetIdentifier();
51    m_lpiCell = m_lpiCell;
52    m_lpiThis = NULL;
53
54    lstrcpy (m_szName, pszName);
55
56    m_fStatusOutOfDate = TRUE;
57    memset (&m_ss, 0x00, sizeof(SERVICESTATUS));
58 }
59
60
61 SERVICE::~SERVICE (void)
62 {
63    if (m_lpiThis)
64       m_lpiThis->m_cRef --;
65 }
66
67
68 void SERVICE::SendDeleteNotifications (void)
69 {
70    NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
71 }
72
73
74 void SERVICE::Close (void)
75 {
76    AfsClass_Leave();
77 }
78
79
80 LPIDENT SERVICE::GetIdentifier (void)
81 {
82    if (m_lpiThis == NULL)
83       {
84       if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
85          m_lpiThis = New2 (IDENT,(this));
86       m_lpiThis->m_cRef ++;
87       }
88
89    return m_lpiThis;
90 }
91
92
93 void SERVICE::Invalidate (void)
94 {
95    if (!m_fStatusOutOfDate)
96       {
97       m_fStatusOutOfDate = TRUE;
98       NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier());
99       }
100 }
101
102
103 BOOL SERVICE::RefreshStatus (BOOL fNotify, ULONG *pStatus)
104 {
105    BOOL rc = TRUE;
106    DWORD status = 0;
107
108    if (m_fStatusOutOfDate)
109       {
110       m_fStatusOutOfDate = FALSE;
111
112       if (fNotify)
113          NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
114
115       LPSERVER lpServer;
116       if ((lpServer = OpenServer (&status)) == NULL)
117          rc = FALSE;
118       else
119          {
120          PVOID hCell;
121          PVOID hBOS;
122          if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL)
123             rc = FALSE;
124          else
125             {
126             SERVICESTATUS ss;
127             if (!lstrcmp (m_szName, TEXT("BOS")))
128                {
129                memset (&ss, 0x00, sizeof(SERVICESTATUS));
130                AfsClass_UnixTimeToSystemTime (&ss.timeLastStart, 0);
131                AfsClass_UnixTimeToSystemTime (&ss.timeLastStop, 0);
132                AfsClass_UnixTimeToSystemTime (&ss.timeLastFail, 0);
133                ss.nStarts = 1;
134                ss.dwErrLast = 0;
135                ss.dwSigLast = 0;
136                ss.type = SERVICETYPE_SIMPLE;
137                ss.state = SERVICESTATE_RUNNING;
138                }
139             else
140                {
141                WORKERPACKET wp;
142                wp.wpBosProcessInfoGet.hServer = hBOS;
143                wp.wpBosProcessInfoGet.pszService = m_szName;
144
145                if (!Worker_DoTask (wtaskBosProcessInfoGet, &wp, &status))
146                   rc = FALSE;
147                else
148                   {
149                   memcpy (&ss, &wp.wpBosProcessInfoGet.ss, sizeof(SERVICESTATUS));
150
151                   // Get the service's current state
152                   //
153                   wp.wpBosProcessExecutionStateGet.hServer = hBOS;
154                   wp.wpBosProcessExecutionStateGet.pszService = m_szName;
155                   wp.wpBosProcessExecutionStateGet.pszAuxStatus = ss.szAuxStatus;
156                   if (!Worker_DoTask (wtaskBosProcessExecutionStateGet, &wp, &status))
157                      ss.state = SERVICESTATE_STOPPED;
158                   else
159                      ss.state = wp.wpBosProcessExecutionStateGet.state;
160
161                   // Get the service's notifier
162                   //
163                   ss.szNotifier[0] = TEXT('\0');
164                   wp.wpBosProcessNotifierGet.hServer = hBOS;
165                   wp.wpBosProcessNotifierGet.pszService = m_szName;
166                   wp.wpBosProcessNotifierGet.pszNotifier = ss.szNotifier;;
167                   Worker_DoTask (wtaskBosProcessNotifierGet, &wp, &status);
168
169                   // Get the service's parameters
170                   //
171                   ss.szParams[0] = TEXT('\0');
172
173                   WORKERPACKET wpBegin;
174                   wpBegin.wpBosProcessParameterGetBegin.hServer = hBOS;
175                   wpBegin.wpBosProcessParameterGetBegin.pszService = m_szName;
176                   if (Worker_DoTask (wtaskBosProcessParameterGetBegin, &wpBegin, &status))
177                      {
178                      for (;;)
179                         {
180                         TCHAR szParam[ 256 ];
181                         WORKERPACKET wpNext;
182                         wpNext.wpBosProcessParameterGetNext.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum;
183                         wpNext.wpBosProcessParameterGetNext.pszParam = szParam;
184
185                         if (!Worker_DoTask (wtaskBosProcessParameterGetNext, &wpNext, &status))
186                            {
187                            if (status == ADMITERATORDONE)
188                               status = 0;
189                            else
190                               rc = FALSE;
191                            break;
192                            }
193
194                         if (ss.szParams[0] != TEXT('\0'))
195                            lstrcat (ss.szParams, TEXT(" "));
196                         lstrcat (ss.szParams, szParam);
197                         }
198
199                      WORKERPACKET wpDone;
200                      wpDone.wpBosProcessParameterGetDone.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum;
201                      Worker_DoTask (wtaskBosProcessParameterGetDone, &wpDone);
202                      }
203
204                   // Strip trailing CR/LF characters
205                   //
206                   size_t cch = lstrlen (ss.szAuxStatus);
207                   while (cch && (ss.szAuxStatus[ cch-1 ] == TEXT('\r') || ss.szAuxStatus[ cch-1 ] == TEXT('\n')))
208                      ss.szAuxStatus[ cch-- ] = TEXT('\0');
209
210                   cch = lstrlen (ss.szParams);
211                   while (cch && (ss.szParams[ cch-1 ] == TEXT('\r') || ss.szParams[ cch-1 ] == TEXT('\n')))
212                      ss.szParams[ cch-- ] = TEXT('\0');
213
214                   cch = lstrlen (ss.szNotifier);
215                   while (cch && (ss.szNotifier[ cch-1 ] == TEXT('\r') || ss.szNotifier[ cch-1 ] == TEXT('\n')))
216                      ss.szNotifier[ cch-- ] = TEXT('\0');
217                   }
218                }
219
220             if (rc)
221                {
222                memcpy (&m_ss, &ss, sizeof(SERVICESTATUS));
223                }
224
225             lpServer->CloseBosObject();
226             }
227
228          lpServer->Close();
229          }
230
231       if (fNotify)
232          NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
233       }
234
235    if (pStatus && !rc)
236       *pStatus = status;
237    return TRUE;
238 }
239
240
241 void SERVICE::GetName (LPTSTR pszName)
242 {
243    lstrcpy (pszName, m_szName);
244 }
245
246
247 LPCELL SERVICE::OpenCell (ULONG *pStatus)
248 {
249    return m_lpiCell->OpenCell (pStatus);
250 }
251
252
253 LPSERVER SERVICE::OpenServer (ULONG *pStatus)
254 {
255    return m_lpiServer->OpenServer (pStatus);
256 }
257
258
259
260 BOOL SERVICE::GetStatus (LPSERVICESTATUS lpss, BOOL fNotify, ULONG *pStatus)
261 {
262    if (!RefreshStatus (fNotify, pStatus))
263       return FALSE;
264
265    memcpy (lpss, &m_ss, sizeof(SERVICESTATUS));
266    return TRUE;
267 }
268
269
270 PVOID SERVICE::GetUserParam (void)
271 {
272    return GetIdentifier()->GetUserParam();
273 }
274
275
276 void SERVICE::SetUserParam (PVOID pUserNew)
277 {
278    GetIdentifier()->SetUserParam (pUserNew);
279 }
280