パスワードを忘れた? アカウント作成
348732 journal

iidaの日記: lftp 4.3.1をsunでコンパイル

日記 by iida

SSL/TLSにも対応したFTPクライアントであるlftpの4.3.1をSolarisにインストールしてみた。しかし、そのままではコンパイルできない。sockaddr_un構造体型の変数sunがSolarisのsunプリプロセッサ・マクロと衝突するのだ。sunをsun_と書き換え、未定義のSUN_LENマクロを、

#define SUN_LEN(su) (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))

と定義してやると、コンパイルが通った。

--- lftp-4.3.1/src/attach.h~    2011-06-17 12:58:31 +0000
+++ lftp-4.3.1/src/attach.h     2011-07-27 06:45:10 +0000
@@ -88,9 +88,9 @@
            TimeoutS(1);
            return m;
         }
-        struct sockaddr_un sun;
-        socklen_t sa_len=sizeof(sun);
-        a_sock=accept(sock,(sockaddr*)&sun,&sa_len);
+        struct sockaddr_un sun_;
+        socklen_t sa_len=sizeof(sun_);
+        a_sock=accept(sock,(sockaddr*)&sun_,&sa_len);
         if(a_sock==-1 && E_RETRY(errno)) {
            Block(sock,POLLIN);
            return m;
@@ -161,11 +161,14 @@
         int fl=fcntl(sock,F_GETFL);
         fcntl(sock,F_SETFL,fl|O_NONBLOCK);
         fcntl(sock,F_SETFD,FD_CLOEXEC);
-        struct sockaddr_un sun;
-        memset(&sun,0,sizeof(sun));
-        sun.sun_family=AF_UNIX;
-        strncpy(sun.sun_path,path,sizeof(sun.sun_path));
-        if(bind(sock,(sockaddr*)&sun,SUN_LEN(&sun))==-1) {
+        struct sockaddr_un sun_;
+        memset(&sun_,0,sizeof(sun_));
+        sun_.sun_family=AF_UNIX;
+        strncpy(sun_.sun_path,path,sizeof(sun_.sun_path));
+#ifndef SUN_LEN
+#define SUN_LEN(su) (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
+#endif
+        if(bind(sock,(sockaddr*)&sun_,SUN_LEN(&sun_))==-1) {
            perror("bind");
            close(sock);
            sock=-1;
@@ -219,12 +222,12 @@
         m=MOVED;
       }
       if(!connected) {
-        struct sockaddr_un sun;
-        memset(&sun,0,sizeof(sun));
-        sun.sun_family=AF_UNIX;
+        struct sockaddr_un sun_;
+        memset(&sun_,0,sizeof(sun_));
+        sun_.sun_family=AF_UNIX;
         const char *path=AcceptTermFD::get_sock_path(pid);
-        strncpy(sun.sun_path,path,sizeof(sun.sun_path));
-        int res=connect(sock,(sockaddr*)&sun,SUN_LEN(&sun));
+        strncpy(sun_.sun_path,path,sizeof(sun_.sun_path));
+        int res=connect(sock,(sockaddr*)&sun_,SUN_LEN(&sun_));
         if(res==-1 && !NonFatalError(errno)) {
            error=Error::Fatal(xstring::format("connect(%s): %s",path,strerror(errno)));
            return MOVED;

このパッチを作者に送ってみた。

- - - - -

(2011-08-02 後記 作者から「Thanks! Patch applied (with minor changes).」との連絡あり。)

この議論は、iida (8060)によって テキとトモのテキ禁止として作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

物事のやり方は一つではない -- Perlな人

読み込み中...