librazor/rpm.c
changeset 352 4866573c6944
parent 351 48b0adfe3059
child 353 90b63682fdd7
     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