source: project/release/2/ioctl/ioctl.scm @ 8742

Last change on this file since 8742 was 8742, checked in by felix winkelmann, 12 years ago

moved eggs partially to rrb2

File size: 10.4 KB
Line 
1;;;; ioctl.scm -- ioctl (I/O control) interface
2;;
3;; Copyright (c) 2007-2008 Alex Shinn.  All rights reserved.
4;; BSD-style license: http://synthcode.com/license.txt
5
6;; The ioctl(2) system call provides an interface to the operating
7;; system terminal drivers (or more commonly these days to ptys
8;; (pseudo-terminals)).  ioctl is very low-level - most aspects of the
9;; terminal can be controlled with the higher-level termios(4),
10;; available in Chicken as the even higher-level stty egg.
11
12;; One thing you may want this library for is to access the terminal's
13;; row and column dimensions, for which the ioctl-winsize procedure is
14;; provided.
15
16;; Procedure: ioctl-winsize [<port-or-fileno>]
17;;
18;;   Returns a list of the form (<num-rows> <num-columns>) for the
19;;   given port or file descriptor, defaulting to current-output-port.
20
21;; Procedure: ioctl <port-or-fileno> <request> <arg> ...
22;;
23;;   Makes the given ioctl request with any arguments provided.  The
24;;   following requests are available:
25;;
26;; TIOCSETD int *ldisc
27;;     change the line discipline:
28;;                TTYDISC     termios interactive line discipline
29;;                TABLDISC    tablet line discipline
30;;                SLIPDISC    serial IP line discipline
31;;                PPPDISC     PPP line discipline
32;; TIOCGETD int *ldisc
33;;     return the current line discipline
34;; TIOCSBRK
35;;     set the terminal into BREAK condition
36;; TIOCCBRK
37;;     clear the terminal BREAK condition
38;; TIOCSDTR
39;;     assert data terminal ready
40;; TIOCCDTR
41;;     clear data terminal ready
42;; TIOCGPGRP int *tpgrp
43;;     return the terminal's process group
44;; TIOCSPGRP int *tpgrp
45;;     associate the terminal's process group
46;; TIOCGETA struct termios *term
47;;     get the terminal's termios attributes
48;; TIOCSETA struct termios *term
49;;     set the terminal's termios attributes
50;; TIOCSETAW struct termios *term
51;;     set the termios attrs after any output completes
52;; TIOCSETAF struct termios *term
53;;     after any output completes, clear input and set termios attrs
54;; TIOCOUTQ int *num
55;;     current number of characters in the output queue
56;; TIOCSTI char *cp
57;;     manually send a character to the terminal
58;; TIOCSTOP
59;;     stop output (like typing ^S)
60;; TIOCSTART
61;;     start output (like typing ^Q)
62;; TIOCSCTTY
63;;     make this the controlling terminal for the process
64;; TIOCDRAIN
65;;     wait until all output is drained
66;; TIOCEXCL
67;;     set exclusive use on the terminal
68;; TIOCNXCL
69;;     clear exclusive use of the terminal
70;; TIOCFLUSH int *what
71;;     clear input/output if `what' has FREAD/FWRITE set
72;; TIOCGWINSZ struct winsize *ws
73;;     get the winsize information
74;; TIOCSWINSZ struct winsize *ws
75;;     set the winsize information
76;; TIOCCONS int *on
77;;     redirect kernel console messages
78;; TIOCMSET int *state
79;;     set the modem state bit flags according to the following:
80;;                TIOCM_LE   Line Enable
81;;                TIOCM_DTR  Data Terminal Ready
82;;                TIOCM_RTS  Request To Send
83;;                TIOCM_ST   Secondary Transmit
84;;                TIOCM_SR   Secondary Receive
85;;                TIOCM_CTS  Clear To Send
86;;                TIOCM_CAR  Carrier Detect
87;;                TIOCM_CD   Carrier Detect (synonym)
88;;                TIOCM_RNG  Ring Indication
89;;                TIOCM_RI   Ring Indication (synonym)
90;;                TIOCM_DSR  Data Set Ready
91;; TIOCMGET int *state
92;;     get the modem state bit flags
93;; TIOCMBIS int *state
94;;     add modem state bit flags, OR-ing in the new states
95;; TIOCMBIC int *state
96;;     clear modem state bit flags
97;;
98;; The struct winsize *ws arguments use the winsize record:
99;;
100;;     make-winsize free-winsize
101;;     winsize-row winsize-col
102;;     winsize-row-set! winsize-col-set!
103;;
104;; The struct termios *term arguments use the term-attrs record from
105;; the stty egg.
106;;
107;; The integer pointer arguments can be handled with pointers from the
108;; lolevel extension.
109
110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
111
112(use posix)
113
114(cond-expand
115 ((and chicken compiling)
116  (declare
117   (export
118    ;; interface
119    ioctl ioctl-winsize
120    ;; the winsize record
121    make-winsize free-winsize
122    winsize-row winsize-col winsize-xpixel winsize-ypixel
123    winsize-row-set! winsize-col-set!
124    winsize-xpixel-set! winsize-ypixel-set!
125    ;; constants
126    TIOCSETD TTYDISC TABLDISC SLIPDISC PPPDISC TIOCGETD
127    TIOCSBRK TIOCCBRK TIOCSDTR TIOCCDTR TIOCGPGRP TIOCSPGRP
128    TIOCGETA TIOCSETA TIOCSETAW TIOCSETAF TIOCOUTQ TIOCSTI
129    TIOCSTOP TIOCSTART TIOCSCTTY TIOCDRAIN TIOCEXCL TIOCNXCL
130    TIOCFLUSH TIOCGWINSZ TIOCSWINSZ TIOCCONS TIOCMSET TIOCM_LE
131    TIOCM_DTR TIOCM_RTS TIOCM_ST TIOCM_SR TIOCM_CTS TIOCM_CAR
132    TIOCM_CD TIOCM_RNG TIOCM_RI TIOCM_DSR TIOCMGET
133    TIOCMBIS TIOCMBIC
134    )))
135 (else
136  ))
137
138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
139
140(declare (foreign-declare "#include <termios.h>\n"))
141(declare (foreign-declare "#include <sys/ioctl.h>"))
142(declare (foreign-declare "#include <sys/ttycom.h>"))
143(declare (foreign-declare "#include <errno.h>"))
144(declare (foreign-declare "#include <string.h>"))
145(declare (foreign-declare "typedef struct winsize struct_winsize;"))
146
147(define-foreign-record (winsize struct_winsize)
148  (constructor: %make-winsize)
149  (destructor: free-winsize)
150  (rename: (lambda (str) (string-append "winsize-" (substring str 11))))
151  (unsigned-short ws_row)
152  (unsigned-short ws_col)
153  (unsigned-short ws_xpixel)
154  (unsigned-short ws_ypixel)
155  )
156
157(define (make-winsize . o)
158  (let ((res (%make-winsize)))
159    (cond
160     ((pair? o)
161      (winsize-row-set! res (car o))
162      (if (pair? (cdr o))
163          (winsize-col-set! res (cadr o)))))
164    res))
165
166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
167;; constants
168
169(define-foreign-variable TIOCSETD_ unsigned-long "TIOCSETD")
170(define TIOCSETD TIOCSETD_)
171(define-foreign-variable TTYDISC_ unsigned-long "TTYDISC")
172(define TTYDISC TTYDISC_)
173(define-foreign-variable TABLDISC_ unsigned-long "TABLDISC")
174(define TABLDISC TABLDISC_)
175(define-foreign-variable SLIPDISC_ unsigned-long "SLIPDISC")
176(define SLIPDISC SLIPDISC_)
177(define-foreign-variable PPPDISC_ unsigned-long "PPPDISC")
178(define PPPDISC PPPDISC_)
179(define-foreign-variable TIOCGETD_ unsigned-long "TIOCGETD")
180(define TIOCGETD TIOCGETD_)
181(define-foreign-variable TIOCSBRK_ unsigned-long "TIOCSBRK")
182(define TIOCSBRK TIOCSBRK_)
183(define-foreign-variable TIOCCBRK_ unsigned-long "TIOCCBRK")
184(define TIOCCBRK TIOCCBRK_)
185(define-foreign-variable TIOCSDTR_ unsigned-long "TIOCSDTR")
186(define TIOCSDTR TIOCSDTR_)
187(define-foreign-variable TIOCCDTR_ unsigned-long "TIOCCDTR")
188(define TIOCCDTR TIOCCDTR_)
189(define-foreign-variable TIOCGPGRP_ unsigned-long "TIOCGPGRP")
190(define TIOCGPGRP TIOCGPGRP_)
191(define-foreign-variable TIOCSPGRP_ unsigned-long "TIOCSPGRP")
192(define TIOCSPGRP TIOCSPGRP_)
193(define-foreign-variable TIOCGETA_ unsigned-long "TIOCGETA")
194(define TIOCGETA TIOCGETA_)
195(define-foreign-variable TIOCSETA_ unsigned-long "TIOCSETA")
196(define TIOCSETA TIOCSETA_)
197(define-foreign-variable TIOCSETAW_ unsigned-long "TIOCSETAW")
198(define TIOCSETAW TIOCSETAW_)
199(define-foreign-variable TIOCSETAF_ unsigned-long "TIOCSETAF")
200(define TIOCSETAF TIOCSETAF_)
201(define-foreign-variable TIOCOUTQ_ unsigned-long "TIOCOUTQ")
202(define TIOCOUTQ TIOCOUTQ_)
203(define-foreign-variable TIOCSTI_ unsigned-long "TIOCSTI")
204(define TIOCSTI TIOCSTI_)
205(define-foreign-variable TIOCSTOP_ unsigned-long "TIOCSTOP")
206(define TIOCSTOP TIOCSTOP_)
207(define-foreign-variable TIOCSTART_ unsigned-long "TIOCSTART")
208(define TIOCSTART TIOCSTART_)
209(define-foreign-variable TIOCSCTTY_ unsigned-long "TIOCSCTTY")
210(define TIOCSCTTY TIOCSCTTY_)
211(define-foreign-variable TIOCDRAIN_ unsigned-long "TIOCDRAIN")
212(define TIOCDRAIN TIOCDRAIN_)
213(define-foreign-variable TIOCEXCL_ unsigned-long "TIOCEXCL")
214(define TIOCEXCL TIOCEXCL_)
215(define-foreign-variable TIOCNXCL_ unsigned-long "TIOCNXCL")
216(define TIOCNXCL TIOCNXCL_)
217(define-foreign-variable TIOCFLUSH_ unsigned-long "TIOCFLUSH")
218(define TIOCFLUSH TIOCFLUSH_)
219(define-foreign-variable TIOCGWINSZ_ unsigned-long "TIOCGWINSZ")
220(define TIOCGWINSZ TIOCGWINSZ_)
221(define-foreign-variable TIOCSWINSZ_ unsigned-long "TIOCSWINSZ")
222(define TIOCSWINSZ TIOCSWINSZ_)
223(define-foreign-variable TIOCCONS_ unsigned-long "TIOCCONS")
224(define TIOCCONS TIOCCONS_)
225(define-foreign-variable TIOCMSET_ unsigned-long "TIOCMSET")
226(define TIOCMSET TIOCMSET_)
227(define-foreign-variable TIOCM_LE_ unsigned-long "TIOCM_LE")
228(define TIOCM_LE TIOCM_LE_)
229(define-foreign-variable TIOCM_DTR_ unsigned-long "TIOCM_DTR")
230(define TIOCM_DTR TIOCM_DTR_)
231(define-foreign-variable TIOCM_RTS_ unsigned-long "TIOCM_RTS")
232(define TIOCM_RTS TIOCM_RTS_)
233(define-foreign-variable TIOCM_ST_ unsigned-long "TIOCM_ST")
234(define TIOCM_ST TIOCM_ST_)
235(define-foreign-variable TIOCM_SR_ unsigned-long "TIOCM_SR")
236(define TIOCM_SR TIOCM_SR_)
237(define-foreign-variable TIOCM_CTS_ unsigned-long "TIOCM_CTS")
238(define TIOCM_CTS TIOCM_CTS_)
239(define-foreign-variable TIOCM_CAR_ unsigned-long "TIOCM_CAR")
240(define TIOCM_CAR TIOCM_CAR_)
241(define-foreign-variable TIOCM_CD_ unsigned-long "TIOCM_CD")
242(define TIOCM_CD TIOCM_CD_)
243(define-foreign-variable TIOCM_RNG_ unsigned-long "TIOCM_RNG")
244(define TIOCM_RNG TIOCM_RNG_)
245(define-foreign-variable TIOCM_RI_ unsigned-long "TIOCM_RI")
246(define TIOCM_RI TIOCM_RI_)
247(define-foreign-variable TIOCM_DSR_ unsigned-long "TIOCM_DSR")
248(define TIOCM_DSR TIOCM_DSR_)
249(define-foreign-variable TIOCMGET_ unsigned-long "TIOCMGET")
250(define TIOCMGET TIOCMGET_)
251(define-foreign-variable TIOCMBIS_ unsigned-long "TIOCMBIS")
252(define TIOCMBIS TIOCMBIS_)
253(define-foreign-variable TIOCMBIC_ unsigned-long "TIOCMBIC")
254(define TIOCMBIC TIOCMBIC_)
255
256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
257
258(define ioctl0
259  (foreign-lambda* int ((int fd) (unsigned-long req))
260    "int res = ioctl(fd, req);"
261    "return(res);"))
262
263(define ioctl1
264  (foreign-lambda* int ((int fd) (unsigned-long req) (c-pointer val1))
265    "int res = ioctl(fd, req, val1);"
266;;     "if (res) fprintf(stderr, \"ioctl(%d, %u) failed: %d: %s\\n\", fd, req, errno, strerror(errno));"
267    "return(res);"))
268
269(define (ioctl port request . o)
270  (let ((fd (if (port? port) (port->fileno port) port)))
271    (cond
272     ((null? o) (ioctl0 fd request))
273     (else (ioctl1 fd request (car o))))))
274
275(define (ioctl-winsize . o)
276  (let* ((port (if (pair? o) (car o) (current-output-port)))
277         (fd (if (port? port) (port->fileno port) port))
278         (ws (%make-winsize))
279         (errcode (ioctl1 fd TIOCGWINSZ ws)))
280    (let ((res (list (winsize-row ws) (winsize-col ws))))
281      (free-winsize ws)
282      (and (zero? errcode) res))))
283
Note: See TracBrowser for help on using the repository browser.