--- toast	2003/12/01 19:19:28	1.257
+++ toast	2003/12/04 04:28:20	1.258
@@ -157,6 +157,26 @@
 
 ##############################################################################
 
+sub whilefile(&$)
+{
+  my($sub, $file) = @_;
+  local(*FILE, $_);
+  open(FILE, "<$file") || error("open $file for read: $!");
+  while(defined($_ = <FILE>) && &$sub($_)) { }
+  close(FILE) || error("close $file for read: $!");
+  !defined($_);
+}
+
+sub readfile($)
+{
+  my($file) = @_;
+  my(@result);
+  whilefile { push(@result, $_) } $file;
+  @result;
+}
+
+##############################################################################
+
 BEGIN
 {
   my($uid, $euid) = ($<, $>);
@@ -243,16 +263,14 @@
     error unless isopt($name);
     return $optloaded{$name} if %optloaded;
     $optloaded{1} = 1;
-    local(*DOTFILE, $_);
     return unless $ENV{HOME};
     my($dotfile) = "$ENV{HOME}/.$myname/conf";
     return unless -e($dotfile);
-    open(DOTFILE, $dotfile) || error("open $dotfile for read: $!");
-    while(<DOTFILE>)
+    whilefile
     {
       s/^\s+//;
       s/\s+$//;
-      next if $_ eq "" || /^\#/;
+      return true if $_ eq "" || /^\#/;
       /^([^\=]*?)\s*\=\s*(.*)$/ ||
           error("$dotfile: line $.: missing \"=\"");
       my($name, $val) = ($1, $2);
@@ -261,8 +279,8 @@
       !isboolopt($name) || isboolean($val) ||
           error("$dotfile: line $.: illegal boolean value: \"$val\"");
       $optloaded{$name} = $val;
-    }
-    close(DOTFILE) || error("close $dotfile for read: $!");
+      true;
+    } $dotfile;
     $optloaded{$name};
   }
 
@@ -499,15 +517,13 @@
 
 sub writefilemode($$@)
 {
-  my($realname, $mode, @contents) = @_;
-  my($tempname) = addtmp($realname);
+  my($name, $mode, @contents) = @_;
   local(*FILE);
-  explain("creating $tempname");
-  open(FILE, ">$tempname") || error("open $tempname for write: $!");
+  explain("creating $name");
+  open(FILE, ">$name") || error("open $name for write: $!");
   print FILE @contents;
-  close(FILE) || error("close $tempname for write: $!");
-  safechmod($mode, $tempname) if $mode;
-  mv($tempname, $realname);
+  close(FILE) || error("close $name for write: $!");
+  safechmod($mode, $name) if $mode;
 }
 
 sub writefile($@)
@@ -522,24 +538,6 @@
   writefilemode($name, 0777, @contents);
 }
 
-sub whilefile(&$)
-{
-  my($sub, $file) = @_;
-  local(*FILE, $_);
-  open(FILE, "<$file") || error("open $file for read: $!");
-  while(defined($_ = <FILE>) && &$sub($_)) { }
-  close(FILE) || error("close $file for read: $!");
-  !defined($_);
-}
-
-sub readfile($)
-{
-  my($file) = @_;
-  my(@result);
-  whilefile { push(@result, $_) } $file;
-  @result;
-}
-
 sub safestat($)
 {
   my($file) = @_;
@@ -1480,7 +1478,9 @@
 
   my($verdir) = pkgpath($name, $version);
   my($urlfile) = path($verdir, urlfile);
-  writefile($urlfile, map("$_\n", @urls));
+  my($tmpfile) = addtmp($urlfile);
+  writefile($tmpfile, map("$_\n", @urls));
+  mv($tmpfile, $urlfile);
 }
 
 ##############################################################################
@@ -5235,6 +5235,7 @@
   - "toast status" should give information about stacking order
   - "toast rename" should rename armed packages by rewriting symlinks
   - directories in armdir should be read-only (mode 0555) by default
+  - "toast build" should be able to deal with perl modules
   - add "toast check": verify storedir and armdir integrity (and fix?)
   - toast get could be more robust w/r/t failures and concurrency
   - configure packages to use alternate /etc, /var, etc. when possible