diff options
Diffstat (limited to 'lex.cgi')
| -rwxr-xr-x | lex.cgi | 30 |
1 files changed, 18 insertions, 12 deletions
@@ -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); |
