LINUX: afs_create infinite fetchStatus loop
[pkg-k5-afs_openafs.git] / src / WINNT / afsclass / c_svc.cpp
bloba74ed20f2fa675538ba263972933b006354c3d7d
1 /*
2 * Copyright 2000, International Business Machines Corporation and others.
3 * All Rights Reserved.
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 */
10 #include <winsock2.h>
11 #include <ws2tcpip.h>
13 extern "C" {
14 #include <afsconfig.h>
15 #include <afs/param.h>
16 #include <roken.h>
19 #include <WINNT/afsclass.h>
20 #include "internal.h"
24 * DEFINITIONS ________________________________________________________________
30 * VARIABLES __________________________________________________________________
36 * PROTOTYPES _________________________________________________________________
42 * ROUTINES ___________________________________________________________________
47 SERVICE::SERVICE (LPSERVER lpServerParent, LPTSTR pszName)
49 m_lpiServer = lpServerParent->GetIdentifier();
50 m_lpiCell = m_lpiCell;
51 m_lpiThis = NULL;
53 lstrcpy (m_szName, pszName);
55 m_fStatusOutOfDate = TRUE;
56 memset (&m_ss, 0x00, sizeof(SERVICESTATUS));
60 SERVICE::~SERVICE (void)
62 if (m_lpiThis)
63 m_lpiThis->m_cRef --;
67 void SERVICE::SendDeleteNotifications (void)
69 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
73 void SERVICE::Close (void)
75 AfsClass_Leave();
79 LPIDENT SERVICE::GetIdentifier (void)
81 if (m_lpiThis == NULL)
83 if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
84 m_lpiThis = New2 (IDENT,(this));
85 m_lpiThis->m_cRef ++;
88 return m_lpiThis;
92 void SERVICE::Invalidate (void)
94 if (!m_fStatusOutOfDate)
96 m_fStatusOutOfDate = TRUE;
97 NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier());
102 BOOL SERVICE::RefreshStatus (BOOL fNotify, ULONG *pStatus)
104 BOOL rc = TRUE;
105 DWORD status = 0;
107 if (m_fStatusOutOfDate)
109 m_fStatusOutOfDate = FALSE;
111 if (fNotify)
112 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
114 LPSERVER lpServer;
115 if ((lpServer = OpenServer (&status)) == NULL)
116 rc = FALSE;
117 else
119 PVOID hCell;
120 PVOID hBOS;
121 if ((hBOS = lpServer->OpenBosObject (&hCell, &status)) == NULL)
122 rc = FALSE;
123 else
125 SERVICESTATUS ss;
126 if (!lstrcmp (m_szName, TEXT("BOS")))
128 memset (&ss, 0x00, sizeof(SERVICESTATUS));
129 AfsClass_UnixTimeToSystemTime (&ss.timeLastStart, 0);
130 AfsClass_UnixTimeToSystemTime (&ss.timeLastStop, 0);
131 AfsClass_UnixTimeToSystemTime (&ss.timeLastFail, 0);
132 ss.nStarts = 1;
133 ss.dwErrLast = 0;
134 ss.dwSigLast = 0;
135 ss.type = SERVICETYPE_SIMPLE;
136 ss.state = SERVICESTATE_RUNNING;
138 else
140 WORKERPACKET wp;
141 wp.wpBosProcessInfoGet.hServer = hBOS;
142 wp.wpBosProcessInfoGet.pszService = m_szName;
144 if (!Worker_DoTask (wtaskBosProcessInfoGet, &wp, &status))
145 rc = FALSE;
146 else
148 memcpy (&ss, &wp.wpBosProcessInfoGet.ss, sizeof(SERVICESTATUS));
150 // Get the service's current state
152 wp.wpBosProcessExecutionStateGet.hServer = hBOS;
153 wp.wpBosProcessExecutionStateGet.pszService = m_szName;
154 wp.wpBosProcessExecutionStateGet.pszAuxStatus = ss.szAuxStatus;
155 if (!Worker_DoTask (wtaskBosProcessExecutionStateGet, &wp, &status))
156 ss.state = SERVICESTATE_STOPPED;
157 else
158 ss.state = wp.wpBosProcessExecutionStateGet.state;
160 // Get the service's notifier
162 ss.szNotifier[0] = TEXT('\0');
163 wp.wpBosProcessNotifierGet.hServer = hBOS;
164 wp.wpBosProcessNotifierGet.pszService = m_szName;
165 wp.wpBosProcessNotifierGet.pszNotifier = ss.szNotifier;;
166 Worker_DoTask (wtaskBosProcessNotifierGet, &wp, &status);
168 // Get the service's parameters
170 ss.szParams[0] = TEXT('\0');
172 WORKERPACKET wpBegin;
173 wpBegin.wpBosProcessParameterGetBegin.hServer = hBOS;
174 wpBegin.wpBosProcessParameterGetBegin.pszService = m_szName;
175 if (Worker_DoTask (wtaskBosProcessParameterGetBegin, &wpBegin, &status))
177 for (;;)
179 TCHAR szParam[ 256 ];
180 WORKERPACKET wpNext;
181 wpNext.wpBosProcessParameterGetNext.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum;
182 wpNext.wpBosProcessParameterGetNext.pszParam = szParam;
184 if (!Worker_DoTask (wtaskBosProcessParameterGetNext, &wpNext, &status))
186 if (status == ADMITERATORDONE)
187 status = 0;
188 else
189 rc = FALSE;
190 break;
193 if (ss.szParams[0] != TEXT('\0'))
194 lstrcat (ss.szParams, TEXT(" "));
195 lstrcat (ss.szParams, szParam);
198 WORKERPACKET wpDone;
199 wpDone.wpBosProcessParameterGetDone.hEnum = wpBegin.wpBosProcessParameterGetBegin.hEnum;
200 Worker_DoTask (wtaskBosProcessParameterGetDone, &wpDone);
203 // Strip trailing CR/LF characters
205 size_t cch = lstrlen (ss.szAuxStatus);
206 while (cch && (ss.szAuxStatus[ cch-1 ] == TEXT('\r') || ss.szAuxStatus[ cch-1 ] == TEXT('\n')))
207 ss.szAuxStatus[ cch-- ] = TEXT('\0');
209 cch = lstrlen (ss.szParams);
210 while (cch && (ss.szParams[ cch-1 ] == TEXT('\r') || ss.szParams[ cch-1 ] == TEXT('\n')))
211 ss.szParams[ cch-- ] = TEXT('\0');
213 cch = lstrlen (ss.szNotifier);
214 while (cch && (ss.szNotifier[ cch-1 ] == TEXT('\r') || ss.szNotifier[ cch-1 ] == TEXT('\n')))
215 ss.szNotifier[ cch-- ] = TEXT('\0');
219 if (rc)
221 memcpy (&m_ss, &ss, sizeof(SERVICESTATUS));
224 lpServer->CloseBosObject();
227 lpServer->Close();
230 if (fNotify)
231 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
234 if (pStatus && !rc)
235 *pStatus = status;
236 return TRUE;
240 void SERVICE::GetName (LPTSTR pszName)
242 lstrcpy (pszName, m_szName);
246 LPCELL SERVICE::OpenCell (ULONG *pStatus)
248 return m_lpiCell->OpenCell (pStatus);
252 LPSERVER SERVICE::OpenServer (ULONG *pStatus)
254 return m_lpiServer->OpenServer (pStatus);
259 BOOL SERVICE::GetStatus (LPSERVICESTATUS lpss, BOOL fNotify, ULONG *pStatus)
261 if (!RefreshStatus (fNotify, pStatus))
262 return FALSE;
264 memcpy (lpss, &m_ss, sizeof(SERVICESTATUS));
265 return TRUE;
269 PVOID SERVICE::GetUserParam (void)
271 return GetIdentifier()->GetUserParam();
275 void SERVICE::SetUserParam (PVOID pUserNew)
277 GetIdentifier()->SetUserParam (pUserNew);