| #!/sbin/runscript |
| |
| MINISSDPD="/usr/sbin/minissdpd" |
| PIDFILE="/var/run/minissdpd.pid" |
| |
| depend() { |
| need net |
| before miniupnpd |
| } |
| |
| interfaceup() { |
| # interface exists? |
| if [ ! -f /sys/class/net/$1/flags ]; then return 1; fi |
| let "IFUP = `cat /sys/class/net/$1/flags` & 1" |
| # interface has UP flag? |
| if [ $IFUP -eq 0 ]; then return 1; fi |
| return 0 |
| } |
| |
| # awk script: scans the /proc routing table for local subnets |
| # 1. filter list for entries with a gateway (column 3) of 0.0.0.0 (ie interface-local) |
| # 2. read column 2 for network-order hex encoded subnet address |
| # 3. match against a 10.x.x.x, 172.(16-31).x.x, or 192.168.x.x address |
| # 4. print out any interface (column 1) that matches |
| privateinterfaces() { |
| awk -f - /proc/net/route <<'FindPrivateNetworks' |
| function p(m,n) { return(and(IP,m) == n); } |
| $3=="00000000" { IP=strtonum("0x"$2); if (p(0xff,0x0a) || p(0x1fff,0x10ac) || p(0xffff,0xa8c0)) print $1; } |
| FindPrivateNetworks |
| } |
| |
| start() { |
| ebegin "Starting minissdpd" |
| |
| ARGS="" |
| if [ "x$MINISSDPD_IFACE" = "x" ]; then |
| ewarn "No interfaces provided, using interfaces on private networks" |
| IFLIST=$(privateinterfaces) |
| else |
| IFLIST="$MINISSDPD_IFACE" |
| fi |
| |
| eindent |
| for IF in $IFLIST; do |
| if interfaceup $IF; then |
| einfo Adding interface $IF |
| ARGS+="-i $IF " |
| else |
| ewarn "Interface $IF is not up" |
| fi |
| done |
| eoutdent |
| start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $MINISSDPD -- $ARGS |
| eend $? |
| } |
| |
| stop() { |
| ebegin "Stopping minissdpd" |
| start-stop-daemon --stop --pidfile "${PIDFILE}" |
| eend $? |
| } |