Upgrade 4.0.17 clean.
[usit-rt.git] / lib / RT / Util.pm
CommitLineData
84fb5b46
MKG
1# BEGIN BPS TAGGED BLOCK {{{
2#
3# COPYRIGHT:
4#
403d7b0b 5# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
84fb5b46
MKG
6# <sales@bestpractical.com>
7#
8# (Except where explicitly superseded by other copyright notices)
9#
10#
11# LICENSE:
12#
13# This work is made available to you under the terms of Version 2 of
14# the GNU General Public License. A copy of that license should have
15# been provided with this software, but in any event can be snarfed
16# from www.gnu.org.
17#
18# This work is distributed in the hope that it will be useful, but
19# WITHOUT ANY WARRANTY; without even the implied warranty of
20# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21# General Public License for more details.
22#
23# You should have received a copy of the GNU General Public License
24# along with this program; if not, write to the Free Software
25# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26# 02110-1301 or visit their web page on the internet at
27# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
28#
29#
30# CONTRIBUTION SUBMISSION POLICY:
31#
32# (The following paragraph is not intended to limit the rights granted
33# to you to modify and distribute this software under the terms of
34# the GNU General Public License and is only of importance to you if
35# you choose to contribute your changes and enhancements to the
36# community by submitting them to Best Practical Solutions, LLC.)
37#
38# By intentionally submitting any modifications, corrections or
39# derivatives to this work, or any other work intended for use with
40# Request Tracker, to Best Practical Solutions, LLC, you confirm that
41# you are the copyright holder for those contributions and you grant
42# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
43# royalty-free, perpetual, license to use, copy, create derivative
44# works based on those contributions, and sublicense and distribute
45# those contributions and any derivatives thereof.
46#
47# END BPS TAGGED BLOCK }}}
48
49package RT::Util;
50use strict;
51use warnings;
52
53
54use base 'Exporter';
55our @EXPORT = qw/safe_run_child mime_recommended_filename/;
56
57sub safe_run_child (&) {
58 my $our_pid = $$;
59
60 # situation here is wierd, running external app
61 # involves fork+exec. At some point after fork,
62 # but before exec (or during) code can die in a
63 # child. Local is no help here as die throws
64 # error out of scope and locals are reset to old
65 # values. Instead we set values, eval code, check pid
66 # on failure and reset values only in our original
67 # process
01e3b242 68 my ($oldv_dbh, $oldv_rth);
84fb5b46 69 my $dbh = $RT::Handle->dbh;
01e3b242 70 $oldv_dbh = $dbh->{'InactiveDestroy'} if $dbh;
84fb5b46 71 $dbh->{'InactiveDestroy'} = 1 if $dbh;
01e3b242 72 $oldv_rth = $RT::Handle->{'DisconnectHandleOnDestroy'};
84fb5b46
MKG
73 $RT::Handle->{'DisconnectHandleOnDestroy'} = 0;
74
75 my ($reader, $writer);
76 pipe( $reader, $writer );
77
78 my @res;
79 my $want = wantarray;
80 eval {
81 my $code = shift;
82 local @ENV{ 'LANG', 'LC_ALL' } = ( 'C', 'C' );
83 unless ( defined $want ) {
84 $code->();
85 } elsif ( $want ) {
86 @res = $code->();
87 } else {
88 @res = ( scalar $code->() );
89 }
90 exit 0 if $our_pid != $$;
91 1;
92 } or do {
93 my $err = $@;
94 $err =~ s/^Stack:.*$//ms;
95 if ( $our_pid == $$ ) {
01e3b242
MKG
96 $dbh->{'InactiveDestroy'} = $oldv_dbh if $dbh;
97 $RT::Handle->{'DisconnectHandleOnDestroy'} = $oldv_rth;
84fb5b46
MKG
98 die "System Error: $err";
99 } else {
100 print $writer "System Error: $err";
101 exit 1;
102 }
103 };
104
105 close($writer);
106 $reader->blocking(0);
107 my ($response) = $reader->getline;
108 warn $response if $response;
109
01e3b242
MKG
110 $dbh->{'InactiveDestroy'} = $oldv_dbh if $dbh;
111 $RT::Handle->{'DisconnectHandleOnDestroy'} = $oldv_rth;
84fb5b46
MKG
112 return $want? (@res) : $res[0];
113}
114
115=head2 mime_recommended_filename( MIME::Head|MIME::Entity )
116
117# mimic our own recommended_filename
118# since MIME-tools 5.501, head->recommended_filename requires the head are
119# mime encoded, we don't meet this yet.
120
121=cut
122
123sub mime_recommended_filename {
124 my $head = shift;
125 $head = $head->head if $head->isa('MIME::Entity');
126
127 for my $attr_name (qw( content-disposition.filename content-type.name )) {
128 my $value = $head->mime_attr($attr_name);
129 if ( defined $value && $value =~ /\S/ ) {
130 return $value;
131 }
132 }
133 return;
134}
135
136RT::Base->_ImportOverlays();
137
1381;