summaryrefslogtreecommitdiffstats
path: root/lex.cgi
diff options
context:
space:
mode:
Diffstat (limited to 'lex.cgi')
-rwxr-xr-xlex.cgi30
1 files changed, 18 insertions, 12 deletions
diff --git a/lex.cgi b/lex.cgi
index da17fc5..255ab34 100755
--- a/lex.cgi
+++ b/lex.cgi
@@ -9,7 +9,7 @@ use File::Find;
use File::Path qw(make_path);
use OpenBSD::Pledge;
use OpenBSD::Unveil;
-use Time::HiRes qw(time);
+use Time::HiRes qw(gettimeofday time);
my $start_time = time();
@@ -39,6 +39,7 @@ BEGIN {
my $log_dir = "/var/log";
my $base_dir = "/var/lex";
+my $spool_dir = "/var/lex/spool";
my $keyring_file = "$base_dir/pubring.gpg";
unveil("/dev/null", "rw") or die "unveil /dev/null failed: $!";
@@ -257,24 +258,29 @@ unless (length($plain_text) > 0) {
respond_ok();
}
+my ($sec, $usec) = gettimeofday();
+my $spool_filename = sprintf("spool_%d%06d_%d.job", $sec, $usec, $$);
+my $tmp_spool_file = "$spool_dir/tmp/$spool_filename.tmp";
+my $spool_file = "$spool_dir/new/$spool_filename";
+
# Set umask so group gets read/write (0666 & ~0007 = 0660)
my $old_umask = umask(007);
-my $queue_file = "$base_dir/queue.txt";
-my $is_new = ! -e $queue_file;
-
-my $qfh;
-unless (open($qfh, '>>:utf8', $queue_file)) {
- log_msg("ERROR: Failed to append to $queue_file: $!");
+my $sfh;
+unless (open($sfh, '>:utf8', $tmp_spool_file)) {
+ umask($old_umask);
+ log_msg("ERROR: Failed to create $tmp_spool_file: $!");
respond_ok();
}
-if ($is_new) {
- my $tool_gid = getgrnam('tool');
- chown -1, $tool_gid, $queue_file;
+print $sfh $plain_text . "\n";
+close($sfh);
+
+unless (rename($tmp_spool_file, $spool_file)) {
+ umask($old_umask);
+ log_msg("ERROR: Failed to create $spool_file: $!");
+ respond_ok();
}
-print $qfh $plain_text . "\n";
-close($qfh);
umask($old_umask);
my $elapsed_ms = sprintf("%.2fms", (time() - $start_time) * 1000);