21.41. mount_smbfs 不能用中文 share 名稱?

Q: mount_smbfs 使用中文 share 名稱遇到如下的錯誤:

mount_smbfs: unable to open connection: syserr = No such file or directory

A: 如果沒有分享的打算, 現在大多用 smbutil 和 mount_smbfs 來看網芳.

# sbmutil view //killbee-xp
Share        Type       Comment
-------------------------------
遊戲人間     disk
# mount_smbfs -N //killbee-xp/遊戲人間 /mnt/遊戲人間
# df
Filesystem                 1K-blocks     Used   Avail Capacity  Mounted on
//ROOT@KILLBEE-XP/遊戲人間  27872740 22286264 5586476    80%    /mnt/遊戲人間

不過, 有些特殊的中文字無法 mount 上來, 但是大多數(?)的中文是可以的. 會產生問題的原因是 libsmb.so 的 nls_str_upper 函式將中文內的 [a-z] 轉成 [A-Z] 了. 以下是個 contrib/smbfs/lib/smb/nls.c 的 dirty hack.

char *
nls_str_upper(char *dst, const char *src)
{
    char *p = dst;
    int big5 = 0;

    while (*src) {
        if(big5)
            *dst++ = *src++;
        else
            *dst++ = toupper(*src++);
        if(!big5 && *(src-1) < 0)
            big5 = 1;
        else
            big5 = 0;
    }
    *dst = 0;
    return p;
}

接著按照以下的方式更新 libsmb.so:

# cd /usr/src/lib/libsmb
# make
# make libsmb.so.1
# make install