from: http://hi.baidu.com/left99/item/1932f412063629011894ecc9

参考这篇文章,根据自己的情况贴一遍。

本文中使用的源码是samba-3.5.9,交叉编译工具是arm-linux-gcc-4.4.3。

本文件中使用的路径为相对于源码根目录的路径。
第一步要修改一下源码,不然不能正常运行,因为在android中不知什么原因getpwnam等不能使用的,总是失败。

lib/system.c
中的4个函数
struct passwd *sys_getpwnam(const char *name)
struct passwd *sys_getpwuid(uid_t uid)
struct group *sys_getgrnam(const char *name)
struct group *sys_getgrgid(gid_t gid)

改为:
static struct passwd rootpw = {
     "root",
     "root",
     0,
     0,
     "root",
     "/root"
     "/system/bin/sh",
};
struct passwd *sys_getpwnam(const char *name)
{
//    return getpwnam(name);
     return &rootpw;
}

struct passwd *sys_getpwuid(uid_t uid)
{
//    return getpwuid(uid);
     return &rootpw;
}

static char *rootmem[] = {
     "root"
};
static struct group rootgr = {
     "root",
     "root",
     0,
     rootmem,
};

struct group *sys_getgrnam(const char *name)
{
     return &rootgr;
//    return getgrnam(name);
}

struct group *sys_getgrgid(gid_t gid)
{
     return &rootgr;
//    return getgrgid(gid);
}


配置脚本:

#!/bin/bash
CROSS_COMPILE=/home/wzh/work/cross/4.4.3/bin/arm-none-linux-gnueabi-
RUNTIME_DIR=/data/data/samba
./configure \
CC="$CROSS_COMPILE"gcc \
AR="$CROSS_COMPILE"ar \
LD="$CROSS_COMPILE"ld \
RANLIB="$CROSS_COMPILE"ranlib \
--host=i686 \
--target=arm-linux \
--disable-cups \
--disable-iprint \
--prefix=$RUNTIME_DIR \
--exec-prefix=$RUNTIME_DIR \
--with-logfilebase=$RUNTIME_DIR/var/log \
--with-swatdir=$RUNTIME_DIR/usr/local/swat \
--with-rootsbindir=$RUNTIME_DIR/sbin \
--with-lockdir=$RUNTIME_DIR/var/lock \
--with-piddir=$RUNTIME_DIR/var/lock \
--with-privatedir=$RUNTIME_DIR/etc/samba \
--with-configdir=$RUNTIME_DIR/etc/samba \
--cache-file=armsel-linux.cache \
--with-static-modules=vfs_fake_perms \

把它放到source3目录下执行。

执行该编译脚本过程中会出现问题,如下:
       3.1 error: cannot run test program while cross compiling错误
           checking that the C compiler understands negative enum values... configure: error: in `/root/samba-3.3.3/source':
           configure: error: cannot run test program while cross compiling


解决方法:
echo samba_cv_CC_NEGATIVE_ENUM_VALUES=yes>armsel-linux.cache

再一下执行脚本

然后在source3目录下执行:
make LDFLAGS="-all-static -static"

上面这外是为把smbd, nmbd等编译为静态的。(不然在Android上执行会出现 no such file or directory问题

对于samba的配置文件在:
/data/data/samba/etc/samba/smb.conf
内容如下:
[global]
interfaces =  wlan0 eth0 lo
workgroup = WORKGROUP
server string = Samba on Android
netbios name = ANDROID
remote announce = 255.255.255.255
encrypt passwords = yes
security = USER
restrict anonymous = 1
load printers = no
printcap name = /dev/null
disable spoolss = yes
deadtime = 5
delete readonly = yes
nt acl support = no
inherit permissions = yes
socket options = SO_SNDBUF=16384 SO_RCVBUF=16384
[sdcard]
vfs objects = fake_perms
comment = Android /mnt/sdcard
path = /mnt/sdcard
force user = root
read only = no
writable = yes
guest ok = no


注意下面这几行:
vfs objects = fake_perms
force user = root

samba的环境设置:

注意配置脚本中的:
RUNTIME_DIR=/data/data/samba

创建几个文件夹:
mkdir /data/data/samba/etc
mkdir /data/data/samba/var/log
mkdir /data/data/samba/var/lock
mkdir /data/data/samba/lib
mkdir /data/data/samba/etc/samba
mkdir /tmp

/tmp这个目录是必须的,不然看不到共享目录。
这个目录应该可以放到任一位置。
这个目录可能通过下面的命令来指定:
export TMPDIR=/data/data/samba/var/tmp/

在lib/util/util.c
中有这样的函数:
_PUBLIC_ const char *tmpdir(void)
{
    char *p;
    if ((p = getenv("TMPDIR")))
        return p;
    return "/tmp";
}

创建几个空文件:
/data/data/samba/etc/printcap
/data/data/samba/lib/valid.dat

要用编译生成的程序:
nmbd
smbd
smbpasswd
testparm

使用时首先要用smbpasswd新加一个用户,不然,在共享目录下不然看到文件夹。

$smbdpasswd -a root

$nmbd -D

$smbd -D


应用的话,可以参考Samba Filesharing,google play 可以下载。


Logo

更多推荐