Megatest

Hex Artifact Content
Login

Artifact 13820d7ecc3212ad057265013740bf661f233086:


0000: 0a 3b 3b 20 43 6f 70 79 72 69 67 68 74 20 32 30  .;; Copyright 20
0010: 30 36 2d 32 30 31 31 2c 20 4d 61 74 74 68 65 77  06-2011, Matthew
0020: 20 57 65 6c 6c 61 6e 64 2e 0a 3b 3b 20 0a 3b 3b   Welland..;; .;;
0030: 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69    This program i
0040: 73 20 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65  s made available
0050: 20 75 6e 64 65 72 20 74 68 65 20 47 4e 55 20 47   under the GNU G
0060: 50 4c 20 76 65 72 73 69 6f 6e 20 32 2e 30 20 6f  PL version 2.0 o
0070: 72 0a 3b 3b 20 20 67 72 65 61 74 65 72 2e 20 53  r.;;  greater. S
0080: 65 65 20 74 68 65 20 61 63 63 6f 6d 70 61 6e 79  ee the accompany
0090: 69 6e 67 20 66 69 6c 65 20 43 4f 50 59 49 4e 47  ing file COPYING
00a0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 3b 3b   for details..;;
00b0: 20 0a 3b 3b 20 20 54 68 69 73 20 70 72 6f 67 72   .;;  This progr
00c0: 61 6d 20 69 73 20 64 69 73 74 72 69 62 75 74 65  am is distribute
00d0: 64 20 57 49 54 48 4f 55 54 20 41 4e 59 20 57 41  d WITHOUT ANY WA
00e0: 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 74 20  RRANTY; without 
00f0: 65 76 65 6e 20 74 68 65 0a 3b 3b 20 20 69 6d 70  even the.;;  imp
0100: 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66  lied warranty of
0110: 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 59   MERCHANTABILITY
0120: 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 20   or FITNESS FOR 
0130: 41 20 50 41 52 54 49 43 55 4c 41 52 0a 3b 3b 20  A PARTICULAR.;; 
0140: 20 50 55 52 50 4f 53 45 2e 0a 0a 28 72 65 71 75   PURPOSE...(requ
0150: 69 72 65 2d 65 78 74 65 6e 73 69 6f 6e 20 28 73  ire-extension (s
0160: 72 66 69 20 31 38 29 20 65 78 74 72 61 73 20 74  rfi 18) extras t
0170: 63 70 20 72 70 63 29 0a 28 69 6d 70 6f 72 74 20  cp rpc).(import 
0180: 28 70 72 65 66 69 78 20 72 70 63 20 72 70 63 3a  (prefix rpc rpc:
0190: 29 29 0a 0a 28 75 73 65 20 73 71 6c 69 74 65 33  ))..(use sqlite3
01a0: 20 73 72 66 69 2d 31 20 70 6f 73 69 78 20 72 65   srfi-1 posix re
01b0: 67 65 78 20 72 65 67 65 78 2d 63 61 73 65 20 73  gex regex-case s
01c0: 72 66 69 2d 36 39 29 0a 28 69 6d 70 6f 72 74 20  rfi-69).(import 
01d0: 28 70 72 65 66 69 78 20 73 71 6c 69 74 65 33 20  (prefix sqlite3 
01e0: 73 71 6c 69 74 65 33 3a 29 29 0a 0a 28 64 65 63  sqlite3:))..(dec
01f0: 6c 61 72 65 20 28 75 6e 69 74 20 73 65 72 76 65  lare (unit serve
0200: 72 29 29 0a 0a 28 64 65 63 6c 61 72 65 20 28 75  r))..(declare (u
0210: 73 65 73 20 63 6f 6d 6d 6f 6e 29 29 0a 28 64 65  ses common)).(de
0220: 63 6c 61 72 65 20 28 75 73 65 73 20 64 62 29 29  clare (uses db))
0230: 0a 0a 28 69 6e 63 6c 75 64 65 20 22 63 6f 6d 6d  ..(include "comm
0240: 6f 6e 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22 29  on_records.scm")
0250: 0a 28 69 6e 63 6c 75 64 65 20 22 64 62 5f 72 65  .(include "db_re
0260: 63 6f 72 64 73 2e 73 63 6d 22 29 0a 0a 3b 3b 20  cords.scm")..;; 
0270: 70 72 6f 63 73 74 72 20 69 73 20 74 68 65 20 6e  procstr is the n
0280: 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 63 65  ame of the proce
0290: 64 75 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  dure to be calle
02a0: 64 20 61 73 20 61 20 73 74 72 69 6e 67 0a 28 64  d as a string.(d
02b0: 65 66 69 6e 65 20 28 73 65 72 76 65 72 3a 61 75  efine (server:au
02c0: 74 6f 72 65 6d 6f 74 65 20 70 72 6f 63 73 74 72  toremote procstr
02d0: 20 70 61 72 61 6d 73 29 0a 20 20 28 68 61 6e 64   params).  (hand
02e0: 6c 65 2d 65 78 63 65 70 74 69 6f 6e 73 0a 20 20  le-exceptions.  
02f0: 20 65 78 6e 0a 20 20 20 28 62 65 67 69 6e 0a 20   exn.   (begin. 
0300: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
0310: 20 31 20 22 52 65 6d 6f 74 65 20 66 61 69 6c 65   1 "Remote faile
0320: 64 20 66 6f 72 20 22 20 70 72 6f 63 20 22 20 22  d for " proc " "
0330: 20 70 61 72 61 6d 73 29 0a 20 20 20 20 20 28 61   params).     (a
0340: 70 70 6c 79 20 28 65 76 61 6c 20 28 73 74 72 69  pply (eval (stri
0350: 6e 67 2d 3e 73 79 6d 62 6f 6c 20 70 72 6f 63 29  ng->symbol proc)
0360: 29 20 70 61 72 61 6d 73 29 29 0a 20 20 20 28 69  ) params)).   (i
0370: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20  f *runremote*.  
0380: 20 20 20 20 20 28 61 70 70 6c 79 20 28 65 76 61       (apply (eva
0390: 6c 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f  l (string->symbo
03a0: 6c 20 28 63 6f 6e 63 20 22 72 65 6d 6f 74 65 3a  l (conc "remote:
03b0: 22 20 70 72 6f 63 73 74 72 29 29 29 20 70 61 72  " procstr))) par
03c0: 61 6d 73 29 0a 20 20 20 20 20 20 20 28 65 76 61  ams).       (eva
03d0: 6c 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f  l (string->symbo
03e0: 6c 20 70 72 6f 63 73 74 72 29 20 70 61 72 61 6d  l procstr) param
03f0: 73 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  s))))..(define (
0400: 73 65 72 76 65 72 3a 73 74 61 72 74 20 64 62 29  server:start db)
0410: 0a 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .  (debug:print 
0420: 30 20 22 41 74 74 65 6d 70 74 69 6e 67 20 74 6f  0 "Attempting to
0430: 20 73 74 61 72 74 20 74 68 65 20 73 65 72 76 65   start the serve
0440: 72 20 2e 2e 2e 22 29 0a 20 20 28 6c 65 74 2a 20  r ...").  (let* 
0450: 28 28 72 70 63 3a 6c 69 73 74 65 6e 65 72 20 28  ((rpc:listener (
0460: 73 65 72 76 65 72 3a 66 69 6e 64 2d 66 72 65 65  server:find-free
0470: 2d 70 6f 72 74 2d 61 6e 64 2d 6f 70 65 6e 20 28  -port-and-open (
0480: 72 70 63 3a 64 65 66 61 75 6c 74 2d 73 65 72 76  rpc:default-serv
0490: 65 72 2d 70 6f 72 74 29 29 29 0a 09 20 28 74 68  er-port))).. (th
04a0: 31 20 20 20 20 20 20 20 20 20 20 28 6d 61 6b 65  1          (make
04b0: 2d 74 68 72 65 61 64 0a 09 09 09 28 63 75 74 65  -thread....(cute
04c0: 20 28 72 70 63 3a 6d 61 6b 65 2d 73 65 72 76 65   (rpc:make-serve
04d0: 72 20 72 70 63 3a 6c 69 73 74 65 6e 65 72 29 20  r rpc:listener) 
04e0: 22 72 70 63 3a 73 65 72 76 65 72 22 29 0a 09 09  "rpc:server")...
04f0: 09 27 72 70 63 3a 73 65 72 76 65 72 29 29 0a 09  .'rpc:server))..
0500: 20 28 68 6f 73 74 3a 70 6f 72 74 20 20 20 20 28   (host:port    (
0510: 63 6f 6e 63 20 28 67 65 74 2d 68 6f 73 74 2d 6e  conc (get-host-n
0520: 61 6d 65 29 20 22 3a 22 20 28 72 70 63 3a 64 65  ame) ":" (rpc:de
0530: 66 61 75 6c 74 2d 73 65 72 76 65 72 2d 70 6f 72  fault-server-por
0540: 74 29 29 29 29 0a 20 20 20 20 28 64 62 3a 73 65  t)))).    (db:se
0550: 74 2d 76 61 72 20 64 62 20 22 53 45 52 56 45 52  t-var db "SERVER
0560: 22 20 68 6f 73 74 3a 70 6f 72 74 29 0a 20 20 20  " host:port).   
0570: 20 28 72 70 63 3a 70 75 62 6c 69 73 68 2d 70 72   (rpc:publish-pr
0580: 6f 63 65 64 75 72 65 21 20 0a 20 20 20 20 20 27  ocedure! .     '
0590: 72 65 6d 6f 74 65 3a 72 75 6e 20 0a 20 20 20 20  remote:run .    
05a0: 20 28 6c 61 6d 62 64 61 20 28 70 72 6f 63 73 74   (lambda (procst
05b0: 72 20 2e 20 70 61 72 61 6d 73 29 0a 20 20 20 20  r . params).    
05c0: 20 20 20 28 73 65 72 76 65 72 3a 61 75 74 6f 72     (server:autor
05d0: 65 6d 6f 74 65 20 70 72 6f 63 73 74 72 20 70 61  emote procstr pa
05e0: 72 61 6d 73 29 29 29 0a 0a 20 20 20 20 3b 3b 3d  rams)))..    ;;=
05f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0600: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0610: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0620: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0630: 3d 3d 3d 3d 3d 0a 20 20 20 20 3b 3b 20 64 62 20  =====.    ;; db 
0640: 73 70 65 63 69 61 6c 73 20 68 65 72 65 0a 20 20  specials here.  
0650: 20 20 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d    ;;============
0660: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 20 20 20 3b  ==========.    ;
06a0: 3b 20 2a 2a 20 73 65 74 2d 74 65 73 74 73 2d 73  ; ** set-tests-s
06b0: 74 61 74 65 2d 73 74 61 74 75 73 0a 20 20 20 20  tate-status.    
06c0: 28 72 70 63 3a 70 75 62 6c 69 73 68 2d 70 72 6f  (rpc:publish-pro
06d0: 63 65 64 75 72 65 21 0a 20 20 20 20 20 27 72 64  cedure!.     'rd
06e0: 62 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74  b:set-tests-stat
06f0: 65 2d 73 74 61 74 75 73 20 0a 20 20 20 20 20 28  e-status .     (
0700: 6c 61 6d 62 64 61 20 28 72 75 6e 2d 69 64 20 74  lambda (run-id t
0710: 65 73 74 6e 61 6d 65 73 20 63 75 72 72 73 74 61  estnames currsta
0720: 74 65 20 63 75 72 72 73 74 61 74 75 73 20 6e 65  te currstatus ne
0730: 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 73  wstate newstatus
0740: 29 0a 20 20 20 20 20 20 20 3b 3b 20 28 64 65 62  ).       ;; (deb
0750: 75 67 3a 70 72 69 6e 74 20 32 20 22 72 64 62 3a  ug:print 2 "rdb:
0760: 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74 65 2d  set-tests-state-
0770: 73 74 61 74 75 73 20 6e 65 77 73 74 61 74 65 3a  status newstate:
0780: 20 22 20 6e 65 77 73 74 61 74 65 20 22 20 6e 65   " newstate " ne
0790: 77 73 74 61 74 75 73 3a 20 22 20 6e 65 77 73 74  wstatus: " newst
07a0: 61 74 75 73 29 0a 20 20 20 20 20 20 20 28 64 62  atus).       (db
07b0: 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74 65  :set-tests-state
07c0: 2d 73 74 61 74 75 73 20 64 62 20 72 75 6e 2d 69  -status db run-i
07d0: 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75 72 72  d testnames curr
07e0: 73 74 61 74 65 20 63 75 72 72 73 74 61 74 75 73  state currstatus
07f0: 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61   newstate newsta
0800: 74 75 73 29 29 29 0a 0a 20 20 20 20 28 72 70 63  tus)))..    (rpc
0810: 3a 70 75 62 6c 69 73 68 2d 70 72 6f 63 65 64 75  :publish-procedu
0820: 72 65 21 0a 20 20 20 20 20 27 72 64 62 3a 74 65  re!.     'rdb:te
0830: 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61 74 75  ststep-set-statu
0840: 73 21 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  s!.     (lambda 
0850: 28 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d  (run-id test-nam
0860: 65 20 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 20  e teststep-name 
0870: 73 74 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d  state-in status-
0880: 69 6e 20 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d  in item-path com
0890: 6d 65 6e 74 20 6c 6f 67 66 69 6c 65 29 0a 20 20  ment logfile).  
08a0: 20 20 20 20 20 3b 3b 20 28 64 65 62 75 67 3a 70       ;; (debug:p
08b0: 72 69 6e 74 20 32 20 22 72 64 62 3a 74 65 73 74  rint 2 "rdb:test
08c0: 73 74 65 70 2d 73 74 61 74 65 2d 73 65 74 2d 73  step-state-set-s
08d0: 74 61 74 75 73 21 20 74 65 73 74 2d 6e 61 6d 65  tatus! test-name
08e0: 3a 20 22 20 74 65 73 74 2d 6e 61 6d 65 20 22 20  : " test-name " 
08f0: 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 3a 20 22  teststep-name: "
0900: 20 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 29 0a   teststep-name).
0910: 20 20 20 20 20 20 20 28 64 62 3a 74 65 73 74 73         (db:tests
0920: 74 65 70 2d 73 65 74 2d 73 74 61 74 75 73 21 20  tep-set-status! 
0930: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  db run-id test-n
0940: 61 6d 65 20 74 65 73 74 73 74 65 70 2d 6e 61 6d  ame teststep-nam
0950: 65 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74 75  e state-in statu
0960: 73 2d 69 6e 20 69 74 65 6d 2d 70 61 74 68 20 63  s-in item-path c
0970: 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65 29 29  omment logfile))
0980: 29 0a 0a 20 20 20 20 28 73 65 74 21 20 2a 72 70  )..    (set! *rp
0990: 63 3a 6c 69 73 74 65 6e 65 72 2a 20 72 70 63 3a  c:listener* rpc:
09a0: 6c 69 73 74 65 6e 65 72 29 0a 20 20 20 20 28 6f  listener).    (o
09b0: 6e 2d 65 78 69 74 20 28 6c 61 6d 62 64 61 20 28  n-exit (lambda (
09c0: 29 0a 09 20 20 20 20 20 20 20 28 73 71 6c 69 74  )..       (sqlit
09d0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44  e3:execute db "D
09e0: 45 4c 45 54 45 20 46 52 4f 4d 20 6d 65 74 61 64  ELETE FROM metad
09f0: 61 74 20 57 48 45 52 45 20 76 61 72 3d 27 53 45  at WHERE var='SE
0a00: 52 56 45 52 27 20 61 6e 64 20 76 61 6c 3d 3f 3b  RVER' and val=?;
0a10: 22 20 68 6f 73 74 3a 70 6f 72 74 29 0a 09 20 20  " host:port)..  
0a20: 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 69       (sqlite3:fi
0a30: 6e 61 6c 69 7a 65 21 20 64 62 29 29 29 0a 20 20  nalize! db))).  
0a40: 20 20 28 74 68 72 65 61 64 2d 73 74 61 72 74 21    (thread-start!
0a50: 20 74 68 31 29 0a 20 20 20 20 28 74 68 72 65 61   th1).    (threa
0a60: 64 2d 6a 6f 69 6e 21 20 74 68 31 29 29 29 20 3b  d-join! th1))) ;
0a70: 3b 20 72 70 63 3a 73 65 72 76 65 72 29 29 29 0a  ; rpc:server))).
0a80: 0a 28 64 65 66 69 6e 65 20 28 73 65 72 76 65 72  .(define (server
0a90: 3a 66 69 6e 64 2d 66 72 65 65 2d 70 6f 72 74 2d  :find-free-port-
0aa0: 61 6e 64 2d 6f 70 65 6e 20 70 6f 72 74 29 0a 20  and-open port). 
0ab0: 20 28 68 61 6e 64 6c 65 2d 65 78 63 65 70 74 69   (handle-excepti
0ac0: 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20 20 28 62  ons.   exn.   (b
0ad0: 65 67 69 6e 0a 20 20 20 20 20 28 70 72 69 6e 74  egin.     (print
0ae0: 20 22 46 61 69 6c 65 64 20 74 6f 20 62 69 6e 64   "Failed to bind
0af0: 20 74 6f 20 70 6f 72 74 20 22 20 28 72 70 63 3a   to port " (rpc:
0b00: 64 65 66 61 75 6c 74 2d 73 65 72 76 65 72 2d 70  default-server-p
0b10: 6f 72 74 29 20 22 2c 20 74 72 79 69 6e 67 20 6e  ort) ", trying n
0b20: 65 78 74 20 70 6f 72 74 22 29 0a 20 20 20 20 20  ext port").     
0b30: 28 73 65 72 76 65 72 3a 66 69 6e 64 2d 66 72 65  (server:find-fre
0b40: 65 2d 70 6f 72 74 2d 61 6e 64 2d 6f 70 65 6e 20  e-port-and-open 
0b50: 28 2b 20 70 6f 72 74 20 31 29 29 29 0a 20 20 20  (+ port 1))).   
0b60: 28 72 70 63 3a 64 65 66 61 75 6c 74 2d 73 65 72  (rpc:default-ser
0b70: 76 65 72 2d 70 6f 72 74 20 70 6f 72 74 29 0a 20  ver-port port). 
0b80: 20 20 28 74 63 70 2d 6c 69 73 74 65 6e 20 28 72    (tcp-listen (r
0b90: 70 63 3a 64 65 66 61 75 6c 74 2d 73 65 72 76 65  pc:default-serve
0ba0: 72 2d 70 6f 72 74 29 29 29 29 0a 0a 28 64 65 66  r-port))))..(def
0bb0: 69 6e 65 20 28 73 65 72 76 65 72 3a 63 6c 69 65  ine (server:clie
0bc0: 6e 74 2d 73 65 74 75 70 20 64 62 29 0a 20 20 28  nt-setup db).  (
0bd0: 6c 65 74 2a 20 28 28 68 6f 73 74 69 6e 66 6f 20  let* ((hostinfo 
0be0: 28 64 62 3a 67 65 74 2d 76 61 72 20 64 62 20 22  (db:get-var db "
0bf0: 53 45 52 56 45 52 22 29 29 0a 09 20 28 68 6f 73  SERVER")).. (hos
0c00: 74 64 61 74 20 20 28 69 66 20 68 6f 73 74 69 6e  tdat  (if hostin
0c10: 66 6f 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74  fo (string-split
0c20: 20 68 6f 73 74 69 6e 66 6f 20 22 3a 22 29 29 29   hostinfo ":")))
0c30: 0a 09 20 28 68 6f 73 74 20 20 20 20 20 28 69 66  .. (host     (if
0c40: 20 68 6f 73 74 69 6e 66 6f 20 28 63 61 72 20 68   hostinfo (car h
0c50: 6f 73 74 64 61 74 29 29 29 0a 09 20 28 70 6f 72  ostdat))).. (por
0c60: 74 20 20 20 20 20 28 69 66 20 28 61 6e 64 20 68  t     (if (and h
0c70: 6f 73 74 69 6e 66 6f 20 28 3e 20 28 6c 65 6e 67  ostinfo (> (leng
0c80: 74 68 20 68 6f 73 74 64 61 74 29 20 31 29 29 28  th hostdat) 1))(
0c90: 63 61 64 72 20 68 6f 73 74 64 61 74 29 20 23 66  cadr hostdat) #f
0ca0: 29 29 29 0a 20 20 20 20 28 69 66 20 28 61 6e 64  ))).    (if (and
0cb0: 20 70 6f 72 74 0a 09 20 20 20 20 20 28 73 74 72   port..     (str
0cc0: 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 70 6f 72 74  ing->number port
0cd0: 29 29 0a 09 28 64 65 62 75 67 3a 70 72 69 6e 74  ))..(debug:print
0ce0: 20 32 20 22 49 4e 46 4f 3a 20 53 65 74 74 69 6e   2 "INFO: Settin
0cf0: 67 20 75 70 20 74 6f 20 63 6f 6e 6e 65 63 74 20  g up to connect 
0d00: 74 6f 20 68 6f 73 74 20 22 20 68 6f 73 74 20 22  to host " host "
0d10: 3a 22 20 70 6f 72 74 29 29 0a 20 20 20 20 28 73  :" port)).    (s
0d20: 65 74 21 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  et! *runremote* 
0d30: 28 69 66 20 70 6f 72 74 20 28 76 65 63 74 6f 72  (if port (vector
0d40: 20 68 6f 73 74 20 28 73 74 72 69 6e 67 2d 3e 6e   host (string->n
0d50: 75 6d 62 65 72 20 70 6f 72 74 29 29 20 23 66 29  umber port)) #f)
0d60: 29 29 29 0a 0a                                   )))..