Diff for /mqtt/src/mqttd.c between versions 1.1.1.1.2.7 and 1.2.2.3

version 1.1.1.1.2.7, 2011/12/01 00:10:18 version 1.2.2.3, 2012/04/15 21:48:23
Line 1 Line 1
 #include "global.h"  #include "global.h"
   #include "mqttd.h"
 #include "rtlm.h"  #include "rtlm.h"
 #include "utils.h"  #include "utils.h"
 #include "daemon.h"  #include "daemon.h"
   
   
sl_config cfg;io_enableDEBUG;
 
 cfg_root_t cfg;
 sessions_t Sessions;
 sched_root_task_t *root;  sched_root_task_t *root;
   sqlite3 *acc, *pub;
   pthread_mutex_t mtx_sess, mtx_pub;
   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 22  Usage(void) Line 30  Usage(void)
                 compiledby, compilehost, compiled);                  compiledby, compilehost, compiled);
 }  }
   
   static void
   sigHand(int sig)
   {
           int stat;
   
           switch (sig) {
                   case SIGHUP:
                           cfgUnloadConfig(&cfg);
                           if (!cfgLoadConfig(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;
                   case SIGPIPE:
                           break;
           }
   }
   
   
 int  int
 main(int argc, char **argv)  main(int argc, char **argv)
 {  {
        char ch, batch = 0, szStr[STRSIZ], szCfgName[MAXPATHLEN];        char ch, batch = 0;
         register int i;          register int i;
         sqlite3 *acc = NULL, *pub = NULL;  
         FILE *logg = NULL;  
         int sock = -1, ret = 0;          int sock = -1, ret = 0;
         struct passwd *pass;          struct passwd *pass;
           struct sigaction sa;
           ait_val_t v;
   
           TAILQ_INIT(&Sessions);
   
         strlcpy(szCfgName, DEFAULT_CONFIG, sizeof szCfgName);          strlcpy(szCfgName, DEFAULT_CONFIG, sizeof szCfgName);
         while ((ch = getopt(argc, argv, "hvbc:")) != -1)          while ((ch = getopt(argc, argv, "hvbc:")) != -1)
                 switch (ch) {                  switch (ch) {
Line 43  main(int argc, char **argv) Line 79  main(int argc, char **argv)
                                 batch++;                                  batch++;
                                 break;                                  break;
                         case 'v':                          case 'v':
                                Verbose++;                                io_incDebug;
                                 break;                                  break;
                         case 'h':                          case 'h':
                         default:                          default:
Line 53  main(int argc, char **argv) Line 89  main(int argc, char **argv)
         argc -= optind;          argc -= optind;
         argv += optind;          argv += optind;
   
        if (LoadConfig(szCfgName, &cfg)) {        if (cfgLoadConfig(szCfgName, &cfg)) {
                 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);
           pthread_mutex_init(&mtx_pub, NULL);
         openlog("mqttd", LOG_PID | LOG_CONS, LOG_DAEMON);          openlog("mqttd", LOG_PID | LOG_CONS, LOG_DAEMON);
           /* load 3 plugins */
         for (i = 0; i < 3; i++)          for (i = 0; i < 3; i++)
                 if (!mqttLoadRTLM(&cfg, i)) {                  if (!mqttLoadRTLM(&cfg, i)) {
                         printf("Error:: Can't load RTL module\n");                          printf("Error:: Can't load RTL module\n");
                         while (i--)                          while (i--)
                                 mqttUnloadRTLM(i);                                  mqttUnloadRTLM(i);
                        UnloadConfig(&cfg);                        cfgUnloadConfig(&cfg);
                         closelog();                          closelog();
                           pthread_mutex_destroy(&mtx_pub);
                           pthread_mutex_destroy(&mtx_sess);
                         return 2;                          return 2;
                 }                  }
         acc = call.OpenACC(&cfg);          acc = call.OpenACC(&cfg);
Line 89  main(int argc, char **argv) Line 130  main(int argc, char **argv)
                 goto end;                  goto end;
         }          }
   
         VERB(2) syslog(LOG_DEBUG, "Service is ready for start engine ...");  
   
         if ((sock = srv_Socket(&cfg)) == -1) {  
                 ret = 4;  
                 goto end;  
         }  
   
         if (!batch)          if (!batch)
                 switch (fork()) {                  switch (fork()) {
                         case -1:                          case -1:
Line 104  main(int argc, char **argv) Line 138  main(int argc, char **argv)
                                 goto end;                                  goto end;
                         case 0:                          case 0:
                                 setsid();                                  setsid();
                                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); 
                                        VERB(1) syslog(LOG_WARNING, "Try to change group #%d and user #%d",  
                                                        pass->pw_gid, pass->pw_uid); 
                                } 
                                 ret = open("/dev/null", O_RDWR);                                  ret = open("/dev/null", O_RDWR);
                                 if (ret != -1) {                                  if (ret != -1) {
                                         dup2(ret, STDIN_FILENO);                                          dup2(ret, STDIN_FILENO);
Line 120  main(int argc, char **argv) Line 146  main(int argc, char **argv)
                                         dup2(ret, STDERR_FILENO);                                          dup2(ret, STDERR_FILENO);
                                         close(ret);                                          close(ret);
                                 }                                  }
                                VERB(2) syslog(LOG_DEBUG, "Welcome MQTT service into shadow land!");                                ioDEBUG(2, "Welcome MQTT service into shadow land!");
                                 break;                                  break;
                         default:                          default:
                                VERB(2) syslog(LOG_DEBUG, "MQTT service go to shadow land ...");                                ioDEBUG(2, "MQTT service go to shadow land ...");
                                 sleep(1);
                                 ret = 0;                                  ret = 0;
                                 goto end;                                  goto end;
                 }                  }
         else          else
                VERB(1) printf("Start service in batch mode ...\n");                ioDEBUG(1, "Start service in batch mode ...");
   
           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);
           sigaction(SIGPIPE, &sa, NULL);
           ioDEBUG(2, "Service is ready for starting engine ...");
   
           if ((sock = srv_Socket(&cfg)) == -1) {
                   ret = 4;
                   goto end;
           }
   
           cfg_loadAttribute(&cfg, "mqttd", "user", &v, MQTT_USER);
           pass = getpwnam(AIT_GET_STR(&v));
           AIT_FREE_VAL(&v);
           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())) {          if (!(root = schedBegin())) {
                printf("Error:: scheduler #%d - %s\n", sched_GetErrno(), sched_GetError());                ioLIBERR(sched);
                 ret = 6;                  ret = 6;
                 goto end;                  goto end;
         }          }
   
           /* go catch the cat ... */
         Run(sock);          Run(sock);
   
         schedEnd(&root);          schedEnd(&root);
end:end:    /* free all resources */
        if (sock > STDERR_FILENO)        srv_Close(sock);
                srv_Close(sock); 
         call.CloseLOG(logg);          call.CloseLOG(logg);
         call.ClosePUB(pub);          call.ClosePUB(pub);
         call.CloseACC(acc);          call.CloseACC(acc);
         for (i = 0; i < 3; i++)          for (i = 0; i < 3; i++)
                 mqttUnloadRTLM(i);                  mqttUnloadRTLM(i);
         closelog();          closelog();
        UnloadConfig(&cfg);        cfgUnloadConfig(&cfg);
         pthread_mutex_destroy(&mtx_pub);
         pthread_mutex_destroy(&mtx_sess);
         return ret;          return ret;
 }  }

Removed from v.1.1.1.1.2.7  
changed lines
  Added in v.1.2.2.3


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