[原创]移植常用软件到ARM平台之samba2
1.平台环境:
ARM1026EJ-Sid(wb)B rev 2 (v5l)
2.移植软件:
samba2(下载:samba2.2.12)
3.移植目标:
能在目标平台上正常以后台进程方式运行
能正常输出日志,便于查错(日常运行时关闭)
能提供基于用户的认证功能
4.移植说明:
因samba3较大,相对samba2也只是提供了对域控的支持,一般情况下用不到,所以选择了samba2的最后一个版本。
最终生成的配置文件位置由./configure –prefix=/xx/xx决定,需特别注意,否则将导致进程无法加载。
另外如用windows访问共享时出现无权访问的问题,请注销或重启再访问即可解决问题。
具体移植步骤:
1.解压源码
2.进入源码目录:
- cd samba-2.2.12/source
3.修改源码:
(1)在include/config.h文件里最后面增加:
- #define USE_SETEUID 1
(2)修改lib/util_unistr.c第739、762行为:
- return True;
(3)在passdb/pdb_tdb.c第44行开始添加如下代码:
- #define PWD_BUFFER_SIZE 256
- char bb_path_passwd_file[]="/etc/passwd" ;
- struct passwd *__getpwent(int pwd_fd)
- {
- static char line_buff[PWD_BUFFER_SIZE];
- static struct passwd passwd;
- char *field_begin;
- char *endptr;
- char *gid_ptr=NULL;
- char *uid_ptr=NULL;
- int line_len;
- int i;
- restart:
- if ((line_len = read(pwd_fd, line_buff, PWD_BUFFER_SIZE)) <= 0)
- return NULL;
- field_begin = strchr(line_buff, '\n');
- if (field_begin != NULL)
- lseek(pwd_fd, (long) (1 + field_begin - (line_buff + line_len)),SEEK_CUR);
- else
- {
- do
- {
- if ((line_len = read(pwd_fd, line_buff, PWD_BUFFER_SIZE)) <= 0)
- return NULL;
- } while (!(field_begin = strchr(line_buff, '\n')));
- lseek(pwd_fd, (long) (field_begin - line_buff) - line_len + 1,SEEK_CUR);
- goto restart;
- }
- if (*line_buff == '#' || *line_buff == ' ' || *line_buff == '\n' ||*line_buff =='\t')
- goto restart;
- *field_begin = '\0';
- field_begin = line_buff;
- for (i = 0; i < 7; i++)
- {
- switch (i)
- {
- case 0:
- passwd.pw_name = field_begin;
- break;
- case 1:
- passwd.pw_passwd = field_begin;
- break;
- case 2:
- uid_ptr = field_begin;
- break;
- case 3:
- gid_ptr = field_begin;
- break;
- case 4:
- passwd.pw_gecos = field_begin;
- break;
- case 5:
- passwd.pw_dir = field_begin;
- break;
- case 6:
- passwd.pw_shell = field_begin;
- break;
- }
- if (i < 6)
- {
- field_begin = strchr(field_begin, ':');
- *field_begin++ = '\0';
- }
- }
- passwd.pw_gid = (gid_t) strtoul(gid_ptr, &endptr, 10);
- if (*endptr != '\0')
- passwd.pw_uid = (uid_t) strtoul(uid_ptr, &endptr, 10);
- if (*endptr != '\0')
- goto restart;
- return &passwd;
- }
- struct passwd *getpwnam(const char *name)
- {
- int passwd_fd;
- struct passwd *passwd;
- if (name == NULL)
- {
- errno = EINVAL;
- return NULL;
- }
- if ((passwd_fd = open(bb_path_passwd_file, O_RDONLY)) < 0)
- return NULL;
- while ((passwd = __getpwent(passwd_fd)) != NULL)
- if (!strcmp(passwd->pw_name, name))
- {
- close(passwd_fd);
- return passwd;
- }
- close(passwd_fd);
- return NULL;
- }
- struct passwd *getpwuid(uid_t uid)
- {
- int passwd_fd;
- struct passwd *passwd;
- if ((passwd_fd = open("/etc/passwd", O_RDONLY)) < 0)
- return NULL;
- while ((passwd = __getpwent(passwd_fd)) != NULL)
- if (passwd->pw_uid == uid) {
- close(passwd_fd);
- return passwd;
- }
- close(passwd_fd);
- return NULL;
- }
- int setgroups(size_t size, const gid_t * list)
- {
- return 0;
- }
4.编译源码
(1)设置环境变量:
- export CC=arm-linux-gcc-4.2.4
- export LDFLAGS='-L/usr/local/arm-linux/lib'
- export CFLAGS='-O3 -s -static -I/usr/local/arm-linux/include'
(2)编译
- ./configure --prefix=/mnt/usb1_1/samba/ --host=arm-linux
- make
- make install
5.软件移植
(1)复制下列文件及目录
- /mnt/usb1_1/samba
- /mnt/usb1_1/samba/bin
- /mnt/usb1_1/samba/var
- /mnt/usb1_1/samba/private
- /mnt/usb1_1/samba/lib
(2)使用方法
I.添加用户名及设置密码
- adduser linuxany
- bin/smbpasswd -a linuxany
- bin/smbpasswd linuxany linuxany.com
- (说明:linuxany为用户名,linuxany.com为密码)
II.启动samba服务
- sbin/nmbd -D
- sbin/smbd -D
没有评论▼