Added facility for remote debugging
This commit is contained in:
parent
756c0c15ae
commit
55ad3044ef
|
@ -0,0 +1,34 @@
|
||||||
|
;;; This file is part of the Scheme Untergrund Library.
|
||||||
|
|
||||||
|
;;; Copyright (c) 2002-2003 by Martin Gasbichler.
|
||||||
|
;;; For copyright information, see the file COPYING which comes with
|
||||||
|
;;; the distribution.
|
||||||
|
|
||||||
|
;; From SUnet plus one more call/cc to capture the continuation of the error
|
||||||
|
(define (with-fatal-and-capturing-error-handler* handler thunk)
|
||||||
|
(call-with-current-continuation
|
||||||
|
(lambda (accept)
|
||||||
|
((call-with-current-continuation
|
||||||
|
(lambda (k)
|
||||||
|
(with-handler
|
||||||
|
(lambda (condition more)
|
||||||
|
(primitive-cwcc
|
||||||
|
(lambda (condition-continuation)
|
||||||
|
(if (error? condition)
|
||||||
|
(call-with-current-continuation
|
||||||
|
(lambda (decline)
|
||||||
|
(k (lambda ()
|
||||||
|
(handler condition condition-continuation decline))))))
|
||||||
|
(more)))) ; Keep looking for a handler.
|
||||||
|
(lambda () (call-with-values thunk accept)))))))))
|
||||||
|
|
||||||
|
(define (with-inspecting-handler port thunk)
|
||||||
|
(with-fatal-and-capturing-error-handler*
|
||||||
|
(lambda (condition condition-continuation more)
|
||||||
|
(let ((res
|
||||||
|
(remote-repl "Welcome to the command processor of the remote scsh"
|
||||||
|
condition-continuation
|
||||||
|
port)))
|
||||||
|
;; TODO: option to return to continuation of handler (by leaving out the with-continuation)
|
||||||
|
(with-continuation condition-continuation (lambda () res))))
|
||||||
|
thunk))
|
|
@ -0,0 +1,9 @@
|
||||||
|
(define-interface repls-interface
|
||||||
|
(export script-repl
|
||||||
|
remote-repl))
|
||||||
|
|
||||||
|
(define-interface inspect-exception-interface
|
||||||
|
(export with-inspecting-handler))
|
||||||
|
|
||||||
|
(define-interface socket2stdports-interface
|
||||||
|
(export socket<->std-ports))
|
|
@ -0,0 +1,23 @@
|
||||||
|
(define-structure repls repls-interface
|
||||||
|
(open scheme-with-scsh
|
||||||
|
command-levels
|
||||||
|
command-processor
|
||||||
|
environments
|
||||||
|
formats
|
||||||
|
handle)
|
||||||
|
(files repl))
|
||||||
|
|
||||||
|
(define-structure inspect-exception inspect-exception-interface
|
||||||
|
|
||||||
|
(open scheme-with-scsh
|
||||||
|
conditions
|
||||||
|
escapes
|
||||||
|
handle
|
||||||
|
repls)
|
||||||
|
(files inspect-exception))
|
||||||
|
|
||||||
|
(define-structure socket2stdports socket2stdports-interface
|
||||||
|
(open scheme-with-scsh
|
||||||
|
handle
|
||||||
|
threads)
|
||||||
|
(files socket2stdport))
|
|
@ -0,0 +1,88 @@
|
||||||
|
;;; This file is part of the Scheme Untergrund Library.
|
||||||
|
|
||||||
|
;;; Copyright (c) 2002-2003 by Martin Gasbichler.
|
||||||
|
;;; For copyright information, see the file COPYING which comes with
|
||||||
|
;;; the distribution.
|
||||||
|
|
||||||
|
(define (bind-listen-accept protocol-family proc arg)
|
||||||
|
(let* ((sock (create-socket protocol-family socket-type/stream))
|
||||||
|
(addr (cond ((= protocol-family
|
||||||
|
protocol-family/internet)
|
||||||
|
(let ((port (cond ((integer? arg) arg)
|
||||||
|
((string? arg)
|
||||||
|
(service-info:port
|
||||||
|
(service-info arg "tcp")))
|
||||||
|
(else
|
||||||
|
(error "socket-connect: bad arg ~s"
|
||||||
|
arg)))))
|
||||||
|
(internet-address->socket-address internet-address/any
|
||||||
|
arg)))
|
||||||
|
((= protocol-family
|
||||||
|
protocol-family/unix)
|
||||||
|
(unix-address->socket-address arg))
|
||||||
|
(else
|
||||||
|
(error "bind-listen-accept: unsupported protocol-family ~s"
|
||||||
|
protocol-family)))))
|
||||||
|
(set-socket-option sock level/socket socket/reuse-address #t)
|
||||||
|
(bind-socket sock addr)
|
||||||
|
(listen-socket sock 5)
|
||||||
|
(with-handler
|
||||||
|
(lambda (condition more)
|
||||||
|
(with-handler
|
||||||
|
(lambda (condition ignore) (more))
|
||||||
|
(lambda () (close-socket sock)))
|
||||||
|
(more))
|
||||||
|
(lambda ()
|
||||||
|
(with-errno-handler
|
||||||
|
;; ECONNABORTED we just ignore
|
||||||
|
((errno packet)
|
||||||
|
((errno/connaborted) 'fick-dich-ins-knie))
|
||||||
|
(call-with-values
|
||||||
|
(lambda () (accept-connection sock))
|
||||||
|
proc))))))
|
||||||
|
|
||||||
|
(define (remote-repl greeting focus-value port)
|
||||||
|
(let ((old-output (command-output))
|
||||||
|
(old-input (command-input))
|
||||||
|
(old-err (command-error-output)))
|
||||||
|
(bind-listen-accept
|
||||||
|
protocol-family/internet
|
||||||
|
(lambda (socket address)
|
||||||
|
(set-port-buffering (socket:outport socket) bufpol/none)
|
||||||
|
(set-port-buffering (socket:inport socket) bufpol/none)
|
||||||
|
(set-socket-option socket level/socket socket/oob-inline #t)
|
||||||
|
(set-socket-option socket level/socket socket/reuse-address #t)
|
||||||
|
(let ((res (script-repl greeting
|
||||||
|
focus-value
|
||||||
|
(socket:inport socket)
|
||||||
|
(socket:outport socket)
|
||||||
|
(socket:outport socket))))
|
||||||
|
(with-handler
|
||||||
|
(lambda (condition ignore) 'fick-dich-ins-knie)
|
||||||
|
(lambda () (close-socket socket)))
|
||||||
|
res))
|
||||||
|
port)))
|
||||||
|
|
||||||
|
(define (script-repl greeting focus-value iport oport eport)
|
||||||
|
(with-interaction-environment
|
||||||
|
(environment-for-commands)
|
||||||
|
(lambda ()
|
||||||
|
(let* ((saved-user-context (user-context))
|
||||||
|
(res
|
||||||
|
(restart-command-processor
|
||||||
|
'ignored-focus-value
|
||||||
|
(user-context)
|
||||||
|
(lambda ()
|
||||||
|
;; we need to redirect the ports of the command processor
|
||||||
|
(start-new-session saved-user-context
|
||||||
|
iport
|
||||||
|
oport
|
||||||
|
eport
|
||||||
|
focus-value
|
||||||
|
#f) ;batch?
|
||||||
|
(display greeting (command-output))
|
||||||
|
(newline (command-output))
|
||||||
|
(display (focus-object) (command-output))
|
||||||
|
(newline (command-output))))))
|
||||||
|
(format (command-output) "Terminating command processor with value ~A ~%" res)
|
||||||
|
res))))
|
|
@ -0,0 +1,33 @@
|
||||||
|
;;; This file is part of the Scheme Untergrund Library.
|
||||||
|
|
||||||
|
;;; Copyright (c) 2002-2003 by Martin Gasbichler.
|
||||||
|
;;; For copyright information, see the file COPYING which comes with
|
||||||
|
;;; the distribution.
|
||||||
|
|
||||||
|
(define (socket<->std-ports host port)
|
||||||
|
(let ((s (socket-connect protocol-family/internet socket-type/stream host port)))
|
||||||
|
(set-port-buffering (socket:outport s) bufpol/none)
|
||||||
|
(set-port-buffering (socket:inport s) bufpol/none)
|
||||||
|
(spawn (lambda () (dynamic-wind
|
||||||
|
(lambda () #f)
|
||||||
|
(lambda ()
|
||||||
|
(dup-port (socket:inport s) (current-output-port)))
|
||||||
|
(lambda ()
|
||||||
|
(close (socket:inport s))))))
|
||||||
|
|
||||||
|
(dynamic-wind
|
||||||
|
(lambda () #f)
|
||||||
|
(lambda ()
|
||||||
|
(dup-port (current-input-port) (socket:outport s)))
|
||||||
|
(lambda ()
|
||||||
|
(close s)))))
|
||||||
|
|
||||||
|
|
||||||
|
(define (dup-port from to)
|
||||||
|
(let ((c (read-char from)))
|
||||||
|
(if (not (eof-object? c))
|
||||||
|
(begin
|
||||||
|
(display c to)
|
||||||
|
(dup-port from to)))))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue