blob: dfa94cc7e834eba323e2afb48d88cc536f8a10ed (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
(define-module (entry-points server)
:use-module (util)
:use-module (util options)
:use-module (util exceptions)
:use-module (srfi srfi-1)
:use-module (ice-9 getopt-long)
;; :use-module (ice-9 regex) #| regex here due to bad macros |#
:use-module ((server server) :select (start-server))
:export (main))
(define options
'((port (value #t) (single-char #\p)
(description "Bind to TCP port, defaults to " (i 8080) "."))
(addr (value #t)
(description "Address to use, defaults to " (i "0.0.0.0")
" for IPv4, and " (i "::") " for IPv6.")
)
;; numbers as single-char doesn't work.
(six (description "Use IPv6."))
(four (description "Use IPv4."))
(help (single-char #\h)
(description "Print this help."))))
(define-public (main args)
(define opts (getopt-long args (getopt-opt options)))
(define port (string->number (option-ref opts 'port "8080")))
(define addr (option-ref opts 'addr #f))
(define family
(cond [(option-ref opts 'six #f) AF_INET6]
[(option-ref opts 'four #f) AF_INET]
[(and addr (string-contains addr ":")) AF_INET6]
[(and addr (string-contains addr ".")) AF_INET]
[else AF_INET6]))
(when (option-ref opts 'help #f)
(print-arg-help options)
(throw 'return))
;; update address if it was left blank. A bit clumsy since
;; @var{addr} & @var{family} depend on each other.
;; placed after load-calendars to keep Guile 2.2 compability.
(set! addr
(if addr addr
(if (eqv? family AF_INET6)
"::" "0.0.0.0")))
(format #t "Starting server on ~a:~a~%I'm ~a, runing from ~a~%"
addr port
(getpid) (getcwd))
(catch 'system-error
(lambda ()
(start-server `(family: ,family port: ,port host: ,addr)))
;; probably address already in use
(lambda (err proc fmt args errno)
(format (current-error-port) "~a: ~?~%"
proc fmt args))))
|