xref: /onnv-gate/usr/src/cmd/lms/main.cpp (revision 9203:3ebffd0a1b10)
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