+#-----------------------------------------------------------------
+#
+# Generate a command which cleans environment, leaving only the
+# most important variables.
+# If any spec requires any additional environment it should
+# redefine %_preserve_env in following manner:
+#
+# # ADDITIONAL_VAR is required because [a good reason here]
+# %{expand:%%define _preserve_env %_preserve_env ADDITIONAL_VAR}
+
+%_preserve_env PATH HOME TMP TMPDIR
+
+%_clean_env env -i %(awk -vq="'" -vqq="\\"'\\"" -vq2q="'\\"'" 'BEGIN {
+ split("%{?_preserve_env:%_preserve_env}", P);
+ for (i in P) {
+ p = P[i];
+ if (ENVIRON[p]) {
+ split( ENVIRON[p], V, "" );
+ val = p "=";
+ for ( j = 1; j in V; j++ ) {
+ v = V[j];
+ if ( v == q )
+ v = qq;
+ else if ( v == "\\"" )
+ v = q2q;
+ else if ( v == "\\\\" )
+ v = "\\\\\\\\";
+ else
+ gsub( "[^a-zA-Z0-9/:._-]", "\\"&\\"", v );
+ val = val "" v;
+ }
+ printf( val " " );
+ }
+ }
+}')
+