Project: Surveyor
Product: NAS ( Network Attached Storage )
Solution: Marvell 88F6180 BSP
Patch
patch_rootfs.sh
#!/bin/sh
. ./scripts/build_subr.sh
#cd ${TOPDIR}/rootfs/dev
#mknod /dev/nfs b 0 255
touch ${TOPDIR}/rootfs/etc/resolv.conf
chmod 644 ${TOPDIR}/rootfs/etc/resolv.conf
cp ${TOPDIR}/patch/sysconf/services ${TOPDIR}/rootfs/etc
cp ${TOPDIR}/patch/sysconf/smb.conf ${TOPDIR}/rootfs/etc
cp ${TOPDIR}/patch/sysconf/issue ${TOPDIR}/rootfs/etc
cp ${TOPDIR}/patch/sysconf/group ${TOPDIR}/rootfs/etc
cp ${TOPDIR}/patch/sysconf/passwd ${TOPDIR}/rootfs/etc
cp ${TOPDIR}/patch/sysconf/fstab ${TOPDIR}/rootfs/etc
cp ${TOPDIR}/patch/sysconf/inittab.patch ${TOPDIR}/rootfs/etc
cd ${TOPDIR}/rootfs/etc
patch -p0 < inittab.patch
rm -f inittab.patch
chmod 644 ${TOPDIR}/rootfs/etc/inittab ${TOPDIR}/rootfs/etc/fstab
cp -f ${TOPDIR}/patch/sysconf/rcS ${TOPDIR}/rootfs/etc/init.d
mkdir ${TOPDIR}/rootfs/tmp ${TOPDIR}/rootfs/mnt ${TOPDIR}/rootfs/sys
chmod 1777 ${TOPDIR}/rootfs/tmp
mkdir ${TOPDIR}/rootfs/var/lib ${TOPDIR}/rootfs/var/log ${TOPDIR}/rootfs/var/run ${TOPDIR}/rootfs/var/tmp
chmod 1777 ${TOPDIR}/rootfs/var/tmp
mkdir ${TOPDIR}/rootfs/syrmnt ${TOPDIR}/rootfs/smbmnt
mknod ${TOPDIR}/rootfs/dev/FLK_gpio c 254 0
echo "Done"
patch_server.sh
#!/bin/sh
. ./scripts/build_subr.sh
echo "===start server==="
echo "**此script必須在pwd=/home/surveyor/rootfs下執行 ./scripts/patch_server.sh**"
echo "1. roofs放在/home/surveyor下"
echo "2. uImage放在/home/surveyor/kernel/linux-2.6.22.18-bin下"
echo "3. 請先安裝dhcp-3.0.6-12.fc8"
echo "4. 請先安裝tftp-0.42-5-fc8"
echo "5. 請先安裝nfs-utils-1.1.0-6.fc8"
echo "6. 請先安裝squashfs-tools"
echo "7. 更改uboot env,請參照.../patch/fedora8/uboot_env.conf"
echo "Setting IP"
ifdown eth0
ifconfig eth0 192.168.1.100
ifup eth0
echo "Satrting DHCP"
cp -f ${TOPDIR}/patch/fedora8/dhcpd.conf /etc
/etc/init.d/dhcpd restart
echo "Satrting TFTP"
cp -f ${TOPDIR}/patch/fedora8/tftp /etc/xinetd.d
service xinetd restart
echo "Satrting NFS"
cp -f ${TOPDIR}/patch/fedora8/exports /etc/
/etc/init.d/rpcbind restart
/etc/init.d/nfs restart
echo "Install squashfs"
modprobe squashfs
echo "===Down==="
build_squashfs.sh
#! /bin/sh
. ./scripts/build_subr.sh
today=`date +%Y%m%d`
mksquashfs ./rootfs ./rootfs.image/rootfs.$today.sqfs
chmod +r ./rootfs.image/rootfs.$today.sqfs
cp -f ./rootfs.image/rootfs.$today.sqfs /home/surveyor/kernel/linux-2.6.22.18-bin
Host Env
dhcpd.conf
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.sample
#
ddns-update-style interim;
ignore client-updates;
allow bootp;
subnet 192.168.1.0 netmask 255.255.255.0 {
range dynamic-bootp 192.168.1.50 192.168.1.60;
default-lease-time 21600;
max-lease-time 43200;
host surveyor {
hardware ethernet 00:50:43:52:02:29;
fixed-address 192.168.1.99;
next-server 192.168.1.3;
filename "uImage";
option root-path "/home/surveyor/rootfs/rootfs";
}
}
exports
/home/surveyor/rootfs/rootfs *(rw,no_root_squash)
tftp
# default: off
# description: The tftp server serves files using the trivial file transfer \
# protocol. The tftp protocol is often used to boot diskless \
# workstations, download configuration files to network-aware printers, \
# and to start the installation process for some operating systems.
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -c -s /home/surveyor/kernel/linux-2.6.22.18-bin
# disable = yes
per_source = 11
cps = 100 2
flags = IPv4
}
Uboot Env
nfs_boot:
setenv console 'console=ttyS0,115200'
setenv bootargs '$(console) $(bootargs_root) ip=dhcp nfsroot=192.168.1.100:/home/surveyor/rootfs/rootfs'
setenv bootcmd 'nand read 0x2000000 0x300000 0x300000;setenv bootargs $(console) $(mtdparts) $(bootargs_root) ip=dhcp nfsroot=192.168.1.100:/home/surveyor/rootfs/rootfs; bootm 0x2000000;'
setenv ipaddr '192.168.1.99'
setenv serverip '192.168.1.100'
mtd_boot:
setenv mtdid 'nand0=nand_mtd'
setenv mtdparts 'mtdparts=nand_mtd:0x100000@0(uboot)ro,0x100000@0x100000(system1),0x100000@0x200000(system2),0x300000@0x300000(kernel)ro,0x700000@0x600000(RootFS)ro'
setenv bootcmd 'nand read 0x2000000 0x300000 0x300000 ;setenv bootargs $(console) ip=dhcp $(mtdparts) rootfstype=squashfs root=/dev/mtdblock5;bootm 0x2000000;'
setenv console 'console=ttyS0,115200'
setenv ipaddr '192.168.1.99'
setenv serverip '192.168.1.100'
burn to flash:
tftpboot 0x1000000 uImage.20090514
nand erase 0x300000 0x300000
nand write 0x1000000 0x300000 0x300000
tftpboot 0x1000000 rootfs.20090514.sqsh
nand erase 0x600000 0x700000
nand write 0x1000000 0x600000 0x700000
Intergrate BSP
fstab
#/dev/nfs / nfs defaults 0 0
proc /proc proc defaults 0 0
devpts /dev/pts devpts gid=4,mode=620 0 0
sysfs /sys sysfs defaults 0 0
group
root:x:0:root
nobody:x:500:
inittab.patch
--- inittab 2005-12-18 18:52:42.000000000 +0800
+++ inittab.new 2009-05-09 10:41:44.000000000 +0800
@@ -1,6 +1,38 @@
+#/**+===========================================================================
+#File: inittab
+#
+#Description: be parsed for /sbin/init
+#
+#Revision: V1.0
+#
+#History:
+#+------------------+-------------+--------------------------------------------+
+#| date | author | comments |
+#+------------------+-------------+--------------------------------------------+
+#| 2009/05/06 | Wade Chiu | Initial build |
+#+------------------+-------------+--------------------------------------------+
+#
+#-------------------------------------------------------------------------------
+#** Cheng Uei Precision Industry CONFIDENTIAL
+#** Copyright(C) 2009 Uei Precision Industry Co., Ltd. All Rights Reserved.
+#**
+#** The source code contained or described herein and all documents related
+#** to the source code (Material) are owned by Cheng Uei.
+#** The Material is protected by worldwide copyright and trade secret laws and
+#** treaty provisions. No part of the Material may be used, copied, reproduced,
+#** modified, published, uploaded, posted, transmitted, distributed, or disclosed
+#** in any way without Cheng Uei prior express written permission.
+#============================================================================+*/
+
+#==========================================
+# sysinit script
+#==========================================
::sysinit:/etc/init.d/rcS
-::respawn:-/bin/sh
-#::respawn:-/bin/sh
-#tty2::askfirst:-/bin/sh
-#::ctrlaltdel:/bin/umount -a -r
+
+#==========================================
+# respawn
+#==========================================
+# Put a getty on the serial port
+ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100
+
issue
Foxlink NAS release 1 (Serveyor)
passwd
root:$1$$oCLuEVgI1iAqOA8pwkzAg1:0:0:root:/root:/bin/sh
nobody:x:500:500:Linux User,,,:/home/nobody:/bin/sh
rcS
#!/bin/bash
echo "Mounting file system"
/bin/mount -a
ifconfig | head -n 1 | awk '{print $5}' | awk '{FS=":"} {print "RPL"$4$5$6}' | xargs hostname
#execute flk_main_program
echo "Mounting shares"
ntfs-3g -o rw,noatime,nodirtime,remove_hiberfile,streams_interface=windows /dev/sda1 /tmp > /dev/null 2>&1
echo "allow_restart"
echo 1 > /sys/block/sda/device/scsi_disk*/allow_restart
echo "Starting telnet"
/usr/sbin/telnetd -f /etc/issue
echo "Starting samba"
/sbin/nmbd -D -s/etc/smb.conf
/sbin/smbd -D -s/etc/smb.conf
services
# /etc/services:
# $Id: services,v 1.1 2004/10/09 02:49:18 andersen Exp $
#
# Network services, Internet style
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
# are included, only the more common ones.
tcpmux 1/tcp # TCP port service multiplexer
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users
daytime 13/tcp
daytime 13/udp
netstat 15/tcp
qotd 17/tcp quote
msp 18/tcp # message send protocol
msp 18/udp # message send protocol
chargen 19/tcp ttytst source
chargen 19/udp ttytst source
ftp-data 20/tcp
ftp 21/tcp
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol
telnet 23/tcp
# 24 - private
smtp 25/tcp mail
# 26 - unassigned
time 37/tcp timserver
time 37/udp timserver
rlp 39/udp resource # resource location
nameserver 42/tcp name # IEN 116
whois 43/tcp nicname
re-mail-ck 50/tcp # Remote Mail Checking Protocol
re-mail-ck 50/udp # Remote Mail Checking Protocol
domain 53/tcp nameserver # name-domain server
domain 53/udp nameserver
mtp 57/tcp # deprecated
bootps 67/tcp # BOOTP server
bootps 67/udp
bootpc 68/tcp # BOOTP client
bootpc 68/udp
tftp 69/udp
gopher 70/tcp # Internet Gopher
gopher 70/udp
rje 77/tcp netrjs
finger 79/tcp
www 80/tcp http # WorldWideWeb HTTP
www 80/udp # HyperText Transfer Protocol
link 87/tcp ttylink
kerberos 88/tcp kerberos5 krb5 # Kerberos v5
kerberos 88/udp kerberos5 krb5 # Kerberos v5
supdup 95/tcp
# 100 - reserved
hostnames 101/tcp hostname # usually from sri-nic
iso-tsap 102/tcp tsap # part of ISODE.
csnet-ns 105/tcp cso-ns # also used by CSO name server
csnet-ns 105/udp cso-ns
# unfortunately the poppassd (Eudora) uses a port which has already
# been assigned to a different service. We list the poppassd as an
# alias here. This should work for programs asking for this service.
# (due to a bug in inetd the 3com-tsmux line is disabled)
#3com-tsmux 106/tcp poppassd
#3com-tsmux 106/udp poppassd
rtelnet 107/tcp # Remote Telnet
rtelnet 107/udp
pop-2 109/tcp postoffice # POP version 2
pop-2 109/udp
pop-3 110/tcp # POP version 3
pop-3 110/udp
sunrpc 111/tcp portmapper # RPC 4.0 portmapper TCP
sunrpc 111/udp portmapper # RPC 4.0 portmapper UDP
auth 113/tcp authentication tap ident
sftp 115/tcp
uucp-path 117/tcp
nntp 119/tcp readnews untp # USENET News Transfer Protocol
ntp 123/tcp
ntp 123/udp # Network Time Protocol
netbios-ns 137/tcp # NETBIOS Name Service
netbios-ns 137/udp
netbios-dgm 138/tcp # NETBIOS Datagram Service
netbios-dgm 138/udp
netbios-ssn 139/tcp # NETBIOS session service
netbios-ssn 139/udp
swat 901/tcp
imap2 143/tcp # Interim Mail Access Proto v2
imap2 143/udp
snmp 161/udp # Simple Net Mgmt Proto
snmp-trap 162/udp snmptrap # Traps for SNMP
cmip-man 163/tcp # ISO mgmt over IP (CMOT)
cmip-man 163/udp
cmip-agent 164/tcp
cmip-agent 164/udp
xdmcp 177/tcp # X Display Mgr. Control Proto
xdmcp 177/udp
nextstep 178/tcp NeXTStep NextStep # NeXTStep window
nextstep 178/udp NeXTStep NextStep # server
bgp 179/tcp # Border Gateway Proto.
bgp 179/udp
prospero 191/tcp # Cliff Neuman's Prospero
prospero 191/udp
irc 194/tcp # Internet Relay Chat
irc 194/udp
smux 199/tcp # SNMP Unix Multiplexer
smux 199/udp
at-rtmp 201/tcp # AppleTalk routing
at-rtmp 201/udp
at-nbp 202/tcp # AppleTalk name binding
at-nbp 202/udp
at-echo 204/tcp # AppleTalk echo
at-echo 204/udp
at-zis 206/tcp # AppleTalk zone information
at-zis 206/udp
qmtp 209/tcp # The Quick Mail Transfer Protocol
qmtp 209/udp # The Quick Mail Transfer Protocol
z3950 210/tcp wais # NISO Z39.50 database
z3950 210/udp wais
ipx 213/tcp # IPX
ipx 213/udp
imap3 220/tcp # Interactive Mail Access
imap3 220/udp # Protocol v3
ulistserv 372/tcp # UNIX Listserv
ulistserv 372/udp
https 443/tcp # MCom
https 443/udp # MCom
snpp 444/tcp # Simple Network Paging Protocol
snpp 444/udp # Simple Network Paging Protocol
saft 487/tcp # Simple Asynchronous File Transfer
saft 487/udp # Simple Asynchronous File Transfer
npmp-local 610/tcp dqs313_qmaster # npmp-local / DQS
npmp-local 610/udp dqs313_qmaster # npmp-local / DQS
npmp-gui 611/tcp dqs313_execd # npmp-gui / DQS
npmp-gui 611/udp dqs313_execd # npmp-gui / DQS
hmmp-ind 612/tcp dqs313_intercell# HMMP Indication / DQS
hmmp-ind 612/udp dqs313_intercell# HMMP Indication / DQS
#
# UNIX specific services
#
exec 512/tcp
biff 512/udp comsat
login 513/tcp
who 513/udp whod
shell 514/tcp cmd # no passwords used
syslog 514/udp
printer 515/tcp spooler # line printer spooler
talk 517/udp
ntalk 518/udp
route 520/udp router routed # RIP
timed 525/udp timeserver
tempo 526/tcp newdate
courier 530/tcp rpc
conference 531/tcp chat
netnews 532/tcp readnews
netwall 533/udp # -for emergency broadcasts
uucp 540/tcp uucpd # uucp daemon
afpovertcp 548/tcp # AFP over TCP
afpovertcp 548/udp # AFP over TCP
remotefs 556/tcp rfs_server rfs # Brunhoff remote filesystem
klogin 543/tcp # Kerberized `rlogin' (v5)
kshell 544/tcp krcmd # Kerberized `rsh' (v5)
kerberos-adm 749/tcp # Kerberos `kadmin' (v5)
#
webster 765/tcp # Network dictionary
webster 765/udp
#
# From ``Assigned Numbers'':
#
#> The Registered Ports are not controlled by the IANA and on most systems
#> can be used by ordinary user processes or programs executed by ordinary
#> users.
#
#> Ports are used in the TCP [45,106] to name the ends of logical
#> connections which carry long term conversations. For the purpose of
#> providing services to unknown callers, a service contact port is
#> defined. This list specifies the port used by the server process as its
#> contact port. While the IANA can not control uses of these ports it
#> does register or list uses of these ports as a convienence to the
#> community.
#
nfsdstatus 1110/tcp
nfsd-keepalive 1110/udp
ingreslock 1524/tcp
ingreslock 1524/udp
prospero-np 1525/tcp # Prospero non-privileged
prospero-np 1525/udp
datametrics 1645/tcp old-radius # datametrics / old radius entry
datametrics 1645/udp old-radius # datametrics / old radius entry
sa-msg-port 1646/tcp old-radacct # sa-msg-port / old radacct entry
sa-msg-port 1646/udp old-radacct # sa-msg-port / old radacct entry
radius 1812/tcp # Radius
radius 1812/udp # Radius
radacct 1813/tcp # Radius Accounting
radacct 1813/udp # Radius Accounting
nfsd 2049/tcp nfs
nfsd 2049/udp nfs
cvspserver 2401/tcp # CVS client/server operations
cvspserver 2401/udp # CVS client/server operations
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL
rfe 5002/tcp # Radio Free Ethernet
rfe 5002/udp # Actually uses UDP only
cfengine 5308/tcp # CFengine
cfengine 5308/udp # CFengine
bbs 7000/tcp # BBS service
#
#
# Kerberos (Project Athena/MIT) services
# Note that these are for Kerberos v4, and are unofficial. Sites running
# v4 should uncomment these and comment out the v5 entries above.
#
kerberos4 750/udp kerberos-iv kdc # Kerberos (server) udp
kerberos4 750/tcp kerberos-iv kdc # Kerberos (server) tcp
kerberos_master 751/udp # Kerberos authentication
kerberos_master 751/tcp # Kerberos authentication
passwd_server 752/udp # Kerberos passwd server
krb_prop 754/tcp # Kerberos slave propagation
krbupdate 760/tcp kreg # Kerberos registration
kpasswd 761/tcp kpwd # Kerberos "passwd"
kpop 1109/tcp # Pop with Kerberos
knetd 2053/tcp # Kerberos de-multiplexor
zephyr-srv 2102/udp # Zephyr server
zephyr-clt 2103/udp # Zephyr serv-hm connection
zephyr-hm 2104/udp # Zephyr hostmanager
eklogin 2105/tcp # Kerberos encrypted rlogin
#
# Unofficial but necessary (for NetBSD) services
#
supfilesrv 871/tcp # SUP server
supfiledbg 1127/tcp # SUP debugging
#
# Datagram Delivery Protocol services
#
rtmp 1/ddp # Routing Table Maintenance Protocol
nbp 2/ddp # Name Binding Protocol
echo 4/ddp # AppleTalk Echo Protocol
zip 6/ddp # Zone Information Protocol
#
# Services added for the Debian GNU/Linux distribution
poppassd 106/tcp # Eudora
poppassd 106/udp # Eudora
mailq 174/tcp # Mailer transport queue for Zmailer
mailq 174/tcp # Mailer transport queue for Zmailer
omirr 808/tcp omirrd # online mirror
omirr 808/udp omirrd # online mirror
rmtcfg 1236/tcp # Gracilis Packeten remote config server
xtel 1313/tcp # french minitel
coda_opcons 1355/udp # Coda opcons (Coda fs)
coda_venus 1363/udp # Coda venus (Coda fs)
coda_auth 1357/udp # Coda auth (Coda fs)
coda_udpsrv 1359/udp # Coda udpsrv (Coda fs)
coda_filesrv 1361/udp # Coda filesrv (Coda fs)
codacon 1423/tcp venus.cmu # Coda Console (Coda fs)
coda_aux1 1431/tcp # coda auxiliary service (Coda fs)
coda_aux1 1431/udp # coda auxiliary service (Coda fs)
coda_aux2 1433/tcp # coda auxiliary service (Coda fs)
coda_aux2 1433/udp # coda auxiliary service (Coda fs)
coda_aux3 1435/tcp # coda auxiliary service (Coda fs)
coda_aux3 1435/udp # coda auxiliary service (Coda fs)
cfinger 2003/tcp # GNU Finger
afbackup 2988/tcp # Afbackup system
afbackup 2988/udp # Afbackup system
icp 3130/tcp # Internet Cache Protocol (Squid)
icp 3130/udp # Internet Cache Protocol (Squid)
postgres 5432/tcp # POSTGRES
postgres 5432/udp # POSTGRES
fax 4557/tcp # FAX transmission service (old)
hylafax 4559/tcp # HylaFAX client-server protocol (new)
noclog 5354/tcp # noclogd with TCP (nocol)
noclog 5354/udp # noclogd with UDP (nocol)
hostmon 5355/tcp # hostmon uses TCP (nocol)
hostmon 5355/udp # hostmon uses TCP (nocol)
ircd 6667/tcp # Internet Relay Chat
ircd 6667/udp # Internet Relay Chat
webcache 8080/tcp # WWW caching service
webcache 8080/udp # WWW caching service
tproxy 8081/tcp # Transparent Proxy
tproxy 8081/udp # Transparent Proxy
mandelspawn 9359/udp mandelbrot # network mandelbrot
amanda 10080/udp # amanda backup services
amandaidx 10082/tcp # amanda backup services
amidxtape 10083/tcp # amanda backup services
isdnlog 20011/tcp # isdn logging system
isdnlog 20011/udp # isdn logging system
vboxd 20012/tcp # voice box system
vboxd 20012/udp # voice box system
binkp 24554/tcp # Binkley
binkp 24554/udp # Binkley
asp 27374/tcp # Address Search Protocol
asp 27374/udp # Address Search Protocol
tfido 60177/tcp # Ifmail
tfido 60177/udp # Ifmail
fido 60179/tcp # Ifmail
fido 60179/udp # Ifmail
# Local services
smb.conf
[global]
server string = FLKNAS
workgroup = SEAGATEGROUP
log file = /private/%L.log
max log size = 1024
security = share
smb passwd file = /private/smbpasswd
private dir = /private
dns proxy = No
lock directory = /private/locks
pid directory = /private/locks
client lanman auth = yes
use sendfile = yes
vfs objects = streams_xattr
[tmp]
path=/tmp
read only=no
public=yes
Porting Server
build_ntfs-3g.sh
#!/bin/sh
. ./scripts/build_subr.sh
rm -rf ${INSTALLDIR}
mkdir -p ${INSTALLDIR}
unpack "ntfs-3g-2009.4.4"
SRC="build/ntfs-3g-2009.4.4"
cd ${TOPDIR}/${SRC}
export LD_LIBARY_PATH=${CROSS_COMPILE}/lib
export CPPFLAGS=-I${CROSS_COMPILE}/include
export LDFLAGS=-L${CROSS_COMPILE}/lib
export CC=${CROSS_COMPILE}-gcc
export PATH=${PATH}:${TOPDIR}/tools/gcc/bin
./configure --host=arm-linux --prefix=${INSTALLDIR} --exec-prefix=${INSTALLDIR}
make
check_errno
make install
check_errno
cd ${INSTALLDIR}/..
tar -jc -f ${TOPDIR}/pkg/softfp/ntfs-3g-2009.4.4.full-bin.tar.bz2 ${ROOTFS}
check_errno
mv ${INSTALLDIR}/share ${INSTALLDIR}/share.qq
rm -rf ${INSTALLDIR}/share.qq
#rm -f ${INSTALLDIR}/bin/ntfs-3g.probe
mv ${INSTALLDIR}/lib/pkgconfig ${INSTALLDIR}/lib/pkgconfig.qq
rm -rf ${INSTALLDIR}/lib/pkgconfig.qq
mv ${INSTALLDIR}/include ${INSTALLDIR}/include.qq
rm -rf ${INSTALLDIR}/include.qq
mv ${INSTALLDIR}/sbin ${INSTALLDIR}/sbin.qq
rm -rf ${INSTALLDIR}/sbin.qq
tar -jc -f ${TOPDIR}/pkg/softfp/ntfs-3g-2009.4.4-bin.tar.bz2 ${ROOTFS}
check_errno
mv ${TOPDIR}/build ${TOPDIR}/build.qq
mkdir -p ${TOPDIR}/build
rm -rf ${TOPDIR}/build.qq &
mv ${TOPDIR}/tmp ${TOPDIR}/tmp.qq
mkdir -p ${TOPDIR}/tmp
rm -rf ${TOPDIR}/tmp.qq &
cd ${TOPDIR}
build_samba.sh
#!/bin/sh
. ./scripts/build_subr.sh
rm -rf ${INSTALLDIR}
mkdir -p ${INSTALLDIR}
unpack "samba-3.3.4"
SRC="build/samba-3.3.4/source"
cp -f ${TOPDIR}/patch/samba-3.3.4/configure.patch ${TOPDIR}/${SRC}
cp -f ${TOPDIR}/patch/samba-3.3.4/mtab.c.patch ${TOPDIR}/${SRC}/client
cd ${TOPDIR}/${SRC}
patch -p0 < configure.patch
cd ${TOPDIR}/${SRC}/client
patch -p0 < mtab.c.patch
cd ..
export LD_LIBARY_PATH=${CROSS_COMPILE}/lib
export CPPFLAGS=-I${CROSS_COMPILE}/include
export LDFLAGS=-L${CROSS_COMPILE}/lib
export CC=${CROSS_COMPILE}-gcc
export PATH=${PATH}:${TOPDIR}/tools/gcc/bin
export samba_cv_CC_NEGATIVE_ENUM_VALUES=yes
export libreplace_cv_READDIR_GETDIRENTRIES=no
export libreplace_cv_READDIR_GETDENTS=no
export linux_getgrouplist_ok=no
export samba_cv_HAVE_WRFILE_KEYTAB=yes
export samba_cv_HAVE_KERNEL_OPLOCKS_LINUX=yes
export samba_cv_HAVE_IFACE_IFCONF=yes
./configure --build=i686-linux --host=arm-linux --target=arm-linux --prefix=${INSTALLDIR} --disable-shared --disable-cups --disable-iprint --disable-pie --disable-fam --without-ldap
cp -f ${TOPDIR}/patch/samba-3.3.4/config.h ${TOPDIR}/${SRC}/include
make
check_errno
make install
check_errno
cd ${INSTALLDIR}/..
tar -jc -f ${TOPDIR}/pkg/softfp/samba-3.3.4.full-bin.tar.bz2 ${ROOTFS}
check_errno
mv ${INSTALLDIR}/swat ${INSTALLDIR}/swat.qq
rm -rf ${INSTALLDIR}/swat.qq
mv ${INSTALLDIR}/share ${INSTALLDIR}/share.qq
rm -rf ${INSTALLDIR}/share.qq
rm -f ${INSTALLDIR}/sbin/mount.cifs
rm -f ${INSTALLDIR}/sbin/swat
rm -f ${INSTALLDIR}/sbin/umount.cifs
rm -f ${INSTALLDIR}/sbin/winbindd
mv ${INSTALLDIR}/lib ${INSTALLDIR}/lib.qq
rm -rf ${INSTALLDIR}/lib.qq
mv ${INSTALLDIR}/include ${INSTALLDIR}/include.qq
rm -rf ${INSTALLDIR}/include.qq
mv ${INSTALLDIR}/bin ${INSTALLDIR}/bin.qq
rm -rf ${INSTALLDIR}/bin.qq
tar -jc -f ${TOPDIR}/pkg/softfp/samba-3.3.4-bin.tar.bz2 ${ROOTFS}
check_errno
mv ${TOPDIR}/build ${TOPDIR}/build.qq
mkdir -p ${TOPDIR}/build
rm -rf ${TOPDIR}/build.qq &
mv ${TOPDIR}/tmp ${TOPDIR}/tmp.qq
mkdir -p ${TOPDIR}/tmp
rm -rf ${TOPDIR}/tmp.qq &
cd ${TOPDIR}
configure.patch
--- configure 2009-04-29 02:53:51.000000000 +0800
+++ configure.new 2009-05-05 16:23:23.000000000 +0800
@@ -13066,13 +13066,17 @@
else
if test "$cross_compiling" = yes; then
- { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }; }
+# { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+#$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+#{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&5
+#$as_echo "$as_me: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&2;}
+# { (exit 1); exit 1; }; }; }
+{
+echo "$as_me:$LINENO: uclibc <= samba 3.3.4 check skipped" >&5
+echo "$as_me: uclibc <= samba 3.3.4 check skipped" >&2;
+}
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
@@ -23586,12 +23590,12 @@
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would st cannot run test program while cross compilingill apply. */
#ifdef __cplusplus
extern "C"
#endif
char $ac_func ();
-/* The GNU C library defines this for functions which it implements
+/* The GNU C library defines this for functions whi cannot run test program while cross compilingch it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
#if defined __stub_$ac_func || defined __stub___$ac_func
@@ -23801,13 +23805,17 @@
else
if test "$cross_compiling" = yes; then
- { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }; }
+# { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+#$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+#{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&5
+#$as_echo "$as_me: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&2;}
+# { (exit 1); exit 1; }; }; }
+{
+echo "$as_me:$LINENO: glibc <= samba 3.3.4 check skipped" >&5
+echo "$as_me: glibc <= samba 3.3.4 check skipped" >&2;
+}
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
@@ -23989,13 +23997,17 @@
else
if test "$cross_compiling" = yes; then
- { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }; }
+# { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+#$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+#{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&5
+#$as_echo "$as_me: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&2;}
+# { (exit 1); exit 1; }; }; }
+{
+echo "$as_me:$LINENO: glibc <= samba 3.3.4 check skipped" >&5
+echo "$as_me: glibc <= samba 3.3.4 check skipped" >&2;
+}
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
@@ -44068,13 +44080,17 @@
*linux*)
# glibc <= 2.3.2 has a broken getgrouplist
if test "$cross_compiling" = yes; then
- { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }; }
+# { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+#$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+#{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&5
+#$as_echo "$as_me: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&2;}
+# { (exit 1); exit 1; }; }; }
+{
+echo "$as_me:$LINENO: glibc <= samba 3.3.4 check skipped" >&5
+echo "$as_me: glibc <= samba 3.3.4 check skipped" >&2;
+}
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
@@ -67118,13 +67134,17 @@
else
if test "$cross_compiling" = yes; then
- { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }; }
+# { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+#$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+#{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&5
+#$as_echo "$as_me: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&2;}
+# { (exit 1); exit 1; }; }; }
+{
+echo "$as_me:$LINENO: glibc <= samba 3.3.4 check skipped" >&5
+echo "$as_me: glibc <= samba 3.3.4 check skipped" >&2;
+}
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
@@ -67393,13 +67413,17 @@
LDFLAGS="$LDFLAGS";
export LDFLAGS;
if test "$cross_compiling" = yes; then
- { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }; }
+# { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+#$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+#{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&5
+#$as_echo "$as_me: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&2;}
+# { (exit 1); exit 1; }; }; }
+{
+echo "$as_me:$LINENO: glibc <= samba 3.3.4 check skipped" >&5
+echo "$as_me: glibc <= samba 3.3.4 check skipped" >&2;
+}
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
@@ -67494,13 +67518,17 @@
LDFLAGS="$LDFLAGS";
export LDFLAGS;
if test "$cross_compiling" = yes; then
- { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }; }
+# { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+#$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+#{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&5
+#$as_echo "$as_me: error: cannot run test program while cross compiling
+#See \`config.log' for more details." >&2;}
+# { (exit 1); exit 1; }; }; }
+{
+echo "$as_me:$LINENO: glibc <= samba 3.3.4 check skipped" >&5
+echo "$as_me: glibc <= samba 3.3.4 check skipped" >&2;
+}
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
mtab.c.patch
--- mtab.c 2009-04-28 14:46:16.000000000 +0800
+++ mtab.c.new 2009-05-05 16:25:33.000000000 +0800
@@ -34,6 +34,8 @@
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
#include <mntent.h>
#include <stdlib.h>
#include <signal.h>
Application
netlink_udev.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/un.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/types.h>
#include <linux/netlink.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define UEVENT_BUFFER_SIZE 2048
static int init_hotplug_sock()
{
const int buffersize = 1024;
int ret;
struct sockaddr_nl snl;
bzero(&snl, sizeof(struct sockaddr_nl));
snl.nl_family = AF_NETLINK;
snl.nl_pid = getpid();
snl.nl_groups = 1;
int s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
if (s == -1)
{
perror("socket");
return -1;
}
setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));
ret = bind(s, (struct sockaddr *)&snl, sizeof(struct sockaddr_nl));
if (ret < 0)
{
perror("bind");
close(s);
return -1;
}
return s;
}
int main(int argc, char* argv[])
{
int hotplug_sock = init_hotplug_sock();
while(1)
{
/* Netlink message buffer */
char buf[UEVENT_BUFFER_SIZE * 2] = {0};
recv(hotplug_sock, &buf, sizeof(buf), 0);
printf("%s\n", buf);
}
return 0;
}
scsi_serial.c
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <scsi/sg.h>
#define SCSI_TIMEOUT 5000 /* ms */
static char *device = "/dev/sdd";
int scsi_io(int fd, unsigned char *cdb, unsigned char cdb_size, int xfer_dir,
unsigned char *data, unsigned int *data_size,
unsigned char *sense, unsigned int *sense_len)
{
sg_io_hdr_t io_hdr;
memset(&io_hdr, 0, sizeof(sg_io_hdr_t));
io_hdr.interface_id = 'S';
/* CDB */
io_hdr.cmdp = cdb;
io_hdr.cmd_len = cdb_size;
/* Where to store the sense_data, if there was an error */
io_hdr.sbp = sense;
io_hdr.mx_sb_len = *sense_len;
*sense_len=0;
/* Transfer direction, either in or out. Linux does not yet
support bidirectional SCSI transfers ?
*/
io_hdr.dxfer_direction = xfer_dir;
/* Where to store the DATA IN/OUT from the device and how big the
buffer is
*/
io_hdr.dxferp = data;
io_hdr.dxfer_len = *data_size;
/* SCSI timeout in ms */
io_hdr.timeout = SCSI_TIMEOUT;
if(ioctl(fd, SG_IO, &io_hdr) < 0){
perror("SG_IO ioctl failed");
return -1;
}
/* now for the error processing */
if((io_hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK){
if(io_hdr.sb_len_wr > 0){
*sense_len=io_hdr.sb_len_wr;
return 0;
}
}
if(io_hdr.masked_status){
printf("status=0x%x\n", io_hdr.status);
printf("masked_status=0x%x\n", io_hdr.masked_status);
return -2;
}
if(io_hdr.host_status){
printf("host_status=0x%x\n", io_hdr.host_status);
return -3;
}
if(io_hdr.driver_status){
printf("driver_status=0x%x\n", io_hdr.driver_status);
return -4;
}
return 0;
}
int scsi_inquiry_unit_serial_number(int fd)
{
unsigned char cdb[]={0x12,0x01,0x80,0,0,0};
unsigned int data_size=0x00ff;
unsigned char data[data_size];
unsigned int sense_len=32;
unsigned char sense[sense_len];
int res, pl, i;
cdb[3]=(data_size>>8)&0xff;
cdb[4]=data_size&0xff;
printf("INQUIRY Unit Serial Number:\n");
res=scsi_io(fd, cdb, sizeof(cdb), SG_DXFER_FROM_DEV, data, &data_size, sense, &sense_len);
if(res){
printf("SCSI_IO failed\n");
return -1;
}
if(sense_len){
return -1;
}
/* Page Length */
pl=data[3];
/* Unit Serial Number */
printf("Unit Serial Number:");
for(i=4;i<(pl+4);i++)printf("%c",data[i]&0xff);printf("\n");
return 0;
}
int open_scsi_device(const char *dev)
{
int fd, vers;
if((fd=open(dev, O_RDWR))<0){
printf("ERROR could not open device %s\n", dev);
return -1;
}
if ((ioctl(fd, SG_GET_VERSION_NUM, &vers) < 0) || (vers < 30000)) {
printf("/dev is not an sg device, or old sg driver\n");
close(fd);
return -1;
}
return fd;
}
int main(int argc, const char *argv[])
{
int fd;
fd=open_scsi_device(device);
if(fd<0){
printf("Could not open SCSI device %s\n",device);
_exit(10);
}
scsi_inquiry_unit_serial_number(fd);
return 0;
}
FSinotify.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/select.h>
#include <sys/file.h>
#include <sys/sysinfo.h>
#include <sys/epoll.h>
#include <signal.h>
#include <linux/inotify.h>
#include <net/if.h>
#include <netinet/in.h>
struct queue_struct
{
int capacity;
int front;
int rear;
int size;
void **array;
};
struct queue_struct;
typedef struct queue_struct *queue_t;
int queue_empty (queue_t q)
{
return q->size == 0;
}
int queue_full (queue_t q)
{
return q->size == q->capacity;
}
void queue_make_empty (queue_t q)
{
q->size = 0;
q->front = 1;
q->rear = 0;
}
queue_t queue_create (int num_elements)
{
queue_t q;
q = malloc (sizeof (struct queue_struct));
if (q == NULL)
exit (-1);
q->array = malloc(sizeof (void *) * num_elements);
if (q->array == NULL)
exit (-1);
q->capacity = num_elements;
queue_make_empty (q);
return q;
}
void queue_destroy (queue_t q)
{
if (q != NULL)
{
if (q->array)
free (q->array);
free (q);
}
}
static int next_position (int v, queue_t q)
{
if (++v == q->capacity) {
v = 0;
}
return v;
}
void queue_enqueue (void *d, queue_t q)
{
if (queue_full (q))
{
return;
}
q->size++;
q->rear = next_position (q->rear, q);
q->array[q->rear] = d;
}
void *queue_front (queue_t q)
{
if (!queue_empty(q))
return q->array [q->front];
return NULL;
}
void queue_dequeue (queue_t q)
{
if (!queue_empty (q))
{
q->size--;
q->front = next_position (q->front, q);
}
}
/* This method does the dirty work of determining what happened,
then allows us to act appropriately
*/
void handle_event (struct inotify_event *event)
{
/* If the event was associated with a filename, we will store it here */
char * cur_event_filename = NULL;
/* This is the watch descriptor the event occurred on */
int cur_event_wd = event->wd;
if (event->len)
{
cur_event_filename = event->name;
}
printf("FILENAME=%s\n", cur_event_filename);
printf("watch descriptor=%d\n",cur_event_wd);
printf("\n");
/* Perform event dependent handler routines */
/* The mask is the magic that tells us what file operation occurred */
switch (event->mask)
{
/* File was accessed */
case IN_ACCESS:
printf("ACCESS EVENT OCCURRED: File \"%s\" on WD #%i\n",
cur_event_filename, cur_event_wd);
break;
/* File was modified */
case IN_MODIFY:
printf("MODIFY EVENT OCCURRED: File \"%s\" on WD #%i\n",
cur_event_filename, cur_event_wd);
break;
/* File changed attributes */
case IN_ATTRIB:
printf("ATTRIB EVENT OCCURRED: File \"%s\" on WD #%i\n",
cur_event_filename, cur_event_wd);
break;
/* File was closed */
case IN_CLOSE:
printf("CLOSE EVENT OCCURRED: File \"%s\" on WD #%i\n",
cur_event_filename, cur_event_wd);
break;
/* File was opened */
case IN_OPEN:
printf("OPEN EVENT OCCURRED: File \"%s\" on WD #%i\n",
cur_event_filename, cur_event_wd);
break;
/* File was moved from X */
case IN_MOVED_FROM:
printf("MOVE_FROM EVENT OCCURRED: File \"%s\" on WD #%i\n",
cur_event_filename, cur_event_wd);
break;
/* File was moved to X */
case IN_MOVED_TO:
printf("MOVE_TO EVENT OCCURRED: File \"%s\" on WD #%i\n",
cur_event_filename, cur_event_wd);
break;
/* Watched entry was deleted */
case IN_DELETE_SELF:
printf("DELETE_SELF EVENT OCCURRED: File \"%s\" on WD #%i\n",
cur_event_filename, cur_event_wd);
break;
/* Backing FS was unmounted */
case IN_UNMOUNT:
printf("UNMOUNT EVENT OCCURRED: File \"%s\" on WD #%i\n",
cur_event_filename, cur_event_wd);
break;
/* Too many FS events were received without reading them
some event notifications were potentially lost. */
case IN_Q_OVERFLOW:
printf("Warning: AN OVERFLOW EVENT OCCURRED: \n");
break;
case IN_IGNORED:
printf("IGNORED EVENT OCCURRED: \n");
break;
/* Some unknown message received */
default:
printf ("UNKNOWN EVENT OCCURRED for file \"%s\" on WD #%i\n",
cur_event_filename, cur_event_wd);
break;
}
}
void handle_events (queue_t q)
{
struct inotify_event *event;
while (!queue_empty (q))
{
event = queue_front (q);
queue_dequeue (q);
handle_event (event);
free (event);
}
}
int event_check (int fd)
{
struct timeval timeout;
int r;
fd_set rfds;
timeout.tv_sec = 4;
timeout.tv_usec = 0;
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
r = select (fd+1, &rfds, NULL, NULL, &timeout);
return r;
}
int read_events (queue_t q, int fd)
{
char buffer[16384];
size_t buffer_i;
struct inotify_event *pevent, *event;
ssize_t r;
size_t event_size;
int count = 0;
r = read (fd, buffer, 16384);
if (r <= 0)
return r;
buffer_i = 0;
while (buffer_i < r)
{
/* Parse events and queue them ! */
pevent = (struct inotify_event *)&buffer[buffer_i];
event_size = sizeof(struct inotify_event) + pevent->len;
event = malloc(event_size);
memmove(event, pevent, event_size);
queue_enqueue(event, q);
buffer_i += event_size;
count++;
}
return count;
}
int process_inotify_events (queue_t q, int iid)
{
while (1)
{
if( !queue_empty(q) )
{
handle_events(q);
}
if (event_check(iid) > 0)
{
int r;
r = read_events(q, iid);
if (r < 0)
break;
}
}
return 0;
}
int main()
{
queue_t q;
int iid;
int wd;
q = queue_create(128);
iid = inotify_init();
wd = inotify_add_watch(iid,"/home/test/", IN_CLOSE_WRITE );
process_inotify_events(q,iid);
queue_destroy(q);
close(iid);
return 0;
}
3. 專案開發環境架設 fedora8及其BSP環境
心得
3. 對linux system programming有一定的了解