Diff for /suX/src/sux.c between versions 1.2.2.2 and 1.3.2.1

version 1.2.2.2, 2011/10/09 21:45:44 version 1.3.2.1, 2013/04/09 08:17:40
Line 9 Line 9
 #include "global.h"  #include "global.h"
   
   
sl_config cfg;cfg_root_t cfg;
 int Verbose;  int Verbose;
 struct tagProc proc;  struct tagProc proc;
 FILE *lf;  FILE *lf;
Line 48  Err(const char *fmt, ...) Line 48  Err(const char *fmt, ...)
 static void  static void
 initProg()  initProg()
 {  {
           char d[MAXPATHLEN];
   
         proc.proc_uid = getuid();          proc.proc_uid = getuid();
         proc.proc_gid = getgid();          proc.proc_gid = getgid();
         proc.proc_prio = getpriority(PRIO_PROCESS, 0);          proc.proc_prio = getpriority(PRIO_PROCESS, 0);
        getcwd(proc.proc_dir, sizeof proc.proc_dir);        getcwd(d, sizeof d);
         AIT_SET_STR(&proc.proc_dir, d);
   
 #if 0  #if 0
         lf = fopen(DEFAULT_LOG, "a");          lf = fopen(DEFAULT_LOG, "a");
Line 109  SetClass() Line 112  SetClass()
                 endpwent();                  endpwent();
                 return -1;                  return -1;
         } else           } else 
                strlcpy(proc.proc_class, pass->pw_class, sizeof proc.proc_class);                AIT_SET_STR(&proc.proc_class, pass->pw_class);
   
        cap = login_getclass(proc.proc_class);        cap = login_getclass(AIT_GET_STR(&proc.proc_class));
         if (!cap) {          if (!cap) {
                Err("Error:: Cant get login class %s", proc.proc_class);                Err("Error:: Cant get login class %s", AIT_GET_STR(&proc.proc_class));
                 endpwent();                  endpwent();
                 return -1;                  return -1;
         }          }
   
         if (setusercontext(cap, pass, proc.proc_uid, LOGIN_SETALL)) {          if (setusercontext(cap, pass, proc.proc_uid, LOGIN_SETALL)) {
                Err("Error:: Cant set login class %s", proc.proc_class);                Err("Error:: Cant set login class %s", AIT_GET_STR(&proc.proc_class));
                 login_close(cap);                  login_close(cap);
                 endpwent();                  endpwent();
                 return -1;                  return -1;
Line 133  SetClass() Line 136  SetClass()
 static int  static int
 LoadCfgData(char flg)  LoadCfgData(char flg)
 {  {
        char *str, mode = 0;        const char *str;
         char mode = 0;
   
        str = (char*) cfg_GetAttribute(&cfg, CFG("global"), CFG("mode"));        str = cfg_getAttribute(&cfg, "global", "mode");
         if (!str) {          if (!str) {
                 Err("Error:: Unknown mode ...");                  Err("Error:: Unknown mode ...");
                 return -1;                  return -1;
         }          }
         if (!strcasecmp(str, "SCRIPT")) {          if (!strcasecmp(str, "SCRIPT")) {
                 mode = 1;                  mode = 1;
                if (setUIDGID(flg, proc.proc_name) == -1)                if (setUIDGID(flg, AIT_GET_STR(&proc.proc_name)) == -1)
                         return -1;                          return -1;
         } else if (!strcasecmp(str, "FILE")) {          } else if (!strcasecmp(str, "FILE")) {
                 mode = 2;                  mode = 2;
                if (setUIDGID(flg, proc.proc_name) == -1)                if (setUIDGID(flg, AIT_GET_STR(&proc.proc_name)) == -1)
                         return -1;                          return -1;
         } else if (!strcasecmp(str, "DIR") &&           } else if (!strcasecmp(str, "DIR") && 
                        (str = (char*) cfg_GetAttribute(&cfg, CFG("global"), CFG("directory")))) {                        (str = cfg_getAttribute(&cfg, "global", "directory"))) {
                 mode = 3;                  mode = 3;
                 if (!(flg & 8))                  if (!(flg & 8))
                        strlcpy(proc.proc_dir, str, sizeof proc.proc_dir);                        AIT_SET_STR(&proc.proc_dir, str);
   
                if (setUIDGID(flg, proc.proc_dir) == -1)                if (setUIDGID(flg, AIT_GET_STR(&proc.proc_dir)) == -1)
                         return -1;                          return -1;
         } else {          } else {
                 Err("Error:: Unknown mode %s", str);                  Err("Error:: Unknown mode %s", str);
                 return -1;                  return -1;
         }          }
         if (!(flg & 4)) {          if (!(flg & 4)) {
                str = (char*) cfg_GetAttribute(&cfg, CFG("global"), CFG("priority"));                str = cfg_getAttribute(&cfg, "global", "priority");
                 if (str)                  if (str)
                         proc.proc_prio = strtol(str, NULL, 10);                          proc.proc_prio = strtol(str, NULL, 10);
         }          }
   
         /* find associate extension */          /* find associate extension */
        str = strrchr(proc.proc_name, '.');        str = strrchr(AIT_GET_STR(&proc.proc_name), '.');
         if (str) {          if (str) {
                 str++;                  str++;
                 str = (*str) ? str : "default";                  str = (*str) ? str : "default";
                switch (cfg_LoadAttribute(&cfg, CFG("associate"), CFG(str),                 switch (cfg_loadAttribute(&cfg, "associate", str, &proc.proc_cmd, NULL)) {
                                        CFG(proc.proc_cmd), sizeof proc.proc_cmd, NULL)) { 
                         case -1:                          case -1:
                                Err("Error:: can`t load attribute #%d - %s\n", cfg_GetErrno(), cfg_GetError());                                ELIBERR(cfg);
                                 return -1;                                  return -1;
                         case 0:                          case 0:
                                cfg_LoadAttribute(&cfg, CFG("associate"), CFG("default"),                                 cfg_loadAttribute(&cfg, "associate", "default", &proc.proc_cmd, DEFAULT_CMD);
                                                CFG(proc.proc_cmd), sizeof proc.proc_cmd, DEFAULT_CMD); 
                 }                  }
         } else          } else
                strlcpy(proc.proc_cmd, DEFAULT_CMD, sizeof proc.proc_cmd);                AIT_SET_STR(&proc.proc_cmd, DEFAULT_CMD);
   
         return 0;          return 0;
 }  }
Line 196  Run(char **argv) Line 198  Run(char **argv)
         if (!argv)          if (!argv)
                 return -1;                  return -1;
   
        n = io_arrayMake(proc.proc_cmd, 0, " \t", &acmd);        n = array_Args(AIT_GET_STR(&proc.proc_cmd), 0, " \t", &acmd);
         if (n < 1)          if (n < 1)
                 return -1;                  return -1;
        if (!(aarg = io_arrayFrom((const char**) argv, 0))) {        if (!(aarg = array_From((const char***) &argv, 0))) {
                io_arrayDestroy(&acmd);                array_Destroy(&acmd);
                 return -1;                  return -1;
        } else if (*io_arrayGet(acmd, 0, char*) == '!') {        } else if (*array(acmd, 0, char*) == '!') {
                if (io_arrayGrow(acmd, 0)) {                if (array_Grow(acmd, 0, 0)) {
                        io_arrayDestroy(&aarg);                        array_Destroy(&aarg);
                        io_arrayDestroy(&acmd);                        array_Destroy(&acmd);
                         return -1;                          return -1;
                 }                  }
                cmd = io_arrayGet(aarg, 0, char*);                cmd = array(aarg, 0, char*);
         } else          } else
                cmd = io_arrayGet(acmd, 0, char*);                cmd = array(acmd, 0, char*);
   
        if (io_arrayConcat(acmd, aarg) == -1) {        if (array_Concat(acmd, aarg) == -1) {
                io_arrayDestroy(&aarg);                array_Destroy(&aarg);
                io_arrayDestroy(&acmd);                array_Destroy(&acmd);
                 return -1;                  return -1;
         }          }
        io_arrayDestroy(&aarg);        array_Destroy(&aarg);
        if (!(args = io_arrayTo(acmd))) {        if (!(args = array_To(acmd))) {
                io_arrayDestroy(&acmd);                array_Destroy(&acmd);
                 return -1;                  return -1;
         }          }
        io_arrayDestroy(&acmd);        array_Destroy(&acmd);
   
         if (SetClass()) {          if (SetClass()) {
                 if (args)                  if (args)
Line 252  Run(char **argv) Line 254  Run(char **argv)
         */          */
   
         Log(0, "UID:GID=%d:%d Prio=%d Class=%s Name=%s Dir=%s Cmd=%s Script=%s",           Log(0, "UID:GID=%d:%d Prio=%d Class=%s Name=%s Dir=%s Cmd=%s Script=%s", 
                        proc.proc_uid, proc.proc_gid, proc.proc_prio, proc.proc_class,                         proc.proc_uid, proc.proc_gid, proc.proc_prio, AIT_GET_STR(&proc.proc_class), 
                        proc.proc_name, proc.proc_dir, proc.proc_cmd, getenv("PATH_TRANSLATED"));                        AIT_GET_STR(&proc.proc_name), AIT_GET_STR(&proc.proc_dir), 
                         AIT_GET_STR(&proc.proc_cmd), getenv("PATH_TRANSLATED"));
   
         if (3 <= Verbose) {          if (3 <= Verbose) {
                 char **el = args - 1;                  char **el = args - 1;
Line 295  main(int argc, char **argv) Line 298  main(int argc, char **argv)
                                 lf = f;                                  lf = f;
                                 break;                                  break;
                         case 'd':                          case 'd':
                                strlcpy(proc.proc_dir, optarg, sizeof proc.proc_dir);                                AIT_SET_STR(&proc.proc_dir, optarg);
                                 flg |= 8;                                  flg |= 8;
                                 break;                                  break;
                         case 'p':                          case 'p':
Line 359  main(int argc, char **argv) Line 362  main(int argc, char **argv)
                                 fclose(lf);                                  fclose(lf);
                         return 1;                          return 1;
                 } else                  } else
                        strlcpy(proc.proc_name, str, sizeof proc.proc_name);                        AIT_SET_STR(&proc.proc_name, str);
         } else          } else
                strlcpy(proc.proc_name, *argv, sizeof proc.proc_name);                AIT_SET_STR(&proc.proc_name, *argv);
         Log(2, "Try to load config %s", szCfg);          Log(2, "Try to load config %s", szCfg);
        if (LoadConfig(szCfg, &cfg)) {        if (cfgLoadConfig(szCfg, &cfg)) {
                 Err("Error:: can`t load config #%d - %s\n", cfg_GetErrno(), cfg_GetError());                  Err("Error:: can`t load config #%d - %s\n", cfg_GetErrno(), cfg_GetError());
                 if (fileno(lf) > 2)                  if (fileno(lf) > 2)
                         fclose(lf);                          fclose(lf);
                 return 2;                  return 2;
         } else          } else
                 if (LoadCfgData(flg) == -1) {                  if (LoadCfgData(flg) == -1) {
                        UnloadConfig(&cfg);                        cfgUnloadConfig(&cfg);
                         if (fileno(lf) > 2)                          if (fileno(lf) > 2)
                                 fclose(lf);                                  fclose(lf);
                         closelog();                          closelog();
                         return 3;                          return 3;
                 }                  }
        UnloadConfig(&cfg);        cfgUnloadConfig(&cfg);
   
         if (Run(argv) == -1) {          if (Run(argv) == -1) {
                 if (fileno(lf) > 2)                  if (fileno(lf) > 2)

Removed from v.1.2.2.2  
changed lines
  Added in v.1.3.2.1


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