Diff for /suX/src/sux.c between versions 1.3.2.4 and 1.5.2.2

version 1.3.2.4, 2013/04/09 12:55:51 version 1.5.2.2, 2015/06/17 14:01:33
Line 26  Log(int lvl, const char *fmt, ...) Line 26  Log(int lvl, const char *fmt, ...)
                 vfprintf(lf, fmt, lst);                  vfprintf(lf, fmt, lst);
                 va_end(lst);                  va_end(lst);
                 fprintf(lf, "\n");                  fprintf(lf, "\n");
                vsyslog(LOG_WARNING, fmt, cp);                vsyslog(LOG_INFO, fmt, cp);
                 va_end(cp);                  va_end(cp);
         }          }
 }  }
Line 48  Err(const char *fmt, ...) Line 48  Err(const char *fmt, ...)
 static inline void  static inline void
 DumpProc(const char *txt)  DumpProc(const char *txt)
 {  {
        Log(0, "%s:: UID:GID=%d:%d Prio=%d Class=%s Name=%s Dir=%s Cmd=%s Script=%s From=%s:%s%s",         Log(1, "%s:: uid:gid=%d:%d UID:GID=%d:%d Prio=%d Class=%s Name=%s Dir=%s Cmd=%s "
                        txt ? txt : __func__, AIT_GET_I16(&proc.proc_uid),                         "Script=%s From=%s:%s Get=%s", txt ? txt : __func__
                         geteuid(), getegid(), AIT_GET_I16(&proc.proc_uid), 
                         AIT_GET_I16(&proc.proc_gid), AIT_GET_I32(&proc.proc_prio),                           AIT_GET_I16(&proc.proc_gid), AIT_GET_I32(&proc.proc_prio), 
                         AIT_GET_STR(&proc.proc_class), AIT_GET_STR(&proc.proc_name),                           AIT_GET_STR(&proc.proc_class), AIT_GET_STR(&proc.proc_name), 
                         AIT_GET_STR(&proc.proc_dir), AIT_GET_STR(&proc.proc_cmd),                           AIT_GET_STR(&proc.proc_dir), AIT_GET_STR(&proc.proc_cmd), 
Line 57  DumpProc(const char *txt) Line 58  DumpProc(const char *txt)
                         getenv("REMOTE_PORT"), getenv("REQUEST_URI"));                          getenv("REMOTE_PORT"), getenv("REQUEST_URI"));
 }  }
   
static voidstatic int
 initProg()  initProg()
 {  {
         char d[MAXPATHLEN];  
   
         AIT_SET_I16(&proc.proc_uid, getuid());          AIT_SET_I16(&proc.proc_uid, getuid());
         AIT_SET_I16(&proc.proc_gid, getgid());          AIT_SET_I16(&proc.proc_gid, getgid());
         AIT_SET_I32(&proc.proc_prio, getpriority(PRIO_PROCESS, 0));          AIT_SET_I32(&proc.proc_prio, getpriority(PRIO_PROCESS, 0));
         AIT_INIT_VAL2(&proc.proc_class, string);          AIT_INIT_VAL2(&proc.proc_class, string);
        getcwd(d, sizeof d);        AIT_INIT_VAL2(&proc.proc_dir, string);
        AIT_SET_STR(&proc.proc_dir, d); 
         AIT_INIT_VAL2(&proc.proc_name, string);          AIT_INIT_VAL2(&proc.proc_name, string);
         AIT_INIT_VAL2(&proc.proc_cmd, string);          AIT_INIT_VAL2(&proc.proc_cmd, string);
   
Line 78  initProg() Line 76  initProg()
                 lf = stdout;                  lf = stdout;
   
         openlog(PACKAGE_NAME, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER);          openlog(PACKAGE_NAME, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER);
           return 0;
 }  }
   
 static void  static void
Line 97  Usage() Line 96  Usage()
 {  {
         printf( " -= suX =- suExecutor designed for web based applicaions\n"          printf( " -= suX =- suExecutor designed for web based applicaions\n"
                 "(C)`11 AITNET ltd - Sofia/Bulgaria - <office@aitnet.org>\n\n"                  "(C)`11 AITNET ltd - Sofia/Bulgaria - <office@aitnet.org>\n\n"
                " Syntax: %s [options] <program> [arguments]\n"                " Syntax: %s [options] <program|-> [arguments]\n"
                 "\t-u <user>\t\t\tUser for suID\n"                  "\t-u <user>\t\t\tUser for suID\n"
                 "\t-g <group>\t\t\tGroup for suID\n"                  "\t-g <group>\t\t\tGroup for suID\n"
                 "\t-p <priority (-20..20)>\t\tExecute with priority\n"                  "\t-p <priority (-20..20)>\t\tExecute with priority\n"
Line 114  static inline int Line 113  static inline int
 setUIDGID(char flg, const char *name)  setUIDGID(char flg, const char *name)
 {  {
         struct stat sb;          struct stat sb;
           struct passwd *pass;
           short uid, gid;
   
        if (stat(name, &sb) == -1) {        if (name) {
                ESYSERR(0);                if (stat(name, &sb) == -1) {
                return -1;                        ESYSERR(0);
                         return -1;
                 }
                 uid = sb.st_uid;
                 gid = sb.st_gid;
         } else {
                 pass = getpwnam(getenv("SUX_USER") ? getenv("SUX_USER") : DEFAULT_SUX_USER);
                 if (!pass) {
                         Err("Error:: User %s not found", getenv("SUX_USER"));
                         endpwent();
                         return -1;
                 }
                 uid = pass->pw_uid;
                 gid = pass->pw_gid;
                 endpwent();
         }          }
   
         if (!(flg & SUX_GET_UID))          if (!(flg & SUX_GET_UID))
                AIT_SET_I16(&proc.proc_uid, sb.st_uid);                AIT_SET_I16(&proc.proc_uid, uid);
         if (!(flg & SUX_GET_GID))          if (!(flg & SUX_GET_GID))
                AIT_SET_I16(&proc.proc_gid, sb.st_gid);                AIT_SET_I16(&proc.proc_gid, gid);
   
         return 0;          return 0;
 }  }
   
 static inline int  static inline int
SetClass()setClassDir()
 {  {
         login_cap_t *cap;  
         struct passwd *pass;          struct passwd *pass;
           int ret = 0;
   
         pass = getpwuid(AIT_GET_I16(&proc.proc_uid));          pass = getpwuid(AIT_GET_I16(&proc.proc_uid));
         if (!pass) {          if (!pass) {
                 Err("Error:: User with this UID %d not found", AIT_GET_I16(&proc.proc_uid));                  Err("Error:: User with this UID %d not found", AIT_GET_I16(&proc.proc_uid));
                endpwent();                ret = -1;
                return -1;        } else {
        } else  
                 AIT_SET_STR(&proc.proc_class, pass->pw_class);                  AIT_SET_STR(&proc.proc_class, pass->pw_class);
                   AIT_SET_STR(&proc.proc_dir, pass->pw_dir);
   
        cap = login_getclass(AIT_GET_STR(&proc.proc_class));                if (setusercontext(NULL, pass, AIT_GET_I16(&proc.proc_uid), 
        if (!cap) {                                        LOGIN_SETLOGIN | LOGIN_SETGROUP | LOGIN_SETUSER | 
                Err("Error:: Cant get login class %s", AIT_GET_STR(&proc.proc_class));                                        LOGIN_SETPRIORITY | LOGIN_SETRESOURCES)) {
                endpwent();                        Err("Error:: Can't set login class %s", AIT_GET_STR(&proc.proc_class));
                return -1;                        ret = -1;
                 }
         }          }
   
         if (setusercontext(cap, pass, AIT_GET_I16(&proc.proc_uid), LOGIN_SETALL)) {  
                 Err("Error:: Cant set login class %s", AIT_GET_STR(&proc.proc_class));  
                 login_close(cap);  
                 endpwent();  
                 return -1;  
         }  
   
         login_close(cap);  
         endpwent();          endpwent();
        return 0;        return ret;
 }  }
   
 static int  static int
Line 174  LoadCfgData(char flg) Line 182  LoadCfgData(char flg)
         }          }
         if (!strcasecmp(str, "SCRIPT")) {          if (!strcasecmp(str, "SCRIPT")) {
                 mode = 1;                  mode = 1;
                if (setUIDGID(flg, AIT_GET_STR(&proc.proc_name)) == -1)                if (setUIDGID(flg, (getenv("SUX_USER") ? NULL : getenv("PATH_TRANSLATED"))) == -1)
                         return -1;                          return -1;
         } else if (!strcasecmp(str, "FILE")) {          } else if (!strcasecmp(str, "FILE")) {
                 mode = 2;                  mode = 2;
                 if (setUIDGID(flg, AIT_GET_STR(&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 = cfg_getAttribute(&cfg, "global", "directory"))) { 
                 mode = 3;                  mode = 3;
                if (!(flg & SUX_GET_DIR))                str = AIT_GET_STR(&proc.proc_dir) ? AIT_GET_STR(&proc.proc_dir) : ".";
                        AIT_SET_STR(&proc.proc_dir, str);                if (setUIDGID(flg, str) == -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);
Line 208  LoadCfgData(char flg) Line 213  LoadCfgData(char flg)
                                 ELIBERR(cfg);                                  ELIBERR(cfg);
                                 return -1;                                  return -1;
                         case 0:                          case 0:
                                cfg_loadAttribute(&cfg, "associate", "default", &proc.proc_cmd, DEFAULT_CMD);                                cfg_loadAttribute(&cfg, "associate", "default", 
                                                 &proc.proc_cmd, DEFAULT_CMD);
                 }                  }
         } else          } else
                 AIT_SET_STR(&proc.proc_cmd, DEFAULT_CMD);                  AIT_SET_STR(&proc.proc_cmd, DEFAULT_CMD);
Line 232  Run(char **argv, char flg) Line 238  Run(char **argv, char flg)
         if (!(aarg = array_From((const char***) &argv, 0))) {          if (!(aarg = array_From((const char***) &argv, 0))) {
                 array_Destroy(&acmd);                  array_Destroy(&acmd);
                 return -1;                  return -1;
        } else if (*array(acmd, 0, char*) == '!') {        }
         /* '!' exclude associated wrapper aka direct args execution */
         if (*array(acmd, 0, char*) == '!') {
                 if (array_Grow(acmd, 0, 0)) {                  if (array_Grow(acmd, 0, 0)) {
                         array_Destroy(&aarg);                          array_Destroy(&aarg);
                         array_Destroy(&acmd);                          array_Destroy(&acmd);
Line 242  Run(char **argv, char flg) Line 250  Run(char **argv, char flg)
         } else          } else
                 cmd = array(acmd, 0, char*);                  cmd = array(acmd, 0, char*);
   
        if (array_Concat(acmd, aarg) == -1) {        if (!(flg & SUX_GET_STDIN) && array_Concat(acmd, aarg) == -1) {
                 array_Destroy(&aarg);                  array_Destroy(&aarg);
                 array_Destroy(&acmd);                  array_Destroy(&acmd);
                 return -1;                  return -1;
Line 254  Run(char **argv, char flg) Line 262  Run(char **argv, char flg)
         }          }
         array_Destroy(&acmd);          array_Destroy(&acmd);
   
        if (SetClass()) {        if (setClassDir()) {
                 if (args)                  if (args)
                         e_free(args);                          e_free(args);
                 return -1;                  return -1;
         }          }
   
         if (flg & SUX_GET_FORCE) {          if (flg & SUX_GET_FORCE) {
                if (setgid(AIT_GET_I16(&proc.proc_gid)) == -1) {                if (setegid(AIT_GET_I16(&proc.proc_gid)) == -1)
                        ESYSERR(0);                        goto err;
                        if (args)                if (seteuid(AIT_GET_I16(&proc.proc_uid)) == -1)
                                free(args);                        goto err;
                        return -1;                if (setpriority(PRIO_PROCESS, 0, AIT_GET_I32(&proc.proc_prio)) == -1)
                }                        goto err;
                if (setuid(AIT_GET_I16(&proc.proc_uid)) == -1) { 
                        ESYSERR(0); 
                        if (args) 
                                free(args); 
                        return -1; 
                } 
                if (setpriority(PRIO_PROCESS, 0, AIT_GET_I32(&proc.proc_prio)) == -1) { 
                        ESYSERR(0); 
                        if (args) 
                                free(args); 
                        return -1; 
                } 
         }          }
   
         DumpProc(__func__);  
   
         EVERBS(3) {          EVERBS(3) {
                 char **el = args - 1;                  char **el = args - 1;
                 while (*++el)                  while (*++el)
                         Log(3, "args: %s", *el);                          Log(3, "args: %s", *el);
         }          }
   
           DumpProc(__func__);
   
         fflush(lf);          fflush(lf);
   
         execve(cmd, args, environ);          execve(cmd, args, environ);
        if (args)err:
                free(args); 
         ESYSERR(0);          ESYSERR(0);
           if (args)
                   e_free(args);
         return -1;          return -1;
 }  }
   
Line 393  main(int argc, char **argv) Line 390  main(int argc, char **argv)
                         return 1;                          return 1;
                 } else                  } else
                         AIT_SET_STR(&proc.proc_name, str);                          AIT_SET_STR(&proc.proc_name, str);
        } else        } else if (strcmp(*argv, "-"))
                 AIT_SET_STR(&proc.proc_name, *argv);                  AIT_SET_STR(&proc.proc_name, *argv);
           else {
                   flg |= SUX_GET_STDIN;
                   AIT_SET_STR(&proc.proc_name, "-.stdin");        /* hack for associate to stdin */
           }
         Log(2, "Try to load config %s", szCfg);          Log(2, "Try to load config %s", szCfg);
         if (cfgLoadConfig(szCfg, &cfg)) {          if (cfgLoadConfig(szCfg, &cfg)) {
                 ELIBERR(cfg);                  ELIBERR(cfg);

Removed from v.1.3.2.4  
changed lines
  Added in v.1.5.2.2


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