manywaypark's Blog
개발, 검색, 함수

현재 진행중인 프로젝트에 cl-ftp를 사용해 자동화 하는 모듈을 작성 중이다. 그런데 cl-ftp의 기능들 중 내가 원하는 기능은 대부분 잘 작동했다. 제일 중요한 파일 다운로드만 빼고... T.T
약간의 공부와, 약간의 삽질 끝에 cl-ftp를 조금 손보았더니 제대로 동작했다.
내경우에는 다음과 같은 에러를 내면서 파일 다운로드가 실패했다.
error message:
The value -117 is not of type (UNSIGNED-BYTE 8).
  [Condition of type TYPE-ERROR]
msb가  1인 바이트가 음수로 읽혀지는 듯했다 (나중에 확인해본 결과 실제로 그랬다).
ftp.lisp의 소스를 좀 뒤졌더니 소켓을 생성할 때 cl-acl-compat 패키지의 acl-socket.lisp 내의 make-socket()을 이용해 소켓을 생성하고 있었다. 다음은 make-socket()의 일부다.
(defun make-socket (&key
......
(let ((element-type (ecase format
(:text 'base-char)
(:binary 'signed-byte)
(:bivalent 'unsigned-byte)))
......
ftp.lisp에서는 make-socket()을 부를 때 :binary 또는 :text를 사용할 수 있으며, :binary의 경우 (unsigned-byte 8) stream에, :text의 경우 character stream에 저장하게 되어있었다. 양쪽에서 :binary를 처리하는 방식이 다르니 에러가 날수 밖에 없어 보였다.
데이터 전송 소켓 생성 부분인 ftp.lispestablish-data-transfer()에서,
;;; ftp.lisp
;;; change underlined :binary to :bivalent.
(defmethod establish-data-transfer
......
(let ((data-socket
(make-socket :remote-host dtp-hostname
:remote-port dtp-port
:format (ecase type
((:binary :image) :binary)
(:ascii :text)))))
......
(let ((server-socket (setup-port conn
:format (ecase type
((:binary :image)
:binary)
(:ascii :text)))))
......
밑줄친 :binary를 전부 :bivalent로 바꾼후 테스트를 해보니 정상적으로 동작했다.

편의를 위해 패치를 첨부한다.
patch file:
--- ftp.lisp.ORIG       2007-08-04 16:44:18.000000000 +0900
+++ ftp.lisp 2007-08-04 18:09:20.000000000 +0900
@@ -307,7 +307,7 @@
(make-socket :remote-host dtp-hostname
:remote-port dtp-port
:format (ecase type
- ((:binary :image) :binary)
+ ((:binary :image) :bivalent)
(:ascii :text)))))
(when (and rest (integerp rest))
(send-raw-line conn (format nil "REST ~A" rest)))
@@ -317,7 +317,7 @@
(let ((server-socket (setup-port conn
:format (ecase type
((:binary :image)
- :binary)
+ :bivalent)
(:ascii :text)))))
(unwind-protect
(progn

테스트환경은 cl-ftp 1.3.3-1, sbcl, ubuntu edgy box이고 기본적인 시스템 정보는 다음과 같다.
$ sbcl --version
SBCL 0.9.14
$ uname -a
Linux hyper-server 2.6.17-12-386 #2 Mon Jul 16 19:35:45 UTC 2007 i686 GNU/Linux

패치를 데비안 패키지 관리자에게 보내긴 했는데 적용될지는 잘 모르겠다.

happy hackin'



분류 전체보기 (306)
잡담 (20)
함수형 언어 (65)
emacs (16)
java (18)
tips & tricks (154)
사랑 (1)
가사 (0)
독서 (4)
mobile (6)
비함수형 언어 (2)

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

03-28 15:58