fix: atomic rename, secure temp names, read lock for status, remove manifest-path exposure

ober

28d945baf4c244239f6250a912b8a79ab6e9f71d

diff --git a/src/jerboa-index/segments.ss b/src/jerboa-index/segments.ss
index 369d710..5602386 100644
--- a/src/jerboa-index/segments.ss
+++ b/src/jerboa-index/segments.ss
@@ -16,6 +16,7 @@
         (only (std os path-util) ensure-directory)
         (only (std security taint) safe-delete-file)
         (only (std crypto sha256-pure) sha256-hex)
+        (only (std crypto random) random-token)
         (jerboa-index core))
 
 (defstruct index-segment-chain
@@ -140,7 +141,7 @@
                  (number->string from-generation) "-"
                  (number->string to-generation) "-"
                  digest "-"
-                 (number->string (random 1000000000))
+                 (random-token)
                  ".jix"))
 
 (def (make-descriptor filename from-generation to-generation digest)
diff --git a/src/jerboa-search/content-store.ss b/src/jerboa-search/content-store.ss
index 58b6f2e..b066c43 100644
--- a/src/jerboa-search/content-store.ss
+++ b/src/jerboa-search/content-store.ss
@@ -5,7 +5,8 @@
         (only (std os path-util)
               ensure-directory directory-files-recursive file-size)
         (only (std security taint) safe-delete-file)
-        (only (std crypto sha256-pure) sha256-hex))
+        (only (std crypto sha256-pure) sha256-hex)
+        (only (std crypto random) random-token))
 
 (def MAX-CONTENT-BYTES (* 16 1024 1024))
 
@@ -65,17 +66,12 @@
                    (content-file-matches? path digest))
         (ensure-directory directory)
         (let ([temporary
-               (string-append path ".tmp-"
-                              (number->string (random 1000000000)))])
+               (string-append path ".tmp-" (random-token))])
           (guard (e [else
                      (when (file-exists? temporary) (safe-delete-file temporary))
                      (raise e)])
             (write-content-file! temporary bytes)
-            (if (file-exists? path)
-                (begin
-                  (safe-delete-file path)
-                  (rename-file temporary path))
-                (rename-file temporary path)))))
+            (rename-file temporary path))))
       digest)))
 
 (def (content-store-get root digest)
diff --git a/src/jerboa-search/index.ss b/src/jerboa-search/index.ss
index 80c946a..9da2cad 100644
--- a/src/jerboa-search/index.ss
+++ b/src/jerboa-search/index.ss
@@ -21,6 +21,7 @@
               make-rwlock rwlock-read-lock! rwlock-read-unlock!
               with-read-lock with-write-lock)
         (only (std security taint) safe-delete-file)
+        (only (std crypto random) random-token)
         (jerboa-index core)
         (jerboa-index mmap)
         (jerboa-index hybrid)
@@ -227,7 +228,7 @@
 (def (pending-mmap-path path generation)
   (string-append (mmap-path path) ".pending-"
                  (number->string generation) "-"
-                 (number->string (random 1000000000))))
+                 (random-token)))
 
 (def (pending-live-view managed)
   (let* ([snapshot (text-index-snapshot-data (managed-index-delta managed))]
@@ -757,7 +758,7 @@
     (lambda (db)
       (let* ([managed (ensure-managed-index db store)]
              [lock (managed-index-rwlock managed)])
-        (with-write-lock lock
+        (with-read-lock lock
           (let ([size
                  (if (managed-index-mapped managed)
                      (hybrid-index-size
@@ -791,9 +792,7 @@
                     (cons 'source (managed-index-source managed))
                     (cons 'query-engine
                           (if (managed-index-mapped managed) 'mmap-hybrid 'core))
-                    (cons 'core-resident (and (managed-index-core managed) #t))
-                    (cons 'manifest-path
-                          (search-store-index-manifest-path store))))))))))
+                    (cons 'core-resident (and (managed-index-core managed) #t))))))))))
 
 (def (gc-search-content! store)
   (call-with-store