diff -r 48b0adfe3059 -r 4866573c6944 librazor/rpm.c --- a/librazor/rpm.c Thu Jan 22 22:54:45 2009 +0000 +++ b/librazor/rpm.c Thu Feb 05 22:43:29 2009 +0000 @@ -742,9 +742,12 @@ { #if HAVE_CHROOT int pid, status, fd[2]; -#else +#if HAVE_LUA + int save_root, retval; +#endif +#else /* HAVE_CHROOT */ FILE *fp; -#endif +#endif /* HAVE_CHROOT */ const char *script = NULL, *program = NULL; program = razor_rpm_get_indirect(installer->rpm, program_tag, NULL); @@ -764,6 +767,50 @@ #else program = "/bin/sh"; #endif + } else if (!strcmp(program, "")) { +#if HAVE_LUA + const char *name; + + switch(script_tag) { + case RPMTAG_PREIN: + name = "%pre"; + break; + case RPMTAG_POSTIN: + name = "%post"; + break; + case RPMTAG_PREUN: + name = "%preun"; + break; + case RPMTAG_POSTUN: + name = "%postun"; + break; + default: + name = "script"; + break; + } +#if HAVE_CHROOT + if (geteuid() == 0) { + save_root = open("/", O_RDONLY, 0); + if (chroot(installer->root) < 0) { + fprintf(stderr, "failed to chroot to %s: %s\n", + installer->root, strerror(errno)); + exit(-1); + } + retval = run_lua_script(NULL, name, script, -1); + fchdir(save_root); + close(save_root); + chroot("."); + } else +#endif + { + retval = run_lua_script(installer->root, name, script, + -1); + } + return retval; +#else /* HAVE_LUA */ + fprintf(stderr, "lua not available to run script\n"); + return -1; +#endif /* HAVE_LUA */ } #if HAVE_CHROOT