移植samba到android

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


文中使用的源码是samba-3.5.9。交叉编译工具是arm-2011.03,是在
http://www.codesourcery.com/sgpp/lite/arm/portal/subscription3057

https://sourcery.mentor.com/sgpp/lite/arm/portal/subscription3057

下载的最新版本。
本文件中使用的路径为相对于源码根目录的路径。
第一步要修改一下源码,不然不能正常运行,因为在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/geilpc/local/arm-2011.03/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 \
--build=i386-linux-gnu \
--host=arm-linux-gnu \
--with-ads=no \
--with-ldap=no \
--with-cifsmount=no \
--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等编译为静态的。

--with-static-modules=vfs_fake_perms \
这个是为了把vfs_fake_perms模块编译为静态的,如果不是静态的它会生成共享库fake_perms.so
模块的名字可以在
source3/configure.in
中找到,在这样的地方:
dnl Add modules that have to be built by default here
dnl These have to be built static:
default_static_modules="pdb_smbpasswd pdb_tdbsam pdb_wbc_sam rpc_lsarpc rpc_samr rpc_winreg rpc_initshutdown rpc_dssetup rpc_wkssvc rpc_svcctl rpc_ntsvcs rpc_netlogon rpc_netdfs rpc_srvsvc rpc_spoolss rpc_eventlog auth_sam auth_unix auth_winbind auth_wbc auth_server auth_domain auth_builtin auth_netlogond vfs_default nss_info_template"

对于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新加一个用户,不然,在共享目录下不然看到文件夹。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值