From f8dd673609db2820dbe82ed5c62a71c9c18bc533 Mon Sep 17 00:00:00 2001 From: Puck Meerburg Date: Sun, 11 May 2025 22:21:07 +0000 Subject: [PATCH] (zilch nix daemon): add more daemon calls --- core/default.nix | 1 + core/src/nix/daemon.sld | 98 ++++++++++++++++++++++++++++++++++++++++- core/zilch.egg | 2 +- 3 files changed, 99 insertions(+), 2 deletions(-) diff --git a/core/default.nix b/core/default.nix index c092ec5..3a7e46f 100644 --- a/core/default.nix +++ b/core/default.nix @@ -17,6 +17,7 @@ srfi-151 srfi-152 srfi-180 + srfi-207 trace json diff --git a/core/src/nix/daemon.sld b/core/src/nix/daemon.sld index c41c83d..58147b7 100644 --- a/core/src/nix/daemon.sld +++ b/core/src/nix/daemon.sld @@ -4,6 +4,7 @@ (define-library (zilch nix daemon) (import (scheme base) (scheme write) (scheme case-lambda) (zilch lib hash) srfi-151 (zilch nix binproto) socket + (srfi 18) (srfi 207) (chicken format)) (export @@ -19,10 +20,19 @@ daemon-wop-handshake daemon-wop-set-options daemon-wop-add-text-to-store daemon-wop-build-paths daemon-wop-query-derivation-output-map + daemon-wop-query-path-info + daemon-wop-nar-from-path + daemon-wop-add-to-store-nar nix-activity? nix-activity-id nix-activity-log-level nix-activity-type - nix-activity-string nix-activity-fields nix-activity-parent-id) + nix-activity-string nix-activity-fields nix-activity-parent-id + + valid-path-info? + valid-path-info-deriver valid-path-info-nar-hash valid-path-info-references + valid-path-info-registration-time valid-path-info-nar-size valid-path-info-ultimate + valid-path-info-sigs valid-path-info-ca) + (begin (define-record-type @@ -251,6 +261,92 @@ (daemon-read-log-events link) (daemon-read-string link)) + (define-record-type + (make-valid-path-info deriver nar-hash references registration-time nar-size ultimate sigs ca) + valid-path-info? + (deriver valid-path-info-deriver) + (nar-hash valid-path-info-nar-hash) + (references valid-path-info-references) + (registration-time valid-path-info-registration-time) + (nar-size valid-path-info-nar-size) + (ultimate valid-path-info-ultimate) + (sigs valid-path-info-sigs) + (ca valid-path-info-ca)) + + (define (read-string-list link) + (define count (daemon-read-u64 link)) + (do ((out '()) (i 0 (+ i 1))) + ((>= i count) (reverse out)) + (set! out (cons (daemon-read-string link) out)))) + + (define (daemon-read-valid-path-info link) + (define deriver (daemon-read-string link)) + (define nar-hash (daemon-read-string link)) + (define references (read-string-list link)) + (define registration-time (daemon-read-u64 link)) + (define nar-size (daemon-read-u64 link)) + (define ultimate (daemon-read-u64 link)) + (define sigs (read-string-list link)) + (define ca (daemon-read-string link)) + + (make-valid-path-info + (if (string=? deriver "") #f deriver) + (hex-string->bytevector nar-hash) + references registration-time nar-size (= ultimate 1) sigs + (if (string=? ca "") #f ca))) + + (define (daemon-wop-query-path-info link store-path) + (daemon-write-u64 link 26) + (daemon-write-string link store-path) + (daemon-flush link) + (daemon-read-log-events link) + (define ok (daemon-read-u64 link)) + (if (= ok 1) + (daemon-read-valid-path-info link) + #f)) + + ; You are responsible for reading exactly the right amount of bytes from + ; the daemon after this. My condolences. + (define (daemon-wop-nar-from-path link store-path) + (daemon-write-u64 link 38) + (daemon-write-string link store-path) + (daemon-flush link) + (daemon-read-log-events link)) + + ; `proc` is a procedure taking one argument, which is used to write data into the daemon. + ; The write-blob procedure passed to `proc` looks like (write-blob bv [start [end]]). + (define (daemon-wop-add-to-store-nar link store-path deriver nar-hash references nar-size ca proc) + (daemon-write-u64 link 39) + (daemon-write-string link store-path) + (daemon-write-string link (or deriver "")) + (daemon-write-string link nar-hash) + (daemon-write-u64 link (length references)) + (for-each (lambda (v) (daemon-write-string link v)) references) + (daemon-write-u64 link 0) ; registration time + (daemon-write-u64 link nar-size) ; registration time + (daemon-write-u64 link 1) ; ultimate + (daemon-write-u64 link 0) ; sigs + (daemon-write-string link ca) + (daemon-write-u64 link 0) ; repair + (daemon-write-u64 link 0) ; dontCheckSigs + + (daemon-flush link) + (define write-blob + (case-lambda + ((bv) (daemon-write-u64 link (bytevector-length bv)) (write-bytevector bv (daemon-link-out-port link))) + ((bv start) (daemon-write-u64 link (- (bytevector-length bv) start)) (write-bytevector bv (daemon-link-out-port link) start)) + ((bv start end) (daemon-write-u64 link (- end start)) (write-bytevector bv (daemon-link-out-port link) start end)))) + + (define data-thread + (make-thread + (lambda () + (proc write-blob) + (daemon-write-u64 link 0) ; send an EOF + (daemon-flush link)))) + (thread-start! data-thread) + (daemon-read-log-events link) + (thread-join! data-thread)) + (define (daemon-wop-query-derivation-output-map link store-path) (daemon-write-u64 link 41) (daemon-write-string link store-path) diff --git a/core/zilch.egg b/core/zilch.egg index 5aa0cfa..8c76cfe 100644 --- a/core/zilch.egg +++ b/core/zilch.egg @@ -1,7 +1,7 @@ ((version "0.0.1") (synopsis "Nix. Noppes. Nada.") (author "puck") - (dependencies socket r7rs vector-lib srfi-60 srfi-113 srfi-128 srfi-132 srfi-146 srfi-151 srfi-152 srfi-180 trace json) + (dependencies socket r7rs vector-lib srfi-60 srfi-113 srfi-128 srfi-132 srfi-146 srfi-151 srfi-152 srfi-180 srfi-207 trace json) (component-options (csc-options "-X" "r7rs" "-R" "r7rs" "-optimize-level" "3")) (components