]> git.donarmstrong.com Git - debbugs.git/blob - scripts/errorlib.in
[project @ 2001-02-20 09:45:50 by ajt]
[debbugs.git] / scripts / errorlib.in
1 # -*- perl -*-
2 # $Id: errorlib.in,v 1.3 1999/12/01 18:04:01 gecko Exp $
3
4 sub F_SETLK { 6; } sub F_WRLCK{ 1; }
5 $flockstruct= 'sslll'; # And there ought to be something for this too.
6
7 sub unlockreadbugmerge {
8     local ($rv) = @_;
9     &unfilelock if $rv >= 2;
10     &unfilelock if $rv >= 1;
11 }
12
13 sub lockreadbugmerge {
14     local ($lref) = @_;
15     if (!&lockreadbug($lref)) { return 0; }
16     if (!length($s_mergedwith)) { return 1; }
17     &unfilelock;
18     &filelock('lock/merge');
19     if (!&lockreadbug($lref)) { &unfilelock; return 0; }
20     return 2;
21 }
22
23 sub lockreadbug {
24     local ($lref) = @_;
25     &filelock("lock/$lref");
26     if (!open(S,"db/$lref.status")) { &unfilelock; return 0; }
27     chop($s_originator= <S>);
28     chop($s_date= <S>);
29     chop($s_subject= <S>);
30     chop($s_msgid= <S>);
31     chop($s_package= <S>);
32     chop($s_keywords= <S>);
33     chop($s_done= <S>);
34     chop($s_forwarded= <S>);
35     chop($s_mergedwith= <S>);
36     chop($s_severity= <S>);
37     close(S);
38         $s_severity = 'normal' if $s_severity eq '';
39     return 1;
40 }
41
42 sub filelock {
43     # NB - NOT COMPATIBLE WITH `with-lock'
44     local ($lockfile,$flockpushno,$evalstring,$count,$errors,@s1,@s2) = @_;
45     $flockpushno= $#filelocks+1;
46     $count= 10; $errors= '';
47     for (;;) {
48         $evalstring= "
49             open(FLOCK${flockpushno},\"> \$lockfile\") || die \"open: \$!\";
50             \$flockwant= pack(\$flockstruct,&F_WRLCK,0,0,1,0);".
51                 ($] >= 5.000 ? "
52             fcntl(FLOCK$flockpushno,&F_SETLK,\$flockwant) || die \"setlk: \$!\";" : "
53             \$z= syscall(&SYS_fcntl,fileno(FLOCK$flockpushno),&F_SETLK,\$flockwant) < 0
54                  && die \"syscall fcntl setlk: \$!\";") ."
55             (\@s1= lstat(\$lockfile)) || die \"lstat: \$!\";
56             (\@s2= stat(FLOCK$flockpushno)) || die \"fstat: \$!\";
57             join(',',\@s1) eq join(',',\@s2) || die \"file switched\";
58             1;
59         ";
60         last if eval $evalstring;
61         $errors .= $@;
62         eval "close(FLOCK$flockpushno);";
63         if (--$count <=0) {
64             $errors =~ s/\n+$//;
65             &quit("failed to get lock on file $lockfile: $errors // $evalstring");
66         }
67         sleep 10;
68     }
69     push(@cleanups,'unfilelock');
70     push(@filelocks,$lockfile);
71 }
72
73 sub unfilelock {
74     local ($lockfile) = pop(@filelocks);
75     pop(@cleanups);
76     eval 'close(FLOCK'.($#filelocks+1).');' || warn "failed to close lock file: $!";
77     unlink($lockfile) || warn "failed to remove lock file: $!";
78 }
79
80 sub quit {
81     print DEBUG "quitting >$_[0]<\n";
82     local ($u);
83     while ($u= $cleanups[$#cleanups]) { &$u; }
84     die "*** $_[0]\n";
85 }
86
87 %saniarray= ('<','lt', '>','gt', '&','amp', '"','quot');
88
89 sub sani {
90     local ($in) = @_;
91     local ($out);
92     while ($in =~ m/[<>&"]/) {
93         $out.= $`. '&'. $saniarray{$&}. ';';
94         $in=$';
95     }
96     $out.= $in;
97     $out;
98 }
99
100 @severities= @gSeverityList;
101 @showseverities= @severities;
102 grep ($_= $_ eq '' ? $gDefaultSeverity : $_, @showseverities);
103 @strongseverities= @gStrongSeverities;
104 %displayshowseverities= %gSeverityDisplay;
105
106 1;