1.1 --- a/librazor/rpm.c Thu Jan 22 22:54:45 2009 +0000
1.2 +++ b/librazor/rpm.c Thu Feb 05 22:43:29 2009 +0000
1.3 @@ -742,9 +742,12 @@
1.4 {
1.5 #if HAVE_CHROOT
1.6 int pid, status, fd[2];
1.7 -#else
1.8 +#if HAVE_LUA
1.9 + int save_root, retval;
1.10 +#endif
1.11 +#else /* HAVE_CHROOT */
1.12 FILE *fp;
1.13 -#endif
1.14 +#endif /* HAVE_CHROOT */
1.15 const char *script = NULL, *program = NULL;
1.16
1.17 program = razor_rpm_get_indirect(installer->rpm, program_tag, NULL);
1.18 @@ -764,6 +767,50 @@
1.19 #else
1.20 program = "/bin/sh";
1.21 #endif
1.22 + } else if (!strcmp(program, "<lua>")) {
1.23 +#if HAVE_LUA
1.24 + const char *name;
1.25 +
1.26 + switch(script_tag) {
1.27 + case RPMTAG_PREIN:
1.28 + name = "%pre";
1.29 + break;
1.30 + case RPMTAG_POSTIN:
1.31 + name = "%post";
1.32 + break;
1.33 + case RPMTAG_PREUN:
1.34 + name = "%preun";
1.35 + break;
1.36 + case RPMTAG_POSTUN:
1.37 + name = "%postun";
1.38 + break;
1.39 + default:
1.40 + name = "script";
1.41 + break;
1.42 + }
1.43 +#if HAVE_CHROOT
1.44 + if (geteuid() == 0) {
1.45 + save_root = open("/", O_RDONLY, 0);
1.46 + if (chroot(installer->root) < 0) {
1.47 + fprintf(stderr, "failed to chroot to %s: %s\n",
1.48 + installer->root, strerror(errno));
1.49 + exit(-1);
1.50 + }
1.51 + retval = run_lua_script(NULL, name, script, -1);
1.52 + fchdir(save_root);
1.53 + close(save_root);
1.54 + chroot(".");
1.55 + } else
1.56 +#endif
1.57 + {
1.58 + retval = run_lua_script(installer->root, name, script,
1.59 + -1);
1.60 + }
1.61 + return retval;
1.62 +#else /* HAVE_LUA */
1.63 + fprintf(stderr, "lua not available to run script\n");
1.64 + return -1;
1.65 +#endif /* HAVE_LUA */
1.66 }
1.67
1.68 #if HAVE_CHROOT