mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2025-12-06 02:40:26 -08:00
Two compatibility improvements in the SOCKETS library:
1) The buffer types :FULL and :LINE are supported. 2) We create an alias called SB-BSD-SOCKETS
This commit is contained in:
parent
34012935a0
commit
413b9561cf
7 changed files with 37 additions and 14 deletions
1
contrib/sockets/sb-bsd-sockets.lisp
Normal file
1
contrib/sockets/sb-bsd-sockets.lisp
Normal file
|
|
@ -0,0 +1 @@
|
|||
(require 'SOCKETS)
|
||||
|
|
@ -1173,29 +1173,29 @@ also known as unix-domain sockets."))
|
|||
"si_set_buffering_mode(ecl_make_stream_from_fd(#0,#1,(enum ecl_smmode)#2,8,ECL_STREAM_DEFAULT_FORMAT,Cnil), #3)"
|
||||
:one-liner t))
|
||||
|
||||
(defmethod socket-make-stream ((socket socket) &rest args &key (buffering-mode NIL))
|
||||
(defmethod socket-make-stream ((socket socket) &rest args &key (buffering :full))
|
||||
(declare (ignore args))
|
||||
(let ((stream (and (slot-boundp socket 'stream)
|
||||
(slot-value socket 'stream))))
|
||||
(unless stream
|
||||
(setf stream (let ((fd (socket-file-descriptor socket)))
|
||||
(make-stream-from-fd fd #-:wsock :input-output #+:wsock :input-output-wsock
|
||||
buffering-mode)))
|
||||
buffering)))
|
||||
(setf (slot-value socket 'stream) stream)
|
||||
#+ ignore
|
||||
(sb-ext:cancel-finalization socket))
|
||||
stream))
|
||||
|
||||
#+:wsock
|
||||
(defmethod socket-make-stream ((socket named-pipe-socket) &rest args &key (buffering-mode NIL))
|
||||
(defmethod socket-make-stream ((socket named-pipe-socket) &rest args &key (buffering :full))
|
||||
(declare (ignore args))
|
||||
(let ((stream (and (slot-boundp socket 'stream)
|
||||
(slot-value socket 'stream))))
|
||||
(unless stream
|
||||
(setf stream
|
||||
(let* ((fd (socket-file-descriptor socket))
|
||||
(in (make-stream-from-fd fd :smm-input buffering-mode))
|
||||
(out (make-stream-from-fd fd :smm-output buffering-mode)))
|
||||
(in (make-stream-from-fd fd :smm-input buffering))
|
||||
(out (make-stream-from-fd fd :smm-output buffering)))
|
||||
(make-two-way-stream in out)))
|
||||
(setf (slot-value socket 'stream) stream)
|
||||
#+ ignore
|
||||
|
|
@ -1519,3 +1519,4 @@ GET-NAME-SERVICE-ERRNO")
|
|||
|
||||
;; Finished loading
|
||||
(provide 'sockets)
|
||||
(provide 'sb-bsd-sockets)
|
||||
|
|
|
|||
|
|
@ -16,6 +16,13 @@ ECL 9.8.4:
|
|||
platforms do not support it and GCC does not complain, making reliable
|
||||
detection impossible.
|
||||
|
||||
- For further compatibility with SBCL, ECL now supports two additional
|
||||
buffer types :FULL and :LINE which are compatible with :FULLY-BUFFERED
|
||||
and :LINE-BUFFERED (Thanks to Matthew Mondor)
|
||||
|
||||
- The sockets library can now be loaded using either (REQUIRE 'SOCKETS)
|
||||
or (REQUIRE 'SB-BSD-SOCKETS).
|
||||
|
||||
ECL 9.8.3:
|
||||
==========
|
||||
|
||||
|
|
|
|||
20
src/c/file.d
20
src/c/file.d
|
|
@ -3749,24 +3749,26 @@ si_set_buffering_mode(cl_object stream, cl_object buffer_mode_symbol)
|
|||
if (type_of(stream) != t_stream) {
|
||||
FEerror("Cannot set buffer of ~A", 1, stream);
|
||||
}
|
||||
if (buffer_mode_symbol == Cnil) {
|
||||
|
||||
if (buffer_mode_symbol == @':none' || Null(buffer_mode_symbol))
|
||||
buffer_mode = _IONBF;
|
||||
} else if (buffer_mode_symbol == Ct || buffer_mode_symbol == @':fully-buffered') {
|
||||
buffer_mode = _IOFBF;
|
||||
} else if (buffer_mode_symbol == @':line-buffered') {
|
||||
else if (buffer_mode_symbol == @':line' || buffer_mode_symbol == @':line-buffered')
|
||||
buffer_mode = _IOLBF;
|
||||
} else {
|
||||
else if (buffer_mode_symbol == @':full' || buffer_mode_symbol == @':fully-buffered')
|
||||
buffer_mode = _IOFBF;
|
||||
else
|
||||
FEerror("Not a valid buffering mode: ~A", 1, buffer_mode_symbol);
|
||||
}
|
||||
|
||||
if (mode == smm_output || mode == smm_io || mode == smm_input) {
|
||||
FILE *fp = IO_STREAM_FILE(stream);
|
||||
setvbuf(fp, 0, _IONBF, 0);
|
||||
|
||||
if (buffer_mode != _IONBF) {
|
||||
cl_index buffer_size = BUFSIZ;
|
||||
char *new_buffer = ecl_alloc_atomic(buffer_size);
|
||||
stream->stream.buffer = new_buffer;
|
||||
setvbuf(fp, new_buffer, buffer_mode, buffer_size);
|
||||
}
|
||||
} else
|
||||
setvbuf(fp, NULL, _IONBF, 0);
|
||||
}
|
||||
@(return stream)
|
||||
}
|
||||
|
|
@ -4501,7 +4503,7 @@ ecl_open_stream(cl_object fn, enum ecl_smmode smm, cl_object if_exists,
|
|||
}
|
||||
x = ecl_make_stream_from_FILE(fn, fp, smm, byte_size, flags,
|
||||
external_format);
|
||||
si_set_buffering_mode(x, byte_size? @':fully-buffered' : @':line-buffered');
|
||||
si_set_buffering_mode(x, byte_size? @':full' : @':line');
|
||||
} else {
|
||||
x = ecl_make_file_stream_from_fd(fn, f, smm, byte_size, flags,
|
||||
external_format);
|
||||
|
|
|
|||
|
|
@ -1630,8 +1630,11 @@ cl_symbols[] = {
|
|||
{SYS_ "*ACTION-ON-UNDEFINED-VARIABLE*", SI_SPECIAL, NULL, -1, Cnil},
|
||||
|
||||
{SYS_ "SET-BUFFERING-MODE", SI_ORDINARY, si_set_buffering_mode, 2, OBJNULL},
|
||||
{KEY_ "NONE", KEYWORD, NULL, -1, OBJNULL},
|
||||
{KEY_ "LINE-BUFFERED", KEYWORD, NULL, -1, OBJNULL},
|
||||
{KEY_ "FULLY-BUFFERED", KEYWORD, NULL, -1, OBJNULL},
|
||||
{KEY_ "LINE", KEYWORD, NULL, -1, OBJNULL},
|
||||
{KEY_ "FULL", KEYWORD, NULL, -1, OBJNULL},
|
||||
|
||||
{SYS_ "CMP-ENV-REGISTER-MACROLET", SI_ORDINARY, NULL, -1, OBJNULL},
|
||||
|
||||
|
|
|
|||
|
|
@ -1630,8 +1630,11 @@ cl_symbols[] = {
|
|||
{SYS_ "*ACTION-ON-UNDEFINED-VARIABLE*",NULL},
|
||||
|
||||
{SYS_ "SET-BUFFERING-MODE","si_set_buffering_mode"},
|
||||
{KEY_ "NONE",NULL},
|
||||
{KEY_ "LINE-BUFFERED",NULL},
|
||||
{KEY_ "FULLY-BUFFERED",NULL},
|
||||
{KEY_ "LINE",NULL},
|
||||
{KEY_ "FULL",NULL},
|
||||
|
||||
{SYS_ "CMP-ENV-REGISTER-MACROLET",NULL},
|
||||
|
||||
|
|
|
|||
|
|
@ -200,6 +200,12 @@
|
|||
:builtin
|
||||
#+(or (NOT :WANTS-DLOPEN) :BUILTIN-SOCKETS) t
|
||||
#-(or (NOT :WANTS-DLOPEN) :BUILTIN-SOCKETS) nil)
|
||||
#+(and WANTS-SOCKETS WANTS-DLOPEN (not BUILTIN-SOCKETS))
|
||||
(build-module "sb-bsd-sockets"
|
||||
'("ext:sockets;sb-bsd-sockets.lisp")
|
||||
:dir "build:ext;"
|
||||
:prefix "EXT"
|
||||
:builtin nil)
|
||||
|
||||
#+WANTS-SERVE-EVENT
|
||||
(build-module "serve-event"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue