diff --git a/contrib/sockets/sb-bsd-sockets.lisp b/contrib/sockets/sb-bsd-sockets.lisp new file mode 100644 index 000000000..a55c487ab --- /dev/null +++ b/contrib/sockets/sb-bsd-sockets.lisp @@ -0,0 +1 @@ +(require 'SOCKETS) diff --git a/contrib/sockets/sockets.lisp b/contrib/sockets/sockets.lisp index ff4c00687..dacae98c3 100644 --- a/contrib/sockets/sockets.lisp +++ b/contrib/sockets/sockets.lisp @@ -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) diff --git a/src/CHANGELOG b/src/CHANGELOG index 3576d6b75..d8998db3b 100644 --- a/src/CHANGELOG +++ b/src/CHANGELOG @@ -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: ========== diff --git a/src/c/file.d b/src/c/file.d index f4bce9056..51c1ddf61 100644 --- a/src/c/file.d +++ b/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); diff --git a/src/c/symbols_list.h b/src/c/symbols_list.h index f09d30f84..34e4a10c5 100644 --- a/src/c/symbols_list.h +++ b/src/c/symbols_list.h @@ -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}, diff --git a/src/c/symbols_list2.h b/src/c/symbols_list2.h index b7a592aa1..3694e57f5 100644 --- a/src/c/symbols_list2.h +++ b/src/c/symbols_list2.h @@ -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}, diff --git a/src/compile.lsp.in b/src/compile.lsp.in index 30d8310f7..bde0b7d1c 100644 --- a/src/compile.lsp.in +++ b/src/compile.lsp.in @@ -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"