--- suX/src/sux.c 2013/04/09 08:29:20 1.3.2.2 +++ suX/src/sux.c 2013/04/09 08:56:57 1.3.2.3 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ - * $Id: sux.c,v 1.3.2.2 2013/04/09 08:29:20 misho Exp $ + * $Id: sux.c,v 1.3.2.3 2013/04/09 08:56:57 misho Exp $ * *************************************************************************/ #include "global.h" @@ -20,7 +20,7 @@ Log(int lvl, const char *fmt, ...) { va_list lst, cp; - if (lvl <= Verbose) { + EVERBS(lvl) { va_start(lst, fmt); va_copy(cp, lst); vfprintf(lf, fmt, lst); @@ -66,6 +66,18 @@ initProg() } static void +endProg() +{ + AIT_FREE_VAL(&proc.proc_uid); + AIT_FREE_VAL(&proc.proc_gid); + AIT_FREE_VAL(&proc.proc_prio); + AIT_FREE_VAL(&proc.proc_class); + AIT_FREE_VAL(&proc.proc_dir); + AIT_FREE_VAL(&proc.proc_name); + AIT_FREE_VAL(&proc.proc_cmd); +} + +static void Usage() { printf( " -= suX =- suExecutor designed for web based applicaions\n" @@ -78,6 +90,7 @@ Usage() "\t-C \t\t\tChroot to directory\n" "\t-c \t\t\tConfig file\n" "\t-l \t\t\tLog file path (default:/var/log/suX.log)\n" + "\t-o\t\t\t\tForce set UID,GID and Priority for program\n" "\t-v\t\t\t\tVerbose, (more -v, more verbosity)\n" "\t-h\t\t\t\tThis help screen!\n\n", PACKAGE_NAME); } @@ -88,13 +101,13 @@ setUIDGID(char flg, const char *name) struct stat sb; if (stat(name, &sb) == -1) { - Err("Error:: %s stat #%d - %s", name, errno, strerror(errno)); + ESYSERR(0); return -1; } - if (!(flg & 1)) + if (!(flg & SUX_GET_UID)) AIT_SET_I16(&proc.proc_uid, sb.st_uid); - if (!(flg & 2)) + if (!(flg & SUX_GET_GID)) AIT_SET_I16(&proc.proc_gid, sb.st_gid); return 0; @@ -108,7 +121,7 @@ SetClass() pass = getpwuid(AIT_GET_I16(&proc.proc_uid)); if (!pass) { - Err("Error:: User with this UID %d not found", proc.proc_uid); + Err("Error:: User with this UID %d not found", AIT_GET_I16(&proc.proc_uid)); endpwent(); return -1; } else @@ -155,7 +168,7 @@ LoadCfgData(char flg) } else if (!strcasecmp(str, "DIR") && (str = cfg_getAttribute(&cfg, "global", "directory"))) { mode = 3; - if (!(flg & 8)) + if (!(flg & SUX_GET_DIR)) AIT_SET_STR(&proc.proc_dir, str); if (setUIDGID(flg, AIT_GET_STR(&proc.proc_dir)) == -1) @@ -164,7 +177,7 @@ LoadCfgData(char flg) Err("Error:: Unknown mode %s", str); return -1; } - if (!(flg & 4)) { + if (!(flg & SUX_GET_PRIO)) { str = cfg_getAttribute(&cfg, "global", "priority"); if (str) AIT_SET_I32(&proc.proc_prio, strtol(str, NULL, 10)); @@ -189,7 +202,7 @@ LoadCfgData(char flg) } static int -Run(char **argv) +Run(char **argv, char flg) { char **args, *cmd; array_t *acmd, *aarg; @@ -228,37 +241,37 @@ Run(char **argv) if (SetClass()) { if (args) - free(args); + e_free(args); return -1; } - /* - if (setgid(proc.proc_gid) == -1) { - Err("Error:: setgid #%d - %s\n", errno, strerror(errno)); - if (args) - free(args); - return -1; + if (flg & SUX_GET_FORCE) { + if (setgid(AIT_GET_I16(&proc.proc_gid)) == -1) { + ESYSERR(0); + if (args) + free(args); + return -1; + } + 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; + } } - if (setuid(proc.proc_uid) == -1) { - Err("Error:: setuid #%d - %s\n", errno, strerror(errno)); - if (args) - free(args); - return -1; - } - if (setpriority(PRIO_PROCESS, 0, proc.proc_prio) == -1) { - Err("Error:: setpriority #%d - %s\n", errno, strerror(errno)); - if (args) - free(args); - return -1; - } - */ 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, AIT_GET_STR(&proc.proc_class), AIT_GET_STR(&proc.proc_name), AIT_GET_STR(&proc.proc_dir), AIT_GET_STR(&proc.proc_cmd), getenv("PATH_TRANSLATED")); - if (3 <= Verbose) { + EVERBS(3) { char **el = args - 1; while (*++el) Log(3, "args: %s", *el); @@ -269,7 +282,7 @@ Run(char **argv) execve(cmd, args, environ); if (args) free(args); - Err("Error:: in exec() #%d - %s", errno, strerror(errno)); + ESYSERR(0); return -1; } @@ -285,7 +298,7 @@ main(int argc, char **argv) initProg(); strlcpy(szCfg, DEFAULT_CONFIG, sizeof szCfg); - while ((ch = getopt(argc, argv, "hvC:c:u:g:p:d:l:")) != -1) + while ((ch = getopt(argc, argv, "hvoC:c:u:g:p:d:l:")) != -1) switch (ch) { case 'l': f = fopen(optarg, "a"); @@ -299,18 +312,18 @@ main(int argc, char **argv) break; case 'd': AIT_SET_STR(&proc.proc_dir, optarg); - flg |= 8; + flg |= SUX_GET_DIR; break; case 'p': AIT_SET_I32(&proc.proc_prio, strtol(optarg, NULL, 0)); - flg |= 4; + flg |= SUX_GET_PRIO; break; case 'g': setgrent(); grp = getgrnam(optarg); if (grp) { AIT_SET_I16(&proc.proc_gid, grp->gr_gid); - flg |= 2; + flg |= SUX_GET_GID; } else Err("Error:: Group not found!"); endgrent(); @@ -320,7 +333,7 @@ main(int argc, char **argv) pass = getpwnam(optarg); if (pass) { AIT_SET_I16(&proc.proc_uid, pass->pw_uid); - flg |= 1; + flg |= SUX_GET_UID; } else Err("Error:: User not found!"); endpwent(); @@ -335,12 +348,16 @@ main(int argc, char **argv) if ((wrk = strstr(str, optarg))) setenv("PATH_TRANSLATED", str + strlen(optarg), 42); break; + case 'o': + flg |= SUX_GET_FORCE; + break; case 'v': - Verbose++; + e_incVerbose; break; case 'h': default: Usage(); + endProg(); if (fileno(lf) > 2) fclose(lf); return 1; @@ -348,7 +365,7 @@ main(int argc, char **argv) argc -= optind; argv += optind; - if (2 <= Verbose) { + EVERBS(2) { for (pp = argv; *pp; pp++) Log(2, "Args=%s\n", *pp); for (pp = environ; *pp; pp++) @@ -358,6 +375,7 @@ main(int argc, char **argv) if (!argc) { if (!(str = getenv("PATH_TRANSLATED"))) { Usage(); + endProg(); if (fileno(lf) > 2) fclose(lf); return 1; @@ -367,13 +385,15 @@ main(int argc, char **argv) AIT_SET_STR(&proc.proc_name, *argv); Log(2, "Try to load config %s", szCfg); if (cfgLoadConfig(szCfg, &cfg)) { - Err("Error:: can`t load config #%d - %s\n", cfg_GetErrno(), cfg_GetError()); + ELIBERR(cfg); + endProg(); if (fileno(lf) > 2) fclose(lf); return 2; } else if (LoadCfgData(flg) == -1) { cfgUnloadConfig(&cfg); + endProg(); if (fileno(lf) > 2) fclose(lf); closelog(); @@ -381,13 +401,15 @@ main(int argc, char **argv) } cfgUnloadConfig(&cfg); - if (Run(argv) == -1) { + if (Run(argv, flg) == -1) { + endProg(); if (fileno(lf) > 2) fclose(lf); closelog(); return 4; } + endProg(); if (fileno(lf) > 2) fclose(lf); closelog();