Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.46 KB | None | 0 0
  1. #lang racket
  2.  
  3. (require racket/unix-socket)
  4.  
  5. (define (write-to entries out)
  6. (displayln entries out))
  7.  
  8. (define (log pid entries)
  9. (match (thread-receive)
  10. [(cons 'read out)
  11. (write-to entries out)
  12. (log pid entries)]
  13.  
  14. [entry
  15. (log pid (cons entry entries))]))
  16.  
  17.  
  18. (define (logger-send loggers pid message)
  19. (cond
  20. [(hash-has-key? loggers pid)
  21. (thread-send (hash-ref loggers pid) message)]
  22. [else '()]))
  23.  
  24. (define (spawn-logger loggers)
  25. (match (thread-receive)
  26. [(list 'log pid entry)
  27. (logger-send loggers pid entry)
  28. (spawn-logger loggers)]
  29.  
  30. [(cons 'spawn pid)
  31. (spawn-logger (hash-set loggers
  32. pid
  33. (thread (lambda () (log pid '[])))))]
  34.  
  35. [(cons 'kill pid)
  36. (kill-thread (hash-ref loggers pid))
  37. (spawn-logger
  38. (hash-remove loggers pid))]
  39.  
  40. [(list 'read pid out)
  41. (displayln "got read message")
  42. ; Reads all the logs for a given pid
  43. (logger-send loggers pid (cons 'read out))
  44. (spawn-logger loggers)]))
  45.  
  46. ; acts as ambient authority for program
  47. (define
  48. control-socket
  49. (unix-socket-listen "/tmp/shelltalk.sock"))
  50.  
  51. (define log-spawner
  52. (thread (lambda ()
  53. (spawn-logger
  54. (make-immutable-hash '[])))))
  55.  
  56. (define (close-socket in out)
  57. (close-output-port out)
  58. (close-input-port in))
  59.  
  60. (define (handle-connection in out)
  61. (define input-string (read-line in 'linefeed))
  62. (cond
  63. [(eof-object? input-string)
  64. (close-socket in out)]
  65. [else
  66. (match (string-split input-string)
  67. [(list "spawn" pid)
  68. (displayln "got spawn")
  69. (thread-send log-spawner (cons 'spawn pid))
  70. (handle-connection in out)]
  71.  
  72. [(list "read" pid)
  73. (displayln "got read")
  74. (thread-send log-spawner (list 'read pid out))
  75. (handle-connection in out)]
  76.  
  77. [(list "write" pid message)
  78. (displayln "got write")
  79. (thread-send log-spawner (list 'log pid message))
  80. (handle-connection in out)]
  81.  
  82. [(list "close" pid)
  83. (thread-send log-spawner (cons 'kill pid))
  84. (close-socket in out)]
  85.  
  86. [other
  87. (displayln other)
  88. (handle-connection in out)])]))
  89.  
  90. (define (accept-logs)
  91. (let-values
  92. ([(in out) (unix-socket-accept control-socket)])
  93. (thread
  94. ; hands the read capability over for this shell instance
  95. (lambda ()
  96. (file-stream-buffer-mode out 'none)
  97. (handle-connection in out))))
  98. (accept-logs))
  99.  
  100. (accept-logs)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement