|
|
;; -*- Mode: Lisp; Syntax: Common-Lisp -*- | ;; -*- Mode: Lisp; Syntax: Common-Lisp -*- |
;; $Id$ |
;; $Id: sockets.lisp,v 1.17 2005/12/05 09:21:30 goffioul Exp $ |
| |
;; This file is based on SBCL's SB-BSD-SOCKET module and has been | ;; This file is based on SBCL's SB-BSD-SOCKET module and has been |
;; heavily modified to work with ECL by Julian Stecklina. | ;; heavily modified to work with ECL by Julian Stecklina. |
|
|
"{ | "{ |
struct sockaddr_in sockaddr; | struct sockaddr_in sockaddr; |
int addr_len = sizeof(struct sockaddr_in); | int addr_len = sizeof(struct sockaddr_in); |
int new_fd = accept(#0, (struct sockaddr*)&sockaddr, &addr_len); |
int new_fd = accept(#0, (struct sockaddr*)&sockaddr, (socklen_t *) &addr_len); |
| |
@(return 0) = new_fd; | @(return 0) = new_fd; |
@(return 1) = Cnil; | @(return 1) = Cnil; |
|
|
sockaddr.sun_len = sizeof(struct sockaddr_un); | sockaddr.sun_len = sizeof(struct sockaddr_un); |
#endif | #endif |
sockaddr.sun_family = #2; | sockaddr.sun_family = #2; |
strncpy(&sockaddr.sun_path,#1,sizeof(sockaddr.sun_path)); |
strncpy((char *) &sockaddr.sun_path,#1,sizeof(sockaddr.sun_path)); |
sockaddr.sun_path[sizeof(sockaddr.sun_path)-1] = '\0'; | sockaddr.sun_path[sizeof(sockaddr.sun_path)-1] = '\0'; |
| |
@(return) = bind(#0,&sockaddr, sizeof(struct sockaddr_un)); |
@(return) = bind(#0,(struct sockaddr *) &sockaddr, sizeof(struct sockaddr_un)); |
}")) | }")) |
(socket-error "bind")))) | (socket-error "bind")))) |
| |
|
|
"{ | "{ |
struct sockaddr_un sockaddr; | struct sockaddr_un sockaddr; |
int addr_len = sizeof(struct sockaddr_un); | int addr_len = sizeof(struct sockaddr_un); |
int new_fd = accept(#0, &sockaddr, &addr_len); |
int new_fd = accept(#0, (struct sockaddr *) &sockaddr, (socklen_t *) &addr_len); |
@(return 0) = new_fd; | @(return 0) = new_fd; |
@(return 1) = (new_fd == -1) ? Cnil : make_string_copy(&sockaddr.sun_path); |
@(return 1) = (new_fd == -1) ? Cnil : make_string_copy((char *) &sockaddr.sun_path); |
}") | }") |
(cond | (cond |
((= fd -1) | ((= fd -1) |
|
|
sockaddr.sun_len = sizeof(struct sockaddr_un); | sockaddr.sun_len = sizeof(struct sockaddr_un); |
#endif | #endif |
sockaddr.sun_family = #1; | sockaddr.sun_family = #1; |
strncpy(&sockaddr.sun_path,#2,sizeof(sockaddr.sun_path)); |
strncpy((char *) &sockaddr.sun_path,#2,sizeof(sockaddr.sun_path)); |
sockaddr.sun_path[sizeof(sockaddr.sun_path)-1] = '\0'; | sockaddr.sun_path[sizeof(sockaddr.sun_path)-1] = '\0'; |
| |
@(return) = connect(#0,&sockaddr, sizeof(struct sockaddr_un)); |
@(return) = connect(#0,(struct sockaddr *) &sockaddr, sizeof(struct sockaddr_un)); |
}")) | }")) |
(socket-error "connect")))) | (socket-error "connect")))) |
| |
|
|
{ | { |
struct sockaddr_un name; | struct sockaddr_un name; |
socklen_t len = sizeof(struct sockaddr_un); | socklen_t len = sizeof(struct sockaddr_un); |
int ret = getpeername(#0,&name,&len); |
int ret = getpeername(#0,(struct sockaddr *) &name,&len); |
| |
if (ret == 0) { | if (ret == 0) { |
@(return) = make_string_copy(&name.sun_path); |
@(return) = make_string_copy((char *) &name.sun_path); |
} else { | } else { |
@(return) = Cnil; | @(return) = Cnil; |
} | } |
|
|
)) | )) |
(t :int :int) | (t :int :int) |
t | t |
"ecl_make_stream_from_fd(#0,#1,#2)" |
"ecl_make_stream_from_fd(#0,#1,(enum ecl_smmode) #2)" |
:one-liner t)) | :one-liner t)) |
| |
(defgeneric socket-make-stream (socket &rest args) | (defgeneric socket-make-stream (socket &rest args) |
|
|
cl_object in_strm, out_strm; | cl_object in_strm, out_strm; |
in_strm = ecl_make_stream_from_fd(make_simple_string(\"FD-STREAM\"), #0, smm_input); | in_strm = ecl_make_stream_from_fd(make_simple_string(\"FD-STREAM\"), #0, smm_input); |
out_strm = ecl_make_stream_from_fd(make_simple_string(\"FD-STREAM\"), #0, smm_output); | out_strm = ecl_make_stream_from_fd(make_simple_string(\"FD-STREAM\"), #0, smm_output); |
@(return) = make_two_way_stream(in_strm, out_strm); |
@(return) = cl_make_two_way_stream(in_strm, out_strm); |
}" | }" |
:one-liner nil))) | :one-liner nil))) |
(setf (slot-value socket 'stream) stream) | (setf (slot-value socket 'stream) stream) |