1*9203SMark.Logan@Sun.COM /*******************************************************************************
2*9203SMark.Logan@Sun.COM * Copyright (C) 2004-2008 Intel Corp. All rights reserved.
3*9203SMark.Logan@Sun.COM *
4*9203SMark.Logan@Sun.COM * Redistribution and use in source and binary forms, with or without
5*9203SMark.Logan@Sun.COM * modification, are permitted provided that the following conditions are met:
6*9203SMark.Logan@Sun.COM *
7*9203SMark.Logan@Sun.COM * - Redistributions of source code must retain the above copyright notice,
8*9203SMark.Logan@Sun.COM * this list of conditions and the following disclaimer.
9*9203SMark.Logan@Sun.COM *
10*9203SMark.Logan@Sun.COM * - Redistributions in binary form must reproduce the above copyright notice,
11*9203SMark.Logan@Sun.COM * this list of conditions and the following disclaimer in the documentation
12*9203SMark.Logan@Sun.COM * and/or other materials provided with the distribution.
13*9203SMark.Logan@Sun.COM *
14*9203SMark.Logan@Sun.COM * - Neither the name of Intel Corp. nor the names of its
15*9203SMark.Logan@Sun.COM * contributors may be used to endorse or promote products derived from this
16*9203SMark.Logan@Sun.COM * software without specific prior written permission.
17*9203SMark.Logan@Sun.COM *
18*9203SMark.Logan@Sun.COM * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
19*9203SMark.Logan@Sun.COM * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*9203SMark.Logan@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*9203SMark.Logan@Sun.COM * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS
22*9203SMark.Logan@Sun.COM * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*9203SMark.Logan@Sun.COM * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*9203SMark.Logan@Sun.COM * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*9203SMark.Logan@Sun.COM * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*9203SMark.Logan@Sun.COM * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*9203SMark.Logan@Sun.COM * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*9203SMark.Logan@Sun.COM * POSSIBILITY OF SUCH DAMAGE.
29*9203SMark.Logan@Sun.COM *******************************************************************************/
30*9203SMark.Logan@Sun.COM
31*9203SMark.Logan@Sun.COM #ifdef HAVE_CONFIG_H
32*9203SMark.Logan@Sun.COM #include "config.h"
33*9203SMark.Logan@Sun.COM #endif
34*9203SMark.Logan@Sun.COM #include "iatshareddata.h"
35*9203SMark.Logan@Sun.COM #include <cstdlib>
36*9203SMark.Logan@Sun.COM #include <cstdio>
37*9203SMark.Logan@Sun.COM #include <cerrno>
38*9203SMark.Logan@Sun.COM #include <csignal>
39*9203SMark.Logan@Sun.COM #include <syslog.h>
40*9203SMark.Logan@Sun.COM #include <unistd.h>
41*9203SMark.Logan@Sun.COM #include <sys/types.h>
42*9203SMark.Logan@Sun.COM #include <sys/stat.h>
43*9203SMark.Logan@Sun.COM #include <fcntl.h>
44*9203SMark.Logan@Sun.COM #include <sys/file.h>
45*9203SMark.Logan@Sun.COM #include "types.h"
46*9203SMark.Logan@Sun.COM #include "Protocol.h"
47*9203SMark.Logan@Sun.COM #include "version.h"
48*9203SMark.Logan@Sun.COM #include "ATVersion.h"
49*9203SMark.Logan@Sun.COM #include "glue.h"
50*9203SMark.Logan@Sun.COM
51*9203SMark.Logan@Sun.COM #ifdef __sun
52*9203SMark.Logan@Sun.COM #include <signal.h>
53*9203SMark.Logan@Sun.COM #endif
54*9203SMark.Logan@Sun.COM
55*9203SMark.Logan@Sun.COM #ifdef DAEMON
56*9203SMark.Logan@Sun.COM #include "daemonize.h"
57*9203SMark.Logan@Sun.COM #endif //DAEMON
58*9203SMark.Logan@Sun.COM
59*9203SMark.Logan@Sun.COM #define LOCK_PATH IATSTATERUNDIR
60*9203SMark.Logan@Sun.COM /* Change this to whatever your daemon is called */
61*9203SMark.Logan@Sun.COM #define DAEMON_PID_FILE "lms.pid"
62*9203SMark.Logan@Sun.COM
63*9203SMark.Logan@Sun.COM #define QUICK_CONNECT_COUNT 30
64*9203SMark.Logan@Sun.COM #define SLEEP_TIMEOUT 30
65*9203SMark.Logan@Sun.COM #define QUICK_SLEEP_TIMEOUT 5
66*9203SMark.Logan@Sun.COM
67*9203SMark.Logan@Sun.COM
isRunning(int running=-1)68*9203SMark.Logan@Sun.COM bool isRunning(int running = -1)
69*9203SMark.Logan@Sun.COM {
70*9203SMark.Logan@Sun.COM static int _running = 0;
71*9203SMark.Logan@Sun.COM if (running >= 0)
72*9203SMark.Logan@Sun.COM {
73*9203SMark.Logan@Sun.COM _running = running;
74*9203SMark.Logan@Sun.COM }
75*9203SMark.Logan@Sun.COM if (_running == 1)
76*9203SMark.Logan@Sun.COM {
77*9203SMark.Logan@Sun.COM return true;
78*9203SMark.Logan@Sun.COM }
79*9203SMark.Logan@Sun.COM else
80*9203SMark.Logan@Sun.COM {
81*9203SMark.Logan@Sun.COM return false;
82*9203SMark.Logan@Sun.COM }
83*9203SMark.Logan@Sun.COM }
84*9203SMark.Logan@Sun.COM
log(void * param,LPCTSTR message,WORD eventType)85*9203SMark.Logan@Sun.COM void log(void *param, LPCTSTR message, WORD eventType)
86*9203SMark.Logan@Sun.COM {
87*9203SMark.Logan@Sun.COM #ifdef DEBUGLOG
88*9203SMark.Logan@Sun.COM syslog((int)eventType, "%s", message);
89*9203SMark.Logan@Sun.COM #endif
90*9203SMark.Logan@Sun.COM }
91*9203SMark.Logan@Sun.COM
92*9203SMark.Logan@Sun.COM //This needs to be global for termination action
93*9203SMark.Logan@Sun.COM Protocol prot;
94*9203SMark.Logan@Sun.COM int lock_pid_file_fd = -1;
95*9203SMark.Logan@Sun.COM glue plugin;
96*9203SMark.Logan@Sun.COM
exitcleanup()97*9203SMark.Logan@Sun.COM void exitcleanup()
98*9203SMark.Logan@Sun.COM {
99*9203SMark.Logan@Sun.COM prot.Deinit();
100*9203SMark.Logan@Sun.COM prot.DestroySockets();
101*9203SMark.Logan@Sun.COM //syslog(EVENTLOG_INFORMATION_TYPE, "Service stopped\n");
102*9203SMark.Logan@Sun.COM closelog();
103*9203SMark.Logan@Sun.COM if (-1 != lock_pid_file_fd) {
104*9203SMark.Logan@Sun.COM close(lock_pid_file_fd);
105*9203SMark.Logan@Sun.COM lock_pid_file_fd = -1;
106*9203SMark.Logan@Sun.COM unlink(LOCK_PATH DAEMON_PID_FILE);
107*9203SMark.Logan@Sun.COM }
108*9203SMark.Logan@Sun.COM
109*9203SMark.Logan@Sun.COM plugin.deinit();
110*9203SMark.Logan@Sun.COM }
111*9203SMark.Logan@Sun.COM
112*9203SMark.Logan@Sun.COM //Action termination
113*9203SMark.Logan@Sun.COM #ifdef __sun
114*9203SMark.Logan@Sun.COM extern "C"
115*9203SMark.Logan@Sun.COM #endif
terminationHandler(int signum,siginfo_t * sinfo,void * dummy)116*9203SMark.Logan@Sun.COM void terminationHandler(int signum, siginfo_t *sinfo, void *dummy)
117*9203SMark.Logan@Sun.COM {
118*9203SMark.Logan@Sun.COM PRINT("LMS Service received - Signal:%d Err:(%d) Code:(%d)\n", signum, sinfo->si_errno, sinfo->si_code);
119*9203SMark.Logan@Sun.COM if (isRunning()) {
120*9203SMark.Logan@Sun.COM syslog(EVENTLOG_WARNING_TYPE, "Received termination signal (%d)\n", signum);
121*9203SMark.Logan@Sun.COM
122*9203SMark.Logan@Sun.COM isRunning(0);
123*9203SMark.Logan@Sun.COM
124*9203SMark.Logan@Sun.COM exit(EXIT_SUCCESS);
125*9203SMark.Logan@Sun.COM }
126*9203SMark.Logan@Sun.COM }
127*9203SMark.Logan@Sun.COM
setTerminationHandler()128*9203SMark.Logan@Sun.COM void setTerminationHandler()
129*9203SMark.Logan@Sun.COM {
130*9203SMark.Logan@Sun.COM int sigSet = 0;
131*9203SMark.Logan@Sun.COM // Termination signal handler.
132*9203SMark.Logan@Sun.COM struct sigaction terminateAction;
133*9203SMark.Logan@Sun.COM // Set up the structure to specify the termination action.
134*9203SMark.Logan@Sun.COM terminateAction.sa_sigaction = terminationHandler;
135*9203SMark.Logan@Sun.COM sigemptyset(&terminateAction.sa_mask);
136*9203SMark.Logan@Sun.COM terminateAction.sa_flags = SA_SIGINFO;
137*9203SMark.Logan@Sun.COM sigSet &= sigaction(SIGTERM, &terminateAction, NULL);
138*9203SMark.Logan@Sun.COM sigSet &= sigaction(SIGQUIT, &terminateAction, NULL);
139*9203SMark.Logan@Sun.COM sigSet &= sigaction(SIGINT, &terminateAction, NULL);
140*9203SMark.Logan@Sun.COM sigSet &= sigaction(SIGHUP, &terminateAction, NULL);
141*9203SMark.Logan@Sun.COM sigSet &= sigaction(SIGPIPE, &terminateAction, NULL);
142*9203SMark.Logan@Sun.COM sigSet &= sigaction(SIGALRM, &terminateAction, NULL);
143*9203SMark.Logan@Sun.COM sigSet &= sigaction(SIGUSR1, &terminateAction, NULL);
144*9203SMark.Logan@Sun.COM sigSet &= sigaction(SIGUSR2, &terminateAction, NULL);
145*9203SMark.Logan@Sun.COM
146*9203SMark.Logan@Sun.COM if (sigSet != 0) {
147*9203SMark.Logan@Sun.COM syslog(EVENTLOG_WARNING_TYPE, "Failed to register terminate signal handler\n");
148*9203SMark.Logan@Sun.COM }
149*9203SMark.Logan@Sun.COM }
150*9203SMark.Logan@Sun.COM
151*9203SMark.Logan@Sun.COM /*
152*9203SMark.Logan@Sun.COM * return: 1 if the lock is real, 0 if not real, -1 on error
153*9203SMark.Logan@Sun.COM **/
lock_is_real(const char * lockfile)154*9203SMark.Logan@Sun.COM int lock_is_real(const char *lockfile)
155*9203SMark.Logan@Sun.COM {
156*9203SMark.Logan@Sun.COM int lfp;
157*9203SMark.Logan@Sun.COM char pid_buf[32];
158*9203SMark.Logan@Sun.COM ssize_t count = 0;
159*9203SMark.Logan@Sun.COM int lockpid;
160*9203SMark.Logan@Sun.COM
161*9203SMark.Logan@Sun.COM lfp = open(lockfile, O_RDONLY);
162*9203SMark.Logan@Sun.COM if (lfp < 0) {
163*9203SMark.Logan@Sun.COM syslog(LOG_ERR,
164*9203SMark.Logan@Sun.COM "unable to open lock file %s, code=%d (%s)",
165*9203SMark.Logan@Sun.COM lockfile, errno, strerror(errno));
166*9203SMark.Logan@Sun.COM return -1;
167*9203SMark.Logan@Sun.COM }
168*9203SMark.Logan@Sun.COM
169*9203SMark.Logan@Sun.COM count = read(lfp, pid_buf, sizeof(pid_buf)-1);
170*9203SMark.Logan@Sun.COM if (count < 1) {
171*9203SMark.Logan@Sun.COM syslog(LOG_ERR,
172*9203SMark.Logan@Sun.COM "unable to read lock file %s, code=%d (%s)",
173*9203SMark.Logan@Sun.COM lockfile, errno, strerror(errno));
174*9203SMark.Logan@Sun.COM close(lfp);
175*9203SMark.Logan@Sun.COM return -1;
176*9203SMark.Logan@Sun.COM }
177*9203SMark.Logan@Sun.COM close(lfp);
178*9203SMark.Logan@Sun.COM pid_buf[count] = '\0';
179*9203SMark.Logan@Sun.COM
180*9203SMark.Logan@Sun.COM lockpid = atoi(pid_buf);
181*9203SMark.Logan@Sun.COM if (lockpid <= 1) {
182*9203SMark.Logan@Sun.COM syslog(LOG_ERR, "bad pid in lock file %s", lockfile);
183*9203SMark.Logan@Sun.COM return 0;
184*9203SMark.Logan@Sun.COM }
185*9203SMark.Logan@Sun.COM
186*9203SMark.Logan@Sun.COM /* See if the process still exists */
187*9203SMark.Logan@Sun.COM if (kill(lockpid, 0) == 0) {
188*9203SMark.Logan@Sun.COM /* Process exists, lock is real */
189*9203SMark.Logan@Sun.COM return 1;
190*9203SMark.Logan@Sun.COM }
191*9203SMark.Logan@Sun.COM else {
192*9203SMark.Logan@Sun.COM /* Process is gone */
193*9203SMark.Logan@Sun.COM return 0;
194*9203SMark.Logan@Sun.COM }
195*9203SMark.Logan@Sun.COM }
196*9203SMark.Logan@Sun.COM
197*9203SMark.Logan@Sun.COM /**
198*9203SMark.Logan@Sun.COM * lock_pid_file - creates a pid file and writes current process pid into it
199*9203SMark.Logan@Sun.COM *
200*9203SMark.Logan@Sun.COM * lockfile - name of a file to be created
201*9203SMark.Logan@Sun.COM *
202*9203SMark.Logan@Sun.COM * return: 0 on success, -1 on fatal error, -2 on error
203*9203SMark.Logan@Sun.COM **/
lock_pid_file(const char * lockfile)204*9203SMark.Logan@Sun.COM int lock_pid_file(const char *lockfile)
205*9203SMark.Logan@Sun.COM {
206*9203SMark.Logan@Sun.COM int lfp = -1;
207*9203SMark.Logan@Sun.COM size_t towrite = 0;
208*9203SMark.Logan@Sun.COM ssize_t written = 0;
209*9203SMark.Logan@Sun.COM int error = 0;
210*9203SMark.Logan@Sun.COM int haserror = 0;
211*9203SMark.Logan@Sun.COM char pid_buf[32];
212*9203SMark.Logan@Sun.COM
213*9203SMark.Logan@Sun.COM /* Create the lock file as the current user */
214*9203SMark.Logan@Sun.COM if (lockfile && lockfile[0]) {
215*9203SMark.Logan@Sun.COM #ifdef __sun
216*9203SMark.Logan@Sun.COM lfp = open(lockfile, O_RDWR | O_CREAT | O_EXCL, 0644);
217*9203SMark.Logan@Sun.COM if (lfp < 0) {
218*9203SMark.Logan@Sun.COM if (errno == EEXIST) {
219*9203SMark.Logan@Sun.COM if (lock_is_real(lockfile)) {
220*9203SMark.Logan@Sun.COM syslog(LOG_ERR,
221*9203SMark.Logan@Sun.COM "The LMS service is already running!");
222*9203SMark.Logan@Sun.COM }
223*9203SMark.Logan@Sun.COM else {
224*9203SMark.Logan@Sun.COM unlink(lockfile);
225*9203SMark.Logan@Sun.COM }
226*9203SMark.Logan@Sun.COM return -2;
227*9203SMark.Logan@Sun.COM }
228*9203SMark.Logan@Sun.COM else {
229*9203SMark.Logan@Sun.COM syslog(LOG_ERR,
230*9203SMark.Logan@Sun.COM "unable to lock file %s, code=%d (%s)",
231*9203SMark.Logan@Sun.COM lockfile, errno, strerror(errno));
232*9203SMark.Logan@Sun.COM return -1;
233*9203SMark.Logan@Sun.COM }
234*9203SMark.Logan@Sun.COM }
235*9203SMark.Logan@Sun.COM snprintf(pid_buf, sizeof(pid_buf), "%u", getpid());
236*9203SMark.Logan@Sun.COM towrite = strnlen(pid_buf, 31);
237*9203SMark.Logan@Sun.COM written = write(lfp, pid_buf, towrite);
238*9203SMark.Logan@Sun.COM #else
239*9203SMark.Logan@Sun.COM lfp = open(lockfile, O_RDWR | O_CREAT, 0644);
240*9203SMark.Logan@Sun.COM if (lfp < 0) {
241*9203SMark.Logan@Sun.COM syslog(LOG_ERR,
242*9203SMark.Logan@Sun.COM "unable to create lock file %s, code=%d (%s)",
243*9203SMark.Logan@Sun.COM lockfile, errno, strerror(errno));
244*9203SMark.Logan@Sun.COM return -1;
245*9203SMark.Logan@Sun.COM }
246*9203SMark.Logan@Sun.COM
247*9203SMark.Logan@Sun.COM if (-1 == flock(lfp, LOCK_EX | LOCK_NB)) {
248*9203SMark.Logan@Sun.COM error = errno;
249*9203SMark.Logan@Sun.COM if (EWOULDBLOCK == errno) {
250*9203SMark.Logan@Sun.COM syslog(LOG_ERR, "The LMS service is already running!");
251*9203SMark.Logan@Sun.COM close(lfp);
252*9203SMark.Logan@Sun.COM } else {
253*9203SMark.Logan@Sun.COM syslog(LOG_ERR,
254*9203SMark.Logan@Sun.COM "unable to lock file %s, code=%d (%s)",
255*9203SMark.Logan@Sun.COM lockfile, error, strerror(error));
256*9203SMark.Logan@Sun.COM close(lfp);
257*9203SMark.Logan@Sun.COM unlink(lockfile);
258*9203SMark.Logan@Sun.COM return -2;
259*9203SMark.Logan@Sun.COM }
260*9203SMark.Logan@Sun.COM return -1;
261*9203SMark.Logan@Sun.COM }
262*9203SMark.Logan@Sun.COM if (-1 == ftruncate(lfp, 0)) {
263*9203SMark.Logan@Sun.COM syslog(LOG_ERR,
264*9203SMark.Logan@Sun.COM "unable to fruncate lock file %s, code=%d (%s)",
265*9203SMark.Logan@Sun.COM lockfile, errno, strerror(errno));
266*9203SMark.Logan@Sun.COM close(lfp);
267*9203SMark.Logan@Sun.COM unlink(lockfile);
268*9203SMark.Logan@Sun.COM return -2;
269*9203SMark.Logan@Sun.COM }
270*9203SMark.Logan@Sun.COM snprintf(pid_buf, sizeof(pid_buf), "%u", getpid());
271*9203SMark.Logan@Sun.COM towrite = strnlen(pid_buf, 31);
272*9203SMark.Logan@Sun.COM written = write(lfp, pid_buf, towrite);
273*9203SMark.Logan@Sun.COM if (-1 == written) {
274*9203SMark.Logan@Sun.COM error = errno;
275*9203SMark.Logan@Sun.COM haserror = 1;
276*9203SMark.Logan@Sun.COM } else if (towrite != (size_t)written) {
277*9203SMark.Logan@Sun.COM haserror = 1;
278*9203SMark.Logan@Sun.COM } else if (-1 == fsync(lfp)) {
279*9203SMark.Logan@Sun.COM error = errno;
280*9203SMark.Logan@Sun.COM haserror = 1;
281*9203SMark.Logan@Sun.COM }
282*9203SMark.Logan@Sun.COM if (1 == haserror) {
283*9203SMark.Logan@Sun.COM syslog(LOG_ERR,
284*9203SMark.Logan@Sun.COM "unable to write pid into lock file %s, code=%d (%s)",
285*9203SMark.Logan@Sun.COM lockfile, error, strerror(error));
286*9203SMark.Logan@Sun.COM close(lfp);
287*9203SMark.Logan@Sun.COM unlink(lockfile);
288*9203SMark.Logan@Sun.COM return -2;
289*9203SMark.Logan@Sun.COM }
290*9203SMark.Logan@Sun.COM #endif // __sun
291*9203SMark.Logan@Sun.COM lock_pid_file_fd = lfp;
292*9203SMark.Logan@Sun.COM }
293*9203SMark.Logan@Sun.COM return 0;
294*9203SMark.Logan@Sun.COM }
295*9203SMark.Logan@Sun.COM
296*9203SMark.Logan@Sun.COM
main(int argc,char ** argv)297*9203SMark.Logan@Sun.COM int main(int argc, char **argv)
298*9203SMark.Logan@Sun.COM {
299*9203SMark.Logan@Sun.COM bool alreadyFailed = false;
300*9203SMark.Logan@Sun.COM bool firstLoop = true;
301*9203SMark.Logan@Sun.COM bool init = false;
302*9203SMark.Logan@Sun.COM int connectCount = 0;
303*9203SMark.Logan@Sun.COM int lockresult = -1;
304*9203SMark.Logan@Sun.COM
305*9203SMark.Logan@Sun.COM if (ATVersion::ShowVersionIfArg(argc, const_cast<const char **>(argv), VER_PRODUCTVERSION_STR)) {
306*9203SMark.Logan@Sun.COM return 0;
307*9203SMark.Logan@Sun.COM }
308*9203SMark.Logan@Sun.COM
309*9203SMark.Logan@Sun.COM umask(022);
310*9203SMark.Logan@Sun.COM
311*9203SMark.Logan@Sun.COM openlog("LMS", LOG_CONS, LOG_DAEMON);
312*9203SMark.Logan@Sun.COM
313*9203SMark.Logan@Sun.COM #ifdef DAEMON
314*9203SMark.Logan@Sun.COM daemonize();
315*9203SMark.Logan@Sun.COM #else
316*9203SMark.Logan@Sun.COM setTerminationHandler();
317*9203SMark.Logan@Sun.COM #endif
318*9203SMark.Logan@Sun.COM
319*9203SMark.Logan@Sun.COM lockresult = lock_pid_file(LOCK_PATH DAEMON_PID_FILE);
320*9203SMark.Logan@Sun.COM if (-2 == lockresult) {
321*9203SMark.Logan@Sun.COM lockresult = lock_pid_file(LOCK_PATH DAEMON_PID_FILE);
322*9203SMark.Logan@Sun.COM }
323*9203SMark.Logan@Sun.COM if (0 != lockresult) {
324*9203SMark.Logan@Sun.COM exit(EXIT_FAILURE);
325*9203SMark.Logan@Sun.COM }
326*9203SMark.Logan@Sun.COM
327*9203SMark.Logan@Sun.COM isRunning(1);
328*9203SMark.Logan@Sun.COM //syslog(EVENTLOG_INFORMATION_TYPE, "Service started\n");
329*9203SMark.Logan@Sun.COM
330*9203SMark.Logan@Sun.COM atexit(exitcleanup);
331*9203SMark.Logan@Sun.COM
332*9203SMark.Logan@Sun.COM plugin.init();
333*9203SMark.Logan@Sun.COM
334*9203SMark.Logan@Sun.COM while (isRunning()) {
335*9203SMark.Logan@Sun.COM if (!prot.IsInitialized()) {
336*9203SMark.Logan@Sun.COM if (init) {
337*9203SMark.Logan@Sun.COM #ifdef DEBUGLOG
338*9203SMark.Logan@Sun.COM log(NULL, "LMS Service lost connection to AMT via HECI driver", EVENTLOG_ERROR_TYPE);
339*9203SMark.Logan@Sun.COM #endif
340*9203SMark.Logan@Sun.COM init = false;
341*9203SMark.Logan@Sun.COM }
342*9203SMark.Logan@Sun.COM
343*9203SMark.Logan@Sun.COM if (!prot.Init(log, NULL)) {
344*9203SMark.Logan@Sun.COM if (firstLoop) {
345*9203SMark.Logan@Sun.COM syslog(EVENTLOG_ERROR_TYPE, "Cannot connect to AMT via HECI driver");
346*9203SMark.Logan@Sun.COM firstLoop = false;
347*9203SMark.Logan@Sun.COM }
348*9203SMark.Logan@Sun.COM // Failed to connect to the HECI driver.
349*9203SMark.Logan@Sun.COM // Sleep for a second and try again.
350*9203SMark.Logan@Sun.COM connectCount++;
351*9203SMark.Logan@Sun.COM if (connectCount >= QUICK_CONNECT_COUNT) {
352*9203SMark.Logan@Sun.COM sleep(SLEEP_TIMEOUT);
353*9203SMark.Logan@Sun.COM } else {
354*9203SMark.Logan@Sun.COM sleep(QUICK_SLEEP_TIMEOUT);
355*9203SMark.Logan@Sun.COM }
356*9203SMark.Logan@Sun.COM continue;
357*9203SMark.Logan@Sun.COM }
358*9203SMark.Logan@Sun.COM init = true;
359*9203SMark.Logan@Sun.COM firstLoop = false;
360*9203SMark.Logan@Sun.COM connectCount = 0;
361*9203SMark.Logan@Sun.COM #ifdef DEBUGLOG
362*9203SMark.Logan@Sun.COM log(NULL, "Connected to AMT via HECI driver\n", EVENTLOG_INFORMATION_TYPE);
363*9203SMark.Logan@Sun.COM #endif
364*9203SMark.Logan@Sun.COM }
365*9203SMark.Logan@Sun.COM
366*9203SMark.Logan@Sun.COM if (!prot.SocketsCreated()) {
367*9203SMark.Logan@Sun.COM if (!prot.CreateSockets()) {
368*9203SMark.Logan@Sun.COM if (!alreadyFailed) {
369*9203SMark.Logan@Sun.COM #ifdef DEBUGLOG
370*9203SMark.Logan@Sun.COM log(NULL, "LMS Service has a problem in achieving network resources.", EVENTLOG_ERROR_TYPE);
371*9203SMark.Logan@Sun.COM #endif
372*9203SMark.Logan@Sun.COM alreadyFailed = true;
373*9203SMark.Logan@Sun.COM }
374*9203SMark.Logan@Sun.COM continue;
375*9203SMark.Logan@Sun.COM } else {
376*9203SMark.Logan@Sun.COM alreadyFailed = false;
377*9203SMark.Logan@Sun.COM }
378*9203SMark.Logan@Sun.COM }
379*9203SMark.Logan@Sun.COM // Select on active sockets (IANA ports and open connections).
380*9203SMark.Logan@Sun.COM prot.Select();
381*9203SMark.Logan@Sun.COM }
382*9203SMark.Logan@Sun.COM
383*9203SMark.Logan@Sun.COM return 0;
384*9203SMark.Logan@Sun.COM }
385