X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=incore.lsp;h=658972a367292a3334169cc30d98507e80a189f8;hb=f03fe656a953f15f394d59af2b32370623b490b0;hp=2847b54fb101dae94412b1c0504cbf18c54cd204;hpb=c6d3a0b36a69445ab93993b92ec73b090ed8c156;p=rrq%2Fnewlisp%2Fpacknl.git diff --git a/incore.lsp b/incore.lsp index 2847b54..658972a 100644 --- a/incore.lsp +++ b/incore.lsp @@ -22,14 +22,18 @@ ;; This is a hashmap of loaded files (new Tree 'archives) -;; A copy of the executable -(define core:core (read-file "/proc/self/exe")) +;; A copy of the executable (file descriptor 3) +(define core:core + (letn ((FD 3) (SZ (seek FD)) (BUFFER (dup "" SZ))) + (seek FD 0) (read FD BUFFER SZ) BUFFER)) +(map delete '(FD SZ BUFFER GNU GNU)) (context 'archive) - (setf main nil) - -(constant 'AR "/usr/bin/ar" 'TAR "/bin/tar" 'FILE "/usr/bin/file") +(constant + 'AR "/usr/bin/ar" + 'TAR (exists file? '("/bin/tar" "/usr/bin/tar")) + 'FILE "/usr/bin/file" ) (define (tar-able PATH) (when (file? FILE) @@ -70,7 +74,7 @@ ;; Discover and load an in-core archive by means of a marker row of 40 ;; "x", and then a series of pathname\nsize\nbytes[size] members. -(if (find (dup "x" 40) core nil 391704) +(if (find (dup "x" 40) core nil 300000) (let ((P (+ $it 41))) ; skip marker and newline (constant 'incore P) (while (regex "([^\n]+)\n([^\n]+)\n" core 0 P) @@ -85,12 +89,12 @@ (constant 'load - (letex ((LOAD load) (CTX '(if (1 (args)) (args 1)) MAIN)) + (letex ((LOAD load) (CTX '(if (1 (args)) (args 1) MAIN))) (fn () (if (archives (args 0)) (eval-string (archive:get $it (args 0)) CTX) - (LOAD (args 0) CTX)))) + (LOAD (args 0) (eval CTX))))) 'read-file - (letex ((READ-FILE read-file) (CTX '(if (1 (args)) (args 1)) MAIN)) + (letex ((READ-FILE read-file) (CTX '(if (1 (args)) (args 1) MAIN))) (fn () (if (archives (args 0)) (archive:get $it (args 0) CTX) (READ-FILE (args 0)))))