--- suX/src/sux.c 2011/05/20 16:02:05 1.1.1.1 +++ suX/src/sux.c 2011/05/20 16:26:53 1.1.1.1.2.2 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ - * $Id: sux.c,v 1.1.1.1 2011/05/20 16:02:05 misho Exp $ + * $Id: sux.c,v 1.1.1.1.2.2 2011/05/20 16:26:53 misho Exp $ * *************************************************************************/ #include "global.h" @@ -12,6 +12,7 @@ sl_config cfg; int Verbose; struct tagProc proc; +FILE *lf; static inline void @@ -21,6 +22,7 @@ Log(int lvl, const char *fmt, ...) if (lvl <= Verbose) { va_start(lst, fmt); + vfprintf(lf, fmt, lst); vsyslog(LOG_WARNING, fmt, lst); va_end(lst); } @@ -32,6 +34,7 @@ Err(const char *fmt, ...) va_list lst; va_start(lst, fmt); + vfprintf(lf, fmt, lst); vsyslog(LOG_ERR, fmt, lst); va_end(lst); } @@ -44,6 +47,8 @@ initProg() proc.proc_prio = getpriority(PRIO_PROCESS, 0); getcwd(proc.proc_dir, sizeof proc.proc_dir); + lf = stdout; + openlog(PACKAGE_NAME, LOG_CONS | LOG_PID | LOG_NDELAY | LOG_PERROR, LOG_USER); } @@ -57,6 +62,7 @@ Usage() "\t-g \t\t\tGroup for suID\n" "\t-p \t\tExecute with priority\n" "\t-d \t\t\tDirectory for suID\n" + "\t-l \t\t\tLog file path (default:/var/log/suX.log)\n" "\t-v\t\t\t\tVerbose, (more -v, more verbosity)\n" "\t-h\t\t\t\tThis help screen!\n\n", PACKAGE_NAME); } @@ -231,6 +237,9 @@ Run(char **argv) return -1; } + Log(1, "UID:GID=%d:%d Prio=%d Class=%s Name=%s Dir=%s Cmd=%s\n", proc.proc_uid, proc.proc_gid, + proc.proc_prio, proc.proc_class, proc.proc_name, proc.proc_dir, proc.proc_cmd); + if (3 <= Verbose) { char **el = args - 1; while (*++el) @@ -248,15 +257,29 @@ Run(char **argv) int main(int argc, char **argv) { - char ch, *str, szCfg[MAXPATHLEN], flg = 0; + char ch, *str, szCfg[MAXPATHLEN], szLog[MAXPATHLEN], flg = 0; struct passwd *pass; struct group *grp; + FILE *f; - initProg(*argv); + initProg(); strlcpy(szCfg, DEFAULT_CONFIG, sizeof szCfg); + strlcpy(szLog, DEFAULT_LOG, sizeof szLog); - while ((ch = getopt(argc, argv, "hvc:u:g:p:d:")) != -1) + while ((ch = getopt(argc, argv, "hvc:u:g:p:d:l:")) != -1) switch (ch) { + case 'l': + strlcpy(szLog, optarg, sizeof szLog); + f = fopen(szLog, "a+"); + if (!f) { + Err("Error:: logfile #%d - %s", errno, strerror(errno)); + return 1; + } else + if (flg & 16 && fileno(lf) > 2) + fclose(lf); + lf = f; + flg |= 16; + break; case 'd': strlcpy(proc.proc_dir, optarg, sizeof proc.proc_dir); flg |= 8; @@ -287,7 +310,6 @@ main(int argc, char **argv) break; case 'c': strlcpy(szCfg, optarg, sizeof szCfg); - flg++; break; case 'v': Verbose++; @@ -295,6 +317,8 @@ main(int argc, char **argv) case 'h': default: Usage(); + if (flg & 16) + fclose(lf); return 1; } argc -= optind; @@ -302,6 +326,8 @@ main(int argc, char **argv) if (!argc) { if (!(str = getenv("PATH_TRANSLATED"))) { Usage(); + if (flg & 16) + fclose(lf); return 1; } else strlcpy(proc.proc_name, str, sizeof proc.proc_name); @@ -310,23 +336,28 @@ main(int argc, char **argv) Log(2, "Try to load config %s", szCfg); if (LoadConfig(szCfg, &cfg)) { Err("Error:: can`t load config #%d - %s\n", cfg_GetErrno(), cfg_GetError()); + if (flg & 16) + fclose(lf); return 2; } else if (LoadCfgData(flg) == -1) { UnloadConfig(&cfg); + if (flg & 16) + fclose(lf); closelog(); return 3; } UnloadConfig(&cfg); - Log(1, "UID:GID=%d:%d Prio=%d Class=%s Name=%s Dir=%s Cmd=%s\n", proc.proc_uid, proc.proc_gid, - proc.proc_prio, proc.proc_class, proc.proc_name, proc.proc_dir, proc.proc_cmd); - if (Run(argv) == -1) { + if (flg & 16) + fclose(lf); closelog(); return 4; } + if (flg & 16) + fclose(lf); closelog(); return 0; }