Diff for /mqtt/src/mqttd.c between versions 1.1.1.1.2.2 and 1.1.1.1.2.13

version 1.1.1.1.2.2, 2011/11/29 22:42:23 version 1.1.1.1.2.13, 2011/12/14 15:09:31
Line 1 Line 1
 #include "global.h"  #include "global.h"
   #include "mqttd.h"
 #include "rtlm.h"  #include "rtlm.h"
   #include "utils.h"
   #include "daemon.h"
   
   
   io_enableDEBUG;
   
 sl_config cfg;  sl_config cfg;
   sessions_t Sessions;
   sched_root_task_t *root;
   sqlite3 *acc, *pub;
   pthread_mutex_t mtx_sess;
   FILE *logg;
 extern char compiled[], compiledby[], compilehost[];  extern char compiled[], compiledby[], compilehost[];
int Verbose;static char szCfgName[MAXPATHLEN];
 intptr_t Kill;
   
   
 static void  static void
Line 13  Usage(void) Line 24  Usage(void)
         printf( " -= MQTT Broker =- MQTT Service from ELWIX\n"          printf( " -= MQTT Broker =- MQTT Service from ELWIX\n"
                 "=== %s@%s === Compiled: %s ===\n\n"                  "=== %s@%s === Compiled: %s ===\n\n"
                 "\t-c <config>\tService config\n"                  "\t-c <config>\tService config\n"
                   "\t-b\t\tBatch mode\n"
                 "\t-v\t\tVerbose (more -vvv, more verbose)\n"                  "\t-v\t\tVerbose (more -vvv, more verbose)\n"
                 "\t-h\t\tHelp! This screen\n\n",                   "\t-h\t\tHelp! This screen\n\n", 
                 compiledby, compilehost, compiled);                  compiledby, compilehost, compiled);
 }  }
   
   static void
   sigHand(int sig)
   {
           int stat;
   
           switch (sig) {
                   case SIGHUP:
                           UnloadConfig(&cfg);
                           if (!LoadConfig(szCfgName, &cfg)) {
                                   ioDEBUG(1, "Config reload OK!");
                                   break;
                           }
   
                           syslog(LOG_ERR, "Error:: can't reload #%d - %s", cfg_GetErrno(), cfg_GetError());
                   case SIGTERM:
                           ioDEBUG(1, "Terminate MQTT service in progress");
                           Kill++;
                           break;
                   case SIGCHLD:
                           while (waitpid(-1, &stat, WNOHANG) > 0);
                           break;
           }
   }
   
   
 int  int
 main(int argc, char **argv)  main(int argc, char **argv)
 {  {
        char ch, szCfgName[MAXPATHLEN];        char ch, batch = 0, szStr[STRSIZ];
         register int i;
         int sock = -1, ret = 0;
         struct passwd *pass;
         struct sigaction sa;
   
           TAILQ_INIT(&Sessions);
   
         strlcpy(szCfgName, DEFAULT_CONFIG, sizeof szCfgName);          strlcpy(szCfgName, DEFAULT_CONFIG, sizeof szCfgName);
        while ((ch = getopt(argc, argv, "hvc:")) != -1)        while ((ch = getopt(argc, argv, "hvbc:")) != -1)
                 switch (ch) {                  switch (ch) {
                         case 'c':                          case 'c':
                                 strlcpy(szCfgName, optarg, sizeof szCfgName);                                  strlcpy(szCfgName, optarg, sizeof szCfgName);
                                 break;                                  break;
                           case 'b':
                                   batch++;
                                   break;
                         case 'v':                          case 'v':
                                Verbose++;                                io_incDebug;
                                 break;                                  break;
                         case 'h':                          case 'h':
                         default:                          default:
Line 45  main(int argc, char **argv) Line 90  main(int argc, char **argv)
                 printf("Error:: can't load #%d - %s\n", cfg_GetErrno(), cfg_GetError());                  printf("Error:: can't load #%d - %s\n", cfg_GetErrno(), cfg_GetError());
                 return 1;                  return 1;
         }          }
           pthread_mutex_init(&mtx_sess, NULL);
           openlog("mqttd", LOG_PID | LOG_CONS, LOG_DAEMON);
           for (i = 0; i < 3; i++)
                   if (!mqttLoadRTLM(&cfg, i)) {
                           printf("Error:: Can't load RTL module\n");
                           while (i--)
                                   mqttUnloadRTLM(i);
                           UnloadConfig(&cfg);
                           closelog();
                           pthread_mutex_destroy(&mtx_sess);
                           return 2;
                   }
           acc = call.OpenACC(&cfg);
           if (!acc) {
                   ret = 3;
                   goto end;
           }
           pub = call.OpenPUB(&cfg);
           if (!pub) {
                   ret = 3;
                   goto end;
           }
           logg = call.OpenLOG(&cfg);
           if (!logg) {
                   ret = 3;
                   goto end;
           }
   
           if (mqttMkDir(&cfg)) {
                   printf("Error:: in statedir #%d - %s\n", errno, strerror(errno));
                   ret = 3;
                   goto end;
           }
   
           if (!batch)
                   switch (fork()) {
                           case -1:
                                   printf("Error:: in fork() #%d - %s\n", errno, strerror(errno));
                                   ret = 5;
                                   goto end;
                           case 0:
                                   setsid();
   
                                   ret = open("/dev/null", O_RDWR);
                                   if (ret != -1) {
                                           dup2(ret, STDIN_FILENO);
                                           dup2(ret, STDOUT_FILENO);
                                           dup2(ret, STDERR_FILENO);
                                           close(ret);
                                   }
                                   ioDEBUG(2, "Welcome MQTT service into shadow land!");
                                   break;
                           default:
                                   ioDEBUG(2, "MQTT service go to shadow land ...");
                                   sleep(1);
                                   ret = 0;
                                   goto end;
                   }
           else
                   ioVERBOSE(1) printf("Start service in batch mode ...\n");
   
           memset(&sa, 0, sizeof sa);
           sigemptyset(&sa.sa_mask);
           sa.sa_handler = sigHand;
           sigaction(SIGHUP, &sa, NULL);
           sigaction(SIGTERM, &sa, NULL);
           sigaction(SIGCHLD, &sa, NULL);
           ioDEBUG(2, "Service is ready for start engine ...");
   
           if ((sock = srv_Socket(&cfg)) == -1) {
                   ret = 4;
                   goto end;
           }
   
           cfg_LoadAttribute(&cfg, CFG("mqttd"), CFG("user"), CFG(szStr), sizeof szStr, MQTT_USER);
           pass = getpwnam(szStr);
           if (pass) {
                   setgid(pass->pw_gid);
                   setuid(pass->pw_uid);
                   ioDEBUG(2, "Try to change group #%d and user #%d", pass->pw_gid, pass->pw_uid);
           }
   
           if (!(root = schedBegin())) {
                   printf("Error:: scheduler #%d - %s\n", sched_GetErrno(), sched_GetError());
                   ret = 6;
                   goto end;
           }
   
           Run(sock);
   
           schedEnd(&root);
   end:
           srv_Close(sock);
           call.CloseLOG(logg);
           call.ClosePUB(pub);
           call.CloseACC(acc);
           for (i = 0; i < 3; i++)
                   mqttUnloadRTLM(i);
           closelog();
         UnloadConfig(&cfg);          UnloadConfig(&cfg);
        return 0;        pthread_mutex_destroy(&mtx_sess);
         return ret;
 }  }

Removed from v.1.1.1.1.2.2  
changed lines
  Added in v.1.1.1.1.2.13


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>