Diff for /suX/src/sux.c between versions 1.4 and 1.5

version 1.4, 2013/04/09 15:59:44 version 1.5, 2013/04/10 00:04:11
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(0, "%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 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"));
                 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()
 {  {
         struct passwd *pass;          struct passwd *pass;
         int ret = 0;          int ret = 0;
Line 137  SetClass() Line 152  SetClass()
         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);
   
        if (setusercontext(NULL, pass, AIT_GET_I16(&proc.proc_uid),                 if (setusercontext(NULL, pass, AIT_GET_I16(&proc.proc_uid), 
                                LOGIN_SETRESOURCES | LOGIN_SETGROUP | LOGIN_SETLOGIN |                                         LOGIN_SETLOGIN | LOGIN_SETGROUP | LOGIN_SETUSER | 
                                LOGIN_SETPRIORITY)) {                                        LOGIN_SETPRIORITY | LOGIN_SETRESOURCES)) {
                Err("Error:: Cant set login class %s", AIT_GET_STR(&proc.proc_class));                        Err("Error:: Can't set login class %s", AIT_GET_STR(&proc.proc_class));
                ret = -1;                        ret = -1;
                 }
         }          }
   
         endpwent();          endpwent();
Line 164  LoadCfgData(char flg) Line 180  LoadCfgData(char flg)
                 Err("Error:: Unknown mode ...");                  Err("Error:: Unknown mode ...");
                 return -1;                  return -1;
         }          }
        if (!strcasecmp(str, "SCRIPT")) {        if (!strcasecmp(str, "SCRIPT") && getenv("SUX_USER")) {
                 mode = 1;                  mode = 1;
                if (setUIDGID(flg, AIT_GET_STR(&proc.proc_name)) == -1)                if (setUIDGID(flg, NULL) == -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 200  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 246  Run(char **argv, char flg) Line 260  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 (setegid(AIT_GET_I16(&proc.proc_gid)) == -1)                  if (setegid(AIT_GET_I16(&proc.proc_gid)) == -1)
                         goto err;                          goto err;
                 if (seteuid(AIT_GET_I16(&proc.proc_uid)) == -1)                  if (seteuid(AIT_GET_I16(&proc.proc_uid)) == -1)
                         goto err;                          goto err;
                         */  
                 if (setpriority(PRIO_PROCESS, 0, AIT_GET_I32(&proc.proc_prio)) == -1)                  if (setpriority(PRIO_PROCESS, 0, AIT_GET_I32(&proc.proc_prio)) == -1)
                         goto err;                          goto err;
         }          }

Removed from v.1.4  
changed lines
  Added in v.1.5


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