617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan/*******************************************************************************
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * Copyright (C) 2004-2008 Intel Corp. All rights reserved.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * Redistribution and use in source and binary forms, with or without
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * modification, are permitted provided that the following conditions are met:
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * - Redistributions of source code must retain the above copyright notice,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * this list of conditions and the following disclaimer.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * - Redistributions in binary form must reproduce the above copyright notice,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * this list of conditions and the following disclaimer in the documentation
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * and/or other materials provided with the distribution.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * - Neither the name of Intel Corp. nor the names of its
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * contributors may be used to endorse or promote products derived from this
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * software without specific prior written permission.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * POSSIBILITY OF SUCH DAMAGE.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *******************************************************************************/
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#ifdef HAVE_CONFIG_H
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "config.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "iatshareddata.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <cstdlib>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <cstdio>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <cerrno>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <csignal>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <syslog.h>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <unistd.h>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <sys/types.h>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <sys/stat.h>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <fcntl.h>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <sys/file.h>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "types.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "Protocol.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "version.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "ATVersion.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "glue.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#ifdef __sun
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include <signal.h>
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#ifdef DAEMON
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#include "daemonize.h"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif //DAEMON
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#define LOCK_PATH IATSTATERUNDIR
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan/* Change this to whatever your daemon is called */
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#define DAEMON_PID_FILE "lms.pid"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#define QUICK_CONNECT_COUNT 30
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#define SLEEP_TIMEOUT 30
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#define QUICK_SLEEP_TIMEOUT 5
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganbool isRunning(int running = -1)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan static int _running = 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (running >= 0)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan _running = running;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (_running == 1)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return true;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan else
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid log(void *param, LPCTSTR message, WORD eventType)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#ifdef DEBUGLOG
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog((int)eventType, "%s", message);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan//This needs to be global for termination action
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark LoganProtocol prot;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganint lock_pid_file_fd = -1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganglue plugin;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid exitcleanup()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan prot.Deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan prot.DestroySockets();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan //syslog(EVENTLOG_INFORMATION_TYPE, "Service stopped\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan closelog();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (-1 != lock_pid_file_fd) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan close(lock_pid_file_fd);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lock_pid_file_fd = -1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unlink(LOCK_PATH DAEMON_PID_FILE);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan plugin.deinit();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan//Action termination
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#ifdef __sun
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganextern "C"
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid terminationHandler(int signum, siginfo_t *sinfo, void *dummy)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan PRINT("LMS Service received - Signal:%d Err:(%d) Code:(%d)\n", signum, sinfo->si_errno, sinfo->si_code);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (isRunning()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog(EVENTLOG_WARNING_TYPE, "Received termination signal (%d)\n", signum);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan isRunning(0);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan exit(EXIT_SUCCESS);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganvoid setTerminationHandler()
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int sigSet = 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // Termination signal handler.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan struct sigaction terminateAction;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // Set up the structure to specify the termination action.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan terminateAction.sa_sigaction = terminationHandler;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan sigemptyset(&terminateAction.sa_mask);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan terminateAction.sa_flags = SA_SIGINFO;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan sigSet &= sigaction(SIGTERM, &terminateAction, NULL);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan sigSet &= sigaction(SIGQUIT, &terminateAction, NULL);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan sigSet &= sigaction(SIGINT, &terminateAction, NULL);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan sigSet &= sigaction(SIGHUP, &terminateAction, NULL);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan sigSet &= sigaction(SIGPIPE, &terminateAction, NULL);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan sigSet &= sigaction(SIGALRM, &terminateAction, NULL);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan sigSet &= sigaction(SIGUSR1, &terminateAction, NULL);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan sigSet &= sigaction(SIGUSR2, &terminateAction, NULL);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (sigSet != 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog(EVENTLOG_WARNING_TYPE, "Failed to register terminate signal handler\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan/*
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * return: 1 if the lock is real, 0 if not real, -1 on error
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan **/
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganint lock_is_real(const char *lockfile)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int lfp;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan char pid_buf[32];
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ssize_t count = 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int lockpid;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lfp = open(lockfile, O_RDONLY);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (lfp < 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog(LOG_ERR,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan "unable to open lock file %s, code=%d (%s)",
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lockfile, errno, strerror(errno));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return -1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan count = read(lfp, pid_buf, sizeof(pid_buf)-1);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (count < 1) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog(LOG_ERR,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan "unable to read lock file %s, code=%d (%s)",
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lockfile, errno, strerror(errno));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan close(lfp);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return -1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan close(lfp);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan pid_buf[count] = '\0';
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lockpid = atoi(pid_buf);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (lockpid <= 1) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog(LOG_ERR, "bad pid in lock file %s", lockfile);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan /* See if the process still exists */
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (kill(lockpid, 0) == 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan /* Process exists, lock is real */
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return 1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan else {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan /* Process is gone */
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan/**
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * lock_pid_file - creates a pid file and writes current process pid into it
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * lockfile - name of a file to be created
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan *
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan * return: 0 on success, -1 on fatal error, -2 on error
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan **/
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganint lock_pid_file(const char *lockfile)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int lfp = -1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan size_t towrite = 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan ssize_t written = 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int error = 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int haserror = 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan char pid_buf[32];
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan /* Create the lock file as the current user */
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (lockfile && lockfile[0]) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#ifdef __sun
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lfp = open(lockfile, O_RDWR | O_CREAT | O_EXCL, 0644);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (lfp < 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (errno == EEXIST) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (lock_is_real(lockfile)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog(LOG_ERR,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan "The LMS service is already running!");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan else {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unlink(lockfile);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return -2;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan else {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog(LOG_ERR,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan "unable to lock file %s, code=%d (%s)",
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lockfile, errno, strerror(errno));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return -1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan snprintf(pid_buf, sizeof(pid_buf), "%u", getpid());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan towrite = strnlen(pid_buf, 31);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan written = write(lfp, pid_buf, towrite);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#else
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lfp = open(lockfile, O_RDWR | O_CREAT, 0644);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (lfp < 0) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog(LOG_ERR,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan "unable to create lock file %s, code=%d (%s)",
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lockfile, errno, strerror(errno));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return -1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (-1 == flock(lfp, LOCK_EX | LOCK_NB)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan error = errno;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (EWOULDBLOCK == errno) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog(LOG_ERR, "The LMS service is already running!");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan close(lfp);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan } else {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog(LOG_ERR,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan "unable to lock file %s, code=%d (%s)",
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lockfile, error, strerror(error));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan close(lfp);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unlink(lockfile);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return -2;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return -1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (-1 == ftruncate(lfp, 0)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog(LOG_ERR,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan "unable to fruncate lock file %s, code=%d (%s)",
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lockfile, errno, strerror(errno));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan close(lfp);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unlink(lockfile);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return -2;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan snprintf(pid_buf, sizeof(pid_buf), "%u", getpid());
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan towrite = strnlen(pid_buf, 31);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan written = write(lfp, pid_buf, towrite);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (-1 == written) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan error = errno;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan haserror = 1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan } else if (towrite != (size_t)written) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan haserror = 1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan } else if (-1 == fsync(lfp)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan error = errno;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan haserror = 1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (1 == haserror) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog(LOG_ERR,
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan "unable to write pid into lock file %s, code=%d (%s)",
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lockfile, error, strerror(error));
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan close(lfp);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan unlink(lockfile);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return -2;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif // __sun
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lock_pid_file_fd = lfp;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Loganint main(int argc, char **argv)
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan{
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool alreadyFailed = false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool firstLoop = true;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan bool init = false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int connectCount = 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan int lockresult = -1;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (ATVersion::ShowVersionIfArg(argc, const_cast<const char **>(argv), VER_PRODUCTVERSION_STR)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan umask(022);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan openlog("LMS", LOG_CONS, LOG_DAEMON);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#ifdef DAEMON
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan daemonize();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#else
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan setTerminationHandler();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lockresult = lock_pid_file(LOCK_PATH DAEMON_PID_FILE);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (-2 == lockresult) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan lockresult = lock_pid_file(LOCK_PATH DAEMON_PID_FILE);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (0 != lockresult) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan exit(EXIT_FAILURE);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan isRunning(1);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan //syslog(EVENTLOG_INFORMATION_TYPE, "Service started\n");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan atexit(exitcleanup);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan plugin.init();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan while (isRunning()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!prot.IsInitialized()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (init) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#ifdef DEBUGLOG
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan log(NULL, "LMS Service lost connection to AMT via HECI driver", EVENTLOG_ERROR_TYPE);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan init = false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!prot.Init(log, NULL)) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (firstLoop) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan syslog(EVENTLOG_ERROR_TYPE, "Cannot connect to AMT via HECI driver");
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan firstLoop = false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // Failed to connect to the HECI driver.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // Sleep for a second and try again.
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan connectCount++;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (connectCount >= QUICK_CONNECT_COUNT) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan sleep(SLEEP_TIMEOUT);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan } else {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan sleep(QUICK_SLEEP_TIMEOUT);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan continue;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan init = true;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan firstLoop = false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan connectCount = 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#ifdef DEBUGLOG
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan log(NULL, "Connected to AMT via HECI driver\n", EVENTLOG_INFORMATION_TYPE);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!prot.SocketsCreated()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!prot.CreateSockets()) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan if (!alreadyFailed) {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#ifdef DEBUGLOG
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan log(NULL, "LMS Service has a problem in achieving network resources.", EVENTLOG_ERROR_TYPE);
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan#endif
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan alreadyFailed = true;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan continue;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan } else {
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan alreadyFailed = false;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan // Select on active sockets (IANA ports and open connections).
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan prot.Select();
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan }
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan return 0;
617e2443dfc17fe44fd44c0675d6aad2ffc9df42Mark Logan}