# HG changeset patch # User Richard Westhaver # Date 1727664292 14400 # Node ID ebe3315b7add2cbd854c829906f7f2ce1d063fd1 # Parent 29fe829a7ac3a41735353155360f6c0f8ec7ff48 evdev/kbd fully operational, rustls and blake3 cleanups diff -r 29fe829a7ac3 -r ebe3315b7add lisp/ffi/blake3/constants.lisp --- a/lisp/ffi/blake3/constants.lisp Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/ffi/blake3/constants.lisp Sun Sep 29 22:44:52 2024 -0400 @@ -1,3 +1,8 @@ -("stddef.h" "stdint.h") +("stddef.h" "stdint.h" "blake3.h") -() +( ;; (:string blake3-version-string "BLAKE3_VERSION_STRING") + (:integer +blake3-key-len+ "BLAKE3_KEY_LEN") + (:integer +blake3-out-len+ "BLAKE3_OUT_LEN") + (:integer +blake3-block-len+ "BLAKE3_BLOCK_LEN") + (:integer +blake3-chunk-len+ "BLAKE3_CHUNK_LEN") + (:integer +blake3-max-depth+ "BLAKE3_MAX_DEPTH")) diff -r 29fe829a7ac3 -r ebe3315b7add lisp/ffi/blake3/pkg.lisp --- a/lisp/ffi/blake3/pkg.lisp Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/ffi/blake3/pkg.lisp Sun Sep 29 22:44:52 2024 -0400 @@ -7,6 +7,7 @@ (:nicknames :blake3) (:use :cl :std :sb-alien) (:export + :load-blake3 :+blake3-key-len+ :+blake3-out-len+ :+blake3-block-len+ @@ -26,13 +27,7 @@ (in-package :blake3) -(defvar +blake3-key-len+ 32) -(defvar +blake3-out-len+ 32) -(defvar +blake3-block-len+ 64) -(defvar +blake3-chunk-len+ 1024) -(defvar +blake3-max-depth+ 54) - -(define-alien-loader "blake3" t "/usr/local/lib/") +(define-alien-loader "blake3") (define-alien-routine blake3-version c-string) diff -r 29fe829a7ac3 -r ebe3315b7add lisp/ffi/blake3/tests.lisp --- a/lisp/ffi/blake3/tests.lisp Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/ffi/blake3/tests.lisp Sun Sep 29 22:44:52 2024 -0400 @@ -12,7 +12,7 @@ (load-blake3) (deftest version () - (is (string= "1.5.0" (blake3-version)))) + (is (stringp (blake3-version)))) (deftest hasher () (with-alien ((h blake3-hasher) @@ -21,6 +21,4 @@ (blake3-hasher-init (addr h)) (blake3-hasher-update (addr h) nil 0) (blake3-hasher-finalize (addr h) o olen) - (print (addr h)) - (print (addr o)) (blake3-hasher-reset (addr h)))) diff -r 29fe829a7ac3 -r ebe3315b7add lisp/ffi/evdev/input.lisp --- a/lisp/ffi/evdev/input.lisp Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/ffi/evdev/input.lisp Sun Sep 29 22:44:52 2024 -0400 @@ -5,15 +5,13 @@ ;;; Code: (in-package :evdev/input) -;; from linux/time.h -(define-alien-type timeval - (struct timeval - (tv-sec sb-unix:time-t) - (tv-nsec long))) +;; (defun eviocgbit (ev len) +;; ;; ioctl read +;; (sb-posix::ioctl 8 2 "E" (+ #x20 ev) len)) (define-alien-type input-event (struct input-event - (time timeval) + (time sb-posix::alien-timeval) (type (unsigned 16)) (code (unsigned 16)) (value (signed 32)))) diff -r 29fe829a7ac3 -r ebe3315b7add lisp/ffi/evdev/pkg.lisp --- a/lisp/ffi/evdev/pkg.lisp Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/ffi/evdev/pkg.lisp Sun Sep 29 22:44:52 2024 -0400 @@ -16,7 +16,11 @@ (defpackage :evdev (:use :cl :std :sb-alien :evdev/input) - (:export)) + (:export + #:libevdev-new + #:libevdev-new-from-fd + #:libevdev-free + #:libevdev-set-fd)) (in-package :evdev) (define-alien-loader "evdev" t "/usr/lib/") diff -r 29fe829a7ac3 -r ebe3315b7add lisp/ffi/evdev/tests.lisp --- a/lisp/ffi/evdev/tests.lisp Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/ffi/evdev/tests.lisp Sun Sep 29 22:44:52 2024 -0400 @@ -25,4 +25,10 @@ libevdev_free(dev); |# -(deftest basic ()) +(deftest basic () + (with-open-file (file "/dev/input/event4") + (let ((dev (libevdev-new)) + (fd (sb-sys:fd-stream-fd file))) + (is (typep dev '(alien (* evdev::libevdev)))) + (is (zerop (libevdev-set-fd dev fd))) + (is (null (libevdev-free dev)))))) diff -r 29fe829a7ac3 -r ebe3315b7add lisp/ffi/rustls/macs.lisp --- a/lisp/ffi/rustls/macs.lisp Sun Sep 29 00:31:24 2024 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -;;; rustls/macs.lisp --- Rustls FFI Macros - -;; - -;;; Code: -(in-package :rustls) diff -r 29fe829a7ac3 -r ebe3315b7add lisp/ffi/rustls/rustls.asd --- a/lisp/ffi/rustls/rustls.asd Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/ffi/rustls/rustls.asd Sun Sep 29 22:44:52 2024 -0400 @@ -10,8 +10,8 @@ (defsystem :rustls :depends-on (:std) :components ((:file "pkg") - (:file "macs") - (:file "types")) + (:file "types") + (:file "rustls")) :in-order-to ((test-op (test-op "rustls/tests")))) (defsystem :rustls/tests diff -r 29fe829a7ac3 -r ebe3315b7add lisp/ffi/rustls/rustls.lisp --- a/lisp/ffi/rustls/rustls.lisp Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/ffi/rustls/rustls.lisp Sun Sep 29 22:44:52 2024 -0400 @@ -33,9 +33,9 @@ (accepted (* rustls-accepted)) (i size-t)) -(define-alien-routine rustls-accepted-alpn rustls-slice-bytes - (accepted (* rustls-accepted)) - (i size-t)) +;; (define-alien-routine rustls-accepted-alpn rustls-slice-bytes +;; (accepted (* rustls-accepted)) +;; (i size-t)) (define-alien-routine rustls-accepted-into-connection rustls-result (accepted (* rustls-accepted)) @@ -232,7 +232,7 @@ (count size-t) (out-n (* size-t))) -(define-alien-routine rustl-connection-free void (* rustls-connection)) +(define-alien-routine rustl-connection-free void (conn (* rustls-connection))) (define-alien-routine rustls-error void (result rustls-result) (len size-t) (out-n (* size-t))) @@ -243,9 +243,9 @@ (define-alien-routine rustls-slice-slice-bytes-len size-t (input (* rustls-slice-slice-bytes))) -(define-alien-routine rustls-slice-slice-bytes-get rustls-slice-bytes - (input (* rustls-slice-slice-bytes)) - (n size-t)) +;; (define-alien-routine rustls-slice-slice-bytes-get rustls-slice-bytes +;; (input (* rustls-slice-slice-bytes)) +;; (n size-t)) (define-alien-routine rustls-slice-str-len size-t (input (* rustls-slice-str))) @@ -259,10 +259,31 @@ (define-alien-routine rustls-server-config-builder-free void (config (* rustls-server-config-builder))) -(define-alien-routine rustls-server-config-builder-build (* rustls-server-config) (* rustls-server-config-builder)) +(define-alien-routine rustls-server-config-builder-build (* rustls-server-config) (builder (* rustls-server-config-builder))) (define-alien-routine rustls-server-config-free void (config (* rustls-server-config))) (define-alien-routine rustls-server-connection-new rustls-result (config (* rustls-server-config)) (conn-out (* (* rustls-connection)))) + +(define-alien-routine rustls-server-connection-get-server-name rustls-result + (conn (* rustls-connection)) + (buf (* unsigned-char)) + (count size-t) + (out-n (* size-t))) + +(define-alien-routine rustls-server-config-builder-set-hello-callback rustls-result + (builder (* rustls-server-config-builder)) + (callback rustls-client-hello-callback)) + +(define-alien-routine rustls-client-hello-select-certified-key rustls-result + (hello (* rustls-client-hello)) + (certified-keys (* (* rustls-certified-key))) + (certified-keys-len size-t) + (out-key (* (* rustls-certified-key)))) + +(define-alien-routine rustls-server-config-builder-set-persistence rustls-result + (builder (* rustls-server-config-builder)) + (get-cb rustls-session-store-get-callback) + (put-cb rustls-session-store-put-callback)) diff -r 29fe829a7ac3 -r ebe3315b7add lisp/ffi/rustls/tests.lisp --- a/lisp/ffi/rustls/tests.lisp Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/ffi/rustls/tests.lisp Sun Sep 29 22:44:52 2024 -0400 @@ -11,5 +11,7 @@ (load-rustls) -(deftest rustls ()) +(deftest sanity () + (is (stringp (rustls::rustls-version)))) +(deftest basic ()) diff -r 29fe829a7ac3 -r ebe3315b7add lisp/ffi/rustls/types.lisp --- a/lisp/ffi/rustls/types.lisp Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/ffi/rustls/types.lisp Sun Sep 29 22:44:52 2024 -0400 @@ -5,126 +5,124 @@ ;;; Code: (in-package :rustls) -(define-alien-type rustls-result unsigned-int) +(define-alien-enum (rustls-result unsigned-int) + :ok 7000 + :io 7001 + :null-parameter 7002 + :invalid-dns-name-error 7003 + :panic 7004 + :certificate-parse-error 7005 + :private-key-parse-error 7006 + :insufficient-size 7007 + :not-found 7008 + :invalid-parameter 7009 + :unexpected-eof 7010 + :plaintext-empty 7011 + :acceptor-not-ready 7012 + :already-used 7013 + :certificate-revocation-list-parse-error 7014 + :no-certificates-presented 7101 + :decrypt-error 7102 + :failed-to-get-current-time 7103 + :failed-to-get-random-bytes 7113 + :handshake-not-complete 7104 + :peer-sent-oversized-record 7105 + :no-application-protocol 7106 + :bad-max-fragment-size 7114 + :unsupported-name-type 7115 + :encrypt-error 7116 + :cert-encoding-bad 7121 + :cert-expired 7122 + :cert-not-yet-valid 7123 + :cert-revoked 7124 + :cert-unhandled-critical-extension 7125 + :cert-unknown-issuer 7126 + :cert-bad-signature 7127 + :cert-not-valid-for-name 7128 + :cert-invalid-purpose 7129 + :cert-application-verification-failure 7130 + :cert-other-error 7131 + :message-handshake-payload-too-large 7133 + :message-invalid-ccs 7134 + :message-invalid-content-type 7135 + :message-invalid-cert-status-type 7136 + :message-invalid-cert-request 7137 + :message-invalid-dh-params 7138 + :message-invalid-empty-payload 7139 + :message-invalid-key-update 7140 + :message-invalid-server-name 7141 + :message-too-large 7142 + :message-too-short 7143 + :message-missing-data 7144 + :message-missing-key-exchange 7145 + :message-no-signature-schemes 7146 + :message-trailing-data 7147 + :message-unexpected-message 7148 + :message-unknown-protocol-version 7149 + :message-unsupported-compression 7150 + :message-unsupported-curve-type 7151 + :message-unsupported-key-exchange-algorithm 7152 + :message-invalid-other 7153 + :peer-incompatible-error 7107 + :peer-misbehaved-error 7108 + :inappropriate-message 7109 + :inappropriate-handshake-message 7110 + :general 7112 + :alert-close-notify 7200 + :alert-unexpected-message 7201 + :alert-bad-record-mac 7202 + :alert-decryption-failed 7203 + :alert-record-overflow 7204 + :alert-decompression-failure 7205 + :alert-handshake-failure 7206 + :alert-no-certificate 7207 + :alert-bad-certificate 7208 + :alert-unsupported-certificate 7209 + :alert-certificate-revoked 7210 + :alert-certificate-expired 7211 + :alert-certificate-unknown 7212 + :alert-illegal-parameter 7213 + :alert-unknown-ca 7214 + :alert-access-denied 7215 + :alert-decode-error 7216 + :alert-decrypt-error 7217 + :alert-export-restriction 7218 + :alert-protocol-version 7219 + :alert-insufficient-security 7220 + :alert-internal-error 7221 + :alert-inappropriate-fallback 7222 + :alert-user-canceled 7223 + :alert-no-renegotiation 7224 + :alert-missing-extension 7225 + :alert-unsupported-extension 7226 + :alert-certificate-unobtainable 7227 + :alert-unrecognised-name 7228 + :alert-bad-certificate-status-response 7229 + :alert-bad-certificate-hash-value 7230 + :alert-unknown-psk-identity 7231 + :alert-certificate-required 7232 + :alert-no-application-protocol 7233 + :alert-unknown 7234 + :cert-revocation-list-bad-signature 7400 + :cert-revocation-list-invalid-crl-number 7401 + :cert-revocation-list-invalid-revoked-cert-serial-number 7402 + :cert-revocation-list-issuer-invalid-for-crl 7403 + :cert-revocation-list-other-error 7404 + :cert-revocation-list-parse-error 7405 + :cert-revocation-list-unsupported-crl-version 7406 + :cert-revocation-list-unsupported-critical-extension 7407 + :cert-revocation-list-unsupported-delta-crl 7408 + :cert-revocation-list-unsupported-indirect-crl 7409 + :cert-revocation-list-unsupported-revocation-reason 7410 + :client-cert-verifier-builder-no-root-anchors 7500) -(defconstant +rustls-result-ok+ 7000) -(defconstant +rustls-result-io+ 7001) -(defconstant +rustls-result-null-parameter+ 7002) -(defconstant +rustls-result-invalid-dns-name-error+ 7003) -(defconstant +rustls-result-panic+ 7004) -(defconstant +rustls-result-certificate-parse-error+ 7005) -(defconstant +rustls-result-private-key-parse-error+ 7006) -(defconstant +rustls-result-insufficient-size+ 7007) -(defconstant +rustls-result-not-found+ 7008) -(defconstant +rustls-result-invalid-parameter+ 7009) -(defconstant +rustls-result-unexpected-eof+ 7010) -(defconstant +rustls-result-plaintext-empty+ 7011) -(defconstant +rustls-result-acceptor-not-ready+ 7012) -(defconstant +rustls-result-already-used+ 7013) -(defconstant +rustls-result-certificate-revocation-list-parse-error+ 7014) -(defconstant +rustls-result-no-certificates-presented+ 7101) -(defconstant +rustls-result-decrypt-error+ 7102) -(defconstant +rustls-result-failed-to-get-current-time+ 7103) -(defconstant +rustls-result-failed-to-get-random-bytes+ 7113) -(defconstant +rustls-result-handshake-not-complete+ 7104) -(defconstant +rustls-result-peer-sent-oversized-record+ 7105) -(defconstant +rustls-result-no-application-protocol+ 7106) -(defconstant +rustls-result-bad-max-fragment-size+ 7114) -(defconstant +rustls-result-unsupported-name-type+ 7115) -(defconstant +rustls-result-encrypt-error+ 7116) -(defconstant +rustls-result-cert-encoding-bad+ 7121) -(defconstant +rustls-result-cert-expired+ 7122) -(defconstant +rustls-result-cert-not-yet-valid+ 7123) -(defconstant +rustls-result-cert-revoked+ 7124) -(defconstant +rustls-result-cert-unhandled-critical-extension+ 7125) -(defconstant +rustls-result-cert-unknown-issuer+ 7126) -(defconstant +rustls-result-cert-bad-signature+ 7127) -(defconstant +rustls-result-cert-not-valid-for-name+ 7128) -(defconstant +rustls-result-cert-invalid-purpose+ 7129) -(defconstant +rustls-result-cert-application-verification-failure+ 7130) -(defconstant +rustls-result-cert-other-error+ 7131) -(defconstant +rustls-result-message-handshake-payload-too-large+ 7133) -(defconstant +rustls-result-message-invalid-ccs+ 7134) -(defconstant +rustls-result-message-invalid-content-type+ 7135) -(defconstant +rustls-result-message-invalid-cert-status-type+ 7136) -(defconstant +rustls-result-message-invalid-cert-request+ 7137) -(defconstant +rustls-result-message-invalid-dh-params+ 7138) -(defconstant +rustls-result-message-invalid-empty-payload+ 7139) -(defconstant +rustls-result-message-invalid-key-update+ 7140) -(defconstant +rustls-result-message-invalid-server-name+ 7141) -(defconstant +rustls-result-message-too-large+ 7142) -(defconstant +rustls-result-message-too-short+ 7143) -(defconstant +rustls-result-message-missing-data+ 7144) -(defconstant +rustls-result-message-missing-key-exchange+ 7145) -(defconstant +rustls-result-message-no-signature-schemes+ 7146) -(defconstant +rustls-result-message-trailing-data+ 7147) -(defconstant +rustls-result-message-unexpected-message+ 7148) -(defconstant +rustls-result-message-unknown-protocol-version+ 7149) -(defconstant +rustls-result-message-unsupported-compression+ 7150) -(defconstant +rustls-result-message-unsupported-curve-type+ 7151) -(defconstant +rustls-result-message-unsupported-key-exchange-algorithm+ 7152) -(defconstant +rustls-result-message-invalid-other+ 7153) -(defconstant +rustls-result-peer-incompatible-error+ 7107) -(defconstant +rustls-result-peer-misbehaved-error+ 7108) -(defconstant +rustls-result-inappropriate-message+ 7109) -(defconstant +rustls-result-inappropriate-handshake-message+ 7110) -(defconstant +rustls-result-general+ 7112) -(defconstant +rustls-result-alert-close-notify+ 7200) -(defconstant +rustls-result-alert-unexpected-message+ 7201) -(defconstant +rustls-result-alert-bad-record-mac+ 7202) -(defconstant +rustls-result-alert-decryption-failed+ 7203) -(defconstant +rustls-result-alert-record-overflow+ 7204) -(defconstant +rustls-result-alert-decompression-failure+ 7205) -(defconstant +rustls-result-alert-handshake-failure+ 7206) -(defconstant +rustls-result-alert-no-certificate+ 7207) -(defconstant +rustls-result-alert-bad-certificate+ 7208) -(defconstant +rustls-result-alert-unsupported-certificate+ 7209) -(defconstant +rustls-result-alert-certificate-revoked+ 7210) -(defconstant +rustls-result-alert-certificate-expired+ 7211) -(defconstant +rustls-result-alert-certificate-unknown+ 7212) -(defconstant +rustls-result-alert-illegal-parameter+ 7213) -(defconstant +rustls-result-alert-unknown-ca+ 7214) -(defconstant +rustls-result-alert-access-denied+ 7215) -(defconstant +rustls-result-alert-decode-error+ 7216) -(defconstant +rustls-result-alert-decrypt-error+ 7217) -(defconstant +rustls-result-alert-export-restriction+ 7218) -(defconstant +rustls-result-alert-protocol-version+ 7219) -(defconstant +rustls-result-alert-insufficient-security+ 7220) -(defconstant +rustls-result-alert-internal-error+ 7221) -(defconstant +rustls-result-alert-inappropriate-fallback+ 7222) -(defconstant +rustls-result-alert-user-canceled+ 7223) -(defconstant +rustls-result-alert-no-renegotiation+ 7224) -(defconstant +rustls-result-alert-missing-extension+ 7225) -(defconstant +rustls-result-alert-unsupported-extension+ 7226) -(defconstant +rustls-result-alert-certificate-unobtainable+ 7227) -(defconstant +rustls-result-alert-unrecognised-name+ 7228) -(defconstant +rustls-result-alert-bad-certificate-status-response+ 7229) -(defconstant +rustls-result-alert-bad-certificate-hash-value+ 7230) -(defconstant +rustls-result-alert-unknown-psk-identity+ 7231) -(defconstant +rustls-result-alert-certificate-required+ 7232) -(defconstant +rustls-result-alert-no-application-protocol+ 7233) -(defconstant +rustls-result-alert-unknown+ 7234) -(defconstant +rustls-result-cert-revocation-list-bad-signature+ 7400) -(defconstant +rustls-result-cert-revocation-list-invalid-crl-number+ 7401) -(defconstant +rustls-result-cert-revocation-list-invalid-revoked-cert-serial-number+ 7402) -(defconstant +rustls-result-cert-revocation-list-issuer-invalid-for-crl+ 7403) -(defconstant +rustls-result-cert-revocation-list-other-error+ 7404) -(defconstant +rustls-result-cert-revocation-list-parse-error+ 7405) -(defconstant +rustls-result-cert-revocation-list-unsupported-crl-version+ 7406) -(defconstant +rustls-result-cert-revocation-list-unsupported-critical-extension+ 7407) -(defconstant +rustls-result-cert-revocation-list-unsupported-delta-crl+ 7408) -(defconstant +rustls-result-cert-revocation-list-unsupported-indirect-crl+ 7409) -(defconstant +rustls-result-cert-revocation-list-unsupported-revocation-reason+ 7410) -(defconstant +rustls-result-client-cert-verifier-builder-no-root-anchors+ 7500) - -(define-alien-type rustls-tls-version int) - -(defconstant +rustls-tls-version-sslv2+ 512) -(defconstant +rustls-tls-version-sslv3+ 768) -(defconstant +rustls-tls-version-tlsv1-0+ 769) -(defconstant +rustls-tls-version-tlsv1-1+ 770) -(defconstant +rustls-tls-version-tlsv1-2+ 771) -(defconstant +rustls-tls-version-tlsv1-3+ 772) +(define-alien-enum (rustls-tls-version int) + :sslv2 512 + :sslv3 768 + :tlsv1-0 769 + :tlsv1-1 770 + :tlsv1-2 771 + :tlsv1-3 772) (define-alien-type rustls-accepted (struct rustls-accepted)) @@ -156,7 +154,10 @@ (define-alien-type rustls-server-config-builder (struct rustls-server-config-builder)) -(define-alien-type rustls-slice-slice-bytes (struct rustls-slice-slice-bytes)) +(define-alien-type rustls-slice-slice-bytes + (struct rustls-slice-slice-bytes + (data (* unsigned-char)) + (len size-t))) (define-alien-type rustls-slice-str (struct rustls-slice-str)) @@ -166,28 +167,104 @@ (define-alien-type rustls-web-pki-server-cert-verifier-builder (struct rustls-web-pki-server-cert-verifier-builder)) -(define-alien-type rustls-str (struct rustls-str)) +(define-alien-type rustls-str + (struct rustls-str + (data (* char)) + (len size-t))) (define-alien-type rustls-io-result int) -(define-alien-type rustls-slice-bytes (struct rustls-slice-bytes)) +(define-alien-type rustls-slice-bytes + (struct rustls-slice-bytes + (data (* unsigned-char)) + (len size-t))) (define-alien-type rustls-verify-server-cert-user-data (* t)) -(define-alien-type rustls-verify-server-cert-params (struct rustls-verify-server-cert-params)) +(define-alien-type rustls-verify-server-cert-params + (struct rustls-verify-server-cert-params + (end-entity-cert-der rustls-slice-bytes) + (intermediate-certs-der (* rustls-slice-slice-bytes)) + (server-name rustls-str) + (ocsp-response rustls-slice-bytes))) + +(define-alien-type rustls-verify-server-cert-callback + (function unsigned-int + rustls-verify-server-cert-user-data + (* rustls-verify-server-cert-params))) (define-alien-type rustls-log-level size-t) -(define-alien-type rustls-log-params (struct rustls-log-params)) +(define-alien-type rustls-log-params + (struct rustls-log-params + (level rustls-log-level) + (message rustls-str))) + +(define-alien-type rustls-log-callback + (function void + (* t) + (* rustls-log-params))) (define-alien-type rustls-client-hello-userdata (* t)) -(define-alien-type rustls-slice-u16 (struct rustls-slice-u16)) +(define-alien-type rustls-slice-u16 + (struct rustls-slice-u16 + (data (* unsigned-short)) + (len size-t))) -(define-alien-type rustls-client-hello (struct rustls-client-hello)) +(define-alien-type rustls-client-hello + (struct rustls-client-hello + (server-name rustls-str) + (signature-schemes rustls-slice-u16) + (alpn (* rustls-slice-slice-bytes)))) (define-alien-type rustls-certified-key (struct rustls-certified-key)) +(define-alien-type rustls-client-hello-callback + (function (* rustls-certified-key) + rustls-client-hello-userdata + (* rustls-client-hello))) + (define-alien-type rustls-session-store-userdata (* t)) +(define-alien-type rustls-session-store-get-callback + (function unsigned-int + rustls-session-store-userdata + (* rustls-slice-bytes) + int + (* unsigned-char) + size-t + (* size-t))) + +(define-alien-type rustls-session-store-put-callback + (function unsigned-int + rustls-session-store-userdata + (* rustls-slice-bytes) + (* rustls-slice-bytes))) + (define-alien-type rustls-supported-ciphersuite (struct rustls-supported-ciphersuite)) + +(define-alien-type rustls-web-pki-client-vert-verifier-builder (struct rustls-web-pki-client-vert-verifier-builder)) + +(define-alien-type rustls-web-pki-server-cert-verifier-builder (struct rustls-web-pki-server-cert-verifier-builder)) + +(define-alien-type rustls-read-callback + (function rustls-io-result + (* t) + (* unsigned-char) + size-t + (* size-t))) + +(define-alien-type rustls-write-callback + (function rustls-io-result + (* t) + (* unsigned-char) + size-t + (* size-t))) + +(define-alien-type rustls-write-vectored-callback + (function rustls-io-result + (* t) + (* rustls-iovec) + size-t + (* size-t))) diff -r 29fe829a7ac3 -r ebe3315b7add lisp/lib/io/kbd.lisp --- a/lisp/lib/io/kbd.lisp Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/lib/io/kbd.lisp Sun Sep 29 22:44:52 2024 -0400 @@ -8,6 +8,10 @@ ;; - https://www.kernel.org/doc/Documentation/input/event-codes.txt +;; - https://github.com/xkbcommon/libxkbcommon/blob/master/tools/interactive-evdev.c + +;; - https://gitlab.freedesktop.org/libevdev/libevdev/-/tree/master/tools + ;;; Code: (in-package :io/kbd) (load-xkbcommon) @@ -18,10 +22,37 @@ (defconstant +evdev-offset+ 8) -(defun evdev-bit-is-set (array bit)) +(defconstant +long-bit+ (sb-alien:alien-size sb-alien:unsigned-long)) + +(defun evdev-bit-p (array bit) + "Array elements should be unsigned-long." + (let ((idx (/ bit +long-bit+))) + ;; the literal 1 here is 1LL in C - there is potential to overflow a + ;; singled long. + (logand (aref array idx) (ash 1 (mod bit +long-bit+))))) -(defun keyboard-device-p (path)) - ;; (sb-posix:ioctl (fd path) +(defun new-device-from-path (path) + (with-fd (fd path :flags sb-posix:o-rdonly :close nil) + (sb-alien:with-alien ((dev (* evdev::libevdev))) + (let ((ret (evdev:libevdev-new-from-fd fd (sb-alien:addr dev)))) + (if (minusp ret) + (sb-unix::strerror (abs ret)) + dev))))) + +;; evdev::+ev-cnt+ evdev::+key-cnt+ +(defun keyboard-device-p (path) + (with-open-file (st path :element-type 'octet) + (let ((evbits (make-array evdev::+ev-cnt+)) + (keybits (make-array evdev::+key-cnt+))) + ;; (sb-posix:ioctl (fd path) + (read-sequence evbits st) + (read-sequence keybits st) + ;; (cons evbits keybits) + (loop for i from evdev::+key-reserved+ upto evdev::+key-min-interesting+ + if (not (evdev-bit-p keybits i)) + do (break) + else return t)))) + (defun make-keyboard-from-dev (dev keymap compose-table)) (defun get-keyboards (keymap compose-table &optional (dir "/dev/input")) @@ -34,4 +65,23 @@ ;; (let ((fd (sb-sys:fd-stream-fd file)) ;; (evbits)))) - +;; (xkb::xkb-consumed-mode :xkb) + +;; (let ((dev (new-device-from-path "/dev/input/event4"))) +;; (unless (evdev::libevdev-has-event-code dev evdev::+ev-key+ evdev::+key-scrollup+) +;; (println "probably not a mouse:")) +;; (println +;; (list +;; (evdev::libevdev-get-name dev) +;; (evdev::libevdev-get-id-bustype dev) +;; (evdev::libevdev-get-id-vendor dev))) +;; (with-alien ((ev evdev/input:input-event)) +;; (when (evdev::libevdev-has-event-pending dev) +;; (println "has event pending")) +;; (assert (zerop (evdev::libevdev-next-event dev (evdev::libevdev-read-flag :normal) (addr ev)))) +;; (with-alien-slots ((* time) type (code evdev/input::code) (value evdev/input::value)) ev +;; (println (obj/time:unix-to-timestamp (sb-posix::alien-timeval-sec time))) +;; (println (evdev::libevdev-event-type-get-name type)) +;; (println (evdev::libevdev-event-code-get-name type code)) +;; (println (evdev::libevdev-event-value-get-name type code value))))) + diff -r 29fe829a7ac3 -r ebe3315b7add lisp/std/fmt.lisp --- a/lisp/std/fmt.lisp Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/std/fmt.lisp Sun Sep 29 22:44:52 2024 -0400 @@ -23,17 +23,17 @@ (format t ";; *print-readably* = ~a~%" *print-readably*) (format t ";; *print-right-margin* = ~a~%" *print-right-margin*)) -(defun fmt-row (data) - (format nil "| ~{~A~^ | ~} |~%" data)) +(defun fmt-row (data &optional stream) + (format stream "| ~{~A~^ | ~} |~%" data)) -(defun format-sxhash (code) +(defun format-sxhash (code &optional stream) "Turn the fixnum value CODE into a human-friendly string. CODE should be produced by `sxhash'." (let (r) (dotimes (i 8 r) (push (ldb (byte 8 (* i 8)) code) r)) (format - nil + stream "~{~A~^-~}" (mapcar (lambda (x) (format nil "~{~(~2,'0x~)~}" x)) diff -r 29fe829a7ac3 -r ebe3315b7add lisp/std/os.lisp --- a/lisp/std/os.lisp Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/std/os.lisp Sun Sep 29 22:44:52 2024 -0400 @@ -35,3 +35,8 @@ (sb-posix:umask ,umask))))) ;; (with-umask #o22 nil) + +(defmacro with-fd ((fvar fname &key (flags #.sb-posix:o-rdonly) (close t)) &body body) + `(let* ((,fvar (sb-posix:open ,fname ,flags))) + (unwind-protect (progn ,@body) + ,@(when close `(sb-posix:close ,fvar))))) diff -r 29fe829a7ac3 -r ebe3315b7add lisp/std/pkg.lisp --- a/lisp/std/pkg.lisp Sun Sep 29 00:31:24 2024 -0400 +++ b/lisp/std/pkg.lisp Sun Sep 29 22:44:52 2024 -0400 @@ -402,7 +402,8 @@ (:export :list-all-users :list-all-groups - :with-umask)) + :with-umask + :with-fd)) (defpkg :std/file (:use :cl)