about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-09-12 08:34:21 +0000
committerEric Wong <e@80x24.org>2019-09-14 09:24:27 +0000
commit25c41ff78d0a65029e410b5478430b1061df1dae (patch)
tree5fdc86205b9e62d5c9b80a12b4bb34ad2f7378e7 /lib
parente5631087d3862823d0d4854a8dfc1258f91cb115 (diff)
downloadpublic-inbox-25c41ff78d0a65029e410b5478430b1061df1dae.tar.gz
Might as well share some code for temporary file creation
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/DS.pm14
-rw-r--r--lib/PublicInbox/Tmpfile.pm8
2 files changed, 8 insertions, 14 deletions
diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm
index 1e51dc41..30a9641a 100644
--- a/lib/PublicInbox/DS.pm
+++ b/lib/PublicInbox/DS.pm
@@ -26,6 +26,7 @@ use warnings;
 use 5.010_001;
 
 use PublicInbox::Syscall qw(:epoll);
+use PublicInbox::Tmpfile;
 
 use fields ('sock',              # underlying socket
             'rbuf',              # scalarref, usually undef
@@ -33,7 +34,7 @@ use fields ('sock',              # underlying socket
             'wbuf_off',  # offset into first element of wbuf to start writing at
             );
 
-use Errno  qw(EAGAIN EINVAL EEXIST);
+use Errno  qw(EAGAIN EINVAL);
 use Carp   qw(croak confess carp);
 require File::Spec;
 
@@ -488,15 +489,8 @@ sub drop {
 # PerlIO::mmap or PerlIO::scalar if needed
 sub tmpio ($$$) {
     my ($self, $bref, $off) = @_;
-    my $fh; # open(my $fh, '+>>', undef) doesn't set O_APPEND
-    do {
-        my $fn = File::Spec->tmpdir . '/wbuf-' . rand;
-        if (sysopen($fh, $fn, O_RDWR|O_CREAT|O_EXCL|O_APPEND, 0600)) { # likely
-            unlink($fn) or return drop($self, "unlink($fn) $!");
-        } elsif ($! != EEXIST) { # EMFILE/ENFILE/ENOSPC/ENOMEM
-            return drop($self, "open: $!");
-        }
-    } until (defined $fh);
+    my $fh = tmpfile('wbuf', $self->{sock}, 1) or
+        return drop($self, "tmpfile $!");
     $fh->autoflush(1);
     my $len = bytes::length($$bref) - $off;
     $fh->write($$bref, $len, $off) or return drop($self, "write ($len): $!");
diff --git a/lib/PublicInbox/Tmpfile.pm b/lib/PublicInbox/Tmpfile.pm
index 7fda100e..28e87f88 100644
--- a/lib/PublicInbox/Tmpfile.pm
+++ b/lib/PublicInbox/Tmpfile.pm
@@ -12,10 +12,9 @@ require File::Spec;
 # use tmpfile instead of open(..., '+>', undef) so we can get an
 # unlinked filename which makes sense when viewed with lsof
 # (at least on Linux)
-# TODO: O_APPEND support (this is the reason I'm not using File::Temp)
 # And if we ever stop caring to have debuggable filenames, O_TMPFILE :)
-sub tmpfile ($;$) {
-        my ($id, $sock) = @_;
+sub tmpfile ($;$$) {
+        my ($id, $sock, $append) = @_;
         if (defined $sock) {
                 # add the socket inode number so we can figure out which
                 # socket it belongs to
@@ -25,10 +24,11 @@ sub tmpfile ($;$) {
         $id =~ tr!/!^!;
 
         my $fl = O_RDWR | O_CREAT | O_EXCL;
+        $fl |= O_APPEND if $append;
         do {
                 my $fn = File::Spec->tmpdir . "/$id-".time.'-'.rand;
                 if (sysopen(my $fh, $fn, $fl, 0600)) { # likely
-                        unlink($fn) or die "unlink($fn): $!"; # FS broken
+                        unlink($fn) or warn "unlink($fn): $!"; # FS broken
                         return $fh; # success
                 }
         } while ($! == EEXIST);