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