close(DATEI);
foreach (@Zeilen){
- if ( $_ =~ /\*/){
- my @files = `ls $_`;
+ chomp($_);
+ my @files = `find $_ -maxdepth 0 2>/dev/null`;
foreach (@files){
push(@include,$_);
- }
- }
- else {push(@include,$_);}
+ }
}
}
--- /dev/null
+/etc/haproxy/haproxy.cfg
+++ /dev/null
-/opt/teamspeak/bad_names.txt
-/opt/teamspeak/server.dbs
-/opt/teamspeak/server.ini
-/opt/teamspeak/server.log
-/opt/teamspeak/whitelist.txt
-
-
# Flush all chains.
&flush();
- # Reload firewall rules.
- &preparerules();
+ # Prepare firewall rules.
+ if (! -z "${General::swroot}/firewall/input"){
+ &buildrules(\%configinputfw);
+ }
+ if (! -z "${General::swroot}/firewall/outgoing"){
+ &buildrules(\%configoutgoingfw);
+ }
+ if (! -z "${General::swroot}/firewall/config"){
+ &buildrules(\%configfwdfw);
+ }
# Load P2P block rules.
&p2pblock();
# Reload firewall policy.
run("/usr/sbin/firewall-policy");
+
+ #Reload firewall.local if present
+ if ( -f '/etc/sysconfig/firewall.local'){
+ run("/etc/sysconfig/firewall.local reload");
+ }
}
sub run {
run("$IPTABLES -t mangle -F $CHAIN_MANGLE_NAT_DESTINATION_FIX");
}
-sub preparerules {
- if (! -z "${General::swroot}/firewall/input"){
- &buildrules(\%configinputfw);
- }
- if (! -z "${General::swroot}/firewall/outgoing"){
- &buildrules(\%configoutgoingfw);
- }
- if (! -z "${General::swroot}/firewall/config"){
- &buildrules(\%configfwdfw);
- }
-}
-
sub buildrules {
my $hash = shift;
}
}
}
- #Reload firewall.local if present
- if ( -f '/etc/sysconfig/firewall.local'){
- run("/etc/sysconfig/firewall.local reload");
- }
}
# Formats the given timestamp into the iptables format which is "hh:mm" UTC.
--- /dev/null
+#---------------------------------------------------------------------
+# Example configuration for a possible web application. See the
+# full configuration options online.
+#
+# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
+#
+#---------------------------------------------------------------------
+
+#---------------------------------------------------------------------
+# Global settings
+#---------------------------------------------------------------------
+global
+ # to have these messages end up in /var/log/haproxy.log you will
+ # need to:
+ #
+ # 1) configure syslog to accept network log events. This is done
+ # by adding the '-r' option to the SYSLOGD_OPTIONS in
+ # /etc/sysconfig/syslog
+ #
+ # 2) configure local2 events to go to the /var/log/haproxy.log
+ # file. A line like the following can be added to
+ # /etc/sysconfig/syslog
+ #
+ # local2.* /var/log/haproxy.log
+ #
+ log 127.0.0.1 local2
+
+ chroot /var/lib/haproxy
+ pidfile /var/run/haproxy.pid
+ maxconn 4000
+ user haproxy
+ group haproxy
+ daemon
+
+ # turn on stats unix socket
+ stats socket /var/lib/haproxy/stats
+
+#---------------------------------------------------------------------
+# common defaults that all the 'listen' and 'backend' sections will
+# use if not designated in their block
+#---------------------------------------------------------------------
+defaults
+ mode http
+ log global
+ option httplog
+ option dontlognull
+ option http-server-close
+ option forwardfor except 127.0.0.0/8
+ option redispatch
+ retries 3
+ timeout http-request 10s
+ timeout queue 1m
+ timeout connect 10s
+ timeout client 1m
+ timeout server 1m
+ timeout http-keep-alive 10s
+ timeout check 10s
+ maxconn 3000
+
+#---------------------------------------------------------------------
+# main frontend which proxys to the backends
+#---------------------------------------------------------------------
+frontend main *:5000
+ acl url_static path_beg -i /static /images /javascript /stylesheets
+ acl url_static path_end -i .jpg .gif .png .css .js
+
+ use_backend static if url_static
+ default_backend app
+
+#---------------------------------------------------------------------
+# static backend for serving up images, stylesheets and such
+#---------------------------------------------------------------------
+backend static
+ balance roundrobin
+ server static 127.0.0.1:4331 check
+
+#---------------------------------------------------------------------
+# round robin balancing between the various backends
+#---------------------------------------------------------------------
+backend app
+ balance roundrobin
+ server app1 127.0.0.1:5001 check
+ server app2 127.0.0.1:5002 check
+ server app3 127.0.0.1:5003 check
+ server app4 127.0.0.1:5004 check
+
Timeout 300
ServerSignature on
UseCanonicalName off
-ServerTokens Full
+ServerTokens Prod
LogLevel warn
CustomLog /var/log/httpd/access_log combined
Include /etc/httpd/conf/hostname.conf
+++ /dev/null
-# bcm4329 NVRAM file for Wandboard Dual
-
-sromrev=3
-vendid=0x14e4
-devid=0x432f
-boardtype=0x53e
-
-boardrev=0x41
-
-#boardflags=0x1200
-boardflags=0x200
-
-# Specify the xtalfreq if it is otherthan 38.4MHz
-xtalfreq=37400
-
-aa2g=3
-aa5g=0
-
-ag0=255
-#tri2g=0x64
-
-# 11g paparams
-pa0b0=5542,5542,5542
-pa0b1=64244,64244,64244
-pa0b2=65202,65202,65202
-
-pa0itssit=62
-pa0maxpwr=74
-opo=0
-mcs2gpo0=0x6666
-mcs2gpo1=0x6666
-
-# 11g rssi params
-rssismf2g=0xa,0xa,0xa
-rssismc2g=0xb,0xb,0xb
-rssisav2g=0x3,0x3,0x3
-bxa2g=0
-
-# country code
-ccode=ALL
-cctl=0x0
-cckdigfilttype=0
-ofdmdigfilttype=1
-
-rxpo2g=0
-
-boardnum=1
-macaddr=DE:AD:BE:EF:00:00
-
-# xtal pu and pd time control variable
-# pu time is driver default (0x1501)
-#r13t=0x1501
-
-#######
-nocrc=1
-
-#for mfgc
-otpimagesize=182
-
-# sdio extra configs
-hwhdr=0x05ffff031030031003100000
-
-#This generates empty F1, F2 and F3 tuple chains, and may be used if the host SDIO stack does not require the standard tuples.
-#RAW1=80 02 fe ff
-
-#This includes the standard FUNCID and FUNCE tuples in the F1, F2, F3 and common CIS.
-RAW1=80 32 fe 21 02 0c 00 22 2a 01 01 00 00 c5 0 e6 00 00 00 00 00 40 00 00 ff ff 80 00 00 00 00 00 00 00 00 00 00 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 ff 20 04 D0 2 29 43 21 02 0c 00 22 04 00 20 00 5A
-nvramver=4.218.214.0
+++ /dev/null
-# bcm4330 NVRAM file for Wandboard Quad
-
-manfid=0x2d0
-prodid=0x0532
-vendid=0x14e4
-devid=0x4360
-boardtype=0x0532
-boardrev=0x20
-boardflags=0x10080201
-
-nocrc=1
-xtalfreq=37400
-xtalmode=0x20,0x4,0
-boardnum=22
-macaddr=DE:AD:BE:EF:00:00
-ag0=252
-ag1=252
-aa2g=1
-aa5g=1
-ccode=EU
-regrev=5
-
-#for BT-coexistence
-btc_params80=0
-btc_params6=10
-btc_params8=10000
-
-sd_gpout=0
-# sd_oobonly=1
-muxenab=0x10
-
-# 2G PA param_B42R 110927
-pa0b0=0x12E4
-pa0b1=0xFE09
-pa0b2=0xFF9A
-#pa0itssit=62
-rssismf2g=0xa
-rssismc2g=0x3
-rssisav2g=0x7
-
-# rssi params for 5GHz B42R_110803
-#rssismf5g=0x4
-rssismf5g=0xa
-rssismc5g=0x7
-rssisav5g=0x1
-#PA parameters for lower band
-pa1lob0=0x144F
-pa1lob1=0xFD6B
-pa1lob2=0xFF3B
-#PA parameters for midband
-pa1b0=0x139C
-pa1b1=0xFD87
-pa1b2=0xFF4F
-#PA parameters for high band
-pa1hib0=0x12CA
-pa1hib1=0xFD9A
-pa1hib2=0xFF4E
-
-# 2G PA offset
-maxp2ga0=64
-sromrev=3
-cckpo=0
-ofdm2gpo=0x66666666
-mcs2gpo0=0xaaaa
-mcs2gpo1=0xaaaa
-
-# 5G PA offset
-maxp5ga0=66
-maxp5gla0=66
-maxp5gha0=66
-ofdm5gpo=0x22222222
-ofdm5glpo=0x11111111
-ofdm5ghpo=0x22222222
-mcs5gpo0=0x6666
-mcs5gpo1=0x6666
-mcs5glpo0=0x5555
-mcs5glpo1=0x5555
-mcs5ghpo0=0x6666
-mcs5ghpo1=0x6666
-
-cckPwrOffset=4
-cckdigfilttype=22
-ofdmdigfilttype=2
-extpagain5g=2
-#wl0id=0x431b
-
-# For 2GHz Tx EVM/SM
-rfreg033=0x19
-rfreg033_cck=0x1d
-pacalidx2g=65
-dacrate2g=160
-txalpfbyp2g=1
-bphyscale=17
-
-# 5GHz LOFT and IQ CAL
-txgaintbl5g=1
-txiqlopapu5g=1
-txiqlopag5g=0x10
-iqlocalidx5g=24
-
-# 5GHz Noise CAL parameter
-noise_cal_po_5g=5
-noise_cal_enable_5g=0
-
-# 2GHz RxPER at low rates
-noise_cal_ref_2g=56
-noise_cal_po_bias_2g=-4
-noise_cal_enable_2g=1
-
-# Max input level on a-band
-triso5g=9
-
-# Tx power control, especially temp.
-tssitime=1
-
-#fc+1.7GHz Spur Elimination
-loidacmode5g=1
-
-swctrlmap_2g=0x84048404, 0x82028202, 0x84048404, 0x010202, 0x1ff
-swctrlmap_5g=0xC040C040, 0xB030A020, 0xA020C040, 0x010A02, 0x2F8
-
-
#etc/rc.d/init.d/mysql
#etc/rc.d/init.d/netsnmpd
etc/rc.d/init.d/network
+etc/rc.d/init.d/network-trigger
etc/rc.d/init.d/network-vlans
#etc/rc.d/init.d/networking
etc/rc.d/init.d/networking/any
etc/rc.d/init.d/swconfig
etc/rc.d/init.d/sysctl
etc/rc.d/init.d/sysklogd
-etc/rc.d/init.d/teamspeak
etc/rc.d/init.d/template
#etc/rc.d/init.d/tftpd
etc/rc.d/init.d/tmpfs
etc/rc.d/rcsysinit.d/S75firstsetup
etc/rc.d/rcsysinit.d/S80localnet
etc/rc.d/rcsysinit.d/S85firewall
+etc/rc.d/rcsysinit.d/S90network-trigger
etc/rc.d/rcsysinit.d/S91network-vlans
etc/rc.d/rcsysinit.d/S92rngd
etc/rc.d/rc3.d/S15fireinfo
#usr/include/curl/multi.h
#usr/include/curl/stdcheaders.h
#usr/include/curl/typecheck-gcc.h
-#usr/include/curl/types.h
#usr/lib/libcurl.a
#usr/lib/libcurl.la
usr/lib/libcurl.so
usr/lib/libcurl.so.4
usr/lib/libcurl.so.4.3.0
#usr/lib/pkgconfig/libcurl.pc
+#usr/share/aclocal/libcurl.m4
#usr/share/man/man1/curl-config.1
#usr/share/man/man1/curl.1
-#usr/share/man/man1/mk-ca-bundle.1
+#usr/share/man/man3/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
+#usr/share/man/man3/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
+#usr/share/man/man3/CURLMOPT_MAXCONNECTS.3
+#usr/share/man/man3/CURLMOPT_MAX_HOST_CONNECTIONS.3
+#usr/share/man/man3/CURLMOPT_MAX_PIPELINE_LENGTH.3
+#usr/share/man/man3/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
+#usr/share/man/man3/CURLMOPT_PIPELINING.3
+#usr/share/man/man3/CURLMOPT_PIPELINING_SERVER_BL.3
+#usr/share/man/man3/CURLMOPT_PIPELINING_SITE_BL.3
+#usr/share/man/man3/CURLMOPT_SOCKETDATA.3
+#usr/share/man/man3/CURLMOPT_SOCKETFUNCTION.3
+#usr/share/man/man3/CURLMOPT_TIMERDATA.3
+#usr/share/man/man3/CURLMOPT_TIMERFUNCTION.3
+#usr/share/man/man3/CURLOPT_ACCEPTTIMEOUT_MS.3
+#usr/share/man/man3/CURLOPT_ACCEPT_ENCODING.3
+#usr/share/man/man3/CURLOPT_ADDRESS_SCOPE.3
+#usr/share/man/man3/CURLOPT_APPEND.3
+#usr/share/man/man3/CURLOPT_AUTOREFERER.3
+#usr/share/man/man3/CURLOPT_BUFFERSIZE.3
+#usr/share/man/man3/CURLOPT_CAINFO.3
+#usr/share/man/man3/CURLOPT_CAPATH.3
+#usr/share/man/man3/CURLOPT_CERTINFO.3
+#usr/share/man/man3/CURLOPT_CHUNK_BGN_FUNCTION.3
+#usr/share/man/man3/CURLOPT_CHUNK_DATA.3
+#usr/share/man/man3/CURLOPT_CHUNK_END_FUNCTION.3
+#usr/share/man/man3/CURLOPT_CLOSESOCKETDATA.3
+#usr/share/man/man3/CURLOPT_CLOSESOCKETFUNCTION.3
+#usr/share/man/man3/CURLOPT_CONNECTTIMEOUT.3
+#usr/share/man/man3/CURLOPT_CONNECTTIMEOUT_MS.3
+#usr/share/man/man3/CURLOPT_CONNECT_ONLY.3
+#usr/share/man/man3/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
+#usr/share/man/man3/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
+#usr/share/man/man3/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
+#usr/share/man/man3/CURLOPT_COOKIE.3
+#usr/share/man/man3/CURLOPT_COOKIEFILE.3
+#usr/share/man/man3/CURLOPT_COOKIEJAR.3
+#usr/share/man/man3/CURLOPT_COOKIELIST.3
+#usr/share/man/man3/CURLOPT_COOKIESESSION.3
+#usr/share/man/man3/CURLOPT_COPYPOSTFIELDS.3
+#usr/share/man/man3/CURLOPT_CRLF.3
+#usr/share/man/man3/CURLOPT_CRLFILE.3
+#usr/share/man/man3/CURLOPT_CUSTOMREQUEST.3
+#usr/share/man/man3/CURLOPT_DEBUGDATA.3
+#usr/share/man/man3/CURLOPT_DEBUGFUNCTION.3
+#usr/share/man/man3/CURLOPT_DIRLISTONLY.3
+#usr/share/man/man3/CURLOPT_DNS_CACHE_TIMEOUT.3
+#usr/share/man/man3/CURLOPT_DNS_INTERFACE.3
+#usr/share/man/man3/CURLOPT_DNS_LOCAL_IP4.3
+#usr/share/man/man3/CURLOPT_DNS_LOCAL_IP6.3
+#usr/share/man/man3/CURLOPT_DNS_SERVERS.3
+#usr/share/man/man3/CURLOPT_DNS_USE_GLOBAL_CACHE.3
+#usr/share/man/man3/CURLOPT_EGDSOCKET.3
+#usr/share/man/man3/CURLOPT_ERRORBUFFER.3
+#usr/share/man/man3/CURLOPT_EXPECT_100_TIMEOUT_MS.3
+#usr/share/man/man3/CURLOPT_FAILONERROR.3
+#usr/share/man/man3/CURLOPT_FILETIME.3
+#usr/share/man/man3/CURLOPT_FNMATCH_DATA.3
+#usr/share/man/man3/CURLOPT_FNMATCH_FUNCTION.3
+#usr/share/man/man3/CURLOPT_FOLLOWLOCATION.3
+#usr/share/man/man3/CURLOPT_FORBID_REUSE.3
+#usr/share/man/man3/CURLOPT_FRESH_CONNECT.3
+#usr/share/man/man3/CURLOPT_FTPPORT.3
+#usr/share/man/man3/CURLOPT_FTPSSLAUTH.3
+#usr/share/man/man3/CURLOPT_FTP_ACCOUNT.3
+#usr/share/man/man3/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
+#usr/share/man/man3/CURLOPT_FTP_CREATE_MISSING_DIRS.3
+#usr/share/man/man3/CURLOPT_FTP_FILEMETHOD.3
+#usr/share/man/man3/CURLOPT_FTP_RESPONSE_TIMEOUT.3
+#usr/share/man/man3/CURLOPT_FTP_SKIP_PASV_IP.3
+#usr/share/man/man3/CURLOPT_FTP_SSL_CCC.3
+#usr/share/man/man3/CURLOPT_FTP_USE_EPRT.3
+#usr/share/man/man3/CURLOPT_FTP_USE_EPSV.3
+#usr/share/man/man3/CURLOPT_FTP_USE_PRET.3
+#usr/share/man/man3/CURLOPT_GSSAPI_DELEGATION.3
+#usr/share/man/man3/CURLOPT_HEADER.3
+#usr/share/man/man3/CURLOPT_HEADERDATA.3
+#usr/share/man/man3/CURLOPT_HEADERFUNCTION.3
+#usr/share/man/man3/CURLOPT_HEADEROPT.3
+#usr/share/man/man3/CURLOPT_HTTP200ALIASES.3
+#usr/share/man/man3/CURLOPT_HTTPAUTH.3
+#usr/share/man/man3/CURLOPT_HTTPGET.3
+#usr/share/man/man3/CURLOPT_HTTPHEADER.3
+#usr/share/man/man3/CURLOPT_HTTPPOST.3
+#usr/share/man/man3/CURLOPT_HTTPPROXYTUNNEL.3
+#usr/share/man/man3/CURLOPT_HTTP_CONTENT_DECODING.3
+#usr/share/man/man3/CURLOPT_HTTP_TRANSFER_DECODING.3
+#usr/share/man/man3/CURLOPT_HTTP_VERSION.3
+#usr/share/man/man3/CURLOPT_IGNORE_CONTENT_LENGTH.3
+#usr/share/man/man3/CURLOPT_INFILESIZE.3
+#usr/share/man/man3/CURLOPT_INFILESIZE_LARGE.3
+#usr/share/man/man3/CURLOPT_INTERFACE.3
+#usr/share/man/man3/CURLOPT_INTERLEAVEDATA.3
+#usr/share/man/man3/CURLOPT_INTERLEAVEFUNCTION.3
+#usr/share/man/man3/CURLOPT_IOCTLDATA.3
+#usr/share/man/man3/CURLOPT_IOCTLFUNCTION.3
+#usr/share/man/man3/CURLOPT_IPRESOLVE.3
+#usr/share/man/man3/CURLOPT_ISSUERCERT.3
+#usr/share/man/man3/CURLOPT_KEYPASSWD.3
+#usr/share/man/man3/CURLOPT_KRBLEVEL.3
+#usr/share/man/man3/CURLOPT_LOCALPORT.3
+#usr/share/man/man3/CURLOPT_LOCALPORTRANGE.3
+#usr/share/man/man3/CURLOPT_LOGIN_OPTIONS.3
+#usr/share/man/man3/CURLOPT_LOW_SPEED_LIMIT.3
+#usr/share/man/man3/CURLOPT_LOW_SPEED_TIME.3
+#usr/share/man/man3/CURLOPT_MAIL_AUTH.3
+#usr/share/man/man3/CURLOPT_MAIL_FROM.3
+#usr/share/man/man3/CURLOPT_MAIL_RCPT.3
+#usr/share/man/man3/CURLOPT_MAXCONNECTS.3
+#usr/share/man/man3/CURLOPT_MAXFILESIZE.3
+#usr/share/man/man3/CURLOPT_MAXFILESIZE_LARGE.3
+#usr/share/man/man3/CURLOPT_MAXREDIRS.3
+#usr/share/man/man3/CURLOPT_MAX_RECV_SPEED_LARGE.3
+#usr/share/man/man3/CURLOPT_MAX_SEND_SPEED_LARGE.3
+#usr/share/man/man3/CURLOPT_NETRC.3
+#usr/share/man/man3/CURLOPT_NETRC_FILE.3
+#usr/share/man/man3/CURLOPT_NEW_DIRECTORY_PERMS.3
+#usr/share/man/man3/CURLOPT_NEW_FILE_PERMS.3
+#usr/share/man/man3/CURLOPT_NOBODY.3
+#usr/share/man/man3/CURLOPT_NOPROGRESS.3
+#usr/share/man/man3/CURLOPT_NOPROXY.3
+#usr/share/man/man3/CURLOPT_NOSIGNAL.3
+#usr/share/man/man3/CURLOPT_OPENSOCKETDATA.3
+#usr/share/man/man3/CURLOPT_OPENSOCKETFUNCTION.3
+#usr/share/man/man3/CURLOPT_PASSWORD.3
+#usr/share/man/man3/CURLOPT_PORT.3
+#usr/share/man/man3/CURLOPT_POST.3
+#usr/share/man/man3/CURLOPT_POSTFIELDS.3
+#usr/share/man/man3/CURLOPT_POSTFIELDSIZE.3
+#usr/share/man/man3/CURLOPT_POSTFIELDSIZE_LARGE.3
+#usr/share/man/man3/CURLOPT_POSTQUOTE.3
+#usr/share/man/man3/CURLOPT_POSTREDIR.3
+#usr/share/man/man3/CURLOPT_PREQUOTE.3
+#usr/share/man/man3/CURLOPT_PRIVATE.3
+#usr/share/man/man3/CURLOPT_PROGRESSDATA.3
+#usr/share/man/man3/CURLOPT_PROGRESSFUNCTION.3
+#usr/share/man/man3/CURLOPT_PROTOCOLS.3
+#usr/share/man/man3/CURLOPT_PROXY.3
+#usr/share/man/man3/CURLOPT_PROXYAUTH.3
+#usr/share/man/man3/CURLOPT_PROXYHEADER.3
+#usr/share/man/man3/CURLOPT_PROXYPASSWORD.3
+#usr/share/man/man3/CURLOPT_PROXYPORT.3
+#usr/share/man/man3/CURLOPT_PROXYTYPE.3
+#usr/share/man/man3/CURLOPT_PROXYUSERNAME.3
+#usr/share/man/man3/CURLOPT_PROXYUSERPWD.3
+#usr/share/man/man3/CURLOPT_PROXY_TRANSFER_MODE.3
+#usr/share/man/man3/CURLOPT_PUT.3
+#usr/share/man/man3/CURLOPT_QUOTE.3
+#usr/share/man/man3/CURLOPT_RANDOM_FILE.3
+#usr/share/man/man3/CURLOPT_RANGE.3
+#usr/share/man/man3/CURLOPT_READDATA.3
+#usr/share/man/man3/CURLOPT_READFUNCTION.3
+#usr/share/man/man3/CURLOPT_REDIR_PROTOCOLS.3
+#usr/share/man/man3/CURLOPT_REFERER.3
+#usr/share/man/man3/CURLOPT_RESOLVE.3
+#usr/share/man/man3/CURLOPT_RESUME_FROM.3
+#usr/share/man/man3/CURLOPT_RESUME_FROM_LARGE.3
+#usr/share/man/man3/CURLOPT_RTSP_CLIENT_CSEQ.3
+#usr/share/man/man3/CURLOPT_RTSP_REQUEST.3
+#usr/share/man/man3/CURLOPT_RTSP_SERVER_CSEQ.3
+#usr/share/man/man3/CURLOPT_RTSP_SESSION_ID.3
+#usr/share/man/man3/CURLOPT_RTSP_STREAM_URI.3
+#usr/share/man/man3/CURLOPT_RTSP_TRANSPORT.3
+#usr/share/man/man3/CURLOPT_SASL_IR.3
+#usr/share/man/man3/CURLOPT_SEEKDATA.3
+#usr/share/man/man3/CURLOPT_SEEKFUNCTION.3
+#usr/share/man/man3/CURLOPT_SHARE.3
+#usr/share/man/man3/CURLOPT_SOCKOPTDATA.3
+#usr/share/man/man3/CURLOPT_SOCKOPTFUNCTION.3
+#usr/share/man/man3/CURLOPT_SOCKS5_GSSAPI_NEC.3
+#usr/share/man/man3/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
+#usr/share/man/man3/CURLOPT_SSH_AUTH_TYPES.3
+#usr/share/man/man3/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
+#usr/share/man/man3/CURLOPT_SSH_KEYDATA.3
+#usr/share/man/man3/CURLOPT_SSH_KEYFUNCTION.3
+#usr/share/man/man3/CURLOPT_SSH_KNOWNHOSTS.3
+#usr/share/man/man3/CURLOPT_SSH_PRIVATE_KEYFILE.3
+#usr/share/man/man3/CURLOPT_SSH_PUBLIC_KEYFILE.3
+#usr/share/man/man3/CURLOPT_SSLCERT.3
+#usr/share/man/man3/CURLOPT_SSLCERTTYPE.3
+#usr/share/man/man3/CURLOPT_SSLENGINE.3
+#usr/share/man/man3/CURLOPT_SSLENGINE_DEFAULT.3
+#usr/share/man/man3/CURLOPT_SSLKEY.3
+#usr/share/man/man3/CURLOPT_SSLKEYTYPE.3
+#usr/share/man/man3/CURLOPT_SSLVERSION.3
+#usr/share/man/man3/CURLOPT_SSL_CIPHER_LIST.3
+#usr/share/man/man3/CURLOPT_SSL_CTX_DATA.3
+#usr/share/man/man3/CURLOPT_SSL_CTX_FUNCTION.3
+#usr/share/man/man3/CURLOPT_SSL_ENABLE_ALPN.3
+#usr/share/man/man3/CURLOPT_SSL_ENABLE_NPN.3
+#usr/share/man/man3/CURLOPT_SSL_OPTIONS.3
+#usr/share/man/man3/CURLOPT_SSL_SESSIONID_CACHE.3
+#usr/share/man/man3/CURLOPT_SSL_VERIFYHOST.3
+#usr/share/man/man3/CURLOPT_SSL_VERIFYPEER.3
+#usr/share/man/man3/CURLOPT_STDERR.3
+#usr/share/man/man3/CURLOPT_TCP_KEEPALIVE.3
+#usr/share/man/man3/CURLOPT_TCP_KEEPIDLE.3
+#usr/share/man/man3/CURLOPT_TCP_KEEPINTVL.3
+#usr/share/man/man3/CURLOPT_TCP_NODELAY.3
+#usr/share/man/man3/CURLOPT_TELNETOPTIONS.3
+#usr/share/man/man3/CURLOPT_TFTP_BLKSIZE.3
+#usr/share/man/man3/CURLOPT_TIMECONDITION.3
+#usr/share/man/man3/CURLOPT_TIMEOUT.3
+#usr/share/man/man3/CURLOPT_TIMEOUT_MS.3
+#usr/share/man/man3/CURLOPT_TIMEVALUE.3
+#usr/share/man/man3/CURLOPT_TLSAUTH_PASSWORD.3
+#usr/share/man/man3/CURLOPT_TLSAUTH_TYPE.3
+#usr/share/man/man3/CURLOPT_TLSAUTH_USERNAME.3
+#usr/share/man/man3/CURLOPT_TRANSFERTEXT.3
+#usr/share/man/man3/CURLOPT_TRANSFER_ENCODING.3
+#usr/share/man/man3/CURLOPT_UNIX_SOCKET_PATH.3
+#usr/share/man/man3/CURLOPT_UNRESTRICTED_AUTH.3
+#usr/share/man/man3/CURLOPT_UPLOAD.3
+#usr/share/man/man3/CURLOPT_URL.3
+#usr/share/man/man3/CURLOPT_USERAGENT.3
+#usr/share/man/man3/CURLOPT_USERNAME.3
+#usr/share/man/man3/CURLOPT_USERPWD.3
+#usr/share/man/man3/CURLOPT_USE_SSL.3
+#usr/share/man/man3/CURLOPT_VERBOSE.3
+#usr/share/man/man3/CURLOPT_WILDCARDMATCH.3
+#usr/share/man/man3/CURLOPT_WRITEDATA.3
+#usr/share/man/man3/CURLOPT_WRITEFUNCTION.3
+#usr/share/man/man3/CURLOPT_XFERINFODATA.3
+#usr/share/man/man3/CURLOPT_XFERINFOFUNCTION.3
+#usr/share/man/man3/CURLOPT_XOAUTH2_BEARER.3
#usr/share/man/man3/curl_easy_cleanup.3
#usr/share/man/man3/curl_easy_duphandle.3
#usr/share/man/man3/curl_easy_escape.3
#etc/dhcp
-#etc/dhcp/dhclient.conf
+#etc/dhcp/dhclient.conf.example
etc/dhcp/dhcpd.conf
+#etc/dhcp/dhcpd.conf.example
#usr/bin/omshell
#usr/include/dhcpctl
#usr/include/dhcpctl/dhcpctl.h
#etc/init.d
#etc/init.d/fuse
+#etc/rc.d/init.d/fuse
etc/udev/rules.d/99-fuse.rules
sbin/mount.fuse
usr/bin/fusermount
#usr/lib/libfuse.la
usr/lib/libfuse.so
usr/lib/libfuse.so.2
-usr/lib/libfuse.so.2.8.3
+usr/lib/libfuse.so.2.9.3
#usr/lib/libulockmgr.a
#usr/lib/libulockmgr.la
usr/lib/libulockmgr.so
usr/lib/libulockmgr.so.1
usr/lib/libulockmgr.so.1.0.1
#usr/lib/pkgconfig/fuse.pc
+#usr/share/man/man1/fusermount.1
+#usr/share/man/man1/ulockmgr_server.1
+#usr/share/man/man8/mount.fuse.8
#etc/rc.d/init.d/mysql
#etc/rc.d/init.d/netsnmpd
etc/rc.d/init.d/network
+etc/rc.d/init.d/network-trigger
etc/rc.d/init.d/network-vlans
#etc/rc.d/init.d/networking
etc/rc.d/init.d/networking/any
etc/rc.d/init.d/swap
etc/rc.d/init.d/sysctl
etc/rc.d/init.d/sysklogd
-etc/rc.d/init.d/teamspeak
etc/rc.d/init.d/template
#etc/rc.d/init.d/tftpd
etc/rc.d/init.d/tmpfs
etc/rc.d/rcsysinit.d/S75firstsetup
etc/rc.d/rcsysinit.d/S80localnet
etc/rc.d/rcsysinit.d/S85firewall
+etc/rc.d/rcsysinit.d/S90network-trigger
etc/rc.d/rcsysinit.d/S91network-vlans
etc/rc.d/rcsysinit.d/S92rngd
etc/rc.d/rc3.d/S15fireinfo
#usr/share/locale/id/LC_MESSAGES/installer.mo
#usr/share/locale/it/LC_MESSAGES/installer.mo
#usr/share/locale/ja/LC_MESSAGES/installer.mo
-#usr/share/locale/ja_JP/LC_MESSAGES/installer.mo
#usr/share/locale/jv/LC_MESSAGES/installer.mo
#usr/share/locale/km_KH/LC_MESSAGES/installer.mo
#usr/share/locale/nl/LC_MESSAGES/installer.mo
#usr/share/locale/pt_PT/LC_MESSAGES/installer.mo
#usr/share/locale/ro_RO/LC_MESSAGES/installer.mo
#usr/share/locale/ru/LC_MESSAGES/installer.mo
-#usr/share/locale/ru_RU/LC_MESSAGES/installer.mo
#usr/share/locale/rw/LC_MESSAGES/installer.mo
#usr/share/locale/sk/LC_MESSAGES/installer.mo
#usr/share/locale/sq/LC_MESSAGES/installer.mo
+#etc/logrotate.d
+etc/logrotate.d/.empty
#usr/man/man8/logrotate.8
usr/sbin/logrotate
var/lib/logrotate.status
bin/lowntfs-3g
bin/ntfs-3g
-lib/libntfs-3g.so
-lib/libntfs-3g.so.80
-lib/libntfs-3g.so.80.0.0
+#lib/libntfs-3g.so
+lib/libntfs-3g.so.85
+lib/libntfs-3g.so.85.0.0
+sbin/mkfs.ntfs
sbin/mount.lowntfs-3g
sbin/mount.ntfs-3g
usr/bin/ntfs-3g.probe
usr/bin/ntfs-3g.secaudit
usr/bin/ntfs-3g.usermap
+usr/bin/ntfscat
+usr/bin/ntfscluster
+usr/bin/ntfscmp
+usr/bin/ntfsfix
+usr/bin/ntfsinfo
+usr/bin/ntfsls
#usr/include/ntfs-3g
#usr/include/ntfs-3g/acls.h
#usr/include/ntfs-3g/attrib.h
#usr/include/ntfs-3g/ntfstime.h
#usr/include/ntfs-3g/object_id.h
#usr/include/ntfs-3g/param.h
+#usr/include/ntfs-3g/realpath.h
#usr/include/ntfs-3g/reparse.h
#usr/include/ntfs-3g/runlist.h
#usr/include/ntfs-3g/security.h
#usr/include/ntfs-3g/xattrs.h
#usr/lib/libntfs-3g.a
#usr/lib/libntfs-3g.la
-usr/lib/libntfs-3g.so
+#usr/lib/libntfs-3g.so
usr/lib/pkgconfig/libntfs-3g.pc
+usr/sbin/mkntfs
+usr/sbin/ntfsclone
+usr/sbin/ntfscp
+usr/sbin/ntfslabel
+usr/sbin/ntfsresize
+usr/sbin/ntfsundelete
#usr/share/doc/ntfs-3g
#usr/share/doc/ntfs-3g/README
+#usr/share/man/man8/mkfs.ntfs.8
+#usr/share/man/man8/mkntfs.8
#usr/share/man/man8/mount.lowntfs-3g.8
#usr/share/man/man8/mount.ntfs-3g.8
#usr/share/man/man8/ntfs-3g.8
#usr/share/man/man8/ntfs-3g.probe.8
#usr/share/man/man8/ntfs-3g.secaudit.8
#usr/share/man/man8/ntfs-3g.usermap.8
+#usr/share/man/man8/ntfscat.8
+#usr/share/man/man8/ntfsclone.8
+#usr/share/man/man8/ntfscluster.8
+#usr/share/man/man8/ntfscmp.8
+#usr/share/man/man8/ntfscp.8
+#usr/share/man/man8/ntfsfix.8
+#usr/share/man/man8/ntfsinfo.8
+#usr/share/man/man8/ntfslabel.8
+#usr/share/man/man8/ntfsls.8
+#usr/share/man/man8/ntfsprogs.8
+#usr/share/man/man8/ntfsresize.8
+#usr/share/man/man8/ntfsundelete.8
usr/share/locale/id/LC_MESSAGES/setup.mo
usr/share/locale/it/LC_MESSAGES/setup.mo
usr/share/locale/ja/LC_MESSAGES/setup.mo
-#usr/share/locale/ja_JP
-#usr/share/locale/ja_JP/LC_MESSAGES
-usr/share/locale/ja_JP/LC_MESSAGES/setup.mo
#usr/share/locale/jv
#usr/share/locale/jv/LC_MESSAGES
usr/share/locale/jv/LC_MESSAGES/setup.mo
#usr/share/locale/ro_RO/LC_MESSAGES
usr/share/locale/ro_RO/LC_MESSAGES/setup.mo
usr/share/locale/ru/LC_MESSAGES/setup.mo
-#usr/share/locale/ru_RU
-#usr/share/locale/ru_RU/LC_MESSAGES
-usr/share/locale/ru_RU/LC_MESSAGES/setup.mo
usr/share/locale/rw/LC_MESSAGES/setup.mo
usr/share/locale/sk/LC_MESSAGES/setup.mo
usr/share/locale/sq/LC_MESSAGES/setup.mo
#lib
#lib/firmware
#lib/firmware/brcm
-lib/firmware/brcm/brcmfmac4329-sdio.txt
-lib/firmware/brcm/brcmfmac4330-sdio.txt
lib/firmware/brcm/brcmfmac43362-sdio.txt
#media
media/cdrom
etc/strongswan.d/charon/eap-ttls.conf
etc/strongswan.d/charon/farp.conf
etc/strongswan.d/charon/fips-prf.conf
+etc/strongswan.d/charon/gcm.conf
etc/strongswan.d/charon/gcrypt.conf
etc/strongswan.d/charon/gmp.conf
etc/strongswan.d/charon/hmac.conf
usr/lib/ipsec/plugins/libstrongswan-eap-ttls.so
usr/lib/ipsec/plugins/libstrongswan-farp.so
usr/lib/ipsec/plugins/libstrongswan-fips-prf.so
+usr/lib/ipsec/plugins/libstrongswan-gcm.so
usr/lib/ipsec/plugins/libstrongswan-gcrypt.so
usr/lib/ipsec/plugins/libstrongswan-gmp.so
usr/lib/ipsec/plugins/libstrongswan-hmac.so
#usr/share/strongswan/templates/config/plugins/eap-ttls.conf
#usr/share/strongswan/templates/config/plugins/farp.conf
#usr/share/strongswan/templates/config/plugins/fips-prf.conf
+#usr/share/strongswan/templates/config/plugins/gcm.conf
#usr/share/strongswan/templates/config/plugins/gcrypt.conf
#usr/share/strongswan/templates/config/plugins/gmp.conf
#usr/share/strongswan/templates/config/plugins/hmac.conf
etc/modprobe.d/blacklist.conf
etc/udev
#etc/udev/rules.d
-#etc/udev/rules.d/30-persistent-network.rules
#etc/udev/rules.d/55-lfs.rules
#etc/udev/rules.d/81-cdrom.rules
#etc/udev/rules.d/83-cdrom-symlinks.rules
#lib/udev/hwdb.d/60-keyboard.hwdb
#lib/udev/init-net-rules.sh
#lib/udev/mtd_probe
+#lib/udev/network-hotplug-rename
#lib/udev/rule_generator.functions
#lib/udev/rules.d
#lib/udev/rules.d/25-alsa.rules
#lib/udev/rules.d/50-udev-default.rules
#lib/udev/rules.d/60-cdrom_id.rules
#lib/udev/rules.d/60-keyboard.rules
+#lib/udev/rules.d/60-net.rules
#lib/udev/rules.d/60-persistent-alsa.rules
#lib/udev/rules.d/60-persistent-input.rules
#lib/udev/rules.d/60-persistent-serial.rules
etc/system-release
etc/issue
+srv/web/ipfire/cgi-bin/fwhosts.cgi
srv/web/ipfire/cgi-bin/ovpnmain.cgi
+var/ipfire/backup/bin/backup.pl
var/ipfire/langs
/usr/local/bin/backupctrl exclude >/dev/null 2>&1
# Remove old core updates from pakfire cache to save space...
-core=87
+core=88
for (( i=1; i<=$core; i++ ))
do
rm -f /var/cache/pakfire/core-upgrade-*-$i.ipfire
/opt/pakfire/db/installed/meta-sqlite \
/opt/pakfire/db/rootfiles/sqlite
+# Fix #10625
+mkdir -p /etc/logrotate.d
+
sync
# This update need a reboot...
etc/ipsec.user.conf
etc/ipsec.user.secrets
etc/localtime
+etc/rc.d/rcsysinit.d/S19checkfstab
+etc/rc.d/rcsysinit.d/S70console
etc/shadow
etc/ssh/ssh_config
etc/ssh/sshd_config
etc/ssl/openssl.cnf
etc/sudoers
etc/sysconfig/firewall.local
+etc/sysconfig/modules
etc/sysconfig/rc.local
etc/udev/rules.d/30-persistent-network.rules
srv/web/ipfire/html/proxy.pac
--- /dev/null
+../../../../common/armv5tel/glibc
\ No newline at end of file
etc/rc.d/init.d/leds
opt/pakfire/etc/pakfire.conf
usr/lib/firewall/rules.pl
+usr/local/bin/backupiso
usr/local/bin/update-bootloader
usr/local/share/GeoIP/GeoIP.dat
var/ipfire/header.pl
--- /dev/null
+../../../common/hwdata
\ No newline at end of file
lib/firmware/ti-connectivity/wl18xx-fw-4.bin
lib/firmware/v4l-cx23885-enc-broken.fw
lib/firmware/WHENCE
-lib/firmware/brcm/brcmfmac4329-sdio.txt
-lib/firmware/brcm/brcmfmac4330-sdio.txt
lib/firmware/brcm/brcmfmac43362-sdio.txt
. /opt/pakfire/lib/functions.sh
/usr/local/bin/backupctrl exclude >/dev/null 2>&1
+
+function find_device() {
+ local mountpoint="${1}"
+
+ local root
+ local dev mp fs flags rest
+ while read -r dev mp fs flags rest; do
+ # Skip unwanted entries
+ [ "${dev}" = "rootfs" ] && continue
+
+ if [ "${mp}" = "${mountpoint}" ] && [ -b "${dev}" ]; then
+ root="$(basename "${dev}")"
+ break
+ fi
+ done < /proc/mounts
+
+ # Get the actual device from the partition that holds /
+ while [ -n "${root}" ]; do
+ if [ -e "/sys/block/${root}" ]; then
+ echo "${root}"
+ return 0
+ fi
+
+ # Remove last character
+ root="${root::-1}"
+ done
+
+ return 1
+}
+
+
#
# Remove old core updates from pakfire cache to save space...
-core=86
+core=87
for (( i=1; i<=${core}; i++ ))
do
rm -f /var/cache/pakfire/core-upgrade-*-$i.ipfire
case "$(uname -m)" in
i?86)
- #
- # Update to GRUB2
- #
- echo
- echo Update grub configuration ...
- if grep -qE "^serial" /boot/old-grub-config; then
- sed -i /etc/default/grub \
- -e "s|panic=10|& console=ttyS0,115200n8|g"
- echo "GRUB_TERMINAL=\"serial\"" >> /etc/default/grub
- echo "GRUB_SERIAL_COMMAND=\"serial --unit=0 --speed=115200\"" >> /etc/default/grub
- fi
+ case "$(find_device "/")" in
+ xvd* )
+ echo Skip remove grub2 files, because pygrub fail.
+ rm -f /boot/grub/*
+ echo config will recreated by linux-pae install.
+ ;;
+ * )
+ #
+ # Update to GRUB2
+ #
+ echo
+ echo Update grub configuration ...
+ if grep -qE "^serial" /boot/old-grub-config; then
+ sed -i /etc/default/grub \
+ -e "s|panic=10|& console=ttyS0,115200n8|g"
+ echo "GRUB_TERMINAL=\"serial\"" >> /etc/default/grub
+ echo "GRUB_SERIAL_COMMAND=\"serial --unit=0 --speed=115200\"" >> /etc/default/grub
+ fi
- if ! /usr/local/bin/update-bootloader; then
- logger -p syslog.emerg -t ipfire \
- "Could not update the bootloader!"
- fi
- ;;
+ if ! /usr/local/bin/update-bootloader; then
+ logger -p syslog.emerg -t ipfire \
+ "Could not update the bootloader!"
+ fi
+ ;;
+ esac
esac
# Force (re)install pae kernel if pae is supported
#usr/lib/libclamav.la
usr/lib/libclamav.so
usr/lib/libclamav.so.6
-usr/lib/libclamav.so.6.1.22
+usr/lib/libclamav.so.6.1.25
#usr/lib/libclamunrar.la
usr/lib/libclamunrar.so
usr/lib/libclamunrar.so.6
-usr/lib/libclamunrar.so.6.1.22
+usr/lib/libclamunrar.so.6.1.25
#usr/lib/libclamunrar_iface.la
usr/lib/libclamunrar_iface.so
usr/lib/libclamunrar_iface.so.6
-usr/lib/libclamunrar_iface.so.6.1.22
+usr/lib/libclamunrar_iface.so.6.1.25
#usr/lib/pkgconfig/libclamav.pc
usr/sbin/clamd
usr/share/clamav
var/ipfire/clamav/clamd.conf.sample
var/ipfire/clamav/freshclam.conf
var/ipfire/clamav/freshclam.conf.sample
-#var/run/clamav
etc/rc.d/init.d/clamav
usr/local/bin/clamavctrl
--- /dev/null
+#etc/haproxy
+etc/haproxy/haproxy.cfg
+etc/rc.d/init.d/haproxy
+usr/sbin/haproxy
+#usr/sbin/haproxy-systemd-wrapper
+#usr/share/man/man1/haproxy.1
+var/ipfire/backup/addons/includes/haproxy
+var/lib/haproxy
#srv/web/owncloud/3rdparty/fontawesome/font/fontawesome-webfont.svg
#srv/web/owncloud/3rdparty/fontawesome/font/fontawesome-webfont.ttf
#srv/web/owncloud/3rdparty/fontawesome/font/fontawesome-webfont.woff
-#srv/web/owncloud/3rdparty/getid3
-#srv/web/owncloud/3rdparty/getid3/extension.cache.dbm.php
-#srv/web/owncloud/3rdparty/getid3/extension.cache.mysql.php
-#srv/web/owncloud/3rdparty/getid3/extension.cache.sqlite3.php
-#srv/web/owncloud/3rdparty/getid3/getid3.lib.php
-#srv/web/owncloud/3rdparty/getid3/getid3.php
-#srv/web/owncloud/3rdparty/getid3/license.txt
-#srv/web/owncloud/3rdparty/getid3/module.archive.gzip.php
-#srv/web/owncloud/3rdparty/getid3/module.archive.rar.php
-#srv/web/owncloud/3rdparty/getid3/module.archive.szip.php
-#srv/web/owncloud/3rdparty/getid3/module.archive.tar.php
-#srv/web/owncloud/3rdparty/getid3/module.archive.zip.php
-#srv/web/owncloud/3rdparty/getid3/module.audio-video.asf.php
-#srv/web/owncloud/3rdparty/getid3/module.audio-video.bink.php
-#srv/web/owncloud/3rdparty/getid3/module.audio-video.flv.php
-#srv/web/owncloud/3rdparty/getid3/module.audio-video.matroska.php
-#srv/web/owncloud/3rdparty/getid3/module.audio-video.mpeg.php
-#srv/web/owncloud/3rdparty/getid3/module.audio-video.nsv.php
-#srv/web/owncloud/3rdparty/getid3/module.audio-video.quicktime.php
-#srv/web/owncloud/3rdparty/getid3/module.audio-video.real.php
-#srv/web/owncloud/3rdparty/getid3/module.audio-video.riff.php
-#srv/web/owncloud/3rdparty/getid3/module.audio-video.swf.php
-#srv/web/owncloud/3rdparty/getid3/module.audio-video.ts.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.aa.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.aac.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.ac3.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.au.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.avr.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.bonk.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.dss.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.dts.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.flac.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.la.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.lpac.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.midi.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.mod.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.monkey.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.mp3.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.mpc.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.ogg.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.optimfrog.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.rkau.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.shorten.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.tta.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.voc.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.vqf.php
-#srv/web/owncloud/3rdparty/getid3/module.audio.wavpack.php
-#srv/web/owncloud/3rdparty/getid3/module.graphic.bmp.php
-#srv/web/owncloud/3rdparty/getid3/module.graphic.efax.php
-#srv/web/owncloud/3rdparty/getid3/module.graphic.gif.php
-#srv/web/owncloud/3rdparty/getid3/module.graphic.jpg.php
-#srv/web/owncloud/3rdparty/getid3/module.graphic.pcd.php
-#srv/web/owncloud/3rdparty/getid3/module.graphic.png.php
-#srv/web/owncloud/3rdparty/getid3/module.graphic.svg.php
-#srv/web/owncloud/3rdparty/getid3/module.graphic.tiff.php
-#srv/web/owncloud/3rdparty/getid3/module.misc.cue.php
-#srv/web/owncloud/3rdparty/getid3/module.misc.exe.php
-#srv/web/owncloud/3rdparty/getid3/module.misc.iso.php
-#srv/web/owncloud/3rdparty/getid3/module.misc.msoffice.php
-#srv/web/owncloud/3rdparty/getid3/module.misc.par2.php
-#srv/web/owncloud/3rdparty/getid3/module.misc.pdf.php
-#srv/web/owncloud/3rdparty/getid3/module.tag.apetag.php
-#srv/web/owncloud/3rdparty/getid3/module.tag.id3v1.php
-#srv/web/owncloud/3rdparty/getid3/module.tag.id3v2.php
-#srv/web/owncloud/3rdparty/getid3/module.tag.lyrics3.php
-#srv/web/owncloud/3rdparty/getid3/module.tag.xmp.php
-#srv/web/owncloud/3rdparty/getid3/write.apetag.php
-#srv/web/owncloud/3rdparty/getid3/write.id3v1.php
-#srv/web/owncloud/3rdparty/getid3/write.id3v2.php
-#srv/web/owncloud/3rdparty/getid3/write.lyrics3.php
-#srv/web/owncloud/3rdparty/getid3/write.metaflac.php
-#srv/web/owncloud/3rdparty/getid3/write.php
-#srv/web/owncloud/3rdparty/getid3/write.real.php
-#srv/web/owncloud/3rdparty/getid3/write.vorbiscomment.php
#srv/web/owncloud/3rdparty/guzzle
#srv/web/owncloud/3rdparty/guzzle/common
#srv/web/owncloud/3rdparty/guzzle/common/Guzzle
#srv/web/owncloud/3rdparty/guzzle/stream/Guzzle/Stream/StreamInterface.php
#srv/web/owncloud/3rdparty/guzzle/stream/Guzzle/Stream/StreamRequestFactoryInterface.php
#srv/web/owncloud/3rdparty/guzzle/stream/Guzzle/Stream/composer.json
-#srv/web/owncloud/3rdparty/isoft
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Driver
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Driver/PDODblib
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Driver/PDODblib/Connection.php
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Driver/PDODblib/Driver.php
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Platforms
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Platforms/DblibPlatform.php
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Readme.md
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/RealestateMssqlBundle.php
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Schema
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Schema/DblibSchemaManager.php
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Types
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Types/DateTimeType.php
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Types/DateType.php
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Types/RealestateDateTime.php
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/Types/UniqueidentifierType.php
-#srv/web/owncloud/3rdparty/isoft/mssql-bundle/Realestate/MssqlBundle/composer.json
+#srv/web/owncloud/3rdparty/james-heinrich
+#srv/web/owncloud/3rdparty/james-heinrich/getid3
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/.gitattributes
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/README.md
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/changelog.txt
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/composer.json
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/dependencies.txt
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/extension.cache.dbm.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/extension.cache.mysql.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/extension.cache.sqlite3.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/getid3.lib.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/getid3.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.archive.gzip.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.archive.rar.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.archive.szip.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.archive.tar.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.archive.zip.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio-video.asf.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio-video.bink.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio-video.flv.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio-video.matroska.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio-video.mpeg.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio-video.nsv.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio-video.quicktime.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio-video.real.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio-video.riff.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio-video.swf.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio-video.ts.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.aa.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.aac.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.ac3.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.amr.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.au.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.avr.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.bonk.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.dss.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.dts.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.flac.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.la.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.lpac.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.midi.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.mod.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.monkey.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.mp3.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.mpc.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.ogg.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.optimfrog.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.rkau.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.shorten.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.tta.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.voc.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.vqf.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.audio.wavpack.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.graphic.bmp.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.graphic.efax.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.graphic.gif.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.graphic.jpg.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.graphic.pcd.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.graphic.png.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.graphic.svg.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.graphic.tiff.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.misc.cue.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.misc.exe.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.misc.iso.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.misc.msoffice.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.misc.par2.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.misc.pdf.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.tag.apetag.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.tag.id3v1.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.tag.id3v2.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.tag.lyrics3.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/module.tag.xmp.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/write.apetag.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/write.id3v1.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/write.id3v2.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/write.lyrics3.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/write.metaflac.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/write.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/write.real.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/getid3/write.vorbiscomment.php
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/license.txt
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/licenses
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/licenses/licence.gpl-10.txt
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/licenses/licence.gpl-20.txt
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/licenses/licence.gpl-30.txt
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/licenses/licence.lgpl-30.txt
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/licenses/licence.mpl-20.txt
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/licenses/license.commercial.txt
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/readme.txt
+#srv/web/owncloud/3rdparty/james-heinrich/getid3/structure.txt
#srv/web/owncloud/3rdparty/js
#srv/web/owncloud/3rdparty/js/chosen
#srv/web/owncloud/3rdparty/js/chosen/LICENSE.md
#srv/web/owncloud/3rdparty/patches.txt
#srv/web/owncloud/3rdparty/phpass
#srv/web/owncloud/3rdparty/phpass/PasswordHash.php
-#srv/web/owncloud/3rdparty/phpass/c
-#srv/web/owncloud/3rdparty/phpass/c/Makefile
-#srv/web/owncloud/3rdparty/phpass/c/crypt_private.c
#srv/web/owncloud/3rdparty/phpass/test.php
#srv/web/owncloud/3rdparty/phpmailer
#srv/web/owncloud/3rdparty/phpmailer/phpmailer
#srv/web/owncloud/apps/activity/l10n/hy.php
#srv/web/owncloud/apps/activity/l10n/ia.php
#srv/web/owncloud/apps/activity/l10n/id.php
+#srv/web/owncloud/apps/activity/l10n/io.php
#srv/web/owncloud/apps/activity/l10n/is.php
#srv/web/owncloud/apps/activity/l10n/it.php
#srv/web/owncloud/apps/activity/l10n/ja.php
-#srv/web/owncloud/apps/activity/l10n/ja_JP.php
#srv/web/owncloud/apps/activity/l10n/jv.php
#srv/web/owncloud/apps/activity/l10n/ka_GE.php
#srv/web/owncloud/apps/activity/l10n/km.php
#srv/web/owncloud/apps/activity/l10n/kn.php
#srv/web/owncloud/apps/activity/l10n/ko.php
#srv/web/owncloud/apps/activity/l10n/ku_IQ.php
-#srv/web/owncloud/apps/activity/l10n/l10n.pl
#srv/web/owncloud/apps/activity/l10n/lb.php
#srv/web/owncloud/apps/activity/l10n/lt_LT.php
#srv/web/owncloud/apps/activity/l10n/lv.php
#srv/web/owncloud/apps/activity/tests/hooksdeleteusertest.php
#srv/web/owncloud/apps/activity/tests/mailqueuehandlertest.php
#srv/web/owncloud/apps/activity/tests/navigationtest.php
+#srv/web/owncloud/apps/activity/tests/parameterhelpertest.php
#srv/web/owncloud/apps/activity/tests/phpunit.xml
#srv/web/owncloud/apps/activity/tests/usersettingstest.php
#srv/web/owncloud/apps/admin_dependencies_chk
#srv/web/owncloud/apps/bookmarks/js/full_tags.php
#srv/web/owncloud/apps/bookmarks/js/settings.js
#srv/web/owncloud/apps/bookmarks/l10n
-#srv/web/owncloud/apps/bookmarks/l10n/ach
-#srv/web/owncloud/apps/bookmarks/l10n/ach/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ady
-#srv/web/owncloud/apps/bookmarks/l10n/ady/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/af
-#srv/web/owncloud/apps/bookmarks/l10n/af/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/af_ZA
#srv/web/owncloud/apps/bookmarks/l10n/af_ZA.php
-#srv/web/owncloud/apps/bookmarks/l10n/af_ZA/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ak
-#srv/web/owncloud/apps/bookmarks/l10n/ak/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/am_ET
-#srv/web/owncloud/apps/bookmarks/l10n/am_ET/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ar
+#srv/web/owncloud/apps/bookmarks/l10n/ar.js
+#srv/web/owncloud/apps/bookmarks/l10n/ar.json
#srv/web/owncloud/apps/bookmarks/l10n/ar.php
-#srv/web/owncloud/apps/bookmarks/l10n/ar/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ast
+#srv/web/owncloud/apps/bookmarks/l10n/ast.js
+#srv/web/owncloud/apps/bookmarks/l10n/ast.json
#srv/web/owncloud/apps/bookmarks/l10n/ast.php
-#srv/web/owncloud/apps/bookmarks/l10n/ast/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/az
-#srv/web/owncloud/apps/bookmarks/l10n/az/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/be
+#srv/web/owncloud/apps/bookmarks/l10n/az.js
+#srv/web/owncloud/apps/bookmarks/l10n/az.json
+#srv/web/owncloud/apps/bookmarks/l10n/az.php
#srv/web/owncloud/apps/bookmarks/l10n/be.php
-#srv/web/owncloud/apps/bookmarks/l10n/be/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/bg_BG
+#srv/web/owncloud/apps/bookmarks/l10n/bg_BG.js
+#srv/web/owncloud/apps/bookmarks/l10n/bg_BG.json
#srv/web/owncloud/apps/bookmarks/l10n/bg_BG.php
-#srv/web/owncloud/apps/bookmarks/l10n/bg_BG/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/bn_BD
+#srv/web/owncloud/apps/bookmarks/l10n/bn_BD.js
+#srv/web/owncloud/apps/bookmarks/l10n/bn_BD.json
#srv/web/owncloud/apps/bookmarks/l10n/bn_BD.php
-#srv/web/owncloud/apps/bookmarks/l10n/bn_BD/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/bn_IN
-#srv/web/owncloud/apps/bookmarks/l10n/bn_IN/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/bs
+#srv/web/owncloud/apps/bookmarks/l10n/bn_IN.js
+#srv/web/owncloud/apps/bookmarks/l10n/bn_IN.json
+#srv/web/owncloud/apps/bookmarks/l10n/bn_IN.php
#srv/web/owncloud/apps/bookmarks/l10n/bs.php
-#srv/web/owncloud/apps/bookmarks/l10n/bs/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ca
+#srv/web/owncloud/apps/bookmarks/l10n/ca.js
+#srv/web/owncloud/apps/bookmarks/l10n/ca.json
#srv/web/owncloud/apps/bookmarks/l10n/ca.php
-#srv/web/owncloud/apps/bookmarks/l10n/ca/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ca@valencia
-#srv/web/owncloud/apps/bookmarks/l10n/ca@valencia/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/cs_CZ
+#srv/web/owncloud/apps/bookmarks/l10n/cs_CZ.js
+#srv/web/owncloud/apps/bookmarks/l10n/cs_CZ.json
#srv/web/owncloud/apps/bookmarks/l10n/cs_CZ.php
-#srv/web/owncloud/apps/bookmarks/l10n/cs_CZ/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/cy_GB
+#srv/web/owncloud/apps/bookmarks/l10n/cy_GB.js
+#srv/web/owncloud/apps/bookmarks/l10n/cy_GB.json
#srv/web/owncloud/apps/bookmarks/l10n/cy_GB.php
-#srv/web/owncloud/apps/bookmarks/l10n/cy_GB/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/da
+#srv/web/owncloud/apps/bookmarks/l10n/da.js
+#srv/web/owncloud/apps/bookmarks/l10n/da.json
#srv/web/owncloud/apps/bookmarks/l10n/da.php
-#srv/web/owncloud/apps/bookmarks/l10n/da/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/de
+#srv/web/owncloud/apps/bookmarks/l10n/de.js
+#srv/web/owncloud/apps/bookmarks/l10n/de.json
#srv/web/owncloud/apps/bookmarks/l10n/de.php
-#srv/web/owncloud/apps/bookmarks/l10n/de/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/de_AT
#srv/web/owncloud/apps/bookmarks/l10n/de_AT.php
-#srv/web/owncloud/apps/bookmarks/l10n/de_AT/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/de_CH
+#srv/web/owncloud/apps/bookmarks/l10n/de_CH.js
+#srv/web/owncloud/apps/bookmarks/l10n/de_CH.json
#srv/web/owncloud/apps/bookmarks/l10n/de_CH.php
-#srv/web/owncloud/apps/bookmarks/l10n/de_CH/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/de_DE
+#srv/web/owncloud/apps/bookmarks/l10n/de_DE.js
+#srv/web/owncloud/apps/bookmarks/l10n/de_DE.json
#srv/web/owncloud/apps/bookmarks/l10n/de_DE.php
-#srv/web/owncloud/apps/bookmarks/l10n/de_DE/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/el
+#srv/web/owncloud/apps/bookmarks/l10n/el.js
+#srv/web/owncloud/apps/bookmarks/l10n/el.json
#srv/web/owncloud/apps/bookmarks/l10n/el.php
-#srv/web/owncloud/apps/bookmarks/l10n/el/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/en@pirate
-#srv/web/owncloud/apps/bookmarks/l10n/en@pirate/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/en_GB
+#srv/web/owncloud/apps/bookmarks/l10n/en_GB.js
+#srv/web/owncloud/apps/bookmarks/l10n/en_GB.json
#srv/web/owncloud/apps/bookmarks/l10n/en_GB.php
-#srv/web/owncloud/apps/bookmarks/l10n/en_GB/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/en_NZ
-#srv/web/owncloud/apps/bookmarks/l10n/en_NZ/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/eo
+#srv/web/owncloud/apps/bookmarks/l10n/eo.js
+#srv/web/owncloud/apps/bookmarks/l10n/eo.json
#srv/web/owncloud/apps/bookmarks/l10n/eo.php
-#srv/web/owncloud/apps/bookmarks/l10n/eo/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/es
+#srv/web/owncloud/apps/bookmarks/l10n/es.js
+#srv/web/owncloud/apps/bookmarks/l10n/es.json
#srv/web/owncloud/apps/bookmarks/l10n/es.php
-#srv/web/owncloud/apps/bookmarks/l10n/es/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/es_AR
+#srv/web/owncloud/apps/bookmarks/l10n/es_AR.js
+#srv/web/owncloud/apps/bookmarks/l10n/es_AR.json
#srv/web/owncloud/apps/bookmarks/l10n/es_AR.php
-#srv/web/owncloud/apps/bookmarks/l10n/es_AR/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/es_BO
-#srv/web/owncloud/apps/bookmarks/l10n/es_BO/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/es_CL
#srv/web/owncloud/apps/bookmarks/l10n/es_CL.php
-#srv/web/owncloud/apps/bookmarks/l10n/es_CL/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/es_CO
-#srv/web/owncloud/apps/bookmarks/l10n/es_CO/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/es_CR
-#srv/web/owncloud/apps/bookmarks/l10n/es_CR/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/es_EC
-#srv/web/owncloud/apps/bookmarks/l10n/es_EC/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/es_MX
+#srv/web/owncloud/apps/bookmarks/l10n/es_MX.js
+#srv/web/owncloud/apps/bookmarks/l10n/es_MX.json
#srv/web/owncloud/apps/bookmarks/l10n/es_MX.php
-#srv/web/owncloud/apps/bookmarks/l10n/es_MX/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/es_PE
-#srv/web/owncloud/apps/bookmarks/l10n/es_PE/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/es_PY
-#srv/web/owncloud/apps/bookmarks/l10n/es_PY/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/es_US
-#srv/web/owncloud/apps/bookmarks/l10n/es_US/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/es_UY
-#srv/web/owncloud/apps/bookmarks/l10n/es_UY/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/et_EE
+#srv/web/owncloud/apps/bookmarks/l10n/et_EE.js
+#srv/web/owncloud/apps/bookmarks/l10n/et_EE.json
#srv/web/owncloud/apps/bookmarks/l10n/et_EE.php
-#srv/web/owncloud/apps/bookmarks/l10n/et_EE/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/eu
+#srv/web/owncloud/apps/bookmarks/l10n/eu.js
+#srv/web/owncloud/apps/bookmarks/l10n/eu.json
#srv/web/owncloud/apps/bookmarks/l10n/eu.php
-#srv/web/owncloud/apps/bookmarks/l10n/eu/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/eu_ES
#srv/web/owncloud/apps/bookmarks/l10n/eu_ES.php
-#srv/web/owncloud/apps/bookmarks/l10n/eu_ES/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/fa
+#srv/web/owncloud/apps/bookmarks/l10n/fa.js
+#srv/web/owncloud/apps/bookmarks/l10n/fa.json
#srv/web/owncloud/apps/bookmarks/l10n/fa.php
-#srv/web/owncloud/apps/bookmarks/l10n/fa/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/fi
#srv/web/owncloud/apps/bookmarks/l10n/fi.php
-#srv/web/owncloud/apps/bookmarks/l10n/fi/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/fi_FI
+#srv/web/owncloud/apps/bookmarks/l10n/fi_FI.js
+#srv/web/owncloud/apps/bookmarks/l10n/fi_FI.json
#srv/web/owncloud/apps/bookmarks/l10n/fi_FI.php
-#srv/web/owncloud/apps/bookmarks/l10n/fi_FI/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/fr
+#srv/web/owncloud/apps/bookmarks/l10n/fr.js
+#srv/web/owncloud/apps/bookmarks/l10n/fr.json
#srv/web/owncloud/apps/bookmarks/l10n/fr.php
-#srv/web/owncloud/apps/bookmarks/l10n/fr/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/fr_CA
-#srv/web/owncloud/apps/bookmarks/l10n/fr_CA/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/gl
+#srv/web/owncloud/apps/bookmarks/l10n/gl.js
+#srv/web/owncloud/apps/bookmarks/l10n/gl.json
#srv/web/owncloud/apps/bookmarks/l10n/gl.php
-#srv/web/owncloud/apps/bookmarks/l10n/gl/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/he
+#srv/web/owncloud/apps/bookmarks/l10n/he.js
+#srv/web/owncloud/apps/bookmarks/l10n/he.json
#srv/web/owncloud/apps/bookmarks/l10n/he.php
-#srv/web/owncloud/apps/bookmarks/l10n/he/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/hi
#srv/web/owncloud/apps/bookmarks/l10n/hi.php
-#srv/web/owncloud/apps/bookmarks/l10n/hi/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/hi_IN
-#srv/web/owncloud/apps/bookmarks/l10n/hi_IN/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/hr
#srv/web/owncloud/apps/bookmarks/l10n/hr.php
-#srv/web/owncloud/apps/bookmarks/l10n/hr/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/hu_HU
+#srv/web/owncloud/apps/bookmarks/l10n/hu_HU.js
+#srv/web/owncloud/apps/bookmarks/l10n/hu_HU.json
#srv/web/owncloud/apps/bookmarks/l10n/hu_HU.php
-#srv/web/owncloud/apps/bookmarks/l10n/hu_HU/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/hy
#srv/web/owncloud/apps/bookmarks/l10n/hy.php
-#srv/web/owncloud/apps/bookmarks/l10n/hy/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ia
+#srv/web/owncloud/apps/bookmarks/l10n/ia.js
+#srv/web/owncloud/apps/bookmarks/l10n/ia.json
#srv/web/owncloud/apps/bookmarks/l10n/ia.php
-#srv/web/owncloud/apps/bookmarks/l10n/ia/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/id
+#srv/web/owncloud/apps/bookmarks/l10n/id.js
+#srv/web/owncloud/apps/bookmarks/l10n/id.json
#srv/web/owncloud/apps/bookmarks/l10n/id.php
-#srv/web/owncloud/apps/bookmarks/l10n/id/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/is
+#srv/web/owncloud/apps/bookmarks/l10n/is.js
+#srv/web/owncloud/apps/bookmarks/l10n/is.json
#srv/web/owncloud/apps/bookmarks/l10n/is.php
-#srv/web/owncloud/apps/bookmarks/l10n/is/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/it
+#srv/web/owncloud/apps/bookmarks/l10n/it.js
+#srv/web/owncloud/apps/bookmarks/l10n/it.json
#srv/web/owncloud/apps/bookmarks/l10n/it.php
-#srv/web/owncloud/apps/bookmarks/l10n/it/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ja
+#srv/web/owncloud/apps/bookmarks/l10n/ja.js
+#srv/web/owncloud/apps/bookmarks/l10n/ja.json
#srv/web/owncloud/apps/bookmarks/l10n/ja.php
-#srv/web/owncloud/apps/bookmarks/l10n/ja/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ja_JP.php
-#srv/web/owncloud/apps/bookmarks/l10n/jv
#srv/web/owncloud/apps/bookmarks/l10n/jv.php
-#srv/web/owncloud/apps/bookmarks/l10n/jv/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ka
-#srv/web/owncloud/apps/bookmarks/l10n/ka/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ka_GE
+#srv/web/owncloud/apps/bookmarks/l10n/ka_GE.js
+#srv/web/owncloud/apps/bookmarks/l10n/ka_GE.json
#srv/web/owncloud/apps/bookmarks/l10n/ka_GE.php
-#srv/web/owncloud/apps/bookmarks/l10n/ka_GE/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/km
+#srv/web/owncloud/apps/bookmarks/l10n/km.js
+#srv/web/owncloud/apps/bookmarks/l10n/km.json
#srv/web/owncloud/apps/bookmarks/l10n/km.php
-#srv/web/owncloud/apps/bookmarks/l10n/km/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/kn
-#srv/web/owncloud/apps/bookmarks/l10n/kn/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ko
+#srv/web/owncloud/apps/bookmarks/l10n/ko.js
+#srv/web/owncloud/apps/bookmarks/l10n/ko.json
#srv/web/owncloud/apps/bookmarks/l10n/ko.php
-#srv/web/owncloud/apps/bookmarks/l10n/ko/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ku_IQ
#srv/web/owncloud/apps/bookmarks/l10n/ku_IQ.php
-#srv/web/owncloud/apps/bookmarks/l10n/ku_IQ/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/l10n.pl
-#srv/web/owncloud/apps/bookmarks/l10n/lb
+#srv/web/owncloud/apps/bookmarks/l10n/lb.js
+#srv/web/owncloud/apps/bookmarks/l10n/lb.json
#srv/web/owncloud/apps/bookmarks/l10n/lb.php
-#srv/web/owncloud/apps/bookmarks/l10n/lb/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/lt_LT
+#srv/web/owncloud/apps/bookmarks/l10n/lt_LT.js
+#srv/web/owncloud/apps/bookmarks/l10n/lt_LT.json
#srv/web/owncloud/apps/bookmarks/l10n/lt_LT.php
-#srv/web/owncloud/apps/bookmarks/l10n/lt_LT/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/lv
+#srv/web/owncloud/apps/bookmarks/l10n/lv.js
+#srv/web/owncloud/apps/bookmarks/l10n/lv.json
#srv/web/owncloud/apps/bookmarks/l10n/lv.php
-#srv/web/owncloud/apps/bookmarks/l10n/lv/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/mk
+#srv/web/owncloud/apps/bookmarks/l10n/mk.js
+#srv/web/owncloud/apps/bookmarks/l10n/mk.json
#srv/web/owncloud/apps/bookmarks/l10n/mk.php
-#srv/web/owncloud/apps/bookmarks/l10n/mk/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ml
-#srv/web/owncloud/apps/bookmarks/l10n/ml/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ml_IN
-#srv/web/owncloud/apps/bookmarks/l10n/ml_IN/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/mn
-#srv/web/owncloud/apps/bookmarks/l10n/mn/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ms_MY
#srv/web/owncloud/apps/bookmarks/l10n/ms_MY.php
-#srv/web/owncloud/apps/bookmarks/l10n/ms_MY/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/my_MM
#srv/web/owncloud/apps/bookmarks/l10n/my_MM.php
-#srv/web/owncloud/apps/bookmarks/l10n/my_MM/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/nb_NO
+#srv/web/owncloud/apps/bookmarks/l10n/nb_NO.js
+#srv/web/owncloud/apps/bookmarks/l10n/nb_NO.json
#srv/web/owncloud/apps/bookmarks/l10n/nb_NO.php
-#srv/web/owncloud/apps/bookmarks/l10n/nb_NO/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/nds
-#srv/web/owncloud/apps/bookmarks/l10n/nds/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ne
-#srv/web/owncloud/apps/bookmarks/l10n/ne/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/nl
+#srv/web/owncloud/apps/bookmarks/l10n/nl.js
+#srv/web/owncloud/apps/bookmarks/l10n/nl.json
#srv/web/owncloud/apps/bookmarks/l10n/nl.php
-#srv/web/owncloud/apps/bookmarks/l10n/nl/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/nn_NO
+#srv/web/owncloud/apps/bookmarks/l10n/nn_NO.js
+#srv/web/owncloud/apps/bookmarks/l10n/nn_NO.json
#srv/web/owncloud/apps/bookmarks/l10n/nn_NO.php
-#srv/web/owncloud/apps/bookmarks/l10n/nn_NO/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/nqo
-#srv/web/owncloud/apps/bookmarks/l10n/nqo/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/oc
#srv/web/owncloud/apps/bookmarks/l10n/oc.php
-#srv/web/owncloud/apps/bookmarks/l10n/oc/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/or_IN
-#srv/web/owncloud/apps/bookmarks/l10n/or_IN/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/pa
#srv/web/owncloud/apps/bookmarks/l10n/pa.php
-#srv/web/owncloud/apps/bookmarks/l10n/pa/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/pl
+#srv/web/owncloud/apps/bookmarks/l10n/pl.js
+#srv/web/owncloud/apps/bookmarks/l10n/pl.json
#srv/web/owncloud/apps/bookmarks/l10n/pl.php
-#srv/web/owncloud/apps/bookmarks/l10n/pl/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/pl_PL
#srv/web/owncloud/apps/bookmarks/l10n/pl_PL.php
-#srv/web/owncloud/apps/bookmarks/l10n/pl_PL/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/pt_BR
+#srv/web/owncloud/apps/bookmarks/l10n/pt_BR.js
+#srv/web/owncloud/apps/bookmarks/l10n/pt_BR.json
#srv/web/owncloud/apps/bookmarks/l10n/pt_BR.php
-#srv/web/owncloud/apps/bookmarks/l10n/pt_BR/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/pt_PT
+#srv/web/owncloud/apps/bookmarks/l10n/pt_PT.js
+#srv/web/owncloud/apps/bookmarks/l10n/pt_PT.json
#srv/web/owncloud/apps/bookmarks/l10n/pt_PT.php
-#srv/web/owncloud/apps/bookmarks/l10n/pt_PT/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ro
+#srv/web/owncloud/apps/bookmarks/l10n/ro.js
+#srv/web/owncloud/apps/bookmarks/l10n/ro.json
#srv/web/owncloud/apps/bookmarks/l10n/ro.php
-#srv/web/owncloud/apps/bookmarks/l10n/ro/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ru
+#srv/web/owncloud/apps/bookmarks/l10n/ru.js
+#srv/web/owncloud/apps/bookmarks/l10n/ru.json
#srv/web/owncloud/apps/bookmarks/l10n/ru.php
-#srv/web/owncloud/apps/bookmarks/l10n/ru/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ru_RU
#srv/web/owncloud/apps/bookmarks/l10n/ru_RU.php
-#srv/web/owncloud/apps/bookmarks/l10n/ru_RU/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/si_LK
+#srv/web/owncloud/apps/bookmarks/l10n/si_LK.js
+#srv/web/owncloud/apps/bookmarks/l10n/si_LK.json
#srv/web/owncloud/apps/bookmarks/l10n/si_LK.php
-#srv/web/owncloud/apps/bookmarks/l10n/si_LK/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/sk
#srv/web/owncloud/apps/bookmarks/l10n/sk.php
-#srv/web/owncloud/apps/bookmarks/l10n/sk/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/sk_SK
+#srv/web/owncloud/apps/bookmarks/l10n/sk_SK.js
+#srv/web/owncloud/apps/bookmarks/l10n/sk_SK.json
#srv/web/owncloud/apps/bookmarks/l10n/sk_SK.php
-#srv/web/owncloud/apps/bookmarks/l10n/sk_SK/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/sl
+#srv/web/owncloud/apps/bookmarks/l10n/sl.js
+#srv/web/owncloud/apps/bookmarks/l10n/sl.json
#srv/web/owncloud/apps/bookmarks/l10n/sl.php
-#srv/web/owncloud/apps/bookmarks/l10n/sl/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/sq
#srv/web/owncloud/apps/bookmarks/l10n/sq.php
-#srv/web/owncloud/apps/bookmarks/l10n/sq/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/sr
+#srv/web/owncloud/apps/bookmarks/l10n/sr.js
+#srv/web/owncloud/apps/bookmarks/l10n/sr.json
#srv/web/owncloud/apps/bookmarks/l10n/sr.php
-#srv/web/owncloud/apps/bookmarks/l10n/sr/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/sr@latin
#srv/web/owncloud/apps/bookmarks/l10n/sr@latin.php
-#srv/web/owncloud/apps/bookmarks/l10n/sr@latin/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/su
-#srv/web/owncloud/apps/bookmarks/l10n/su/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/sv
+#srv/web/owncloud/apps/bookmarks/l10n/sv.js
+#srv/web/owncloud/apps/bookmarks/l10n/sv.json
#srv/web/owncloud/apps/bookmarks/l10n/sv.php
-#srv/web/owncloud/apps/bookmarks/l10n/sv/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/sw_KE
-#srv/web/owncloud/apps/bookmarks/l10n/sw_KE/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ta_IN
-#srv/web/owncloud/apps/bookmarks/l10n/ta_IN/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ta_LK
+#srv/web/owncloud/apps/bookmarks/l10n/ta_IN.php
+#srv/web/owncloud/apps/bookmarks/l10n/ta_LK.js
+#srv/web/owncloud/apps/bookmarks/l10n/ta_LK.json
#srv/web/owncloud/apps/bookmarks/l10n/ta_LK.php
-#srv/web/owncloud/apps/bookmarks/l10n/ta_LK/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/te
#srv/web/owncloud/apps/bookmarks/l10n/te.php
-#srv/web/owncloud/apps/bookmarks/l10n/te/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/templates
-#srv/web/owncloud/apps/bookmarks/l10n/templates/bookmarks.pot
-#srv/web/owncloud/apps/bookmarks/l10n/th_TH
+#srv/web/owncloud/apps/bookmarks/l10n/th_TH.js
+#srv/web/owncloud/apps/bookmarks/l10n/th_TH.json
#srv/web/owncloud/apps/bookmarks/l10n/th_TH.php
-#srv/web/owncloud/apps/bookmarks/l10n/th_TH/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/tr
+#srv/web/owncloud/apps/bookmarks/l10n/tr.js
+#srv/web/owncloud/apps/bookmarks/l10n/tr.json
#srv/web/owncloud/apps/bookmarks/l10n/tr.php
-#srv/web/owncloud/apps/bookmarks/l10n/tr/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/tzm
-#srv/web/owncloud/apps/bookmarks/l10n/tzm/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ug
+#srv/web/owncloud/apps/bookmarks/l10n/ug.js
+#srv/web/owncloud/apps/bookmarks/l10n/ug.json
#srv/web/owncloud/apps/bookmarks/l10n/ug.php
-#srv/web/owncloud/apps/bookmarks/l10n/ug/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/uk
+#srv/web/owncloud/apps/bookmarks/l10n/uk.js
+#srv/web/owncloud/apps/bookmarks/l10n/uk.json
#srv/web/owncloud/apps/bookmarks/l10n/uk.php
-#srv/web/owncloud/apps/bookmarks/l10n/uk/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ur
-#srv/web/owncloud/apps/bookmarks/l10n/ur/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/ur_PK
#srv/web/owncloud/apps/bookmarks/l10n/ur_PK.php
-#srv/web/owncloud/apps/bookmarks/l10n/ur_PK/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/uz
-#srv/web/owncloud/apps/bookmarks/l10n/uz/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/vi
+#srv/web/owncloud/apps/bookmarks/l10n/vi.js
+#srv/web/owncloud/apps/bookmarks/l10n/vi.json
#srv/web/owncloud/apps/bookmarks/l10n/vi.php
-#srv/web/owncloud/apps/bookmarks/l10n/vi/bookmarks.po
#srv/web/owncloud/apps/bookmarks/l10n/xgettextfiles
-#srv/web/owncloud/apps/bookmarks/l10n/zh_CN
-#srv/web/owncloud/apps/bookmarks/l10n/zh_CN.GB2312
-#srv/web/owncloud/apps/bookmarks/l10n/zh_CN.GB2312.php
-#srv/web/owncloud/apps/bookmarks/l10n/zh_CN.GB2312/bookmarks.po
+#srv/web/owncloud/apps/bookmarks/l10n/zh_CN.js
+#srv/web/owncloud/apps/bookmarks/l10n/zh_CN.json
#srv/web/owncloud/apps/bookmarks/l10n/zh_CN.php
-#srv/web/owncloud/apps/bookmarks/l10n/zh_CN/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/zh_HK
#srv/web/owncloud/apps/bookmarks/l10n/zh_HK.php
-#srv/web/owncloud/apps/bookmarks/l10n/zh_HK/bookmarks.po
-#srv/web/owncloud/apps/bookmarks/l10n/zh_TW
+#srv/web/owncloud/apps/bookmarks/l10n/zh_TW.js
+#srv/web/owncloud/apps/bookmarks/l10n/zh_TW.json
#srv/web/owncloud/apps/bookmarks/l10n/zh_TW.php
-#srv/web/owncloud/apps/bookmarks/l10n/zh_TW/bookmarks.po
#srv/web/owncloud/apps/bookmarks/lib
#srv/web/owncloud/apps/bookmarks/lib/bookmarks.php
#srv/web/owncloud/apps/bookmarks/lib/search.php
#srv/web/owncloud/apps/bookmarks/templates/list.php
#srv/web/owncloud/apps/bookmarks/templates/settings.php
#srv/web/owncloud/apps/bookmarks/tests
-#srv/web/owncloud/apps/bookmarks/tests/lib_bookmark.php
+#srv/web/owncloud/apps/bookmarks/tests/bootstrap.php
+#srv/web/owncloud/apps/bookmarks/tests/lib_bookmark_test.php
+#srv/web/owncloud/apps/bookmarks/tests/phpunit.xml
#srv/web/owncloud/apps/calendar
#srv/web/owncloud/apps/calendar/3rdparty
#srv/web/owncloud/apps/calendar/3rdparty/fullcalendar
#srv/web/owncloud/apps/contacts/lib/jsonresponse.php
#srv/web/owncloud/apps/contacts/lib/middleware
#srv/web/owncloud/apps/contacts/lib/middleware/http.php
-#srv/web/owncloud/apps/contacts/lib/searchprovider.php
+#srv/web/owncloud/apps/contacts/lib/search
+#srv/web/owncloud/apps/contacts/lib/search/contact.php
+#srv/web/owncloud/apps/contacts/lib/search/provider.php
#srv/web/owncloud/apps/contacts/lib/share
#srv/web/owncloud/apps/contacts/lib/share/addressbook.php
#srv/web/owncloud/apps/contacts/lib/share/contact.php
#srv/web/owncloud/apps/files_external/ajax
#srv/web/owncloud/apps/files_external/ajax/addMountPoint.php
#srv/web/owncloud/apps/files_external/ajax/addRootCertificate.php
+#srv/web/owncloud/apps/files_external/ajax/applicable.php
#srv/web/owncloud/apps/files_external/ajax/dropbox.php
#srv/web/owncloud/apps/files_external/ajax/google.php
#srv/web/owncloud/apps/files_external/ajax/removeMountPoint.php
#srv/web/owncloud/apps/files_external/lib/api.php
#srv/web/owncloud/apps/files_external/lib/config.php
#srv/web/owncloud/apps/files_external/lib/dropbox.php
+#srv/web/owncloud/apps/files_external/lib/etagpropagator.php
#srv/web/owncloud/apps/files_external/lib/ftp.php
#srv/web/owncloud/apps/files_external/lib/google.php
#srv/web/owncloud/apps/files_external/lib/owncloud.php
#srv/web/owncloud/apps/files_external/templates/settings.php
#srv/web/owncloud/apps/files_external/tests
#srv/web/owncloud/apps/files_external/tests/amazons3.php
+#srv/web/owncloud/apps/files_external/tests/amazons3migration.php
#srv/web/owncloud/apps/files_external/tests/appSpec.js
#srv/web/owncloud/apps/files_external/tests/config.php
#srv/web/owncloud/apps/files_external/tests/dropbox.php
#srv/web/owncloud/apps/files_external/tests/dynamicmountconfig.php
+#srv/web/owncloud/apps/files_external/tests/etagpropagator.php
#srv/web/owncloud/apps/files_external/tests/ftp.php
#srv/web/owncloud/apps/files_external/tests/google.php
#srv/web/owncloud/apps/files_external/tests/js
#srv/web/owncloud/apps/files_external/tests/js/mountsfilelistSpec.js
#srv/web/owncloud/apps/files_external/tests/mountconfig.php
#srv/web/owncloud/apps/files_external/tests/owncloud.php
+#srv/web/owncloud/apps/files_external/tests/owncloudfunctions.php
#srv/web/owncloud/apps/files_external/tests/sftp.php
#srv/web/owncloud/apps/files_external/tests/smb.php
#srv/web/owncloud/apps/files_external/tests/smbfunctions.php
#srv/web/owncloud/apps/files_sharing/lib/cache.php
#srv/web/owncloud/apps/files_sharing/lib/connector
#srv/web/owncloud/apps/files_sharing/lib/connector/publicauth.php
+#srv/web/owncloud/apps/files_sharing/lib/exceptions.php
#srv/web/owncloud/apps/files_sharing/lib/external
#srv/web/owncloud/apps/files_sharing/lib/external/cache.php
#srv/web/owncloud/apps/files_sharing/lib/external/manager.php
#srv/web/owncloud/apps/files_sharing/templates/settings-admin.php
#srv/web/owncloud/apps/files_sharing/tests
#srv/web/owncloud/apps/files_sharing/tests/api.php
+#srv/web/owncloud/apps/files_sharing/tests/backend.php
#srv/web/owncloud/apps/files_sharing/tests/base.php
#srv/web/owncloud/apps/files_sharing/tests/cache.php
#srv/web/owncloud/apps/files_sharing/tests/externalstorage.php
+#srv/web/owncloud/apps/files_sharing/tests/helper.php
#srv/web/owncloud/apps/files_sharing/tests/js
#srv/web/owncloud/apps/files_sharing/tests/js/appSpec.js
#srv/web/owncloud/apps/files_sharing/tests/js/shareSpec.js
#srv/web/owncloud/apps/updater/admin.php
#srv/web/owncloud/apps/updater/ajax
#srv/web/owncloud/apps/updater/ajax/backup
+#srv/web/owncloud/apps/updater/ajax/backup.php
#srv/web/owncloud/apps/updater/ajax/backup/delete.php
#srv/web/owncloud/apps/updater/ajax/backup/download.php
#srv/web/owncloud/apps/updater/ajax/backup/list.php
+#srv/web/owncloud/apps/updater/ajax/download.php
#srv/web/owncloud/apps/updater/ajax/update.php
#srv/web/owncloud/apps/updater/appinfo
#srv/web/owncloud/apps/updater/appinfo/app.php
#srv/web/owncloud/apps/updater/lib
#srv/web/owncloud/apps/updater/lib/app.php
#srv/web/owncloud/apps/updater/lib/backup.php
+#srv/web/owncloud/apps/updater/lib/collection.php
#srv/web/owncloud/apps/updater/lib/downloader.php
+#srv/web/owncloud/apps/updater/lib/fsexception.php
#srv/web/owncloud/apps/updater/lib/helper.php
#srv/web/owncloud/apps/updater/lib/location
#srv/web/owncloud/apps/updater/lib/location.php
#srv/web/owncloud/apps/updater/lib/location/3rdparty.php
#srv/web/owncloud/apps/updater/lib/location/apps.php
#srv/web/owncloud/apps/updater/lib/location/core.php
+#srv/web/owncloud/apps/updater/lib/permissionexception.php
#srv/web/owncloud/apps/updater/lib/updater.php
#srv/web/owncloud/apps/updater/templates
#srv/web/owncloud/apps/updater/templates/admin.php
#srv/web/owncloud/apps/user_ldap/group_ldap.php
#srv/web/owncloud/apps/user_ldap/group_proxy.php
#srv/web/owncloud/apps/user_ldap/js
+#srv/web/owncloud/apps/user_ldap/js/experiencedAdmin.js
#srv/web/owncloud/apps/user_ldap/js/ldapFilter.js
#srv/web/owncloud/apps/user_ldap/js/settings.js
#srv/web/owncloud/apps/user_ldap/l10n
#srv/web/owncloud/apps/user_ldap/tests/data
#srv/web/owncloud/apps/user_ldap/tests/data/sid.dat
#srv/web/owncloud/apps/user_ldap/tests/group_ldap.php
+#srv/web/owncloud/apps/user_ldap/tests/helper.php
#srv/web/owncloud/apps/user_ldap/tests/user
#srv/web/owncloud/apps/user_ldap/tests/user/manager.php
#srv/web/owncloud/apps/user_ldap/tests/user/user.php
#srv/web/owncloud/core/css/jquery.ocdialog.css
#srv/web/owncloud/core/css/mobile.css
#srv/web/owncloud/core/css/multiselect.css
+#srv/web/owncloud/core/css/select2
+#srv/web/owncloud/core/css/select2/select2-spinner.gif
+#srv/web/owncloud/core/css/select2/select2.css
+#srv/web/owncloud/core/css/select2/select2.png
+#srv/web/owncloud/core/css/select2/select2x2.png
#srv/web/owncloud/core/css/share.css
#srv/web/owncloud/core/css/styles.css
#srv/web/owncloud/core/doc
#srv/web/owncloud/core/doc/admin
#srv/web/owncloud/core/doc/admin/_images
-#srv/web/owncloud/core/doc/admin/_images/100000000000003800000018D49F1CE7.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000050000000DB83B8FA5B.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000000950000004412998BE7.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000000A800000073F49785A6.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000000B600000120706C3C75.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000000CD000000ECA8DE7780.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000000F1000000F56125BDBA.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000000F1000000F6704F46D3.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000000F300000068AF0ECD53.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000000F40000019A110DD159.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000000F5000000675DC5F68C.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000000F500000067A8845EF8.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000000F60000006754ED2A1E.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000000F6000000685DFB3767.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000012C0000009C444B4720.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000013C0000017D4FC6CEF5.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001400000008A557EF7E3.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001440000005A2989832F.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000160000000DBB2FB0223.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000165000000D3FF2168AB.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000167000000B43E4BF478.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001800000009A9494E037.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001880000007EA4444400.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000018B000000A090F31164.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000018E000000C4BA62B2A3.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000193000001AE9AB8B0A2.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000194000000498325A766.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000194000000FAD39BC0D8.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001980000009271BE0D26.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000019E0000004CD2A0F407.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001A3000000AAFE82893A.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001AC000000477C76808F.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001BF00000012349EAE2F.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001C1000000FE663748B2.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001C9000000AF9C1CE57F.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001CF00000176B0BE1EBC.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001D30000014DC251C948.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001E50000006E3ECDC427.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000001FD000000DF8D2D7546.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000200000000BCCCC35DEB.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000002170000004A27056037.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000021C0000004CACBF786C.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000002210000002DE3BE7515.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000227000000935D9B1EF6.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000023B000000125381F51B.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000247000000A77440E4D3.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000002720000013FB6EDA793.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000027B0000011D10F70F88.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000002840000016729388B7F.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000288000001A1D5BE4881.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000289000001A9D7F3941F.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000002910000018B31D51F03.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000291000001951B69B9A6.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000002950000019EF5732E36.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000002950000021E245F6883.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000298000001870B0581FA.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000298000001874D3CA506.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000029B0000018885B5282E.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000002A6000000BFBE298238.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000002B1000002258C08D304.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000002B3000000365E1CD00D.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000002BB000000266DB6AD1A.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000002F3000000926CA65D02.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000304000001B964698779.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000336000000F38C3FAF84.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000372000002AF943ADDA0.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000003730000002B6865E951.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000003A60000011E274A1A28.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000003A6000002A9C7A660BE.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000003A800000039364066E4.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000003B30000021B5EE5D338.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000003DF00000071A41D8A1F.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000003DF000000D953A456B6.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000003E8000001524A147A04.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000003EC000000AB60616FA7.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000003FB000002359BAFB40E.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000004010000017E4A6552BC.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000403000001632F0B76F6.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000404000000FCFC13E732.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000004100000005657010336.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000004170000016ACB5E15AE.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000041D0000017D8D1BC4D9.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000042500000163D2B339D5.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000427000000324F58266D.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000042E000001D3EEB9978B.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000042F000000CC3EDDE79E.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000430000000AF9D6E724E.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000043000000164DA0CE8C9.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000043200000169BCD20493.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000044C000002B0B421E27E.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000045800000197FE462F2B.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000462000000D44541CF9A.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000046C000000C2D3E5CF30.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000004770000008AAF3CFFDB.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000004920000028D9C8DC2CB.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000004C0000000795BB2C146.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000004CA000002B52116BE0C.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000004ED000000BE3B9E25D5.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000523000000C6F786381C.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000052500000088DBB95005.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000525000000BE30CF0423.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000527000000A7AB409FE0.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000052F000000C2867B7294.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000530000001410CF0028A.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000053100000142D9A4C916.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000532000000285DDBBF37.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000053A00000067708C8F53.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000552000000BF22E90239.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000557000002E148BAB6D4.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005970000006AE23997C9.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005AF00000074604B1A67.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005B90000007866D92D14.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005BB0000007C1DF71FA7.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005C30000006CAFFAAD61.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005D00000003B29340A7A.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005D50000009458C5EE48.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005E20000009B1BA5A8CF.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005E6000000676902E040.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005EB000000A68BA73E2D.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005EC00000073E678DFEC.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005F30000030F1372448D.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005F70000005F0912E904.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005F70000007E43DB8026.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005FA0000005CE8491B77.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000005FF0000005F35710398.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000006000000005EDA7B96BE.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000060300000065DF96536B.png
-#srv/web/owncloud/core/doc/admin/_images/10000000000006060000006A0106CA0C.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000061A0000006FC014C3A4.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000061D0000007047877972.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000061E0000006BCF9ECC0B.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000062A0000005F61A18950.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000631000000E19D116AA0.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000063F00000090AAE1FA4A.png
-#srv/web/owncloud/core/doc/admin/_images/1000000000000668000002D29EAD9899.png
-#srv/web/owncloud/core/doc/admin/_images/100000000000066D000001AAD8CE8256.png
-#srv/web/owncloud/core/doc/admin/_images/10000201000002FC000001DC2DDAD2F1.png
-#srv/web/owncloud/core/doc/admin/_images/1000020100000359000000A8B848DE68.png
-#srv/web/owncloud/core/doc/admin/_images/10000201000005F90000029D8BA200FB.png
-#srv/web/owncloud/core/doc/admin/_images/custom_mount_config_gui-1.png
-#srv/web/owncloud/core/doc/admin/_images/custom_mount_config_gui-2.png
-#srv/web/owncloud/core/doc/admin/_images/custom_mount_config_gui-3.png
-#srv/web/owncloud/core/doc/admin/_images/custom_mount_config_gui-4.png
-#srv/web/owncloud/core/doc/admin/_images/edit_encrypted_file.png
+#srv/web/owncloud/core/doc/admin/_images/antivirus-app.png
+#srv/web/owncloud/core/doc/admin/_images/antivirus-config.png
+#srv/web/owncloud/core/doc/admin/_images/antivirus-daemon-socket.png
+#srv/web/owncloud/core/doc/admin/_images/antivirus-executable.png
+#srv/web/owncloud/core/doc/admin/_images/antivirus-logging.png
+#srv/web/owncloud/core/doc/admin/_images/create_public_share.png
+#srv/web/owncloud/core/doc/admin/_images/documents_app_enable.png
+#srv/web/owncloud/core/doc/admin/_images/encryption1.png
+#srv/web/owncloud/core/doc/admin/_images/encryption2.png
+#srv/web/owncloud/core/doc/admin/_images/encryption3.png
+#srv/web/owncloud/core/doc/admin/_images/encryption4.png
+#srv/web/owncloud/core/doc/admin/_images/encryption5.png
+#srv/web/owncloud/core/doc/admin/_images/encryption6.png
+#srv/web/owncloud/core/doc/admin/_images/encryption7.png
+#srv/web/owncloud/core/doc/admin/_images/encryption8.png
+#srv/web/owncloud/core/doc/admin/_images/encryption9.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-amazons3.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-app-add.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-app-enable.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-app-local.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-app-usermounts.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-dropbox-allowshare.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-dropbox-app.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-dropbox-configapp.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-dropbox-oc.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-dropbox.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-ftp.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-google-drive-0auth.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-google-drive-9.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-google-drive-sdk.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-google-drive.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-google-drive1.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-google-drive2.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-google-drive5.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-google-drive7.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-google-drive8.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-smb.png
+#srv/web/owncloud/core/doc/admin/_images/external-storage-webdav.png
#srv/web/owncloud/core/doc/admin/_images/install-wizard-advanced.png
#srv/web/owncloud/core/doc/admin/_images/install-wizard.png
#srv/web/owncloud/core/doc/admin/_images/ldap-advanced-1-connection.png
#srv/web/owncloud/core/doc/admin/_images/ldap-wizard-2-user.png
#srv/web/owncloud/core/doc/admin/_images/ldap-wizard-3-login.png
#srv/web/owncloud/core/doc/admin/_images/ldap-wizard-4-group.png
+#srv/web/owncloud/core/doc/admin/_images/lucene-search-enable.png
+#srv/web/owncloud/core/doc/admin/_images/lucene-search-user.png
#srv/web/owncloud/core/doc/admin/_images/oc_admin_app_page.png
-#srv/web/owncloud/core/doc/admin/_images/oc_admin_user_manage.png
+#srv/web/owncloud/core/doc/admin/_images/preview_images.png
+#srv/web/owncloud/core/doc/admin/_images/remote_shares.png
+#srv/web/owncloud/core/doc/admin/_images/sharing-admin.png
+#srv/web/owncloud/core/doc/admin/_images/sharing-user-local.png
+#srv/web/owncloud/core/doc/admin/_images/sharing-user.png
+#srv/web/owncloud/core/doc/admin/_images/smtp-config-php-sendmail.png
+#srv/web/owncloud/core/doc/admin/_images/smtp-config-smtp.png
+#srv/web/owncloud/core/doc/admin/_images/smtp-config-wizard.png
#srv/web/owncloud/core/doc/admin/_images/ucs-app-center-install.png
#srv/web/owncloud/core/doc/admin/_images/ucs-app-center-module.png
#srv/web/owncloud/core/doc/admin/_images/ucsint.png
#srv/web/owncloud/core/doc/admin/_images/ucsint1.png
#srv/web/owncloud/core/doc/admin/_images/ucsint2.png
#srv/web/owncloud/core/doc/admin/_images/untrusted-domain.png
+#srv/web/owncloud/core/doc/admin/_images/updater-1.png
+#srv/web/owncloud/core/doc/admin/_images/updater-2.png
+#srv/web/owncloud/core/doc/admin/_images/updater-3.png
+#srv/web/owncloud/core/doc/admin/_images/updater-4.png
+#srv/web/owncloud/core/doc/admin/_images/updater-5.png
+#srv/web/owncloud/core/doc/admin/_images/updater-6.png
+#srv/web/owncloud/core/doc/admin/_images/updater-7.png
+#srv/web/owncloud/core/doc/admin/_images/users-config.png
+#srv/web/owncloud/core/doc/admin/_images/users-create.png
+#srv/web/owncloud/core/doc/admin/_images/users-groups.png
#srv/web/owncloud/core/doc/admin/_images/win7features.jpg
#srv/web/owncloud/core/doc/admin/_images/winserverroles.jpg
#srv/web/owncloud/core/doc/admin/_sources
-#srv/web/owncloud/core/doc/admin/_sources/apps
-#srv/web/owncloud/core/doc/admin/_sources/apps/activity
-#srv/web/owncloud/core/doc/admin/_sources/apps/activity/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/apps/admin_dependencies_chk
-#srv/web/owncloud/core/doc/admin/_sources/apps/admin_dependencies_chk/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/apps/files_antivirus
-#srv/web/owncloud/core/doc/admin/_sources/apps/files_antivirus/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/apps/files_encryption
-#srv/web/owncloud/core/doc/admin/_sources/apps/files_encryption/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/apps/files_external
-#srv/web/owncloud/core/doc/admin/_sources/apps/files_external/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/apps/files_sharing
-#srv/web/owncloud/core/doc/admin/_sources/apps/files_sharing/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/apps/files_trashbin
-#srv/web/owncloud/core/doc/admin/_sources/apps/files_trashbin/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/apps/files_versions
-#srv/web/owncloud/core/doc/admin/_sources/apps/files_versions/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/apps/firstrunwizard
-#srv/web/owncloud/core/doc/admin/_sources/apps/firstrunwizard/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/apps/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/apps/user_ldap
-#srv/web/owncloud/core/doc/admin/_sources/apps/user_ldap/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/apps/viewers
-#srv/web/owncloud/core/doc/admin/_sources/apps/viewers/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/config
-#srv/web/owncloud/core/doc/admin/_sources/config/apps.txt
-#srv/web/owncloud/core/doc/admin/_sources/config/code_locations.txt
-#srv/web/owncloud/core/doc/admin/_sources/config/default_parameters.txt
-#srv/web/owncloud/core/doc/admin/_sources/config/deleted_items.txt
-#srv/web/owncloud/core/doc/admin/_sources/config/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/config/logging.txt
-#srv/web/owncloud/core/doc/admin/_sources/config/mail_parameters.txt
-#srv/web/owncloud/core/doc/admin/_sources/config/maintenance.txt
-#srv/web/owncloud/core/doc/admin/_sources/config/miscellaneous.txt
-#srv/web/owncloud/core/doc/admin/_sources/config/previews.txt
-#srv/web/owncloud/core/doc/admin/_sources/config/reverse_proxy_configurations.txt
-#srv/web/owncloud/core/doc/admin/_sources/config/session_info.txt
-#srv/web/owncloud/core/doc/admin/_sources/config/user_experience.txt
-#srv/web/owncloud/core/doc/admin/_sources/config/verification.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration
#srv/web/owncloud/core/doc/admin/_sources/configuration/auth_ldap.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/background_jobs.txt
+#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration-antivirus.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_3rdparty.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_apps.txt
+#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_assets.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_automation.txt
+#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_config_sample_php.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_custom_clients.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_database.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_encryption.txt
+#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_file_sharing.txt
+#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_files_locking.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_knowledgebase.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_language.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_logging.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_mail.txt
-#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_maintenance.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_preview.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_reverseproxy.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuration_users.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/configuring_big_file_upload.txt
+#srv/web/owncloud/core/doc/admin/_sources/configuration/configuring_documents.txt
+#srv/web/owncloud/core/doc/admin/_sources/configuration/configuring_search.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/custom_mount_config.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/custom_mount_config_gui.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/custom_user_backend.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/index.txt
+#srv/web/owncloud/core/doc/admin/_sources/configuration/server_to_server_managing.txt
#srv/web/owncloud/core/doc/admin/_sources/configuration/xsendfile.txt
#srv/web/owncloud/core/doc/admin/_sources/contents.txt
-#srv/web/owncloud/core/doc/admin/_sources/cron
-#srv/web/owncloud/core/doc/admin/_sources/cron/index.txt
#srv/web/owncloud/core/doc/admin/_sources/index.txt
#srv/web/owncloud/core/doc/admin/_sources/installation
+#srv/web/owncloud/core/doc/admin/_sources/installation/configuration_hiawatha.txt
+#srv/web/owncloud/core/doc/admin/_sources/installation/configuration_lighttpd.txt
+#srv/web/owncloud/core/doc/admin/_sources/installation/configuration_nginx.txt
+#srv/web/owncloud/core/doc/admin/_sources/installation/configuration_yaws.txt
#srv/web/owncloud/core/doc/admin/_sources/installation/index.txt
#srv/web/owncloud/core/doc/admin/_sources/installation/installation_appliance.txt
#srv/web/owncloud/core/doc/admin/_sources/installation/installation_linux.txt
#srv/web/owncloud/core/doc/admin/_sources/issues/index.txt
#srv/web/owncloud/core/doc/admin/_sources/maintenance
#srv/web/owncloud/core/doc/admin/_sources/maintenance/backup.txt
+#srv/web/owncloud/core/doc/admin/_sources/maintenance/convert_db.txt
+#srv/web/owncloud/core/doc/admin/_sources/maintenance/enable_maintenance.txt
#srv/web/owncloud/core/doc/admin/_sources/maintenance/index.txt
#srv/web/owncloud/core/doc/admin/_sources/maintenance/migrating.txt
#srv/web/owncloud/core/doc/admin/_sources/maintenance/restore.txt
#srv/web/owncloud/core/doc/admin/_sources/maintenance/update.txt
-#srv/web/owncloud/core/doc/admin/_sources/quota
-#srv/web/owncloud/core/doc/admin/_sources/quota/index.txt
-#srv/web/owncloud/core/doc/admin/_sources/sharing_api
-#srv/web/owncloud/core/doc/admin/_sources/sharing_api/create_a_new_share.txt
-#srv/web/owncloud/core/doc/admin/_sources/sharing_api/delete_share.txt
-#srv/web/owncloud/core/doc/admin/_sources/sharing_api/get_all_shares.txt
-#srv/web/owncloud/core/doc/admin/_sources/sharing_api/get_information_about_a_known_share.txt
-#srv/web/owncloud/core/doc/admin/_sources/sharing_api/get_shares_from_a_specific_file_or_folder.txt
-#srv/web/owncloud/core/doc/admin/_sources/sharing_api/index.txt
+#srv/web/owncloud/core/doc/admin/_sources/maintenance/upgrade.txt
+#srv/web/owncloud/core/doc/admin/_sources/whats_new_admin.txt
#srv/web/owncloud/core/doc/admin/_static
#srv/web/owncloud/core/doc/admin/_static/ajax-loader.gif
#srv/web/owncloud/core/doc/admin/_static/basic.css
#srv/web/owncloud/core/doc/admin/_static/up-pressed.png
#srv/web/owncloud/core/doc/admin/_static/up.png
#srv/web/owncloud/core/doc/admin/_static/websupport.js
-#srv/web/owncloud/core/doc/admin/apps
-#srv/web/owncloud/core/doc/admin/apps/activity
-#srv/web/owncloud/core/doc/admin/apps/activity/index.html
-#srv/web/owncloud/core/doc/admin/apps/admin_dependencies_chk
-#srv/web/owncloud/core/doc/admin/apps/admin_dependencies_chk/index.html
-#srv/web/owncloud/core/doc/admin/apps/files_antivirus
-#srv/web/owncloud/core/doc/admin/apps/files_antivirus/index.html
-#srv/web/owncloud/core/doc/admin/apps/files_encryption
-#srv/web/owncloud/core/doc/admin/apps/files_encryption/index.html
-#srv/web/owncloud/core/doc/admin/apps/files_external
-#srv/web/owncloud/core/doc/admin/apps/files_external/index.html
-#srv/web/owncloud/core/doc/admin/apps/files_sharing
-#srv/web/owncloud/core/doc/admin/apps/files_sharing/index.html
-#srv/web/owncloud/core/doc/admin/apps/files_trashbin
-#srv/web/owncloud/core/doc/admin/apps/files_trashbin/index.html
-#srv/web/owncloud/core/doc/admin/apps/files_versions
-#srv/web/owncloud/core/doc/admin/apps/files_versions/index.html
-#srv/web/owncloud/core/doc/admin/apps/firstrunwizard
-#srv/web/owncloud/core/doc/admin/apps/firstrunwizard/index.html
-#srv/web/owncloud/core/doc/admin/apps/index.html
-#srv/web/owncloud/core/doc/admin/apps/user_ldap
-#srv/web/owncloud/core/doc/admin/apps/user_ldap/index.html
-#srv/web/owncloud/core/doc/admin/apps/viewers
-#srv/web/owncloud/core/doc/admin/apps/viewers/index.html
-#srv/web/owncloud/core/doc/admin/config
-#srv/web/owncloud/core/doc/admin/config/apps.html
-#srv/web/owncloud/core/doc/admin/config/code_locations.html
-#srv/web/owncloud/core/doc/admin/config/default_parameters.html
-#srv/web/owncloud/core/doc/admin/config/deleted_items.html
-#srv/web/owncloud/core/doc/admin/config/index.html
-#srv/web/owncloud/core/doc/admin/config/logging.html
-#srv/web/owncloud/core/doc/admin/config/mail_parameters.html
-#srv/web/owncloud/core/doc/admin/config/maintenance.html
-#srv/web/owncloud/core/doc/admin/config/miscellaneous.html
-#srv/web/owncloud/core/doc/admin/config/previews.html
-#srv/web/owncloud/core/doc/admin/config/reverse_proxy_configurations.html
-#srv/web/owncloud/core/doc/admin/config/session_info.html
-#srv/web/owncloud/core/doc/admin/config/user_experience.html
-#srv/web/owncloud/core/doc/admin/config/verification.html
#srv/web/owncloud/core/doc/admin/configuration
#srv/web/owncloud/core/doc/admin/configuration/auth_ldap.html
#srv/web/owncloud/core/doc/admin/configuration/background_jobs.html
+#srv/web/owncloud/core/doc/admin/configuration/configuration-antivirus.html
#srv/web/owncloud/core/doc/admin/configuration/configuration_3rdparty.html
#srv/web/owncloud/core/doc/admin/configuration/configuration_apps.html
+#srv/web/owncloud/core/doc/admin/configuration/configuration_assets.html
#srv/web/owncloud/core/doc/admin/configuration/configuration_automation.html
+#srv/web/owncloud/core/doc/admin/configuration/configuration_config_sample_php.html
#srv/web/owncloud/core/doc/admin/configuration/configuration_custom_clients.html
#srv/web/owncloud/core/doc/admin/configuration/configuration_database.html
#srv/web/owncloud/core/doc/admin/configuration/configuration_encryption.html
+#srv/web/owncloud/core/doc/admin/configuration/configuration_file_sharing.html
+#srv/web/owncloud/core/doc/admin/configuration/configuration_files_locking.html
#srv/web/owncloud/core/doc/admin/configuration/configuration_knowledgebase.html
#srv/web/owncloud/core/doc/admin/configuration/configuration_language.html
#srv/web/owncloud/core/doc/admin/configuration/configuration_logging.html
#srv/web/owncloud/core/doc/admin/configuration/configuration_mail.html
-#srv/web/owncloud/core/doc/admin/configuration/configuration_maintenance.html
#srv/web/owncloud/core/doc/admin/configuration/configuration_preview.html
#srv/web/owncloud/core/doc/admin/configuration/configuration_reverseproxy.html
#srv/web/owncloud/core/doc/admin/configuration/configuration_users.html
#srv/web/owncloud/core/doc/admin/configuration/configuring_big_file_upload.html
+#srv/web/owncloud/core/doc/admin/configuration/configuring_documents.html
+#srv/web/owncloud/core/doc/admin/configuration/configuring_search.html
#srv/web/owncloud/core/doc/admin/configuration/custom_mount_config.html
#srv/web/owncloud/core/doc/admin/configuration/custom_mount_config_gui.html
#srv/web/owncloud/core/doc/admin/configuration/custom_user_backend.html
#srv/web/owncloud/core/doc/admin/configuration/index.html
+#srv/web/owncloud/core/doc/admin/configuration/server_to_server_managing.html
#srv/web/owncloud/core/doc/admin/configuration/xsendfile.html
#srv/web/owncloud/core/doc/admin/contents.html
-#srv/web/owncloud/core/doc/admin/cron
-#srv/web/owncloud/core/doc/admin/cron/index.html
#srv/web/owncloud/core/doc/admin/genindex.html
#srv/web/owncloud/core/doc/admin/index.html
#srv/web/owncloud/core/doc/admin/installation
+#srv/web/owncloud/core/doc/admin/installation/configuration_hiawatha.html
+#srv/web/owncloud/core/doc/admin/installation/configuration_lighttpd.html
+#srv/web/owncloud/core/doc/admin/installation/configuration_nginx.html
+#srv/web/owncloud/core/doc/admin/installation/configuration_yaws.html
#srv/web/owncloud/core/doc/admin/installation/index.html
#srv/web/owncloud/core/doc/admin/installation/installation_appliance.html
#srv/web/owncloud/core/doc/admin/installation/installation_linux.html
#srv/web/owncloud/core/doc/admin/issues/index.html
#srv/web/owncloud/core/doc/admin/maintenance
#srv/web/owncloud/core/doc/admin/maintenance/backup.html
+#srv/web/owncloud/core/doc/admin/maintenance/convert_db.html
+#srv/web/owncloud/core/doc/admin/maintenance/enable_maintenance.html
#srv/web/owncloud/core/doc/admin/maintenance/index.html
#srv/web/owncloud/core/doc/admin/maintenance/migrating.html
#srv/web/owncloud/core/doc/admin/maintenance/restore.html
#srv/web/owncloud/core/doc/admin/maintenance/update.html
+#srv/web/owncloud/core/doc/admin/maintenance/upgrade.html
#srv/web/owncloud/core/doc/admin/objects.inv
-#srv/web/owncloud/core/doc/admin/quota
-#srv/web/owncloud/core/doc/admin/quota/index.html
#srv/web/owncloud/core/doc/admin/search.html
#srv/web/owncloud/core/doc/admin/searchindex.js
-#srv/web/owncloud/core/doc/admin/sharing_api
-#srv/web/owncloud/core/doc/admin/sharing_api/create_a_new_share.html
-#srv/web/owncloud/core/doc/admin/sharing_api/delete_share.html
-#srv/web/owncloud/core/doc/admin/sharing_api/get_all_shares.html
-#srv/web/owncloud/core/doc/admin/sharing_api/get_information_about_a_known_share.html
-#srv/web/owncloud/core/doc/admin/sharing_api/get_shares_from_a_specific_file_or_folder.html
-#srv/web/owncloud/core/doc/admin/sharing_api/index.html
+#srv/web/owncloud/core/doc/admin/whats_new_admin.html
#srv/web/owncloud/core/doc/user
#srv/web/owncloud/core/doc/user/_images
-#srv/web/owncloud/core/doc/user/_images/1000000000000163000000E9CDA84C92.png
-#srv/web/owncloud/core/doc/user/_images/1000000000000175000000FAB2A2B294.png
-#srv/web/owncloud/core/doc/user/_images/1000000000000195000000EF7E44082C.png
-#srv/web/owncloud/core/doc/user/_images/10000000000001CE000000F2E2084BA1.png
-#srv/web/owncloud/core/doc/user/_images/100000000000041D0000003D52225C0D.png
-#srv/web/owncloud/core/doc/user/_images/1000000000000453000001BFFCF48776.png
-#srv/web/owncloud/core/doc/user/_images/1000000000000467000002B63162E59B.png
-#srv/web/owncloud/core/doc/user/_images/10000000000004690000026615360BEB.png
-#srv/web/owncloud/core/doc/user/_images/100000000000046D0000015F4B5494A9.png
-#srv/web/owncloud/core/doc/user/_images/100000000000046F000000DEA2BFCD9B.png
-#srv/web/owncloud/core/doc/user/_images/1000000000000470000001B68AE60DD3.png
-#srv/web/owncloud/core/doc/user/_images/10000000000004710000014BBC34499D.png
-#srv/web/owncloud/core/doc/user/_images/100000000000047200000129CB014025.png
-#srv/web/owncloud/core/doc/user/_images/100000000000047700000219A3013A92.png
-#srv/web/owncloud/core/doc/user/_images/1000000000000479000002887E7F48EA.png
-#srv/web/owncloud/core/doc/user/_images/100000000000047A000000B727198874.png
-#srv/web/owncloud/core/doc/user/_images/100000000000047A000000FB86FF2A9A.png
-#srv/web/owncloud/core/doc/user/_images/100000000000047A0000011C6682A254.png
-#srv/web/owncloud/core/doc/user/_images/100000000000048100000245268CDB7A.png
#srv/web/owncloud/core/doc/user/_images/bookmark_addurl.png
#srv/web/owncloud/core/doc/user/_images/bookmark_setting.png
-#srv/web/owncloud/core/doc/user/_images/calendar_createevent.png
+#srv/web/owncloud/core/doc/user/_images/calendar_create_event.png
+#srv/web/owncloud/core/doc/user/_images/calendar_create_event_repeat.png
+#srv/web/owncloud/core/doc/user/_images/calendar_create_event_share.png
+#srv/web/owncloud/core/doc/user/_images/calendar_create_new.png
+#srv/web/owncloud/core/doc/user/_images/calendar_default.png
+#srv/web/owncloud/core/doc/user/_images/calendar_edit_event.png
#srv/web/owncloud/core/doc/user/_images/calendar_export.png
#srv/web/owncloud/core/doc/user/_images/calendar_import.png
-#srv/web/owncloud/core/doc/user/_images/calendar_manage-calendars.png
#srv/web/owncloud/core/doc/user/_images/calendar_newtimezone1.png
+#srv/web/owncloud/core/doc/user/_images/calendar_settings.png
+#srv/web/owncloud/core/doc/user/_images/contact_address_book_add.png
#srv/web/owncloud/core/doc/user/_images/contact_bottombar.png
#srv/web/owncloud/core/doc/user/_images/contact_crop.jpg
-#srv/web/owncloud/core/doc/user/_images/contact_del_ab.png
-#srv/web/owncloud/core/doc/user/_images/contact_emptycontact.png
-#srv/web/owncloud/core/doc/user/_images/contact_picture.jpg
+#srv/web/owncloud/core/doc/user/_images/contact_new.png
+#srv/web/owncloud/core/doc/user/_images/contact_picture.png
+#srv/web/owncloud/core/doc/user/_images/contact_picture_default.png
#srv/web/owncloud/core/doc/user/_images/contact_syncopt.jpg
#srv/web/owncloud/core/doc/user/_images/contact_thunderbird-Symbol_Gear.jpg
#srv/web/owncloud/core/doc/user/_images/contact_thunderbird-Symbol_Impeller.jpg
#srv/web/owncloud/core/doc/user/_images/contact_thunderbird-URL_config.jpg
#srv/web/owncloud/core/doc/user/_images/contact_uploadbutton.png
#srv/web/owncloud/core/doc/user/_images/contact_vcfpick.jpg
+#srv/web/owncloud/core/doc/user/_images/contacts_empty.png
+#srv/web/owncloud/core/doc/user/_images/contacts_settings.png
+#srv/web/owncloud/core/doc/user/_images/deleted_files.png
+#srv/web/owncloud/core/doc/user/_images/documents_personal_settings.png
#srv/web/owncloud/core/doc/user/_images/dolphin_webdav.png
+#srv/web/owncloud/core/doc/user/_images/download.png
+#srv/web/owncloud/core/doc/user/_images/email_address_personal_settings.png
+#srv/web/owncloud/core/doc/user/_images/encryption1.png
+#srv/web/owncloud/core/doc/user/_images/encryption2.png
+#srv/web/owncloud/core/doc/user/_images/encryption3.png
+#srv/web/owncloud/core/doc/user/_images/encryption4.png
+#srv/web/owncloud/core/doc/user/_images/event_export.png
#srv/web/owncloud/core/doc/user/_images/explorer_webdav.png
-#srv/web/owncloud/core/doc/user/_images/external_google_drive_1_sign_in.png
-#srv/web/owncloud/core/doc/user/_images/external_google_drive_2_verify.png
-#srv/web/owncloud/core/doc/user/_images/external_google_drive_3_create_project.png
-#srv/web/owncloud/core/doc/user/_images/external_google_drive_4_enable_api.png
-#srv/web/owncloud/core/doc/user/_images/external_google_drive_5_setup_ownCloud.png
-#srv/web/owncloud/core/doc/user/_images/external_google_drive_6_accept.png
#srv/web/owncloud/core/doc/user/_images/files_versioning.png
+#srv/web/owncloud/core/doc/user/_images/full_name.png
#srv/web/owncloud/core/doc/user/_images/gnome3_nautilus_webdav.png
#srv/web/owncloud/core/doc/user/_images/kdes.png
#srv/web/owncloud/core/doc/user/_images/kdes1.png
#srv/web/owncloud/core/doc/user/_images/kdes6.png
#srv/web/owncloud/core/doc/user/_images/kdes7.png
#srv/web/owncloud/core/doc/user/_images/kdes9.png
+#srv/web/owncloud/core/doc/user/_images/language_personal_settings.png
+#srv/web/owncloud/core/doc/user/_images/notifications_personal_settings.png
#srv/web/owncloud/core/doc/user/_images/oc_connect.png
#srv/web/owncloud/core/doc/user/_images/oc_documents.png
#srv/web/owncloud/core/doc/user/_images/oc_documents_col_edit.png
#srv/web/owncloud/core/doc/user/_images/oc_documents_edit.png
#srv/web/owncloud/core/doc/user/_images/oc_documents_share.png
-#srv/web/owncloud/core/doc/user/_images/oc_files_share.png
-#srv/web/owncloud/core/doc/user/_images/oc_filesweb.png
#srv/web/owncloud/core/doc/user/_images/oc_filesweb_navigate.png
#srv/web/owncloud/core/doc/user/_images/oc_filesweb_new.png
-#srv/web/owncloud/core/doc/user/_images/oc_ui.png
-#srv/web/owncloud/core/doc/user/_images/oc_user_preferences.png
+#srv/web/owncloud/core/doc/user/_images/oc_main_web.png
+#srv/web/owncloud/core/doc/user/_images/oc_main_web_labelled.png
+#srv/web/owncloud/core/doc/user/_images/oc_personal_settings_dropdown.png
#srv/web/owncloud/core/doc/user/_images/osx_webdav1.png
#srv/web/owncloud/core/doc/user/_images/osx_webdav2.png
+#srv/web/owncloud/core/doc/user/_images/password_change.png
+#srv/web/owncloud/core/doc/user/_images/personal_settings.png
+#srv/web/owncloud/core/doc/user/_images/profile_picture_personal_settings.png
+#srv/web/owncloud/core/doc/user/_images/quota1.png
+#srv/web/owncloud/core/doc/user/_images/s2s-add-remote-share.png
+#srv/web/owncloud/core/doc/user/_images/s2s-connect-to-remote-share.png
+#srv/web/owncloud/core/doc/user/_images/s2s-create_public_share.png
+#srv/web/owncloud/core/doc/user/_images/s2s-remote-share-labeled.png
+#srv/web/owncloud/core/doc/user/_images/usage_indicator.png
+#srv/web/owncloud/core/doc/user/_images/users-files.png
+#srv/web/owncloud/core/doc/user/_images/users-overlays-sharepoint.png
+#srv/web/owncloud/core/doc/user/_images/users-overlays-win-net-drive.png
+#srv/web/owncloud/core/doc/user/_images/users-overlays.png
+#srv/web/owncloud/core/doc/user/_images/users-share-local.png
+#srv/web/owncloud/core/doc/user/_images/users-share-local2.png
+#srv/web/owncloud/core/doc/user/_images/users-share-public.png
#srv/web/owncloud/core/doc/user/_sources
#srv/web/owncloud/core/doc/user/_sources/bookmarks.txt
#srv/web/owncloud/core/doc/user/_sources/contents.txt
#srv/web/owncloud/core/doc/user/_sources/files/filesweb.txt
#srv/web/owncloud/core/doc/user/_sources/files/index.txt
#srv/web/owncloud/core/doc/user/_sources/files/quota.txt
+#srv/web/owncloud/core/doc/user/_sources/files/server_to_server_using.txt
#srv/web/owncloud/core/doc/user/_sources/files/sync.txt
#srv/web/owncloud/core/doc/user/_sources/files/versioncontrol.txt
#srv/web/owncloud/core/doc/user/_sources/index.txt
-#srv/web/owncloud/core/doc/user/_sources/migration.txt
+#srv/web/owncloud/core/doc/user/_sources/installing_apps.txt
#srv/web/owncloud/core/doc/user/_sources/pim
#srv/web/owncloud/core/doc/user/_sources/pim/calendar.txt
#srv/web/owncloud/core/doc/user/_sources/pim/contacts.txt
#srv/web/owncloud/core/doc/user/_sources/pim/sync_thunderbird.txt
#srv/web/owncloud/core/doc/user/_sources/pim/troubleshooting.txt
#srv/web/owncloud/core/doc/user/_sources/userpreferences.txt
-#srv/web/owncloud/core/doc/user/_sources/web_guide
-#srv/web/owncloud/core/doc/user/_sources/web_guide/index.txt
#srv/web/owncloud/core/doc/user/_sources/webinterface.txt
+#srv/web/owncloud/core/doc/user/_sources/whats_new.txt
#srv/web/owncloud/core/doc/user/_static
#srv/web/owncloud/core/doc/user/_static/ajax-loader.gif
#srv/web/owncloud/core/doc/user/_static/basic.css
#srv/web/owncloud/core/doc/user/files/filesweb.html
#srv/web/owncloud/core/doc/user/files/index.html
#srv/web/owncloud/core/doc/user/files/quota.html
+#srv/web/owncloud/core/doc/user/files/server_to_server_using.html
#srv/web/owncloud/core/doc/user/files/sync.html
#srv/web/owncloud/core/doc/user/files/versioncontrol.html
#srv/web/owncloud/core/doc/user/genindex.html
#srv/web/owncloud/core/doc/user/index.html
-#srv/web/owncloud/core/doc/user/migration.html
+#srv/web/owncloud/core/doc/user/installing_apps.html
#srv/web/owncloud/core/doc/user/objects.inv
#srv/web/owncloud/core/doc/user/pim
#srv/web/owncloud/core/doc/user/pim/calendar.html
#srv/web/owncloud/core/doc/user/search.html
#srv/web/owncloud/core/doc/user/searchindex.js
#srv/web/owncloud/core/doc/user/userpreferences.html
-#srv/web/owncloud/core/doc/user/web_guide
-#srv/web/owncloud/core/doc/user/web_guide/index.html
#srv/web/owncloud/core/doc/user/webinterface.html
+#srv/web/owncloud/core/doc/user/whats_new.html
#srv/web/owncloud/core/fonts
#srv/web/owncloud/core/fonts/LICENSE.txt
#srv/web/owncloud/core/fonts/OpenSans-Bold.woff
#srv/web/owncloud/core/img/actions/public.svg
#srv/web/owncloud/core/img/actions/rename.png
#srv/web/owncloud/core/img/actions/rename.svg
+#srv/web/owncloud/core/img/actions/search-white.png
+#srv/web/owncloud/core/img/actions/search-white.svg
#srv/web/owncloud/core/img/actions/search.png
#srv/web/owncloud/core/img/actions/search.svg
#srv/web/owncloud/core/img/actions/settings.png
#srv/web/owncloud/core/js/octemplate.js
#srv/web/owncloud/core/js/placeholder.js
#srv/web/owncloud/core/js/placeholders.js
+#srv/web/owncloud/core/js/select2
+#srv/web/owncloud/core/js/select2/LICENSE
+#srv/web/owncloud/core/js/select2/README.md
+#srv/web/owncloud/core/js/select2/bower.json
+#srv/web/owncloud/core/js/select2/component.json
+#srv/web/owncloud/core/js/select2/composer.json
+#srv/web/owncloud/core/js/select2/package.json
+#srv/web/owncloud/core/js/select2/release.sh
+#srv/web/owncloud/core/js/select2/select2-bootstrap.css
+#srv/web/owncloud/core/js/select2/select2.jquery.json
+#srv/web/owncloud/core/js/select2/select2.js
+#srv/web/owncloud/core/js/select2/select2_locale_ar.js
+#srv/web/owncloud/core/js/select2/select2_locale_bg.js
+#srv/web/owncloud/core/js/select2/select2_locale_ca.js
+#srv/web/owncloud/core/js/select2/select2_locale_cs.js
+#srv/web/owncloud/core/js/select2/select2_locale_da.js
+#srv/web/owncloud/core/js/select2/select2_locale_de.js
+#srv/web/owncloud/core/js/select2/select2_locale_el.js
+#srv/web/owncloud/core/js/select2/select2_locale_en.js.template
+#srv/web/owncloud/core/js/select2/select2_locale_es.js
+#srv/web/owncloud/core/js/select2/select2_locale_et.js
+#srv/web/owncloud/core/js/select2/select2_locale_eu.js
+#srv/web/owncloud/core/js/select2/select2_locale_fa.js
+#srv/web/owncloud/core/js/select2/select2_locale_fi.js
+#srv/web/owncloud/core/js/select2/select2_locale_fr.js
+#srv/web/owncloud/core/js/select2/select2_locale_gl.js
+#srv/web/owncloud/core/js/select2/select2_locale_he.js
+#srv/web/owncloud/core/js/select2/select2_locale_hr.js
+#srv/web/owncloud/core/js/select2/select2_locale_hu.js
+#srv/web/owncloud/core/js/select2/select2_locale_id.js
+#srv/web/owncloud/core/js/select2/select2_locale_is.js
+#srv/web/owncloud/core/js/select2/select2_locale_it.js
+#srv/web/owncloud/core/js/select2/select2_locale_ja.js
+#srv/web/owncloud/core/js/select2/select2_locale_ka.js
+#srv/web/owncloud/core/js/select2/select2_locale_ko.js
+#srv/web/owncloud/core/js/select2/select2_locale_lt.js
+#srv/web/owncloud/core/js/select2/select2_locale_lv.js
+#srv/web/owncloud/core/js/select2/select2_locale_mk.js
+#srv/web/owncloud/core/js/select2/select2_locale_ms.js
+#srv/web/owncloud/core/js/select2/select2_locale_nl.js
+#srv/web/owncloud/core/js/select2/select2_locale_no.js
+#srv/web/owncloud/core/js/select2/select2_locale_pl.js
+#srv/web/owncloud/core/js/select2/select2_locale_pt-BR.js
+#srv/web/owncloud/core/js/select2/select2_locale_pt-PT.js
+#srv/web/owncloud/core/js/select2/select2_locale_ro.js
+#srv/web/owncloud/core/js/select2/select2_locale_rs.js
+#srv/web/owncloud/core/js/select2/select2_locale_ru.js
+#srv/web/owncloud/core/js/select2/select2_locale_sk.js
+#srv/web/owncloud/core/js/select2/select2_locale_sv.js
+#srv/web/owncloud/core/js/select2/select2_locale_th.js
+#srv/web/owncloud/core/js/select2/select2_locale_tr.js
+#srv/web/owncloud/core/js/select2/select2_locale_uk.js
+#srv/web/owncloud/core/js/select2/select2_locale_vi.js
+#srv/web/owncloud/core/js/select2/select2_locale_zh-CN.js
+#srv/web/owncloud/core/js/select2/select2_locale_zh-TW.js
#srv/web/owncloud/core/js/setup.js
+#srv/web/owncloud/core/js/setupchecks.js
#srv/web/owncloud/core/js/share.js
#srv/web/owncloud/core/js/singleselect.js
#srv/web/owncloud/core/js/snap.js
#srv/web/owncloud/core/templates/message.html
#srv/web/owncloud/core/templates/singleuser.user.php
#srv/web/owncloud/core/templates/tags.html
+#srv/web/owncloud/core/templates/untrustedDomain.php
#srv/web/owncloud/core/templates/update.admin.php
#srv/web/owncloud/core/templates/update.user.php
#srv/web/owncloud/cron.php
#srv/web/owncloud/lib/private/connector/sabre/quotaplugin.php
#srv/web/owncloud/lib/private/connector/sabre/request.php
#srv/web/owncloud/lib/private/connector/sabre/server.php
+#srv/web/owncloud/lib/private/contacts
+#srv/web/owncloud/lib/private/contacts/localaddressbook.php
#srv/web/owncloud/lib/private/contactsmanager.php
#srv/web/owncloud/lib/private/davclient.php
#srv/web/owncloud/lib/private/db
#srv/web/owncloud/lib/private/db.php
#srv/web/owncloud/lib/private/db/adapter.php
+#srv/web/owncloud/lib/private/db/adaptermysql.php
#srv/web/owncloud/lib/private/db/adapteroci8.php
#srv/web/owncloud/lib/private/db/adapterpgsql.php
#srv/web/owncloud/lib/private/db/adaptersqlite.php
#srv/web/owncloud/lib/private/db/mdb2schemawriter.php
#srv/web/owncloud/lib/private/db/migrationexception.php
#srv/web/owncloud/lib/private/db/migrator.php
+#srv/web/owncloud/lib/private/db/mssqlmigrator.php
#srv/web/owncloud/lib/private/db/mysqlmigrator.php
#srv/web/owncloud/lib/private/db/nocheckmigrator.php
#srv/web/owncloud/lib/private/db/oracleconnection.php
#srv/web/owncloud/lib/private/db/oraclemigrator.php
#srv/web/owncloud/lib/private/db/pgsqltools.php
#srv/web/owncloud/lib/private/db/sqlitemigrator.php
+#srv/web/owncloud/lib/private/db/sqlitesessioninit.php
#srv/web/owncloud/lib/private/db/statementwrapper.php
#srv/web/owncloud/lib/private/defaults.php
#srv/web/owncloud/lib/private/eventsource.php
#srv/web/owncloud/lib/private/hooks/forwardingemitter.php
#srv/web/owncloud/lib/private/hooks/legacyemitter.php
#srv/web/owncloud/lib/private/hooks/publicemitter.php
+#srv/web/owncloud/lib/private/httphelper.php
#srv/web/owncloud/lib/private/image.php
#srv/web/owncloud/lib/private/installer.php
#srv/web/owncloud/lib/private/json.php
#srv/web/owncloud/lib/private/migration/provider.php
#srv/web/owncloud/lib/private/mimetypes.list.php
#srv/web/owncloud/lib/private/navigationmanager.php
+#srv/web/owncloud/lib/private/needsupdateexception.php
#srv/web/owncloud/lib/private/notsquareexception.php
#srv/web/owncloud/lib/private/ocs
#srv/web/owncloud/lib/private/ocs.php
#srv/web/owncloud/lib/private/preview/provider.php
#srv/web/owncloud/lib/private/preview/svg.php
#srv/web/owncloud/lib/private/preview/txt.php
-#srv/web/owncloud/lib/private/preview/unknown.php
#srv/web/owncloud/lib/private/previewmanager.php
#srv/web/owncloud/lib/private/repair.php
#srv/web/owncloud/lib/private/repairstep.php
#srv/web/owncloud/lib/private/search/result/folder.php
#srv/web/owncloud/lib/private/search/result/image.php
#srv/web/owncloud/lib/private/server.php
+#srv/web/owncloud/lib/private/serviceunavailableexception.php
#srv/web/owncloud/lib/private/session
#srv/web/owncloud/lib/private/session/internal.php
#srv/web/owncloud/lib/private/session/memory.php
#srv/web/owncloud/lib/public/icontainer.php
#srv/web/owncloud/lib/public/idb.php
#srv/web/owncloud/lib/public/idbconnection.php
+#srv/web/owncloud/lib/public/igroup.php
+#srv/web/owncloud/lib/public/igroupmanager.php
#srv/web/owncloud/lib/public/ihelper.php
#srv/web/owncloud/lib/public/il10n.php
#srv/web/owncloud/lib/public/ilogger.php
#srv/web/owncloud/lib/repair
#srv/web/owncloud/lib/repair/collation.php
#srv/web/owncloud/lib/repair/innodb.php
+#srv/web/owncloud/lib/repair/preview.php
#srv/web/owncloud/lib/repair/repairmimetypes.php
+#srv/web/owncloud/lib/repair/searchlucenetables.php
#srv/web/owncloud/occ
#srv/web/owncloud/ocs
#srv/web/owncloud/ocs/providers.php
#srv/web/owncloud/search/templates
#srv/web/owncloud/search/templates/part.results.php
#srv/web/owncloud/settings
-#srv/web/owncloud/settings/admin
#srv/web/owncloud/settings/admin.php
-#srv/web/owncloud/settings/admin/controller.php
#srv/web/owncloud/settings/ajax
#srv/web/owncloud/settings/ajax/apps
#srv/web/owncloud/settings/ajax/apps/ocs.php
#srv/web/owncloud/settings/ajax/changedisplayname.php
+#srv/web/owncloud/settings/ajax/checksetup.php
#srv/web/owncloud/settings/ajax/creategroup.php
#srv/web/owncloud/settings/ajax/createuser.php
#srv/web/owncloud/settings/ajax/decryptall.php
#srv/web/owncloud/settings/ajax/deletekeys.php
#srv/web/owncloud/settings/ajax/disableapp.php
#srv/web/owncloud/settings/ajax/enableapp.php
-#srv/web/owncloud/settings/ajax/excludegroups.php
+#srv/web/owncloud/settings/ajax/geteveryonecount.php
#srv/web/owncloud/settings/ajax/getlog.php
#srv/web/owncloud/settings/ajax/grouplist.php
#srv/web/owncloud/settings/ajax/installapp.php
#srv/web/owncloud/settings/ajax/uninstallapp.php
#srv/web/owncloud/settings/ajax/updateapp.php
#srv/web/owncloud/settings/ajax/userlist.php
+#srv/web/owncloud/settings/application.php
#srv/web/owncloud/settings/apps.php
#srv/web/owncloud/settings/changepassword
#srv/web/owncloud/settings/changepassword/controller.php
+#srv/web/owncloud/settings/controller
+#srv/web/owncloud/settings/controller/mailsettingscontroller.php
#srv/web/owncloud/settings/css
#srv/web/owncloud/settings/css/settings.css
#srv/web/owncloud/settings/help.php
#srv/web/owncloud/settings/js/apps.js
#srv/web/owncloud/settings/js/log.js
#srv/web/owncloud/settings/js/personal.js
+#srv/web/owncloud/settings/js/settings.js
#srv/web/owncloud/settings/js/users
#srv/web/owncloud/settings/js/users/deleteHandler.js
#srv/web/owncloud/settings/js/users/filter.js
#srv/web/owncloud/settings/templates/users/part.grouplist.php
#srv/web/owncloud/settings/templates/users/part.setquota.php
#srv/web/owncloud/settings/templates/users/part.userlist.php
+#srv/web/owncloud/settings/tests
+#srv/web/owncloud/settings/tests/js
+#srv/web/owncloud/settings/tests/js/users
+#srv/web/owncloud/settings/tests/js/users/deleteHandlerSpec.js
#srv/web/owncloud/settings/users.php
#srv/web/owncloud/status.php
#srv/web/owncloud/themes
+++ /dev/null
-etc/rc.d/init.d/teamspeak
-opt/teamspeak
-var/ipfire/backup/addons/includes/teamspeak
-uenvcmd=if test "$board" = "panda" ;then run bootpanda; else run bootbananapi; fi;
KVER=xxxKVERxxx
-bootpanda=setenv initrd_high 90000000; fatload mmc 0:1 0x82000000 zImage-ipfire-multi; fatload mmc 0:1 ${fdtaddr} dtb-${KVER}-ipfire-multi/${fdtfile}; setenv bootargs video=800x600 console=tty1 rootwait smsc95xx.macaddr=$usbethaddr root=/dev/mmcblk0p3 ro; bootz 0x82000000 - ${fdtaddr};
-bootbananapi=setenv fdt_high ffffffff; fatload mmc 0:1 0x46000000 zImage-ipfire-multi; fatload mmc 0:1 0x49000000 dtb-${KVER}-ipfire-multi/sun7i-a20-bananapi.dtb; setenv bootargs console=ttyS0,115200n8 rootwait root=/dev/mmcblk0p3 rootwait; bootz 0x46000000 - 0x49000000;
+DTBSUNXI=sun7i-a20-bananapi.dtb
+uenvcmd=if test "$board" = "panda" ;then run bootpanda; else run bootsunxi; fi;
+bootpanda=setenv initrd_high 90000000; fatload mmc 0:1 0x82000000 zImage-ipfire-multi; fatload mmc 0:1 ${fdtaddr} dtb-${KVER}-ipfire-multi/${fdtfile}; setenv bootargs video=800x600 console=tty1 rootwait smsc95xx.macaddr=$usbethaddr root=/dev/mmcblk0p3; bootz 0x82000000 - ${fdtaddr};
+bootsunxi=setenv fdt_high ffffffff; fatload mmc 0:1 0x46000000 zImage-ipfire-multi; fatload mmc 0:1 0x49000000 dtb-${KVER}-ipfire-multi/${DTBSUNXI}; fatload mmc 0:1 0x49100000 uInit-ipfire-multi; setenv bootargs console=ttyS0,115200n8 rootwait root=/dev/mmcblk0p3 rootwait; bootz 0x46000000 0x49100000 0x49000000;
--- /dev/null
+# Call a script that checks for the right name of the new device.
+# If it matches the configuration it will be renamed accordingly.
+ACTION=="add", SUBSYSTEM=="net", PROGRAM="/lib/udev/network-hotplug-rename", RESULT=="?*", NAME="$result"
--- /dev/null
+#!/bin/bash
+###############################################################################
+# #
+# IPFire.org - A linux based firewall #
+# Copyright (C) 2015 IPFire Team <info@ipfire.org> #
+# #
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation, either version 3 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+###############################################################################
+
+# Check if all appropriate variables are set
+[ -n "${INTERFACE}" ] || exit 2
+
+# Ignore virtual interfaces, etc.
+case "${INTERFACE}" in
+ lo)
+ exit 0
+ ;;
+ tun*)
+ exit 0
+ ;;
+ ppp*)
+ exit 0
+ ;;
+esac
+
+# Check if INTERFACE actually exists
+[ -d "/sys/class/net/${INTERFACE}" ] || exit 1
+
+# If the network configuration is not readable,
+# we cannot go on.
+if [ ! -r "/var/ipfire/ethernet/settings" ]; then
+ exit 1
+fi
+
+# Read network settings
+eval $(/usr/local/bin/readhash /var/ipfire/ethernet/settings)
+
+# Standard zones
+ZONES="RED GREEN ORANGE BLUE"
+
+# Determine the address of INTERFACE
+ADDRESS="$(</sys/class/net/${INTERFACE}/address)"
+
+# Walk through all zones and find the matching interface
+for zone in ${ZONES}; do
+ address="${zone}_MACADDR"
+ device="${zone}_DEV"
+
+ # Skip if address or device is unset
+ [ -n "${!address}" -a -n "${!device}" ] || continue
+
+ # If a matching interface has been found we will
+ # print the name to which udev will rename it.
+ if [ "${ADDRESS}" = "${!address}" ]; then
+ echo "${!device}"
+ exit 0
+ fi
+done
+
+# If we get here we have not found a matching device,
+# but we won't return an error any way. The new device
+# will remain with the previous name.
+exit 0
- look what is going on: "xm top" or "xm list"
This script can also build a Citrix XenCenter xva image. (Need xz-aware
-xen version. Tested with Citrix Xen Server 6.2.5 beta)
+xen version. Tested with Citrix Xen Server 6.5)
- run "XEN_IMG_TYPE=xva bash xen-image-maker.sh" to build an xva image.
-- import the vm with "xe vm-import file=ipfire.xva"
+- import the vm with "xe vm-import filename=ipfire.xva"
mount -o loop $IMGvar $MNThdd/var
# Install IPFire without kernel modules
-xz -d < $ISODIR/$SNAME-$VERSION.tlz > $TMPDIR/$SNAME-$VERSION.tar
+xz -d < $ISODIR/distro.img > $TMPDIR/$SNAME-$VERSION.tar
tar -C $MNThdd/ -xvf $TMPDIR/$SNAME-$VERSION.tar \
--exclude=lib/modules* --exclude=boot* --numeric-owner
echo "timeout 10" > $MNThdd/boot/grub/grub.conf
echo "default 0" >> $MNThdd/boot/grub/grub.conf
echo "title IPFire ($KERN_TYPE-kernel)" >> $MNThdd/boot/grub/grub.conf
-echo " kernel /vmlinuz-$KVER-ipfire-$KERN_TYPE root=/dev/$P3 rootdelay=10 panic=10 console=$CONSOLE ro" \
+echo " kernel /vmlinuz-$KVER-ipfire-$KERN_TYPE root=/dev/$P3 rootdelay=10 panic=10 console=$CONSOLE" \
>> $MNThdd/boot/grub/grub.conf
-echo " initrd /ipfirerd-$KVER-$KERN_TYPE.img" >> $MNThdd/boot/grub/grub.conf
+echo " initrd /initramfs-$KVER-ipfire-$KERN_TYPE.img" >> $MNThdd/boot/grub/grub.conf
echo "# savedefault 0" >> $MNThdd/boot/grub/grub.conf
ln -s grub.conf $MNThdd/boot/grub/menu.lst
mount --bind /dev $MNThdd/dev
mount --bind /sys $MNThdd/sys
chroot $MNThdd /usr/bin/perl -e "require '/var/ipfire/lang.pl'; &Lang::BuildCacheLang"
-sed -i -e "s|DEVICE1|/dev/$P1|g" $MNThdd/etc/fstab
-sed -i -e "s|DEVICE2|/dev/$P2|g" $MNThdd/etc/fstab
-sed -i -e "s|DEVICE3|/dev/$P3|g" $MNThdd/etc/fstab
-sed -i -e "s|DEVICE4|/dev/$P4|g" $MNThdd/etc/fstab
-sed -i -e "s|FSTYPE|$FSTYPE|g" $MNThdd/etc/fstab
+# create fstab
+echo "/dev/$P1 /boot auto defaults 1 3" > $MNThdd/etc/fstab
+echo "/dev/$P2 swap swap defaults 0 0" >> $MNThdd/etc/fstab
+echo "/dev/$P3 / auto defaults 1 1" >> $MNThdd/etc/fstab
+echo "/dev/$P4 /var auto defaults 1 2" >> $MNThdd/etc/fstab
+
#Remove root / fstab check
rm -rf $MNThdd/etc/rc.d/rcsysinit.d/S19checkfstab
}
my $sip_colour = ipcolour($sip);
- my $dip_colour = ipcolour($dip);
+ # use colour of destination network for DNAT
+ my $dip_colour = $dip ne $dip_ret ? ipcolour($dip_ret) : ipcolour($dip);
my $sserv = '';
if ($sport < 1024) {
my %aliases=();
my %optionsfw=();
my %ifaces=();
+my %rulehash=();
my @PROTOCOLS = ("TCP", "UDP", "ICMP", "IGMP", "AH", "ESP", "GRE","IPv6","IPIP");
&General::readhasharray("$configfwdfw", \%configfwdfw);
&General::readhasharray("$configinput", \%configinputfw);
&General::readhasharray("$configoutgoing", \%configoutgoingfw);
+ my $maxkey;
#Set Variables according to the JQuery code in protocol section
if ($fwdfwsettings{'PROT'} eq 'TCP' || $fwdfwsettings{'PROT'} eq 'UDP')
{
if( $fwdfwsettings{'grp1'} eq 'ipfire_src' && $fwdfwsettings{'grp2'} eq 'ipfire'){
$errormessage=$Lang::tr{'fwdfw err same'};
}
- #INPUT part
- if($fwdfwsettings{'grp2'} eq 'ipfire' && $fwdfwsettings{$fwdfwsettings{'grp1'}} ne 'ORANGE'){
+ # INPUT part
+ if ($fwdfwsettings{'grp2'} eq 'ipfire' && $fwdfwsettings{$fwdfwsettings{'grp1'}} ne 'ORANGE'){
$fwdfwsettings{'config'}=$configinput;
$fwdfwsettings{'chain'} = 'INPUTFW';
- my $maxkey=&General::findhasharraykey(\%configinputfw);
- #check if we have an identical rule already
- if($fwdfwsettings{'oldrulenumber'} eq $fwdfwsettings{'rulepos'}){
- foreach my $key (sort keys %configinputfw){
- if ( "$fwdfwsettings{'RULE_ACTION'},$fwdfwsettings{'ACTIVE'},$fwdfwsettings{'grp1'},$fwdfwsettings{$fwdfwsettings{'grp1'}},$fwdfwsettings{'grp2'},$fwdfwsettings{$fwdfwsettings{'grp2'}},$fwdfwsettings{'USE_SRC_PORT'},$fwdfwsettings{'PROT'},$fwdfwsettings{'ICMP_TYPES'},$fwdfwsettings{'SRC_PORT'},$fwdfwsettings{'USESRV'},$fwdfwsettings{'TGT_PROT'},$fwdfwsettings{'ICMP_TGT'},$fwdfwsettings{'grp3'},$fwdfwsettings{$fwdfwsettings{'grp3'}},$fwdfwsettings{'LOG'},$fwdfwsettings{'TIME'},$fwdfwsettings{'TIME_MON'},$fwdfwsettings{'TIME_TUE'},$fwdfwsettings{'TIME_WED'},$fwdfwsettings{'TIME_THU'},$fwdfwsettings{'TIME_FRI'},$fwdfwsettings{'TIME_SAT'},$fwdfwsettings{'TIME_SUN'},$fwdfwsettings{'TIME_FROM'},$fwdfwsettings{'TIME_TO'},$fwdfwsettings{'USE_NAT'},$fwdfwsettings{$fwdfwsettings{'nat'}},$fwdfwsettings{'dnatport'},$fwdfwsettings{'nat'},$fwdfwsettings{'LIMIT_CON_CON'},$fwdfwsettings{'concon'},$fwdfwsettings{'RATE_LIMIT'},$fwdfwsettings{'ratecon'},$fwdfwsettings{'RATETIME'}"
- eq "$configinputfw{$key}[0],$configinputfw{$key}[2],$configinputfw{$key}[3],$configinputfw{$key}[4],$configinputfw{$key}[5],$configinputfw{$key}[6],$configinputfw{$key}[7],$configinputfw{$key}[8],$configinputfw{$key}[9],$configinputfw{$key}[10],$configinputfw{$key}[11],$configinputfw{$key}[12],$configinputfw{$key}[13],$configinputfw{$key}[14],$configinputfw{$key}[15],$configinputfw{$key}[17],$configinputfw{$key}[18],$configinputfw{$key}[19],$configinputfw{$key}[20],$configinputfw{$key}[21],$configinputfw{$key}[22],$configinputfw{$key}[23],$configinputfw{$key}[24],$configinputfw{$key}[25],$configinputfw{$key}[26],$configinputfw{$key}[27],$configinputfw{$key}[28],$configinputfw{$key}[29],$configinputfw{$key}[30],$configinputfw{$key}[31],$configinputfw{$key}[32],$configinputfw{$key}[33],$configinputfw{$key}[34],$configinputfw{$key}[35],$configinputfw{$key}[36]"){
- $errormessage.=$Lang::tr{'fwdfw err ruleexists'};
- if($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on' && $fwdfwsettings{'ruleremark'} ne '' && !&validremark($fwdfwsettings{'ruleremark'})){
- $errormessage=$Lang::tr{'fwdfw err remark'}."<br>";
- }
- if($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on' && $fwdfwsettings{'ruleremark'} ne '' && &validremark($fwdfwsettings{'ruleremark'})){
- $errormessage='';
- }
- if ($fwdfwsettings{'oldruleremark'} eq $fwdfwsettings{'ruleremark'}){
- $fwdfwsettings{'nosave'} = 'on';
- }
- }
- }
- }
- #check Rulepos on new Rule
- if($fwdfwsettings{'rulepos'} > 0 && !$fwdfwsettings{'oldrulenumber'}){
- $fwdfwsettings{'oldrulenumber'}=$maxkey;
- foreach my $key (sort keys %configinputfw){
- if ( "$fwdfwsettings{'RULE_ACTION'},$fwdfwsettings{'ACTIVE'},$fwdfwsettings{'grp1'},$fwdfwsettings{$fwdfwsettings{'grp1'}},$fwdfwsettings{'grp2'},$fwdfwsettings{$fwdfwsettings{'grp2'}},$fwdfwsettings{'USE_SRC_PORT'},$fwdfwsettings{'PROT'},$fwdfwsettings{'ICMP_TYPES'},$fwdfwsettings{'SRC_PORT'},$fwdfwsettings{'USESRV'},$fwdfwsettings{'TGT_PROT'},$fwdfwsettings{'ICMP_TGT'},$fwdfwsettings{'grp3'},$fwdfwsettings{$fwdfwsettings{'grp3'}},$fwdfwsettings{'LOG'},$fwdfwsettings{'TIME'},$fwdfwsettings{'TIME_MON'},$fwdfwsettings{'TIME_TUE'},$fwdfwsettings{'TIME_WED'},$fwdfwsettings{'TIME_THU'},$fwdfwsettings{'TIME_FRI'},$fwdfwsettings{'TIME_SAT'},$fwdfwsettings{'TIME_SUN'},$fwdfwsettings{'TIME_FROM'},$fwdfwsettings{'TIME_TO'},$fwdfwsettings{'USE_NAT'},$fwdfwsettings{$fwdfwsettings{'nat'}},$fwdfwsettings{'dnatport'},$fwdfwsettings{'nat'},$fwdfwsettings{'LIMIT_CON_CON'},$fwdfwsettings{'concon'},$fwdfwsettings{'RATE_LIMIT'},$fwdfwsettings{'ratecon'},$fwdfwsettings{'RATETIME'}"
- eq "$configinputfw{$key}[0],$configinputfw{$key}[2],$configinputfw{$key}[3],$configinputfw{$key}[4],$configinputfw{$key}[5],$configinputfw{$key}[6],$configinputfw{$key}[7],$configinputfw{$key}[8],$configinputfw{$key}[9],$configinputfw{$key}[10],$configinputfw{$key}[11],$configinputfw{$key}[12],$configinputfw{$key}[13],$configinputfw{$key}[14],$configinputfw{$key}[15],$configinputfw{$key}[17],$configinputfw{$key}[18],$configinputfw{$key}[19],$configinputfw{$key}[20],$configinputfw{$key}[21],$configinputfw{$key}[22],$configinputfw{$key}[23],$configinputfw{$key}[24],$configinputfw{$key}[25],$configinputfw{$key}[26],$configinputfw{$key}[27],$configinputfw{$key}[28],$configinputfw{$key}[29],$configinputfw{$key}[30],$configinputfw{$key}[31],$configinputfw{$key}[32],$configinputfw{$key}[33],$configinputfw{$key}[34],$configinputfw{$key}[35],$configinputfw{$key}[36]"){
- $errormessage.=$Lang::tr{'fwdfw err ruleexists'};
- }
- }
- }
- #check if we just close a rule
- if( $fwdfwsettings{'oldgrp1a'} eq $fwdfwsettings{'grp1'} && $fwdfwsettings{'oldgrp1b'} eq $fwdfwsettings{$fwdfwsettings{'grp1'}} && $fwdfwsettings{'oldgrp2a'} eq $fwdfwsettings{'grp2'} && $fwdfwsettings{'oldgrp2b'} eq $fwdfwsettings{$fwdfwsettings{'grp2'}} && $fwdfwsettings{'oldgrp3a'} eq $fwdfwsettings{'grp3'} && $fwdfwsettings{'oldgrp3b'} eq $fwdfwsettings{$fwdfwsettings{'grp3'}} && $fwdfwsettings{'oldusesrv'} eq $fwdfwsettings{'USESRV'} && $fwdfwsettings{'oldruleremark'} eq $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'oldruletype'} eq $fwdfwsettings{'chain'} ) {
- if($fwdfwsettings{'nosave'} eq 'on' && $fwdfwsettings{'updatefwrule'} eq 'on'){
- $errormessage='';
- $fwdfwsettings{'nosave2'} = 'on';
- }
- }
- if (!$errormessage){
- if($fwdfwsettings{'nosave2'} ne 'on'){
- &saverule(\%configinputfw,$configinput);
- }
- }
- }elsif($fwdfwsettings{'grp1'} eq 'ipfire_src' ){
+ $maxkey=&General::findhasharraykey(\%configinputfw);
+ %rulehash=%configinputfw;
+ }elsif ($fwdfwsettings{'grp1'} eq 'ipfire_src' ){
# OUTGOING PART
$fwdfwsettings{'config'}=$configoutgoing;
$fwdfwsettings{'chain'} = 'OUTGOINGFW';
- my $maxkey=&General::findhasharraykey(\%configoutgoingfw);
- if($fwdfwsettings{'oldrulenumber'} eq $fwdfwsettings{'rulepos'}){
- foreach my $key (sort keys %configoutgoingfw){
- if ( "$fwdfwsettings{'RULE_ACTION'},$fwdfwsettings{'ACTIVE'},$fwdfwsettings{'grp1'},$fwdfwsettings{$fwdfwsettings{'grp1'}},$fwdfwsettings{'grp2'},$fwdfwsettings{$fwdfwsettings{'grp2'}},$fwdfwsettings{'USE_SRC_PORT'},$fwdfwsettings{'PROT'},$fwdfwsettings{'ICMP_TYPES'},$fwdfwsettings{'SRC_PORT'},$fwdfwsettings{'USESRV'},$fwdfwsettings{'TGT_PROT'},$fwdfwsettings{'ICMP_TGT'},$fwdfwsettings{'grp3'},$fwdfwsettings{$fwdfwsettings{'grp3'}},$fwdfwsettings{'LOG'},$fwdfwsettings{'TIME'},$fwdfwsettings{'TIME_MON'},$fwdfwsettings{'TIME_TUE'},$fwdfwsettings{'TIME_WED'},$fwdfwsettings{'TIME_THU'},$fwdfwsettings{'TIME_FRI'},$fwdfwsettings{'TIME_SAT'},$fwdfwsettings{'TIME_SUN'},$fwdfwsettings{'TIME_FROM'},$fwdfwsettings{'TIME_TO'},$fwdfwsettings{'USE_NAT'},$fwdfwsettings{$fwdfwsettings{'nat'}},$fwdfwsettings{'dnatport'},$fwdfwsettings{'nat'},$fwdfwsettings{'LIMIT_CON_CON'},$fwdfwsettings{'concon'},$fwdfwsettings{'RATE_LIMIT'},$fwdfwsettings{'ratecon'},$fwdfwsettings{'RATETIME'}"
- eq "$configoutgoingfw{$key}[0],$configoutgoingfw{$key}[2],$configoutgoingfw{$key}[3],$configoutgoingfw{$key}[4],$configoutgoingfw{$key}[5],$configoutgoingfw{$key}[6],$configoutgoingfw{$key}[7],$configoutgoingfw{$key}[8],$configoutgoingfw{$key}[9],$configoutgoingfw{$key}[10],$configoutgoingfw{$key}[11],$configoutgoingfw{$key}[12],$configoutgoingfw{$key}[13],$configoutgoingfw{$key}[14],$configoutgoingfw{$key}[15],$configoutgoingfw{$key}[17],$configoutgoingfw{$key}[18],$configoutgoingfw{$key}[19],$configoutgoingfw{$key}[20],$configoutgoingfw{$key}[21],$configoutgoingfw{$key}[22],$configoutgoingfw{$key}[23],$configoutgoingfw{$key}[24],$configoutgoingfw{$key}[25],$configoutgoingfw{$key}[26],$configoutgoingfw{$key}[27],$configoutgoingfw{$key}[28],$configoutgoingfw{$key}[29],$configoutgoingfw{$key}[30],$configoutgoingfw{$key}[31],$configoutgoingfw{$key}[32],$configoutgoingfw{$key}[33],$configoutgoingfw{$key}[34],$configoutgoingfw{$key}[35],$configoutgoingfw{$key}[36]"){
- $errormessage.=$Lang::tr{'fwdfw err ruleexists'};
- if($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on' && $fwdfwsettings{'ruleremark'} ne '' && !&validremark($fwdfwsettings{'ruleremark'})){
- $errormessage=$Lang::tr{'fwdfw err remark'}."<br>";
- }
- if($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on' && $fwdfwsettings{'ruleremark'} ne '' && &validremark($fwdfwsettings{'ruleremark'})){
- $errormessage='';
- }
- if ($fwdfwsettings{'oldruleremark'} eq $fwdfwsettings{'ruleremark'}){
- $fwdfwsettings{'nosave'} = 'on';
- }
- }
- }
- }
- #check Rulepos on new Rule
- if($fwdfwsettings{'rulepos'} > 0 && !$fwdfwsettings{'oldrulenumber'}){
- $fwdfwsettings{'oldrulenumber'}=$maxkey;
- foreach my $key (sort keys %configoutgoingfw){
- if ( "$fwdfwsettings{'RULE_ACTION'},$fwdfwsettings{'ACTIVE'},$fwdfwsettings{'grp1'},$fwdfwsettings{$fwdfwsettings{'grp1'}},$fwdfwsettings{'grp2'},$fwdfwsettings{$fwdfwsettings{'grp2'}},$fwdfwsettings{'USE_SRC_PORT'},$fwdfwsettings{'PROT'},$fwdfwsettings{'ICMP_TYPES'},$fwdfwsettings{'SRC_PORT'},$fwdfwsettings{'USESRV'},$fwdfwsettings{'TGT_PROT'},$fwdfwsettings{'ICMP_TGT'},$fwdfwsettings{'grp3'},$fwdfwsettings{$fwdfwsettings{'grp3'}},$fwdfwsettings{'LOG'},$fwdfwsettings{'TIME'},$fwdfwsettings{'TIME_MON'},$fwdfwsettings{'TIME_TUE'},$fwdfwsettings{'TIME_WED'},$fwdfwsettings{'TIME_THU'},$fwdfwsettings{'TIME_FRI'},$fwdfwsettings{'TIME_SAT'},$fwdfwsettings{'TIME_SUN'},$fwdfwsettings{'TIME_FROM'},$fwdfwsettings{'TIME_TO'},$fwdfwsettings{'USE_NAT'},$fwdfwsettings{$fwdfwsettings{'nat'}},$fwdfwsettings{'dnatport'},$fwdfwsettings{'nat'},$fwdfwsettings{'LIMIT_CON_CON'},$fwdfwsettings{'concon'},$fwdfwsettings{'RATE_LIMIT'},$fwdfwsettings{'ratecon'},$fwdfwsettings{'RATETIME'}"
- eq "$configoutgoingfw{$key}[0],$configoutgoingfw{$key}[2],$configoutgoingfw{$key}[3],$configoutgoingfw{$key}[4],$configoutgoingfw{$key}[5],$configoutgoingfw{$key}[6],$configoutgoingfw{$key}[7],$configoutgoingfw{$key}[8],$configoutgoingfw{$key}[9],$configoutgoingfw{$key}[10],$configoutgoingfw{$key}[11],$configoutgoingfw{$key}[12],$configoutgoingfw{$key}[13],$configoutgoingfw{$key}[14],$configoutgoingfw{$key}[15],$configoutgoingfw{$key}[17],$configoutgoingfw{$key}[18],$configoutgoingfw{$key}[19],$configoutgoingfw{$key}[20],$configoutgoingfw{$key}[21],$configoutgoingfw{$key}[22],$configoutgoingfw{$key}[23],$configoutgoingfw{$key}[24],$configoutgoingfw{$key}[25],$configoutgoingfw{$key}[26],$configoutgoingfw{$key}[27],$configoutgoingfw{$key}[28],$configoutgoingfw{$key}[29],$configoutgoingfw{$key}[30],$configoutgoingfw{$key}[31],$configoutgoingfw{$key}[32],$configoutgoingfw{$key}[33],$configoutgoingfw{$key}[34],$configoutgoingfw{$key}[35],$configoutgoingfw{$key}[36]"){
- $errormessage.=$Lang::tr{'fwdfw err ruleexists'};
- }
- }
- }
- #check if we just close a rule
- if( $fwdfwsettings{'oldgrp1a'} eq $fwdfwsettings{'grp1'} && $fwdfwsettings{'oldgrp1b'} eq $fwdfwsettings{$fwdfwsettings{'grp1'}} && $fwdfwsettings{'oldgrp2a'} eq $fwdfwsettings{'grp2'} && $fwdfwsettings{'oldgrp2b'} eq $fwdfwsettings{$fwdfwsettings{'grp2'}} && $fwdfwsettings{'oldgrp3a'} eq $fwdfwsettings{'grp3'} && $fwdfwsettings{'oldgrp3b'} eq $fwdfwsettings{$fwdfwsettings{'grp3'}} && $fwdfwsettings{'oldusesrv'} eq $fwdfwsettings{'USESRV'} && $fwdfwsettings{'oldruleremark'} eq $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'oldruletype'} eq $fwdfwsettings{'chain'} ) {
- if($fwdfwsettings{'nosave'} eq 'on' && $fwdfwsettings{'updatefwrule'} eq 'on'){
- $fwdfwsettings{'nosave2'} = 'on';
- $errormessage='';
- }
- }
- #increase counters
- if (!$errormessage){
- if ($fwdfwsettings{'nosave2'} ne 'on'){
- &saverule(\%configoutgoingfw,$configoutgoing);
- }
- }
- }else{
- #FORWARD PART
+ $maxkey=&General::findhasharraykey(\%configoutgoingfw);
+ %rulehash=%configoutgoingfw;
+ }else {
+ # FORWARD PART
$fwdfwsettings{'config'}=$configfwdfw;
$fwdfwsettings{'chain'} = 'FORWARDFW';
- my $maxkey=&General::findhasharraykey(\%configfwdfw);
- if($fwdfwsettings{'oldrulenumber'} eq $fwdfwsettings{'rulepos'}){
- #check if we have an identical rule already
- foreach my $key (sort keys %configfwdfw){
- if ( "$fwdfwsettings{'RULE_ACTION'},$fwdfwsettings{'ACTIVE'},$fwdfwsettings{'grp1'},$fwdfwsettings{$fwdfwsettings{'grp1'}},$fwdfwsettings{'grp2'},$fwdfwsettings{$fwdfwsettings{'grp2'}},$fwdfwsettings{'USE_SRC_PORT'},$fwdfwsettings{'PROT'},$fwdfwsettings{'ICMP_TYPES'},$fwdfwsettings{'SRC_PORT'},$fwdfwsettings{'USESRV'},$fwdfwsettings{'TGT_PROT'},$fwdfwsettings{'ICMP_TGT'},$fwdfwsettings{'grp3'},$fwdfwsettings{$fwdfwsettings{'grp3'}},$fwdfwsettings{'TIME'},$fwdfwsettings{'TIME_MON'},$fwdfwsettings{'TIME_TUE'},$fwdfwsettings{'TIME_WED'},$fwdfwsettings{'TIME_THU'},$fwdfwsettings{'TIME_FRI'},$fwdfwsettings{'TIME_SAT'},$fwdfwsettings{'TIME_SUN'},$fwdfwsettings{'TIME_FROM'},$fwdfwsettings{'TIME_TO'},$fwdfwsettings{'USE_NAT'},$fwdfwsettings{$fwdfwsettings{'nat'}},$fwdfwsettings{'dnatport'},$fwdfwsettings{'nat'},$fwdfwsettings{'LIMIT_CON_CON'},$fwdfwsettings{'concon'},$fwdfwsettings{'RATE_LIMIT'},$fwdfwsettings{'ratecon'},$fwdfwsettings{'RATETIME'}"
- eq "$configfwdfw{$key}[0],$configfwdfw{$key}[2],$configfwdfw{$key}[3],$configfwdfw{$key}[4],$configfwdfw{$key}[5],$configfwdfw{$key}[6],$configfwdfw{$key}[7],$configfwdfw{$key}[8],$configfwdfw{$key}[9],$configfwdfw{$key}[10],$configfwdfw{$key}[11],$configfwdfw{$key}[12],$configfwdfw{$key}[13],$configfwdfw{$key}[14],$configfwdfw{$key}[15],$configfwdfw{$key}[18],$configfwdfw{$key}[19],$configfwdfw{$key}[20],$configfwdfw{$key}[21],$configfwdfw{$key}[22],$configfwdfw{$key}[23],$configfwdfw{$key}[24],$configfwdfw{$key}[25],$configfwdfw{$key}[26],$configfwdfw{$key}[27],$configfwdfw{$key}[28],$configfwdfw{$key}[29],$configfwdfw{$key}[30],$configfwdfw{$key}[31],$configfwdfw{$key}[32],$configfwdfw{$key}[33],$configfwdfw{$key}[34],$configfwdfw{$key}[35],$configfwdfw{$key}[36]"){
- $errormessage.=$Lang::tr{'fwdfw err ruleexists'};
- if($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on' && $fwdfwsettings{'ruleremark'} ne '' && !&validremark($fwdfwsettings{'ruleremark'})){
- $errormessage=$Lang::tr{'fwdfw err remark'}."<br>";
- }
- if($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on' && $fwdfwsettings{'ruleremark'} ne '' && &validremark($fwdfwsettings{'ruleremark'})){
- $errormessage='';
- }
- if ($fwdfwsettings{'oldruleremark'} eq $fwdfwsettings{'ruleremark'}){
- $fwdfwsettings{'nosave'} = 'on';
- }
- }
+ $maxkey=&General::findhasharraykey(\%configfwdfw);
+ %rulehash=%configfwdfw;
+ }
+ #check if we have an identical rule already
+ if($fwdfwsettings{'oldrulenumber'} eq $fwdfwsettings{'rulepos'}){
+ foreach my $key (sort keys %rulehash){
+ if ( "$fwdfwsettings{'RULE_ACTION'},$fwdfwsettings{'ACTIVE'},$fwdfwsettings{'grp1'},$fwdfwsettings{$fwdfwsettings{'grp1'}},$fwdfwsettings{'grp2'},$fwdfwsettings{$fwdfwsettings{'grp2'}},$fwdfwsettings{'USE_SRC_PORT'},$fwdfwsettings{'PROT'},$fwdfwsettings{'ICMP_TYPES'},$fwdfwsettings{'SRC_PORT'},$fwdfwsettings{'USESRV'},$fwdfwsettings{'TGT_PROT'},$fwdfwsettings{'ICMP_TGT'},$fwdfwsettings{'grp3'},$fwdfwsettings{$fwdfwsettings{'grp3'}},$fwdfwsettings{'ruleremark'},$fwdfwsettings{'LOG'},$fwdfwsettings{'TIME'},$fwdfwsettings{'TIME_MON'},$fwdfwsettings{'TIME_TUE'},$fwdfwsettings{'TIME_WED'},$fwdfwsettings{'TIME_THU'},$fwdfwsettings{'TIME_FRI'},$fwdfwsettings{'TIME_SAT'},$fwdfwsettings{'TIME_SUN'},$fwdfwsettings{'TIME_FROM'},$fwdfwsettings{'TIME_TO'},$fwdfwsettings{'USE_NAT'},$fwdfwsettings{$fwdfwsettings{'nat'}},$fwdfwsettings{'dnatport'},$fwdfwsettings{'nat'},$fwdfwsettings{'LIMIT_CON_CON'},$fwdfwsettings{'concon'},$fwdfwsettings{'RATE_LIMIT'},$fwdfwsettings{'ratecon'},$fwdfwsettings{'RATETIME'}"
+ eq "$rulehash{$key}[0],$rulehash{$key}[2],$rulehash{$key}[3],$rulehash{$key}[4],$rulehash{$key}[5],$rulehash{$key}[6],$rulehash{$key}[7],$rulehash{$key}[8],$rulehash{$key}[9],$rulehash{$key}[10],$rulehash{$key}[11],$rulehash{$key}[12],$rulehash{$key}[13],$rulehash{$key}[14],$rulehash{$key}[15],$rulehash{$key}[16],$rulehash{$key}[17],$rulehash{$key}[18],$rulehash{$key}[19],$rulehash{$key}[20],$rulehash{$key}[21],$rulehash{$key}[22],$rulehash{$key}[23],$rulehash{$key}[24],$rulehash{$key}[25],$rulehash{$key}[26],$rulehash{$key}[27],$rulehash{$key}[28],$rulehash{$key}[29],$rulehash{$key}[30],$rulehash{$key}[31],$rulehash{$key}[32],$rulehash{$key}[33],$rulehash{$key}[34],$rulehash{$key}[35],$rulehash{$key}[36]"){
+ $errormessage.=$Lang::tr{'fwdfw err ruleexists'};
+ if($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on' && $fwdfwsettings{'ruleremark'} ne '' && !&validremark($fwdfwsettings{'ruleremark'})){
+ $errormessage=$Lang::tr{'fwdfw err remark'}."<br>";
+ }
+ if($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on' && $fwdfwsettings{'ruleremark'} ne '' && &validremark($fwdfwsettings{'ruleremark'})){
+ $errormessage='';
+ }
+ if ($fwdfwsettings{'oldruleremark'} eq $fwdfwsettings{'ruleremark'}){
+ $fwdfwsettings{'nosave'} = 'on';
+ }
}
}
- #check Rulepos on new Rule
- if($fwdfwsettings{'rulepos'} > 0 && !$fwdfwsettings{'oldrulenumber'}){
- $fwdfwsettings{'oldrulenumber'}=$maxkey;
- foreach my $key (sort keys %configfwdfw){
- if ( "$fwdfwsettings{'RULE_ACTION'},$fwdfwsettings{'ACTIVE'},$fwdfwsettings{'grp1'},$fwdfwsettings{$fwdfwsettings{'grp1'}},$fwdfwsettings{'grp2'},$fwdfwsettings{$fwdfwsettings{'grp2'}},$fwdfwsettings{'USE_SRC_PORT'},$fwdfwsettings{'PROT'},$fwdfwsettings{'ICMP_TYPES'},$fwdfwsettings{'SRC_PORT'},$fwdfwsettings{'USESRV'},$fwdfwsettings{'TGT_PROT'},$fwdfwsettings{'ICMP_TGT'},$fwdfwsettings{'grp3'},$fwdfwsettings{$fwdfwsettings{'grp3'}},$fwdfwsettings{'TIME'},$fwdfwsettings{'TIME_MON'},$fwdfwsettings{'TIME_TUE'},$fwdfwsettings{'TIME_WED'},$fwdfwsettings{'TIME_THU'},$fwdfwsettings{'TIME_FRI'},$fwdfwsettings{'TIME_SAT'},$fwdfwsettings{'TIME_SUN'},$fwdfwsettings{'TIME_FROM'},$fwdfwsettings{'TIME_TO'},$fwdfwsettings{'USE_NAT'},$fwdfwsettings{$fwdfwsettings{'nat'}},$fwdfwsettings{'dnatport'},$fwdfwsettings{'nat'},$fwdfwsettings{'LIMIT_CON_CON'},$fwdfwsettings{'concon'},$fwdfwsettings{'RATE_LIMIT'},$fwdfwsettings{'ratecon'},$fwdfwsettings{'RATETIME'}"
- eq "$configfwdfw{$key}[0],$configfwdfw{$key}[2],$configfwdfw{$key}[3],$configfwdfw{$key}[4],$configfwdfw{$key}[5],$configfwdfw{$key}[6],$configfwdfw{$key}[7],$configfwdfw{$key}[8],$configfwdfw{$key}[9],$configfwdfw{$key}[10],$configfwdfw{$key}[11],$configfwdfw{$key}[12],$configfwdfw{$key}[13],$configfwdfw{$key}[14],$configfwdfw{$key}[15],$configfwdfw{$key}[18],$configfwdfw{$key}[19],$configfwdfw{$key}[20],$configfwdfw{$key}[21],$configfwdfw{$key}[22],$configfwdfw{$key}[23],$configfwdfw{$key}[24],$configfwdfw{$key}[25],$configfwdfw{$key}[26],$configfwdfw{$key}[27],$configfwdfw{$key}[28],$configfwdfw{$key}[29],$configfwdfw{$key}[30],$configfwdfw{$key}[31],$configfwdfw{$key}[32],$configfwdfw{$key}[33],$configfwdfw{$key}[34],$configfwdfw{$key}[35],$configfwdfw{$key}[36]"){
- $errormessage.=$Lang::tr{'fwdfw err ruleexists'};
- }
+ }
+ #check Rulepos on new Rule
+ if($fwdfwsettings{'rulepos'} > 0 && !$fwdfwsettings{'oldrulenumber'}){
+ $fwdfwsettings{'oldrulenumber'}=$maxkey;
+ foreach my $key (sort keys %rulehash){
+ if ( "$fwdfwsettings{'RULE_ACTION'},$fwdfwsettings{'ACTIVE'},$fwdfwsettings{'grp1'},$fwdfwsettings{$fwdfwsettings{'grp1'}},$fwdfwsettings{'grp2'},$fwdfwsettings{$fwdfwsettings{'grp2'}},$fwdfwsettings{'USE_SRC_PORT'},$fwdfwsettings{'PROT'},$fwdfwsettings{'ICMP_TYPES'},$fwdfwsettings{'SRC_PORT'},$fwdfwsettings{'USESRV'},$fwdfwsettings{'TGT_PROT'},$fwdfwsettings{'ICMP_TGT'},$fwdfwsettings{'grp3'},$fwdfwsettings{$fwdfwsettings{'grp3'}},$fwdfwsettings{'TIME'},$fwdfwsettings{'TIME_MON'},$fwdfwsettings{'TIME_TUE'},$fwdfwsettings{'TIME_WED'},$fwdfwsettings{'TIME_THU'},$fwdfwsettings{'TIME_FRI'},$fwdfwsettings{'TIME_SAT'},$fwdfwsettings{'TIME_SUN'},$fwdfwsettings{'TIME_FROM'},$fwdfwsettings{'TIME_TO'},$fwdfwsettings{'USE_NAT'},$fwdfwsettings{$fwdfwsettings{'nat'}},$fwdfwsettings{'dnatport'},$fwdfwsettings{'nat'},$fwdfwsettings{'LIMIT_CON_CON'},$fwdfwsettings{'concon'},$fwdfwsettings{'RATE_LIMIT'},$fwdfwsettings{'ratecon'},$fwdfwsettings{'RATETIME'}"
+ eq "$rulehash{$key}[0],$rulehash{$key}[2],$rulehash{$key}[3],$rulehash{$key}[4],$rulehash{$key}[5],$rulehash{$key}[6],$rulehash{$key}[7],$rulehash{$key}[8],$rulehash{$key}[9],$rulehash{$key}[10],$rulehash{$key}[11],$rulehash{$key}[12],$rulehash{$key}[13],$rulehash{$key}[14],$rulehash{$key}[15],$rulehash{$key}[18],$rulehash{$key}[19],$rulehash{$key}[20],$rulehash{$key}[21],$rulehash{$key}[22],$rulehash{$key}[23],$rulehash{$key}[24],$rulehash{$key}[25],$rulehash{$key}[26],$rulehash{$key}[27],$rulehash{$key}[28],$rulehash{$key}[29],$rulehash{$key}[30],$rulehash{$key}[31],$rulehash{$key}[32],$rulehash{$key}[33],$rulehash{$key}[34],$rulehash{$key}[35],$rulehash{$key}[36]"){
+ $errormessage.=$Lang::tr{'fwdfw err ruleexists'};
}
}
- #check if we just close a rule
- if( $fwdfwsettings{'oldgrp1a'} eq $fwdfwsettings{'grp1'} && $fwdfwsettings{'oldgrp1b'} eq $fwdfwsettings{$fwdfwsettings{'grp1'}} && $fwdfwsettings{'oldgrp2a'} eq $fwdfwsettings{'grp2'} && $fwdfwsettings{'oldgrp2b'} eq $fwdfwsettings{$fwdfwsettings{'grp2'}} && $fwdfwsettings{'oldgrp3a'} eq $fwdfwsettings{'grp3'} && $fwdfwsettings{'oldgrp3b'} eq $fwdfwsettings{$fwdfwsettings{'grp3'}} && $fwdfwsettings{'oldusesrv'} eq $fwdfwsettings{'USESRV'} && $fwdfwsettings{'oldruleremark'} eq $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'oldruletype'} eq $fwdfwsettings{'chain'}){
- if($fwdfwsettings{'nosave'} eq 'on' && $fwdfwsettings{'updatefwrule'} eq 'on'){
- $fwdfwsettings{'nosave2'} = 'on';
- $errormessage='';
- }
+ }
+ #check if we just close a rule
+ if( $fwdfwsettings{'oldgrp1a'} eq $fwdfwsettings{'grp1'} && $fwdfwsettings{'oldgrp1b'} eq $fwdfwsettings{$fwdfwsettings{'grp1'}} && $fwdfwsettings{'oldgrp2a'} eq $fwdfwsettings{'grp2'} && $fwdfwsettings{'oldgrp2b'} eq $fwdfwsettings{$fwdfwsettings{'grp2'}} && $fwdfwsettings{'oldgrp3a'} eq $fwdfwsettings{'grp3'} && $fwdfwsettings{'oldgrp3b'} eq $fwdfwsettings{$fwdfwsettings{'grp3'}} && $fwdfwsettings{'oldusesrv'} eq $fwdfwsettings{'USESRV'} && $fwdfwsettings{'oldruleremark'} eq $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'oldruletype'} eq $fwdfwsettings{'chain'}){
+ if($fwdfwsettings{'nosave'} eq 'on' && $fwdfwsettings{'updatefwrule'} eq 'on'){
+ $fwdfwsettings{'nosave2'} = 'on';
+ $errormessage='';
}
- #check max concurrent connections per ip address
- if ($fwdfwsettings{'LIMIT_CON_CON'} eq 'ON'){
- if (!($fwdfwsettings{'concon'} =~ /^(\d+)$/)) {
- $errormessage.=$Lang::tr{'fwdfw err concon'};
- }
- }else{
- $fwdfwsettings{'concon'}='';
+ }
+ #check max concurrent connections per ip address
+ if ($fwdfwsettings{'LIMIT_CON_CON'} eq 'ON'){
+ if (!($fwdfwsettings{'concon'} =~ /^(\d+)$/)) {
+ $errormessage.=$Lang::tr{'fwdfw err concon'};
}
- #check ratelimit value
- if ($fwdfwsettings{'RATE_LIMIT'} eq 'ON'){
- if (!($fwdfwsettings{'ratecon'} =~ /^(\d+)$/)) {
- $errormessage.=$Lang::tr{'fwdfw err ratecon'};
- }
- }else{
- $fwdfwsettings{'ratecon'}='';
+ }else{
+ $fwdfwsettings{'concon'}='';
+ }
+ #check ratelimit value
+ if ($fwdfwsettings{'RATE_LIMIT'} eq 'ON'){
+ if (!($fwdfwsettings{'ratecon'} =~ /^(\d+)$/)) {
+ $errormessage.=$Lang::tr{'fwdfw err ratecon'};
}
- #increase counters
- if (!$errormessage){
- if ($fwdfwsettings{'nosave2'} ne 'on'){
- &saverule(\%configfwdfw,$configfwdfw);
- }
+ }else{
+ $fwdfwsettings{'ratecon'}='';
+ }
+ #increase counters
+ if (!$errormessage){
+ if ($fwdfwsettings{'nosave2'} ne 'on'){
+ &saverule(\%rulehash,$fwdfwsettings{'config'});
}
}
if ($errormessage){
}
}
}
- if ($tcpcounter > 15){
+ if ($tcpcounter > 14){
$errormessage=$Lang::tr{'fwhost err maxservicetcp'};
}
- if ($udpcounter > 15){
+ if ($udpcounter > 14){
$errormessage=$Lang::tr{'fwhost err maxserviceudp'};
}
$tcpcounter=0;
my $comment = $3;
my $packet = $4;
- $packet =~ /IN=(\w+)/; my $iface=$1; if ( $1 =~ /2./ ){ $iface="";}
- $packet =~ /SRC=([\d\.]+)/; my $srcaddr=$1;
- $packet =~ /DST=([\d\.]+)/; my $dstaddr=$1;
- $packet =~ /MAC=([\w+\:]+)/; my $macaddr=$1;
- $packet =~ /PROTO=(\w+)/; my $proto=$1;
- $packet =~ /SPT=(\d+)/; my $srcport=$1;
- $packet =~ /DPT=(\d+)/; my $dstport=$1;
+ my ($iface, $srcaddr, $dstaddr, $macaddr, $proto, $srcport, $dstport);
+ $iface=$1 if $packet =~ /IN=(\w+)/;
+ $srcaddr=$1 if $packet =~ /SRC=([\d\.]+)/;
+ $dstaddr=$1 if $packet =~ /DST=([\d\.]+)/;
+ $macaddr=$1 if $packet =~ /MAC=([\w+\:]+)/;
+ $proto=$1 if $packet =~ /PROTO=(\w+)/;
+ $srcport=$1 if $packet =~ /SPT=(\d+)/;
+ $dstport=$1 if $packet =~ /DPT=(\d+)/;
my $gi = Geo::IP::PurePerl->new();
my $ccode = $gi->country_code_by_name($srcaddr);
$cgiparams{'REMOTE_ID'} = '';
#use default advanced value
- $cgiparams{'IKE_ENCRYPTION'} = 'aes256|aes192|aes128|3des'; #[18];
- $cgiparams{'IKE_INTEGRITY'} = 'sha2_256|sha|md5'; #[19];
+ $cgiparams{'IKE_ENCRYPTION'} = 'aes256|aes192|aes128|aes256gcm128|aes192gcm128|aes128gcm128|aes256gcm96|aes192gcm96|aes128gcm96|aes256gcm64|aes192gcm64|aes128gcm64'; #[18];
+ $cgiparams{'IKE_INTEGRITY'} = 'sha2_512|sha2_256|sha'; #[19];
$cgiparams{'IKE_GROUPTYPE'} = '4096|3072|2048|1536|1024'; #[20];
$cgiparams{'IKE_LIFETIME'} = '3'; #[16];
- $cgiparams{'ESP_ENCRYPTION'} = 'aes256|aes192|aes128|3des'; #[21];
- $cgiparams{'ESP_INTEGRITY'} = 'sha2_256|sha1|md5'; #[22];
+ $cgiparams{'ESP_ENCRYPTION'} = 'aes256|aes192|aes128|aes256gcm128|aes192gcm128|aes128gcm128|aes256gcm96|aes192gcm96|aes128gcm96|aes256gcm64|aes192gcm64|aes128gcm64'; #[21];
+ $cgiparams{'ESP_INTEGRITY'} = 'sha2_512|sha2_256|sha1'; #[22];
$cgiparams{'ESP_GROUPTYPE'} = ''; #[23];
$cgiparams{'ESP_KEYLIFE'} = '1'; #[17];
$cgiparams{'COMPRESSION'} = 'on'; #[13];
goto ADVANCED_ERROR;
}
foreach my $val (@temp) {
- if ($val !~ /^(aes256|aes192|aes128|3des|camellia256|camellia192|camellia128)$/) {
+ if ($val !~ /^(aes(256|192|128)(gcm(128|96|64))?|3des|camellia(256|192|128))$/) {
$errormessage = $Lang::tr{'invalid input'};
goto ADVANCED_ERROR;
}
$errormessage = $Lang::tr{'invalid input for ike lifetime'};
goto ADVANCED_ERROR;
}
- if ($cgiparams{'IKE_LIFETIME'} < 1 || $cgiparams{'IKE_LIFETIME'} > 24) {
- $errormessage = $Lang::tr{'ike lifetime should be between 1 and 24 hours'};
+ if ($cgiparams{'IKE_LIFETIME'} < 1 || $cgiparams{'IKE_LIFETIME'} > 8) {
+ $errormessage = $Lang::tr{'ike lifetime should be between 1 and 8 hours'};
goto ADVANCED_ERROR;
}
@temp = split('\|', $cgiparams{'ESP_ENCRYPTION'});
goto ADVANCED_ERROR;
}
foreach my $val (@temp) {
- if ($val !~ /^(aes256|aes192|aes128|3des|camellia256|camellia192|camellia128)$/) {
+ if ($val !~ /^(aes(256|192|128)(gcm(128|96|64))?|3des|camellia(256|192|128))$/) {
$errormessage = $Lang::tr{'invalid input'};
goto ADVANCED_ERROR;
}
$checked{'IKE_ENCRYPTION'}{'aes256'} = '';
$checked{'IKE_ENCRYPTION'}{'aes192'} = '';
$checked{'IKE_ENCRYPTION'}{'aes128'} = '';
+ $checked{'IKE_ENCRYPTION'}{'aes256gcm128'} = '';
+ $checked{'IKE_ENCRYPTION'}{'aes192gcm128'} = '';
+ $checked{'IKE_ENCRYPTION'}{'aes128gcm128'} = '';
+ $checked{'IKE_ENCRYPTION'}{'aes256gcm96'} = '';
+ $checked{'IKE_ENCRYPTION'}{'aes192gcm96'} = '';
+ $checked{'IKE_ENCRYPTION'}{'aes128gcm96'} = '';
+ $checked{'IKE_ENCRYPTION'}{'aes256gcm64'} = '';
+ $checked{'IKE_ENCRYPTION'}{'aes192gcm64'} = '';
+ $checked{'IKE_ENCRYPTION'}{'aes128gcm64'} = '';
$checked{'IKE_ENCRYPTION'}{'3des'} = '';
$checked{'IKE_ENCRYPTION'}{'camellia256'} = '';
$checked{'IKE_ENCRYPTION'}{'camellia192'} = '';
$checked{'ESP_ENCRYPTION'}{'aes256'} = '';
$checked{'ESP_ENCRYPTION'}{'aes192'} = '';
$checked{'ESP_ENCRYPTION'}{'aes128'} = '';
+ $checked{'ESP_ENCRYPTION'}{'aes256gcm128'} = '';
+ $checked{'ESP_ENCRYPTION'}{'aes192gcm128'} = '';
+ $checked{'ESP_ENCRYPTION'}{'aes128gcm128'} = '';
+ $checked{'ESP_ENCRYPTION'}{'aes256gcm96'} = '';
+ $checked{'ESP_ENCRYPTION'}{'aes192gcm96'} = '';
+ $checked{'ESP_ENCRYPTION'}{'aes128gcm96'} = '';
+ $checked{'ESP_ENCRYPTION'}{'aes256gcm64'} = '';
+ $checked{'ESP_ENCRYPTION'}{'aes192gcm64'} = '';
+ $checked{'ESP_ENCRYPTION'}{'aes128gcm64'} = '';
$checked{'ESP_ENCRYPTION'}{'3des'} = '';
$checked{'ESP_ENCRYPTION'}{'camellia256'} = '';
$checked{'ESP_ENCRYPTION'}{'camellia192'} = '';
<td class='boldbase' width="15%">$Lang::tr{'encryption'}</td>
<td class='boldbase'>
<select name='IKE_ENCRYPTION' multiple='multiple' size='6' style='width: 100%'>
- <option value='aes256' $checked{'IKE_ENCRYPTION'}{'aes256'}>AES (256 bit)</option>
- <option value='aes192' $checked{'IKE_ENCRYPTION'}{'aes192'}>AES (192 bit)</option>
- <option value='aes128' $checked{'IKE_ENCRYPTION'}{'aes128'}>AES (128 bit)</option>
- <option value='3des' $checked{'IKE_ENCRYPTION'}{'3des'}>3DES</option>
- <option value='camellia256' $checked{'IKE_ENCRYPTION'}{'camellia256'}>Camellia (256 bit)</option>
- <option value='camellia192' $checked{'IKE_ENCRYPTION'}{'camellia192'}>Camellia (192 bit)</option>
- <option value='camellia128' $checked{'IKE_ENCRYPTION'}{'camellia128'}>Camellia (128 bit)</option>
+ <option value='aes256' $checked{'IKE_ENCRYPTION'}{'aes256'}>256 bit AES-CBC</option>
+ <option value='aes192' $checked{'IKE_ENCRYPTION'}{'aes192'}>192 bit AES-CBC</option>
+ <option value='aes128' $checked{'IKE_ENCRYPTION'}{'aes128'}>128 bit AES-CBC</option>
+ <option value='aes256gcm128' $checked{'IKE_ENCRYPTION'}{'aes256gcm128'}>256 bit AES-GCM/128 bit ICV</option>
+ <option value='aes192gcm128' $checked{'IKE_ENCRYPTION'}{'aes192gcm128'}>192 bit AES-GCM/128 bit ICV</option>
+ <option value='aes128gcm128' $checked{'IKE_ENCRYPTION'}{'aes128gcm128'}>128 bit AES-GCM/128 bit ICV</option>
+ <option value='aes256gcm96' $checked{'IKE_ENCRYPTION'}{'aes256gcm96'}>256 bit AES-GCM/96 bit ICV</option>
+ <option value='aes192gcm96' $checked{'IKE_ENCRYPTION'}{'aes192gcm96'}>192 bit AES-GCM/96 bit ICV</option>
+ <option value='aes128gcm96' $checked{'IKE_ENCRYPTION'}{'aes128gcm96'}>128 bit AES-GCM/96 bit ICV</option>
+ <option value='aes256gcm64' $checked{'IKE_ENCRYPTION'}{'aes256gcm64'}>256 bit AES-GCM/64 bit ICV</option>
+ <option value='aes192gcm64' $checked{'IKE_ENCRYPTION'}{'aes192gcm64'}>192 bit AES-GCM/64 bit ICV</option>
+ <option value='aes128gcm64' $checked{'IKE_ENCRYPTION'}{'aes128gcm64'}>128 bit AES-GCM/64 bit ICV</option>
+ <option value='3des' $checked{'IKE_ENCRYPTION'}{'3des'}>168 bit 3DES-EDE-CBC</option>
+ <option value='camellia256' $checked{'IKE_ENCRYPTION'}{'camellia256'}>256 bit Camellia-CBC</option>
+ <option value='camellia192' $checked{'IKE_ENCRYPTION'}{'camellia192'}>192 bit Camellia-CBC</option>
+ <option value='camellia128' $checked{'IKE_ENCRYPTION'}{'camellia128'}>128 bit Camellia-CBC</option>
</select>
</td>
<td class='boldbase'>
<select name='ESP_ENCRYPTION' multiple='multiple' size='6' style='width: 100%'>
- <option value='aes256' $checked{'ESP_ENCRYPTION'}{'aes256'}>AES (256 bit)</option>
- <option value='aes192' $checked{'ESP_ENCRYPTION'}{'aes192'}>AES (192 bit)</option>
- <option value='aes128' $checked{'ESP_ENCRYPTION'}{'aes128'}>AES (128 bit)</option>
- <option value='3des' $checked{'ESP_ENCRYPTION'}{'3des'}>3DES</option>
- <option value='camellia256' $checked{'ESP_ENCRYPTION'}{'camellia256'}>Camellia (256 bit)</option>
- <option value='camellia192' $checked{'ESP_ENCRYPTION'}{'camellia192'}>Camellia (192 bit)</option>
- <option value='camellia128' $checked{'ESP_ENCRYPTION'}{'camellia128'}>Camellia (128 bit)</option>
+ <option value='aes256' $checked{'ESP_ENCRYPTION'}{'aes256'}>256 bit AES-CBC</option>
+ <option value='aes192' $checked{'ESP_ENCRYPTION'}{'aes192'}>192 bit AES-CBC</option>
+ <option value='aes128' $checked{'ESP_ENCRYPTION'}{'aes128'}>128 bit AES-CBC</option>
+ <option value='aes256gcm128' $checked{'ESP_ENCRYPTION'}{'aes256gcm128'}>256 bit AES-GCM/128 bit ICV</option>
+ <option value='aes192gcm128' $checked{'ESP_ENCRYPTION'}{'aes192gcm128'}>192 bit AES-GCM/128 bit ICV</option>
+ <option value='aes128gcm128' $checked{'ESP_ENCRYPTION'}{'aes128gcm128'}>128 bit AES-GCM/128 bit ICV</option>
+ <option value='aes256gcm96' $checked{'ESP_ENCRYPTION'}{'aes256gcm96'}>256 bit AES-GCM/96 bit ICV</option>
+ <option value='aes192gcm96' $checked{'ESP_ENCRYPTION'}{'aes192gcm96'}>192 bit AES-GCM/96 bit ICV</option>
+ <option value='aes128gcm96' $checked{'ESP_ENCRYPTION'}{'aes128gcm96'}>128 bit AES-GCM/96 bit ICV</option>
+ <option value='aes256gcm64' $checked{'ESP_ENCRYPTION'}{'aes256gcm64'}>256 bit AES-GCM/64 bit ICV</option>
+ <option value='aes192gcm64' $checked{'ESP_ENCRYPTION'}{'aes192gcm64'}>192 bit AES-GCM/64 bit ICV</option>
+ <option value='aes128gcm64' $checked{'ESP_ENCRYPTION'}{'aes128gcm64'}>128 bit AES-GCM/64 bit ICV</option>
+ <option value='3des' $checked{'ESP_ENCRYPTION'}{'3des'}>168 bit 3DES-EDE-CBC</option>
+ <option value='camellia256' $checked{'ESP_ENCRYPTION'}{'camellia256'}>256 bit Camellia-CBC</option>
+ <option value='camellia192' $checked{'ESP_ENCRYPTION'}{'camellia192'}>192 bit Camellia-CBC</option>
+ <option value='camellia128' $checked{'ESP_ENCRYPTION'}{'camellia128'}>128 bit Camellia-CBC</option>
</select>
</td>
</tr>
###############################################################################
# #
# IPFire.org - A linux based firewall #
-# Copyright (C) 2007 Michael Tremer & Christian Schmidt #
+# Copyright (C) 2015 Michael Tremer & Christian Schmidt #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
include Config
-VER = 2.0.16
+VER = 2.0.23
THISAPP = acpid-$(VER)
DL_FILE = $(THISAPP).tar.xz
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_MD5 = d59fc02c9c34f0d5c137495302e2c074
+$(DL_FILE)_MD5 = d7bcdcdefcd53b03730e50ba842554ea
install : $(TARGET)
DIR_APP = $(DIR_SRC)/$(THISAPP)
TARGET = $(DIR_INFO)/$(THISAPP)
PROG = asterisk
-PAK_VER = 13
+PAK_VER = 14
-DEPS = "libsrtp sqlite"
+DEPS = "libsrtp"
###############################################################################
# Top-level Rules
###############################################################################
# #
# IPFire.org - A linux based firewall #
-# Copyright (C) 2007-2014 IPFire Team <info@ipfire.org> #
+# Copyright (C) 2007-2015 IPFire Team <info@ipfire.org> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
include Config
-VER = 0.98.5
+VER = 0.98.6
THISAPP = clamav-$(VER)
DL_FILE = $(THISAPP).tar.gz
DIR_APP = $(DIR_SRC)/$(THISAPP)
TARGET = $(DIR_INFO)/$(THISAPP)
PROG = clamav
-PAK_VER = 27
+PAK_VER = 28
DEPS = ""
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_MD5 = abb5c7efaff3394c0a49ff970841a2ac
+$(DL_FILE)_MD5 = 7f4f7e82a09e42c4ebf153d6d452d9d8
install : $(TARGET)
$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
@$(PREBUILD)
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/clamav/llvm-glibc.patch
cd $(DIR_APP) && ./configure \
--prefix=/usr \
--sysconfdir=/var/ipfire/clamav \
###############################################################################
# #
# IPFire.org - A linux based firewall #
-# Copyright (C) 2007 Michael Tremer & Christian Schmidt #
+# Copyright (C) 2015 Michael Tremer & Christian Schmidt #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
include Config
-VER = 7.31.0
+VER = 7.40.0
THISAPP = curl-$(VER)
DL_FILE = $(THISAPP).tar.gz
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_MD5 = 6f26843f7e3a2fb06e02f68a55efe8c7
+$(DL_FILE)_MD5 = 58943642ea0ed050ab0431ea1caf3a6f
install : $(TARGET)
include Config
-VER = 005
+VER = 007
THISAPP = ddns-$(VER)
DL_FILE = $(THISAPP).tar.xz
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_MD5 = 5fb0e7c8a775ae03074ad90d5a251a4c
+$(DL_FILE)_MD5 = 44f63cecc36db0d9ffddfa4bca7983ae
install : $(TARGET)
@$(PREBUILD)
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/ddns/ddns-005-Add-changeip-com.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/ddns/ddns-005-SPDNS-fix-auth.patch
-
cd $(DIR_APP) && [ -x "configure" ] || sh ./autogen.sh
- cd $(DIR_APP) && ./configure --prefix=/usr --sysconfdir=/var/ipfire
+ cd $(DIR_APP) && ./configure \
+ --prefix=/usr \
+ --sysconfdir=/var/ipfire \
+ --disable-manpages
+
cd $(DIR_APP) && make $(MAKETUNING)
cd $(DIR_APP) && make install
###############################################################################
# #
# IPFire.org - A linux based firewall #
-# Copyright (C) 2007-2012 IPFire Team <info@ipfire.org> #
+# Copyright (C) 2007-2015 IPFire Team <info@ipfire.org> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
include Config
-VER = 4.2.2
+VER = 4.3.1
THISAPP = dhcp-$(VER)
DL_FILE = $(THISAPP).tar.gz
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_MD5 = bb0f0434cd796f76aa7cead391d71f31
+$(DL_FILE)_MD5 = b3a42ece3c7f2cd2e74a3e12ca881d20
install : $(TARGET)
@$(PREBUILD)
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.2-remove-bind.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-errwarn-message.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.2-options.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-release-by-ifup.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-dhclient-decline-backoff.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-unicast-bootp.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.2-dhclient-usage.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-default-requested-options.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.2-xen-checksum.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.1-manpages.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-paths.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.2-CLOEXEC.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-inherit-leases.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-garbage-chars.patch
- # ???
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-missing-ipv6-not-fatal.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-add_timeout_when_NULL.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.1-64_bit_lease_parse.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.2-capability.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-logpid.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-UseMulticast.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.1-sendDecline.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.1-retransmission.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.2-rfc3442-classless-static-routes.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-honor-expired.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-noprefixavail.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.2-sharedlib.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.0-PPP.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.2-lpf-ib.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.2-improved-xid.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.2-gpxe-cid.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp-4.2.1-invalid-dhclient-conf.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-remove-bind.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-errwarn-message.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-dhclient-options.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-release-by-ifup.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-dhclient-decline-backoff.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-unicast-bootp.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-default-requested-options.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-xen-checksum.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-manpages.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-paths.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-CLOEXEC.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-garbage-chars.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-add_timeout_when_NULL.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-64_bit_lease_parse.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-capability.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-logpid.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-UseMulticast.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-sendDecline.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-rfc3442-classless-static-routes.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-honor-expired.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-sharedlib.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-PPP.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-paranoia.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-lpf-ib.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-improved-xid.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-gpxe-cid.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-stateless-DUID-LLT.patch
# Remove bundled BIND stuff.
# (requires newer autoconf)
include Config
-VER = 1062667
+VER = 2.72
THISAPP = dnsmasq-$(VER)
-DL_FILE = $(THISAPP)-20150201.tar.gz
+DL_FILE = $(THISAPP).tar.xz
DL_FROM = $(URL_IPFIRE)
DIR_APP = $(DIR_SRC)/$(THISAPP)
TARGET = $(DIR_INFO)/$(THISAPP)
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_MD5 = ee58d033a892faa69b099ed598f500c2
+$(DL_FILE)_MD5 = 0256e0a71e27c8d8a5c89a0d18f3cfe2
install : $(TARGET)
$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
@$(PREBUILD)
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0001-Add-newline-at-the-end-of-example-config-file.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0002-crash-at-startup-when-an-empty-suffix-is-supplied-to.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0003-Debian-build-fixes-for-kFreeBSD.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0004-Set-conntrack-mark-before-connect-call.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0005-Fix-typo-in-new-Dbus-code.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0006-Fit-example-conf-file-typo.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0007-Improve-RFC-compliance-when-unable-to-supply-address.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0008-Fix-conntrack-with-bind-interfaces.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0009-Use-inotify-instead-of-polling-on-Linux.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0010-Teach-the-new-inotify-code-about-symlinks.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0011-Remove-floor-on-EDNS0-packet-size-with-DNSSEC.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0012-CHANGELOG-re.-inotify.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0013-Fix-breakage-of-domain-domain-subnet-local.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0014-Remove-redundant-IN6_IS_ADDR_ULA-a-macro-defn.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0015-Eliminate-IPv6-privacy-addresses-from-interface-name.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0016-Tweak-field-width-in-cache-dump-to-avoid-truncating-.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0017-Fix-crash-in-DNSSEC-code-when-attempting-to-verify-l.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0018-Make-caching-work-for-CNAMEs-pointing-to-A-AAAA-reco.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0019-Fix-problems-validating-NSEC3-and-wildcards.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0020-Initialise-return-value.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0021-Add-ignore-address-option.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0022-Bad-packet-protection.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0023-Fix-build-failure-in-new-inotify-code-on-BSD.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0024-Implement-makefile-dependencies-on-COPTS-variable.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0025-Fix-race-condition-issue-in-makefile.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0026-DNSSEC-do-top-down-search-for-limit-of-secure-delega.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0027-Add-log-queries-extra-option-for-more-complete-loggi.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0028-Add-min-cache-ttl-option.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0029-Log-port-of-requestor-when-doing-extra-logging.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0030-Don-t-answer-from-cache-RRsets-from-wildcards-as-we-.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0031-Logs-for-DS-records-consistent.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0032-Cope-with-multiple-interfaces-with-the-same-LL-addre.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0033-Don-t-treat-SERVFAIL-as-a-recoverable-error.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0034-Add-dhcp-hostsdir-config-option.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0035-Update-German-translation.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0036-Don-t-reply-to-DHCPv6-SOLICIT-messages-when-not-conf.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0037-Allow-inotify-to-be-disabled-at-compile-time-on-Linu.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0038-Expand-inotify-code-to-dhcp-hostsdir-dhcp-optsdir-an.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0039-Update-copyrights-for-dawn-of-2015.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0040-inotify-documentation-updates.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0041-Fix-broken-ECDSA-DNSSEC-signatures.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0042-BSD-make-support.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0043-Fix-build-failure-on-openBSD.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0044-Manpage-typo-fix.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0045-Fixup-dhcp-configs-after-reading-extra-hostfiles-wit.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0046-Extra-logging-for-inotify-code.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0047-man-page-typo.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0048-Fix-get-version-script-which-returned-wrong-tag-in-s.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0049-Typos.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0050-Make-dynamic-hosts-files-work-when-no-hosts-set.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0051-Fix-trivial-memory-leaks-to-quieten-valgrind.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0052-Fix-uninitialized-value-used-in-get_client_mac.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0053-Log-parsing-utils-in-contrib-reverse-dns.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0054-Add-dnssec-timestamp-option-and-facility.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0055-Fix-last-commit-to-not-crash-if-uid-changing-not-con.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0056-New-version-of-contrib-reverse-dns.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq/0057-Tweak-DNSSEC-timestamp-code-to-create-file-later-rem.patch
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/dnsmasq-Add-support-to-read-ISC-DHCP-lease-file.patch
cd $(DIR_APP) && sed -i src/config.h \
-e 's|/\* #define HAVE_IDN \*/|#define HAVE_IDN|g' \
###############################################################################
# #
# IPFire.org - A linux based firewall #
-# Copyright (C) 2007 Michael Tremer & Christian Schmidt #
+# Copyright (C) 2015 Michael Tremer & Christian Schmidt #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
include Config
-VER = 2.8.3
+VER = 2.9.3
THISAPP = fuse-$(VER)
DL_FILE = $(THISAPP).tar.gz
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_MD5 = 517c8384f915e40647bda9f71579fd97
+$(DL_FILE)_MD5 = 33cae22ca50311446400daf8a6255c6a
install : $(TARGET)
###############################################################################
# #
# IPFire.org - A linux based firewall #
-# Copyright (C) 2007 Michael Tremer & Christian Schmidt #
+# Copyright (C) 2013 IPFire Team <info@ipfire.org> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
include Config
-VER = 2.0.24.1
+VER = 1.5.11
-THISAPP = teamspeak-$(VER)
+THISAPP = haproxy-$(VER)
+DL_FILE = $(THISAPP).tar.gz
+DL_FROM = $(URL_IPFIRE)
+DIR_APP = $(DIR_SRC)/$(THISAPP)
TARGET = $(DIR_INFO)/$(THISAPP)
-PROG = teamspeak
-PAK_VER = 2
+PROG = haproxy
+PAK_VER = 1
DEPS = ""
# Top-level Rules
###############################################################################
-objects =
+objects = $(DL_FILE)
+
+$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
+
+$(DL_FILE)_MD5 = 5500a79d0d2b238d4a1e9749bd0c2cb2
install : $(TARGET)
-check :
+check : $(patsubst %,$(DIR_CHK)/%,$(objects))
-download :
+download :$(patsubst %,$(DIR_DL)/%,$(objects))
-md5 :
+md5 : $(subst %,%_MD5,$(objects))
-dist:
+dist:
@$(PAK)
+###############################################################################
+# Downloading, checking, md5sum
+###############################################################################
+
+$(patsubst %,$(DIR_CHK)/%,$(objects)) :
+ @$(CHECK)
+
+$(patsubst %,$(DIR_DL)/%,$(objects)) :
+ @$(LOAD)
+
+$(subst %,%_MD5,$(objects)) :
+ @$(MD5)
+
###############################################################################
# Installation Details
###############################################################################
-$(TARGET) :
+$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
@$(PREBUILD)
- -mkdir -p /opt/teamspeak
- install -v -m 644 $(DIR_SRC)/config/backup/includes/teamspeak \
- /var/ipfire/backup/addons/includes/teamspeak
+ @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
+
+ cd $(DIR_APP) && make $(MAKETUNING) CPU="generic" TARGET="linux2628" \
+ USE_OPENSSL=1 USE_PCRE=1 USE_ZLIB=1 USE_REGPARM=1 \
+ ADDINC="$(CFLAGS)" USE_LINUX_TPROXY=1 ADDLIB="$(LDFLAGS)"
+
+ cd $(DIR_APP) && make install-bin install-man PREFIX=/usr
+
+ -mkdir -pv /etc/haproxy /var/lib/haproxy
+ install -v -m 644 $(DIR_SRC)/config/haproxy/haproxy.cfg \
+ /etc/haproxy/haproxy.cfg
+
+ install -v -m 644 $(DIR_SRC)/config/backup/includes/haproxy \
+ /var/ipfire/backup/addons/includes/haproxy
+
+ # Restore initscript
+ install -v -m 754 $(DIR_SRC)/src/initscripts/init.d/haproxy \
+ /etc/rc.d/init.d/haproxy
+
+ @rm -rf $(DIR_APP)
@$(POSTBUILD)
ln -sf ../init.d/firstsetup /etc/rc.d/rcsysinit.d/S75firstsetup
ln -sf ../init.d/localnet /etc/rc.d/rcsysinit.d/S80localnet
ln -sf ../init.d/firewall /etc/rc.d/rcsysinit.d/S85firewall
+ ln -sf ../init.d/network-trigger /etc/rc.d/rcsysinit.d/S90network-trigger
ln -sf ../init.d/network-vlans /etc/rc.d/rcsysinit.d/S91network-vlans
ln -sf ../init.d/rngd /etc/rc.d/rcsysinit.d/S92rngd
ln -sf ../init.d/wlanclient /etc/rc.d/rc0.d/K82wlanclient
md5 : $(subst %,%_MD5,$(objects))
+dist:
+ @$(PAK)
+
###############################################################################
# Downloading, checking, md5sum
###############################################################################
include Config
-VER = 3.14.32
+VER = 3.14.33
-RPI_PATCHES = 3.14.32-grsec-ipfire1
-A7M_PATCHES = 3.14.32-grsec-ipfire1
-GRS_PATCHES = grsecurity-3.0-3.14.32-201502062101.patch.xz
+RPI_PATCHES = 3.14.33-grsec-ipfire1
+A7M_PATCHES = 3.14.33-grsec-ipfire1
+GRS_PATCHES = grsecurity-3.0-3.14.33-201502180832.patch.xz
THISAPP = linux-$(VER)
DL_FILE = linux-$(VER).tar.xz
arm7-multi-patches-$(A7M_PATCHES).patch.xz = $(URL_IPFIRE)/arm7-multi-patches-$(A7M_PATCHES).patch.xz
$(GRS_PATCHES) = $(URL_IPFIRE)/$(GRS_PATCHES)
-$(DL_FILE)_MD5 = 3178fb8f6f1eafcffdd730fec68754f8
-rpi-patches-$(RPI_PATCHES).patch.xz_MD5 = 375dc501711ff3ffeffdfc9848675d26
-arm7-multi-patches-$(A7M_PATCHES).patch.xz_MD5 = efcfe5889f120d879387dd4ebe881587
-$(GRS_PATCHES)_MD5 = c1565eb2a630a673f3ace31a6901e251
+$(DL_FILE)_MD5 = c19feb0646fde7e96602ac313fb7e5d6
+rpi-patches-$(RPI_PATCHES).patch.xz_MD5 = e423c8b3a408f23b9a26f8f0f4384c50
+arm7-multi-patches-$(A7M_PATCHES).patch.xz_MD5 = f147ce7c81889d2c5134304f3a6e60e3
+$(GRS_PATCHES)_MD5 = 119943451628ff5a62437637d60a585d
install : $(TARGET)
# Apply Arm7-multiarch kernel patches.
cd $(DIR_APP) && xzcat $(DIR_DL)/arm7-multi-patches-$(A7M_PATCHES).patch.xz | patch -Np1
- # Update Banana Pi, Lamobo-R1 and add Banana Pro dtb
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.14.x-update_banana_dts.patch
-
# Install switch api userspace header
cd $(DIR_APP) && install -v -m644 include/uapi/linux/switch.h /usr/include/linux/
+
+ # Fix Lamobo-R1 SATA Power
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.14.x-lamobo-r1-fix-sata-pwr.patch
endif
ifeq "$(KCFG)" "-rpi"
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
cd $(DIR_APP) && make $(MAKETUNING)
cd $(DIR_APP) && make install
- touch /var/lib/logrotate.status
+ mkdir -pv /etc/logrotate.d
+ touch /etc/logrotate.d/.empty /var/lib/logrotate.status
@rm -rf $(DIR_APP)
@$(POSTBUILD)
###############################################################################
# #
# IPFire.org - A linux based firewall #
-# Copyright (C) 2009 Michael Tremer & Christian Schmidt #
+# Copyright (C) 2015 Michael Tremer & Christian Schmidt #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
include Config
-VER = 2011.1.15
+VER = 2014.2.15
-THISAPP = ntfs-3g-$(VER)
+THISAPP = ntfs-3g_ntfsprogs-$(VER)
DL_FILE = $(THISAPP).tgz
DL_FROM = $(URL_IPFIRE)
DIR_APP = $(DIR_SRC)/$(THISAPP)
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_MD5 = 15a5cf5752012269fa168c24191f00e2
+$(DL_FILE)_MD5 = f11d563816249d730a00498983485f3a
install : $(TARGET)
include Config
-VER = 7.0.0
+VER = 7.0.3
THISAPP = owncloud-$(VER)
DL_FILE = $(THISAPP).tar.bz2
DIR_APP = $(DIR_SRC)/$(THISAPP)
TARGET = $(DIR_INFO)/$(THISAPP)
PROG = owncloud
-PAK_VER = 2
+PAK_VER = 4
DEPS = ""
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_MD5 = 28cfdc99e8ee9350fe88430b4c7d62f2
+$(DL_FILE)_MD5 = d5d2ad068046e6ddb322cf001a9bb3d5
install : $(TARGET)
###############################################################################
# #
# IPFire.org - A linux based firewall #
-# Copyright (C) 2007-2014 IPFire Team <info@ipfire.org> #
+# Copyright (C) 2007-2015 IPFire Team <info@ipfire.org> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
include Config
-VER = 3.6.24
+VER = 3.6.25
THISAPP = samba-$(VER)
DL_FILE = $(THISAPP).tar.gz
DIR_APP = $(DIR_SRC)/$(THISAPP)
TARGET = $(DIR_INFO)/$(THISAPP)
PROG = samba
-PAK_VER = 59
+PAK_VER = 60
DEPS = "cups krb5"
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_MD5 = d98425c0c2b73e08f048d31ffc727fb0
+$(DL_FILE)_MD5 = 76da2fa64edd94a0188531e7ecb27c4e
install : $(TARGET)
@$(PREBUILD)
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/strongswan-5.0.2_ipfire.patch
- cd $(DIR_APP) && patch -Np1 --ignore-whitespace \
- -i $(DIR_SRC)/src/patches/strongswan-5.2.2-issue-816.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/strongswan-5.2.2-issue-816-eb25190.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/strongswan-5.2.2-issue-816-650a3ad.patch
+ cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/strongswan-5.2.2-issue-816-dd0ebb.patch
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/strongswan-5.2.2-issue-819-cd2c30a.patch
cd $(DIR_APP) && [ -x "configure" ] || ./autogen.sh
--enable-farp \
--enable-openssl \
--enable-gcrypt \
+ --enable-gcm \
--enable-xauth-eap \
--enable-xauth-noauth \
--enable-eap-radius \
rm -f /lib/udev/rules.d/75-persistent-net-generator.rules
rm -f /lib/udev/rules.d/80-net-name-slot.rules
- # Create rule file for the setup
- touch /etc/udev/rules.d/30-persistent-network.rules
-
# Blacklist some modules
cp -vf $(DIR_SRC)/config/udev/blacklist.conf /etc/modprobe.d/blacklist.conf
install -v -m 644 $(DIR_SRC)/config/udev/25-alsa.rules \
/lib/udev/rules.d
+ # Install network rules.
+ install -v -m 755 $(DIR_SRC)/config/udev/network-hotplug-rename \
+ /lib/udev/network-hotplug-rename
+ install -v -m 644 $(DIR_SRC)/config/udev/60-net.rules \
+ /lib/udev/rules.d
+
# Install hwrng rules.
install -v -m 644 $(DIR_SRC)/config/udev/90-hwrng.rules \
/lib/udev/rules.d
NAME="IPFire" # Software name
SNAME="ipfire" # Short name
VERSION="2.17" # Version number
-CORE="87-rc1" # Core Level (Filename)
-PAKFIRE_CORE="86" # Core Level (PAKFIRE)
+CORE="87" # Core Level (Filename)
+PAKFIRE_CORE="87" # Core Level (PAKFIRE)
GIT_BRANCH=`git rev-parse --abbrev-ref HEAD` # Git Branch
SLOGAN="www.ipfire.org" # Software slogan
CONFIG_ROOT=/var/ipfire # Configuration rootdir
ipfiremake lm_sensors
ipfiremake liboping
ipfiremake collectd
- ipfiremake teamspeak
ipfiremake elinks
ipfiremake igmpproxy
ipfiremake fbset
ipfiremake pigz
ipfiremake tmux
ipfiremake swconfig
+ ipfiremake haproxy
}
buildinstaller() {
TRUST_ANCHOR=".,19036,8,2,49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5"
function dnssec_args() {
- local cmdline="--dnssec"
+ local cmdline="--dnssec --dnssec-timestamp"
if [ -n "${TRUST_ANCHOR}" ]; then
cmdline="${cmdline} --trust-anchor=${TRUST_ANCHOR}"
--- /dev/null
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/haproxy
+#
+# Description : HAProxy init script
+#
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+ start)
+ boot_mesg "Starting HAProxy..."
+ loadproc /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg \
+ -p /var/run/haproxy.pid
+ ;;
+
+ stop)
+ boot_mesg "Stopping HAProxy..."
+ killproc /usr/sbin/haproxy
+ ;;
+
+ reload)
+ boot_mesg "Reloading HAProxy..."
+ /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg \
+ -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
+ evaluate_retval
+ ;;
+
+ restart)
+ ${0} stop
+ sleep 1
+ ${0} start
+ ;;
+
+ status)
+ statusproc /usr/sbin/haproxy
+ ;;
+
+ *)
+ echo "Usage: ${0} {start|stop|reload|restart|status}"
+ exit 1
+ ;;
+esac
+
+# End $rc_base/init.d/haproxy
--- /dev/null
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/network-trigger
+########################################################################
+
+. /etc/sysconfig/rc
+. ${rc_functions}
+
+case "${1}" in
+ start)
+ boot_mesg "Triggering network devices..."
+ udevadm trigger --action="add" --subsystem-match="net"
+ evaluate_retval
+ ;;
+
+ *)
+ echo "Usage: ${0} {start}"
+ exit 1
+ ;;
+esac
+
+# End $rc_base/init.d/network-trigger
+++ /dev/null
-#!/bin/sh
-########################################################################
-# Begin $rc_base/init.d/teamspeak
-#
-# Description : Start/Stops the teamspeak server
-#
-# Authors : Michael Tremer
-#
-# Version : 01.00
-#
-# Notes :
-#
-########################################################################
-
-. /etc/sysconfig/rc
-. $rc_functions
-
-case "$1" in
- status)
- statusproc /opt/teamspeak/server_linux
- ;;
- *)
- export LANG=en_US.utf8
- cd /opt/teamspeak && sudo -u teamspeak ./teamspeak2-server_startscript $*
- exit 0
- ;;
-esac
-# End $rc_base/init.d/teamspeak
"%s - %s", size_str, p);
}
+ // Cut off the description string after 40 characters
+ disk->description[41] = '\0';
+
*disks++ = disk;
if (--i == 0)
newtPopWindow();
- /* Set marker that the user has already accepted the gpl */
- mysystem(logfile, "/usr/bin/touch /harddisk/var/ipfire/main/gpl_accepted");
+ /* Set marker that the user has already accepted the GPL if the license has been shown
+ * in the installation process. In unatteded mode, the user will be presented the
+ * license when he or she logs on to the web user interface for the first time. */
+ if (!config.unattended)
+ mysystem(logfile, "/usr/bin/touch /harddisk/var/ipfire/main/gpl_accepted");
/* Copy restore file from cdrom */
char* backup_file = hw_find_backup_file(logfile, SOURCE_MOUNT_PATH);
id
it
ja
-ja_JP
jv
km_KH
nl
pt_PT
ro_RO
ru
-ru_RU
rw
sk
sq
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
-# Henrik Simonsen <cybermaze@gmail.com>, 2014
+# Henrik Simonsen <cybermaze@gmail.com>, 2014-2015
msgid ""
msgstr ""
"Project-Id-Version: IPFire Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-11-05 01:29+0000\n"
-"PO-Revision-Date: 2014-11-05 01:33+0000\n"
-"Last-Translator: Michael Tremer <michael.tremer@ipfire.org>\n"
+"PO-Revision-Date: 2015-01-13 21:22+0000\n"
+"Last-Translator: Henrik Simonsen <cybermaze@gmail.com>\n"
"Language-Team: Danish (http://www.transifex.com/projects/p/ipfire/language/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
#: main.c:384
msgid "Warning: Unattended installation will start in 10 seconds..."
-msgstr ""
+msgstr "Advarsel: Installation uden opsyn starter om 10 sekunder..."
#: main.c:403
msgid "Language selection"
#: main.c:418
msgid "Unattended mode"
-msgstr ""
+msgstr "Uden opsyn"
#: main.c:420
msgid "<Tab>/<Alt-Tab> between elements | <Space> selects | <F12> next screen"
#: main.c:449
#, c-format
msgid "The installer will now try downloading the installation image."
-msgstr ""
+msgstr "Installationen vil nu forsøge at hente installationsbilledet."
#: main.c:452
#, c-format
"No source drive could be found.\n"
"\n"
"You can try downloading the required installation image."
-msgstr ""
+msgstr "Kunne ikke finde et kildedrev.\n\nDu kan prøve at hente det påkrævede installationsbillede."
#: main.c:456
msgid ""
"Please make sure to connect your machine to a network and the installer will"
" try connect to acquire an IP address."
-msgstr ""
+msgstr "Sørg venligst for at din computer er forbundet til et netværk, så vil installationen forsøge at skaffe en IP adresse."
#: main.c:460
msgid "Download installation image"
-msgstr ""
+msgstr "Hent installationsbillede"
#: main.c:473
msgid "Trying to start networking (DHCP)..."
-msgstr ""
+msgstr "Prøver at starte netværk (DHCP)..."
#: main.c:484
msgid ""
"Networking could not be started but is required to go on with the installation.\n"
"\n"
"Please connect your machine to a network with a DHCP server and retry."
-msgstr ""
+msgstr "Kunne ikke oprette forbindelse til et netværk hvilket er nødvendigt for installationen.\n\nForbind venligst din computer til et netværk med en DHCP server og prøv igen."
#: main.c:487 main.c:516
msgid "Retry"
-msgstr ""
+msgstr "Prøv igen"
#: main.c:501
msgid "Downloading installation image..."
-msgstr ""
+msgstr "Henter installationsbillede..."
#: main.c:510
#, c-format
msgid "MD5 checksum mismatch"
-msgstr ""
+msgstr "MD5 checksum mismatch"
#: main.c:513
#, c-format
" Reason: %s\n"
"\n"
"%s"
-msgstr ""
+msgstr "Installationsbilledet kunne ikke hentes.\n Årsag: %s\n\n%s"
#: main.c:528
#, c-format
msgid ""
"Could not mount %s to %s:\n"
" %s\n"
-msgstr ""
+msgstr "Kunne ikke montere %s til %s:\n %s\n"
#: main.c:543
msgid "License Agreement"
#: main.c:640
msgid "Your disk configuration is currently not supported."
-msgstr ""
+msgstr "Din drev konfiguration er ikke understøttet pt."
#: main.c:655
msgid "Your harddisk is too small."
-msgstr "Din harddisk er for lille."
+msgstr "Din harddisk har for lille kapacitet."
#: main.c:671
msgid ""
"Your harddisk is very small, but you can continue without a swap partition."
-msgstr "Din harddisk er meget lille, men du kan fortsætte uden en swap partition."
+msgstr "Din harddisk har meget lille kapacitet, men du kan fortsætte uden en swap partition."
#: main.c:684
msgid "ext4 Filesystem"
"A backup file has been found on the installation image.\n"
"\n"
"Do you want to restore the backup?"
-msgstr ""
+msgstr "En backup fil er fundet på installationsbilledet.\n\nØnsker du at genskabe denne backup?"
#: main.c:827
msgid "Yes"
-msgstr ""
+msgstr "Ja"
#: main.c:827
msgid "No"
-msgstr ""
+msgstr "Nej"
#: main.c:834
msgid "An error occured when the backup file was restored."
-msgstr ""
+msgstr "Der opstod en fejl under forsøget på at genskabe backup filen."
#: main.c:869
msgid "Running post-install script..."
-msgstr ""
+msgstr "Kører efter-installation script..."
#: main.c:870
msgid "Post-install script failed."
-msgstr ""
+msgstr "Efter-installation script fejlede."
#: main.c:877
#, c-format
"Project-Id-Version: IPFire Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-11-05 01:29+0000\n"
-"PO-Revision-Date: 2015-01-26 07:48+0000\n"
+"PO-Revision-Date: 2015-02-17 23:49+0000\n"
"Last-Translator: Khalil Delavaran <khalil.delavaran@gmail.com>\n"
"Language-Team: Persian (http://www.transifex.com/projects/p/ipfire/language/fa/)\n"
"MIME-Version: 1.0\n"
#: main.c:449
#, c-format
msgid "The installer will now try downloading the installation image."
-msgstr ""
+msgstr "برنامه نصب تلاش خواهد کرد که ایمیج نصب را دانلود کند."
#: main.c:452
#, c-format
msgid ""
"Please make sure to connect your machine to a network and the installer will"
" try connect to acquire an IP address."
-msgstr ""
+msgstr "لطفا مطمئن شوید که دستگاه شما به شبکه متصل است و برنامه نصب برای بدست آوردن IP تلاش خواهد کرد."
#: main.c:460
msgid "Download installation image"
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# nonux <nonux@free.fr>, 2015
msgid ""
msgstr ""
"Project-Id-Version: IPFire Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-11-05 01:29+0000\n"
-"PO-Revision-Date: 2014-11-05 01:33+0000\n"
-"Last-Translator: Michael Tremer <michael.tremer@ipfire.org>\n"
+"PO-Revision-Date: 2015-02-17 23:23+0000\n"
+"Last-Translator: nonux <nonux@free.fr>\n"
"Language-Team: French (http://www.transifex.com/projects/p/ipfire/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
#: main.c:79 main.c:460 main.c:487 main.c:516 main.c:620 main.c:630 main.c:670
#: main.c:702
msgid "Cancel"
-msgstr ""
+msgstr "Annuler"
#: main.c:176
msgid "I accept this license"
-msgstr ""
+msgstr "J'accepte la licence"
#: main.c:384
msgid "Warning: Unattended installation will start in 10 seconds..."
#: main.c:403
msgid "Language selection"
-msgstr ""
+msgstr "Sélection de la langue"
#: main.c:403
msgid "Select the language you wish to use for the installation."
-msgstr ""
+msgstr "Sélectionnez la langue que vous souhaitez utiliser pour l'installation."
#: main.c:418
msgid "Unattended mode"
#: main.c:428
msgid "Start installation"
-msgstr ""
+msgstr "Démarrer l'installation"
#: main.c:449
#, c-format
msgid "The installer will now try downloading the installation image."
-msgstr ""
+msgstr "Le programme d'installation va maintenant essayer de télécharger l'image d'installation."
#: main.c:452
#, c-format
#: main.c:460
msgid "Download installation image"
-msgstr ""
+msgstr "Télécharger l'image d'installation"
#: main.c:473
msgid "Trying to start networking (DHCP)..."
-msgstr ""
+msgstr "Tente de démarrer le réseau (DHCP)..."
#: main.c:484
msgid ""
#: main.c:487 main.c:516
msgid "Retry"
-msgstr ""
+msgstr "Ré-essayer"
#: main.c:501
msgid "Downloading installation image..."
-msgstr ""
+msgstr "Téléchargement de l'image d'installation ..."
#: main.c:510
#, c-format
#: main.c:543
msgid "License Agreement"
-msgstr ""
+msgstr "Contrat de licence"
#: main.c:544
msgid "License not accepted!"
-msgstr ""
+msgstr "Contrat de licence non accepté!"
#: main.c:566
msgid "No hard disk found."
-msgstr ""
+msgstr "Aucun disque dur trouvé."
#: main.c:587
msgid "Disk Selection"
-msgstr ""
+msgstr "Sélection du disque"
#: main.c:588
msgid ""
#: main.c:619
msgid "Disk Setup"
-msgstr ""
+msgstr "Configuration du disque"
#: main.c:620 main.c:630
msgid "Delete all data"
-msgstr ""
+msgstr "Supprime toutes les données"
#: main.c:627
#, c-format
#: main.c:640
msgid "Your disk configuration is currently not supported."
-msgstr ""
+msgstr "La configuration du disque n'est pas actuellement supportée."
#: main.c:655
msgid "Your harddisk is too small."
-msgstr ""
+msgstr "Votre disque dur est trop petit."
#: main.c:671
msgid ""
"Your harddisk is very small, but you can continue without a swap partition."
-msgstr ""
+msgstr "Votre disque dur est très petit, mais vous pouvez continuer sans la partition d'échange."
#: main.c:684
msgid "ext4 Filesystem"
-msgstr ""
+msgstr "Système de fichier ext4"
#: main.c:685
msgid "ext4 Filesystem without journal"
-msgstr ""
+msgstr "Système de fichier ext4 sans journalisation"
#: main.c:686
msgid "XFS Filesystem"
-msgstr ""
+msgstr "Système de fichier XFS"
#: main.c:687
msgid "ReiserFS Filesystem"
-msgstr ""
+msgstr "Système de fichier ReiserFS"
#: main.c:701
msgid "Filesystem Selection"
-msgstr ""
+msgstr "Choix du système de fichier"
#: main.c:701
msgid "Please choose your filesystem:"
-msgstr ""
+msgstr "Merci de choisir votre système de fichier : "
#: main.c:712
msgid "Building RAID..."
-msgstr ""
+msgstr "Contruction du RAID..."
#: main.c:716
msgid "Unable to build the RAID."
-msgstr ""
+msgstr "Impossible de construire le RAID."
#: main.c:728
msgid "Partitioning disk..."
-msgstr ""
+msgstr "Partitionnement du disque..."
#: main.c:732
msgid "Unable to partition the disk."
-msgstr ""
+msgstr "Impossible de partitionner le disque."
#: main.c:739
msgid "Creating filesystems..."
-msgstr ""
+msgstr "Création des systèmes de fichiers"
#: main.c:743
msgid "Unable to create filesystems."
-msgstr ""
+msgstr "Impossible de créer les systèmes de fichiers."
#: main.c:749
msgid "Unable to mount filesystems."
-msgstr ""
+msgstr "Impossible de monter les systèmes de fichiers."
#: main.c:760
msgid "Installing the system..."
-msgstr ""
+msgstr "Installation du système..."
#: main.c:761
msgid "Unable to install the system."
-msgstr ""
+msgstr "Impossible d'installer le système."
#: main.c:777
msgid "Installing the language cache..."
#: main.c:827
msgid "Yes"
-msgstr ""
+msgstr "Oui"
#: main.c:827
msgid "No"
-msgstr ""
+msgstr "Non"
#: main.c:834
msgid "An error occured when the backup file was restored."
#: main.c:882
msgid "Reboot"
-msgstr ""
+msgstr "Re-démarrer"
#: main.c:893
msgid "Setup has failed. Press Ok to reboot."
-msgstr ""
+msgstr "La configuration a échoué. Appuyez sur OK pour re-démarrer."
+++ /dev/null
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR The IPFire Project (www.ipfire.org)
-# This file is distributed under the same license as the PACKAGE package.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: IPFire Project\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-11-05 01:29+0000\n"
-"PO-Revision-Date: 2014-07-31 09:39+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/ipfire/language/ja_JP/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: ja_JP\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-#: main.c:78 main.c:179 main.c:404 main.c:670 main.c:702 main.c:893
-msgid "OK"
-msgstr ""
-
-#: main.c:79 main.c:460 main.c:487 main.c:516 main.c:620 main.c:630 main.c:670
-#: main.c:702
-msgid "Cancel"
-msgstr ""
-
-#: main.c:176
-msgid "I accept this license"
-msgstr ""
-
-#: main.c:384
-msgid "Warning: Unattended installation will start in 10 seconds..."
-msgstr ""
-
-#: main.c:403
-msgid "Language selection"
-msgstr ""
-
-#: main.c:403
-msgid "Select the language you wish to use for the installation."
-msgstr ""
-
-#: main.c:418
-msgid "Unattended mode"
-msgstr ""
-
-#: main.c:420
-msgid "<Tab>/<Alt-Tab> between elements | <Space> selects | <F12> next screen"
-msgstr ""
-
-#: main.c:426
-#, c-format
-msgid ""
-"Welcome to the %s installation program.\n"
-"\n"
-"Selecting Cancel on any of the following screens will reboot the computer."
-msgstr ""
-
-#: main.c:428
-msgid "Start installation"
-msgstr ""
-
-#: main.c:449
-#, c-format
-msgid "The installer will now try downloading the installation image."
-msgstr ""
-
-#: main.c:452
-#, c-format
-msgid ""
-"No source drive could be found.\n"
-"\n"
-"You can try downloading the required installation image."
-msgstr ""
-
-#: main.c:456
-msgid ""
-"Please make sure to connect your machine to a network and the installer will"
-" try connect to acquire an IP address."
-msgstr ""
-
-#: main.c:460
-msgid "Download installation image"
-msgstr ""
-
-#: main.c:473
-msgid "Trying to start networking (DHCP)..."
-msgstr ""
-
-#: main.c:484
-msgid ""
-"Networking could not be started but is required to go on with the installation.\n"
-"\n"
-"Please connect your machine to a network with a DHCP server and retry."
-msgstr ""
-
-#: main.c:487 main.c:516
-msgid "Retry"
-msgstr ""
-
-#: main.c:501
-msgid "Downloading installation image..."
-msgstr ""
-
-#: main.c:510
-#, c-format
-msgid "MD5 checksum mismatch"
-msgstr ""
-
-#: main.c:513
-#, c-format
-msgid ""
-"The installation image could not be downloaded.\n"
-" Reason: %s\n"
-"\n"
-"%s"
-msgstr ""
-
-#: main.c:528
-#, c-format
-msgid ""
-"Could not mount %s to %s:\n"
-" %s\n"
-msgstr ""
-
-#: main.c:543
-msgid "License Agreement"
-msgstr ""
-
-#: main.c:544
-msgid "License not accepted!"
-msgstr ""
-
-#: main.c:566
-msgid "No hard disk found."
-msgstr ""
-
-#: main.c:587
-msgid "Disk Selection"
-msgstr ""
-
-#: main.c:588
-msgid ""
-"Select the disk(s) you want to install IPFire on. First those will be partitioned, and then the partitions will have a filesystem put on them.\n"
-"\n"
-"ALL DATA ON THE DISK WILL BE DESTROYED."
-msgstr ""
-
-#: main.c:599
-msgid ""
-"No disk has been selected.\n"
-"\n"
-"Please select one or more disks you want to install IPFire on."
-msgstr ""
-
-#: main.c:617
-#, c-format
-msgid ""
-"The installation program will now prepare the chosen harddisk:\n"
-"\n"
-" %s\n"
-"\n"
-"Do you agree to continue?"
-msgstr ""
-
-#: main.c:619
-msgid "Disk Setup"
-msgstr ""
-
-#: main.c:620 main.c:630
-msgid "Delete all data"
-msgstr ""
-
-#: main.c:627
-#, c-format
-msgid ""
-"The installation program will now set up a RAID configuration on the selected harddisks:\n"
-"\n"
-" %s\n"
-" %s\n"
-"\n"
-"Do you agree to continue?"
-msgstr ""
-
-#: main.c:629
-msgid "RAID Setup"
-msgstr ""
-
-#: main.c:640
-msgid "Your disk configuration is currently not supported."
-msgstr ""
-
-#: main.c:655
-msgid "Your harddisk is too small."
-msgstr ""
-
-#: main.c:671
-msgid ""
-"Your harddisk is very small, but you can continue without a swap partition."
-msgstr ""
-
-#: main.c:684
-msgid "ext4 Filesystem"
-msgstr ""
-
-#: main.c:685
-msgid "ext4 Filesystem without journal"
-msgstr ""
-
-#: main.c:686
-msgid "XFS Filesystem"
-msgstr ""
-
-#: main.c:687
-msgid "ReiserFS Filesystem"
-msgstr ""
-
-#: main.c:701
-msgid "Filesystem Selection"
-msgstr ""
-
-#: main.c:701
-msgid "Please choose your filesystem:"
-msgstr ""
-
-#: main.c:712
-msgid "Building RAID..."
-msgstr ""
-
-#: main.c:716
-msgid "Unable to build the RAID."
-msgstr ""
-
-#: main.c:728
-msgid "Partitioning disk..."
-msgstr ""
-
-#: main.c:732
-msgid "Unable to partition the disk."
-msgstr ""
-
-#: main.c:739
-msgid "Creating filesystems..."
-msgstr ""
-
-#: main.c:743
-msgid "Unable to create filesystems."
-msgstr ""
-
-#: main.c:749
-msgid "Unable to mount filesystems."
-msgstr ""
-
-#: main.c:760
-msgid "Installing the system..."
-msgstr ""
-
-#: main.c:761
-msgid "Unable to install the system."
-msgstr ""
-
-#: main.c:777
-msgid "Installing the language cache..."
-msgstr ""
-
-#: main.c:778
-msgid "Unable to install the language cache."
-msgstr ""
-
-#: main.c:783
-msgid "Installing the bootloader..."
-msgstr ""
-
-#: main.c:790
-msgid "Unable to open /etc/default/grub for writing."
-msgstr ""
-
-#: main.c:812
-msgid "Unable to install the bootloader."
-msgstr ""
-
-#: main.c:826
-msgid ""
-"A backup file has been found on the installation image.\n"
-"\n"
-"Do you want to restore the backup?"
-msgstr ""
-
-#: main.c:827
-msgid "Yes"
-msgstr ""
-
-#: main.c:827
-msgid "No"
-msgstr ""
-
-#: main.c:834
-msgid "An error occured when the backup file was restored."
-msgstr ""
-
-#: main.c:869
-msgid "Running post-install script..."
-msgstr ""
-
-#: main.c:870
-msgid "Post-install script failed."
-msgstr ""
-
-#: main.c:877
-#, c-format
-msgid ""
-"%s was successfully installed!\n"
-"\n"
-"Please remove any installation mediums from this system and hit the reboot button. Once the system has restarted you will be asked to setup networking and system passwords. After that, you should point your web browser at https://%s:444 (or what ever you name your %s) for the web configuration console."
-msgstr ""
-
-#: main.c:882
-msgid "Congratulations!"
-msgstr ""
-
-#: main.c:882
-msgid "Reboot"
-msgstr ""
-
-#: main.c:893
-msgid "Setup has failed. Press Ok to reboot."
-msgstr ""
#
# Translators:
# André Felipe Morro <andre@andremorro.com>, 2014
+# Evertton de Lima <e.everttonlima@gmail.com>, 2015
# Leandro Luquetti Basilio da Silva <leandroluquetti@gmail.com>, 2014
msgid ""
msgstr ""
"Project-Id-Version: IPFire Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-11-05 01:29+0000\n"
-"PO-Revision-Date: 2014-11-05 01:33+0000\n"
-"Last-Translator: Michael Tremer <michael.tremer@ipfire.org>\n"
+"PO-Revision-Date: 2015-02-16 23:04+0000\n"
+"Last-Translator: Evertton de Lima <e.everttonlima@gmail.com>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/ipfire/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
#: main.c:384
msgid "Warning: Unattended installation will start in 10 seconds..."
-msgstr ""
+msgstr "Cuidado: A instalação irá iniciar em 10 segundos..."
#: main.c:403
msgid "Language selection"
-msgstr ""
+msgstr "Seleção de idioma"
#: main.c:403
msgid "Select the language you wish to use for the installation."
-msgstr ""
+msgstr "Selecione o idioma que você deseja usar para a instalação."
#: main.c:418
msgid "Unattended mode"
-msgstr ""
+msgstr "Modo automático"
#: main.c:420
msgid "<Tab>/<Alt-Tab> between elements | <Space> selects | <F12> next screen"
"Welcome to the %s installation program.\n"
"\n"
"Selecting Cancel on any of the following screens will reboot the computer."
-msgstr ""
+msgstr "Bem-vindo para o programa de instalação %s.\n\nSelecionando Cancelar em qualquer uma das telas seguintes irá reiniciar o computador."
#: main.c:428
msgid "Start installation"
#: main.c:449
#, c-format
msgid "The installer will now try downloading the installation image."
-msgstr ""
+msgstr "O instalador irá tentar baixar a imagem de instalação agora."
#: main.c:452
#, c-format
#: main.c:460
msgid "Download installation image"
-msgstr ""
+msgstr "Baixar imagem de instalação"
#: main.c:473
msgid "Trying to start networking (DHCP)..."
-msgstr ""
+msgstr "Tentando iniciar a rede (DHCP)..."
#: main.c:484
msgid ""
"Networking could not be started but is required to go on with the installation.\n"
"\n"
"Please connect your machine to a network with a DHCP server and retry."
-msgstr ""
+msgstr "Rede não pode ser iniciado, mas é necessária para continuar a instalação.\n\nPor favor, conecte sua máquina a uma rede com servidor DHCP e reinicie."
#: main.c:487 main.c:516
msgid "Retry"
-msgstr ""
+msgstr "Tentar novamente"
#: main.c:501
msgid "Downloading installation image..."
-msgstr ""
+msgstr "Baixando imagem de instalação..."
#: main.c:510
#, c-format
" Reason: %s\n"
"\n"
"%s"
-msgstr ""
+msgstr "A imagem de instalação não pode ser baixada.\nMotivo: %s\n\n%s"
#: main.c:528
#, c-format
msgid ""
"Could not mount %s to %s:\n"
" %s\n"
-msgstr ""
+msgstr "Não pode montar %s para %s:\n%s\n"
#: main.c:543
msgid "License Agreement"
-msgstr ""
+msgstr "Contrato de Licença"
#: main.c:544
msgid "License not accepted!"
#: main.c:640
msgid "Your disk configuration is currently not supported."
-msgstr ""
+msgstr "Sua configuração de disco não é suportada atualmente."
#: main.c:655
msgid "Your harddisk is too small."
#: main.c:671
msgid ""
"Your harddisk is very small, but you can continue without a swap partition."
-msgstr ""
+msgstr "Seu disco rígido é muito pequeno, mas você pode continuar sem uma partição swap."
#: main.c:684
msgid "ext4 Filesystem"
#: main.c:790
msgid "Unable to open /etc/default/grub for writing."
-msgstr ""
+msgstr "Não possível abrir /etc/default/grub para escrita."
#: main.c:812
msgid "Unable to install the bootloader."
"A backup file has been found on the installation image.\n"
"\n"
"Do you want to restore the backup?"
-msgstr ""
+msgstr "Uma cópia de segurança foi encontrada na imagem de instalação.\n\nVocê quer restaurar a cópia de segurança?"
#: main.c:827
msgid "Yes"
-msgstr ""
+msgstr "Sim"
#: main.c:827
msgid "No"
-msgstr ""
+msgstr "Não"
#: main.c:834
msgid "An error occured when the backup file was restored."
-msgstr ""
+msgstr "Um erro ocorreu enquanto a cópia de segurança foi restaurada."
#: main.c:869
msgid "Running post-install script..."
-msgstr ""
+msgstr "Executando post-install script..."
#: main.c:870
msgid "Post-install script failed."
-msgstr ""
+msgstr "Post-install script falhou."
#: main.c:877
#, c-format
#: main.c:893
msgid "Setup has failed. Press Ok to reboot."
-msgstr ""
+msgstr "Instalação falhou. Pressione Ok para reiniciar."
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# ellviss <kpe1501@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: IPFire Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-11-05 01:29+0000\n"
-"PO-Revision-Date: 2014-11-05 01:33+0000\n"
-"Last-Translator: Michael Tremer <michael.tremer@ipfire.org>\n"
+"PO-Revision-Date: 2015-02-24 12:56+0000\n"
+"Last-Translator: ellviss <kpe1501@gmail.com>\n"
"Language-Team: Russian (http://www.transifex.com/projects/p/ipfire/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
#: main.c:78 main.c:179 main.c:404 main.c:670 main.c:702 main.c:893
msgid "OK"
-msgstr ""
+msgstr "ОК"
#: main.c:79 main.c:460 main.c:487 main.c:516 main.c:620 main.c:630 main.c:670
#: main.c:702
msgid "Cancel"
-msgstr ""
+msgstr "Отмена"
#: main.c:176
msgid "I accept this license"
-msgstr ""
+msgstr "Я Согласен с этой лицензией"
#: main.c:384
msgid "Warning: Unattended installation will start in 10 seconds..."
-msgstr ""
+msgstr "Внимание : запуск автоматической установки начнётся через 10 секунд ..."
#: main.c:403
msgid "Language selection"
-msgstr ""
+msgstr "Выберите язык"
#: main.c:403
msgid "Select the language you wish to use for the installation."
-msgstr ""
+msgstr "Выберете язык для инсталяции"
#: main.c:418
msgid "Unattended mode"
-msgstr ""
+msgstr "Автоматический режим"
#: main.c:420
msgid "<Tab>/<Alt-Tab> between elements | <Space> selects | <F12> next screen"
-msgstr ""
+msgstr "<Tab>/<Alt-Tab> переход между элементами | <Space> выбор <F12> следующий экран"
#: main.c:426
#, c-format
"Welcome to the %s installation program.\n"
"\n"
"Selecting Cancel on any of the following screens will reboot the computer."
-msgstr ""
+msgstr "Добро пожаловать в установку %s .\n\nНажатие Отмены на любом из следующих экранах приведёт к перезагрузке."
#: main.c:428
msgid "Start installation"
-msgstr ""
+msgstr "Начать установку"
#: main.c:449
#, c-format
msgid "The installer will now try downloading the installation image."
-msgstr ""
+msgstr "Установщик пробует скачать установочный образ"
#: main.c:452
#, c-format
"No source drive could be found.\n"
"\n"
"You can try downloading the required installation image."
-msgstr ""
+msgstr "Не найден источник\n\nВы можете скачать необходимый загрузочный образ"
#: main.c:456
msgid ""
"Please make sure to connect your machine to a network and the installer will"
" try connect to acquire an IP address."
-msgstr ""
+msgstr "Убедитесь что компьютер подсоединён к сети и установщик может подключиться к запращиваемому ip адресу"
#: main.c:460
msgid "Download installation image"
-msgstr ""
+msgstr "Скачать образ установки"
#: main.c:473
msgid "Trying to start networking (DHCP)..."
-msgstr ""
+msgstr "Проверка запуска (DHCP)..."
#: main.c:484
msgid ""
#: main.c:487 main.c:516
msgid "Retry"
-msgstr ""
+msgstr "Повтор"
#: main.c:501
msgid "Downloading installation image..."
-msgstr ""
+msgstr "Скачивание образа установки..."
#: main.c:510
#, c-format
msgid "MD5 checksum mismatch"
-msgstr ""
+msgstr "MD5 хеш не совпал"
#: main.c:513
#, c-format
msgid ""
"Could not mount %s to %s:\n"
" %s\n"
-msgstr ""
+msgstr "Не удалось подключить %s к %s:\n\n%s\n"
#: main.c:543
msgid "License Agreement"
-msgstr ""
+msgstr "Лицензионное соглашение"
#: main.c:544
msgid "License not accepted!"
-msgstr ""
+msgstr "Лицензия не принята"
#: main.c:566
msgid "No hard disk found."
-msgstr ""
+msgstr "Не найдены жесткие диски"
#: main.c:587
msgid "Disk Selection"
-msgstr ""
+msgstr "Выберете диск"
#: main.c:588
msgid ""
" %s\n"
"\n"
"Do you agree to continue?"
-msgstr ""
+msgstr "Установочная программа настроит выбранный диск :\n\n%s\n\nВы согласны продолжить?"
#: main.c:619
msgid "Disk Setup"
-msgstr ""
+msgstr "Настройка диска"
#: main.c:620 main.c:630
msgid "Delete all data"
-msgstr ""
+msgstr "Удалить все данные"
#: main.c:627
#, c-format
#: main.c:629
msgid "RAID Setup"
-msgstr ""
+msgstr "Настройка RAID"
#: main.c:640
msgid "Your disk configuration is currently not supported."
-msgstr ""
+msgstr "Конфигурация ваших дисков не поддерживается"
#: main.c:655
msgid "Your harddisk is too small."
-msgstr ""
+msgstr "Ваш диск слишком мал"
#: main.c:671
msgid ""
"Your harddisk is very small, but you can continue without a swap partition."
-msgstr ""
+msgstr "Ваш диск слишком мал, но вы можете продолжить без файла подкачки"
#: main.c:684
msgid "ext4 Filesystem"
-msgstr ""
+msgstr "раздел ext4"
#: main.c:685
msgid "ext4 Filesystem without journal"
-msgstr ""
+msgstr "журналируемый раздел ext4"
#: main.c:686
msgid "XFS Filesystem"
-msgstr ""
+msgstr "раздел XFS"
#: main.c:687
msgid "ReiserFS Filesystem"
-msgstr ""
+msgstr "раздел ReiserFS"
#: main.c:701
msgid "Filesystem Selection"
-msgstr ""
+msgstr "Выбор файловой системы"
#: main.c:701
msgid "Please choose your filesystem:"
-msgstr ""
+msgstr "Пожалуйста, выберете тип файловой системы:"
#: main.c:712
msgid "Building RAID..."
-msgstr ""
+msgstr "Создание RAID...."
#: main.c:716
msgid "Unable to build the RAID."
-msgstr ""
+msgstr "Не возмозжно создать RAID"
#: main.c:728
msgid "Partitioning disk..."
-msgstr ""
+msgstr "Разбивка диска..."
#: main.c:732
msgid "Unable to partition the disk."
-msgstr ""
+msgstr "Невозможно разбить диск"
#: main.c:739
msgid "Creating filesystems..."
-msgstr ""
+msgstr "Создание файловой системы..."
#: main.c:743
msgid "Unable to create filesystems."
-msgstr ""
+msgstr "Не возможно создать раздел"
#: main.c:749
msgid "Unable to mount filesystems."
-msgstr ""
+msgstr "Невозможно присоединить раздел"
#: main.c:760
msgid "Installing the system..."
-msgstr ""
+msgstr "Установка системы ...."
#: main.c:761
msgid "Unable to install the system."
-msgstr ""
+msgstr "Невозможно установить систему"
#: main.c:777
msgid "Installing the language cache..."
-msgstr ""
+msgstr "Установка кеша языка...."
#: main.c:778
msgid "Unable to install the language cache."
-msgstr ""
+msgstr "Невозможно установить кеш языка"
#: main.c:783
msgid "Installing the bootloader..."
-msgstr ""
+msgstr "Установка загрузчика....."
#: main.c:790
msgid "Unable to open /etc/default/grub for writing."
-msgstr ""
+msgstr "Невозможно открыть /etc/default/grub на запись"
#: main.c:812
msgid "Unable to install the bootloader."
-msgstr ""
+msgstr "Невозможно установить загрузчик"
#: main.c:826
msgid ""
"A backup file has been found on the installation image.\n"
"\n"
"Do you want to restore the backup?"
-msgstr ""
+msgstr "Файл восстановления был найдет на установочном носителе\n\nвы хотите восстановить ?"
#: main.c:827
msgid "Yes"
-msgstr ""
+msgstr "Да"
#: main.c:827
msgid "No"
-msgstr ""
+msgstr "Нет"
#: main.c:834
msgid "An error occured when the backup file was restored."
-msgstr ""
+msgstr "Произошла ошибка при восстановлении из файла."
#: main.c:869
msgid "Running post-install script..."
-msgstr ""
+msgstr "Выполняются пост-установочные скрипты..."
#: main.c:870
msgid "Post-install script failed."
-msgstr ""
+msgstr "Пост-установочный скрипт не сработал"
#: main.c:877
#, c-format
"%s was successfully installed!\n"
"\n"
"Please remove any installation mediums from this system and hit the reboot button. Once the system has restarted you will be asked to setup networking and system passwords. After that, you should point your web browser at https://%s:444 (or what ever you name your %s) for the web configuration console."
-msgstr ""
+msgstr "%s успешно установлено!\n\nПожалуйста извлеките все установочные носители из системы и нажмите кнопку перезагрузки. После перезапуска система попросит установить системный и сетевой пароли. После этого вы можете зайти через браузер на https://%s:444 ( где %s - ваш адрес ) для конфигурирования системы через web"
#: main.c:882
msgid "Congratulations!"
-msgstr ""
+msgstr "Поздравляем!"
#: main.c:882
msgid "Reboot"
-msgstr ""
+msgstr "Перезагрузка"
#: main.c:893
msgid "Setup has failed. Press Ok to reboot."
-msgstr ""
+msgstr "Установка не удалась. Нажмите ОК для перезапуска"
+++ /dev/null
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR The IPFire Project (www.ipfire.org)
-# This file is distributed under the same license as the PACKAGE package.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: IPFire Project\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-11-05 01:29+0000\n"
-"PO-Revision-Date: 2014-07-31 09:39+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/ipfire/language/ru_RU/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: ru_RU\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-
-#: main.c:78 main.c:179 main.c:404 main.c:670 main.c:702 main.c:893
-msgid "OK"
-msgstr ""
-
-#: main.c:79 main.c:460 main.c:487 main.c:516 main.c:620 main.c:630 main.c:670
-#: main.c:702
-msgid "Cancel"
-msgstr ""
-
-#: main.c:176
-msgid "I accept this license"
-msgstr ""
-
-#: main.c:384
-msgid "Warning: Unattended installation will start in 10 seconds..."
-msgstr ""
-
-#: main.c:403
-msgid "Language selection"
-msgstr ""
-
-#: main.c:403
-msgid "Select the language you wish to use for the installation."
-msgstr ""
-
-#: main.c:418
-msgid "Unattended mode"
-msgstr ""
-
-#: main.c:420
-msgid "<Tab>/<Alt-Tab> between elements | <Space> selects | <F12> next screen"
-msgstr ""
-
-#: main.c:426
-#, c-format
-msgid ""
-"Welcome to the %s installation program.\n"
-"\n"
-"Selecting Cancel on any of the following screens will reboot the computer."
-msgstr ""
-
-#: main.c:428
-msgid "Start installation"
-msgstr ""
-
-#: main.c:449
-#, c-format
-msgid "The installer will now try downloading the installation image."
-msgstr ""
-
-#: main.c:452
-#, c-format
-msgid ""
-"No source drive could be found.\n"
-"\n"
-"You can try downloading the required installation image."
-msgstr ""
-
-#: main.c:456
-msgid ""
-"Please make sure to connect your machine to a network and the installer will"
-" try connect to acquire an IP address."
-msgstr ""
-
-#: main.c:460
-msgid "Download installation image"
-msgstr ""
-
-#: main.c:473
-msgid "Trying to start networking (DHCP)..."
-msgstr ""
-
-#: main.c:484
-msgid ""
-"Networking could not be started but is required to go on with the installation.\n"
-"\n"
-"Please connect your machine to a network with a DHCP server and retry."
-msgstr ""
-
-#: main.c:487 main.c:516
-msgid "Retry"
-msgstr ""
-
-#: main.c:501
-msgid "Downloading installation image..."
-msgstr ""
-
-#: main.c:510
-#, c-format
-msgid "MD5 checksum mismatch"
-msgstr ""
-
-#: main.c:513
-#, c-format
-msgid ""
-"The installation image could not be downloaded.\n"
-" Reason: %s\n"
-"\n"
-"%s"
-msgstr ""
-
-#: main.c:528
-#, c-format
-msgid ""
-"Could not mount %s to %s:\n"
-" %s\n"
-msgstr ""
-
-#: main.c:543
-msgid "License Agreement"
-msgstr ""
-
-#: main.c:544
-msgid "License not accepted!"
-msgstr ""
-
-#: main.c:566
-msgid "No hard disk found."
-msgstr ""
-
-#: main.c:587
-msgid "Disk Selection"
-msgstr ""
-
-#: main.c:588
-msgid ""
-"Select the disk(s) you want to install IPFire on. First those will be partitioned, and then the partitions will have a filesystem put on them.\n"
-"\n"
-"ALL DATA ON THE DISK WILL BE DESTROYED."
-msgstr ""
-
-#: main.c:599
-msgid ""
-"No disk has been selected.\n"
-"\n"
-"Please select one or more disks you want to install IPFire on."
-msgstr ""
-
-#: main.c:617
-#, c-format
-msgid ""
-"The installation program will now prepare the chosen harddisk:\n"
-"\n"
-" %s\n"
-"\n"
-"Do you agree to continue?"
-msgstr ""
-
-#: main.c:619
-msgid "Disk Setup"
-msgstr ""
-
-#: main.c:620 main.c:630
-msgid "Delete all data"
-msgstr ""
-
-#: main.c:627
-#, c-format
-msgid ""
-"The installation program will now set up a RAID configuration on the selected harddisks:\n"
-"\n"
-" %s\n"
-" %s\n"
-"\n"
-"Do you agree to continue?"
-msgstr ""
-
-#: main.c:629
-msgid "RAID Setup"
-msgstr ""
-
-#: main.c:640
-msgid "Your disk configuration is currently not supported."
-msgstr ""
-
-#: main.c:655
-msgid "Your harddisk is too small."
-msgstr ""
-
-#: main.c:671
-msgid ""
-"Your harddisk is very small, but you can continue without a swap partition."
-msgstr ""
-
-#: main.c:684
-msgid "ext4 Filesystem"
-msgstr ""
-
-#: main.c:685
-msgid "ext4 Filesystem without journal"
-msgstr ""
-
-#: main.c:686
-msgid "XFS Filesystem"
-msgstr ""
-
-#: main.c:687
-msgid "ReiserFS Filesystem"
-msgstr ""
-
-#: main.c:701
-msgid "Filesystem Selection"
-msgstr ""
-
-#: main.c:701
-msgid "Please choose your filesystem:"
-msgstr ""
-
-#: main.c:712
-msgid "Building RAID..."
-msgstr ""
-
-#: main.c:716
-msgid "Unable to build the RAID."
-msgstr ""
-
-#: main.c:728
-msgid "Partitioning disk..."
-msgstr ""
-
-#: main.c:732
-msgid "Unable to partition the disk."
-msgstr ""
-
-#: main.c:739
-msgid "Creating filesystems..."
-msgstr ""
-
-#: main.c:743
-msgid "Unable to create filesystems."
-msgstr ""
-
-#: main.c:749
-msgid "Unable to mount filesystems."
-msgstr ""
-
-#: main.c:760
-msgid "Installing the system..."
-msgstr ""
-
-#: main.c:761
-msgid "Unable to install the system."
-msgstr ""
-
-#: main.c:777
-msgid "Installing the language cache..."
-msgstr ""
-
-#: main.c:778
-msgid "Unable to install the language cache."
-msgstr ""
-
-#: main.c:783
-msgid "Installing the bootloader..."
-msgstr ""
-
-#: main.c:790
-msgid "Unable to open /etc/default/grub for writing."
-msgstr ""
-
-#: main.c:812
-msgid "Unable to install the bootloader."
-msgstr ""
-
-#: main.c:826
-msgid ""
-"A backup file has been found on the installation image.\n"
-"\n"
-"Do you want to restore the backup?"
-msgstr ""
-
-#: main.c:827
-msgid "Yes"
-msgstr ""
-
-#: main.c:827
-msgid "No"
-msgstr ""
-
-#: main.c:834
-msgid "An error occured when the backup file was restored."
-msgstr ""
-
-#: main.c:869
-msgid "Running post-install script..."
-msgstr ""
-
-#: main.c:870
-msgid "Post-install script failed."
-msgstr ""
-
-#: main.c:877
-#, c-format
-msgid ""
-"%s was successfully installed!\n"
-"\n"
-"Please remove any installation mediums from this system and hit the reboot button. Once the system has restarted you will be asked to setup networking and system passwords. After that, you should point your web browser at https://%s:444 (or what ever you name your %s) for the web configuration console."
-msgstr ""
-
-#: main.c:882
-msgid "Congratulations!"
-msgstr ""
-
-#: main.c:882
-msgid "Reboot"
-msgstr ""
-
-#: main.c:893
-msgid "Setup has failed. Press Ok to reboot."
-msgstr ""
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Ersan YILDIRIM <ersan73@gmail.com>, 2015
# Kudret Emre <kudretemre@hotmail.com.tr>, 2014
# Kudret Emre <kudretemre@hotmail.com.tr>, 2014
msgid ""
"Project-Id-Version: IPFire Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-11-05 01:29+0000\n"
-"PO-Revision-Date: 2014-12-08 17:24+0000\n"
-"Last-Translator: Kudret Emre <kudretemre@hotmail.com.tr>\n"
+"PO-Revision-Date: 2015-02-28 22:11+0000\n"
+"Last-Translator: Ersan YILDIRIM <ersan73@gmail.com>\n"
"Language-Team: Turkish (http://www.transifex.com/projects/p/ipfire/language/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
#: main.c:420
msgid "<Tab>/<Alt-Tab> between elements | <Space> selects | <F12> next screen"
-msgstr "<Tab>/<Alt-Tab> elementler arası geçiş | <Space> seç | <F12> sonraki ekran"
+msgstr "<Tab>/<Alt-Tab> düğmeler arası geçiş | <Space> seç | <F12> sonraki ekran"
#: main.c:426
#, c-format
"Welcome to the %s installation program.\n"
"\n"
"Selecting Cancel on any of the following screens will reboot the computer."
-msgstr "%s yükleme programına hoşgeldiniz.\n\nİlerleyen ekranların herhangi birinde İptal'e tıklamanız bilgisayarınızı yeniden başlatır."
+msgstr "%s kurulum programına hoş geldiniz.\n\nSonraki ekranların herhangi birinde İptal seçeneğini seçtiğinizde bilgisayar yeniden başlatılac."
#: main.c:428
msgid "Start installation"
-msgstr "Yüklemeyi başlat"
+msgstr "Kurulumu Başlat"
#: main.c:449
#, c-format
msgid "The installer will now try downloading the installation image."
-msgstr "Yükleyici şimdi yükleme dosyasını indirmeyi deneyecek."
+msgstr "Yükleyici şimdi kurulum dosyasını indirmeyi deneyecek."
#: main.c:452
#, c-format
"No source drive could be found.\n"
"\n"
"You can try downloading the required installation image."
-msgstr "Hiçbir kaynak sürücüsü bulunamadı.\n\nGerekli yükleme dosyasını indirmeyi deneyebilirsiniz."
+msgstr "Hiçbir kaynak sürücüsü bulunamadı.\n\nGerekli kurulum dosyasını indirmeyi deneyebilirsiniz."
#: main.c:456
msgid ""
"Please make sure to connect your machine to a network and the installer will"
" try connect to acquire an IP address."
-msgstr ""
+msgstr "Makinenizi bir ağa bağladığınıza emin olun ve yükleyiciye IP adresini elle girerek bağlanmayı tekrar deneyin."
#: main.c:460
msgid "Download installation image"
-msgstr "Yükleme dosyasını indir"
+msgstr "Kurulum dosyasını indir"
#: main.c:473
msgid "Trying to start networking (DHCP)..."
msgid ""
"Could not mount %s to %s:\n"
" %s\n"
-msgstr ""
+msgstr "Bağlanamadı: %s - %s:\n%s\n\n"
#: main.c:543
msgid "License Agreement"
#: main.c:620 main.c:630
msgid "Delete all data"
-msgstr "Tüm veriyi sil"
+msgstr "Tüm Veriyi Sil"
#: main.c:627
#, c-format
#: main.c:701
msgid "Filesystem Selection"
-msgstr "Dosya sistemi Seçimi"
+msgstr "Dosya Sistemi Seçimi"
#: main.c:701
msgid "Please choose your filesystem:"
"A backup file has been found on the installation image.\n"
"\n"
"Do you want to restore the backup?"
-msgstr "Yükleme dosyasında bir yedekleme dosyası bulundu.\n\nYedeği geri yüklemek ister misiniz?"
+msgstr "Kurulum dosyasında bir yedek dosyası bulundu.\n\nYedeği geri yüklemek ister misiniz?"
#: main.c:827
msgid "Yes"
#: main.c:869
msgid "Running post-install script..."
-msgstr "post-install betiği çalıştırılıyor..."
+msgstr "Post-install betiği çalıştırılıyor..."
#: main.c:870
msgid "Post-install script failed."
-msgstr "post-install betiği başarısız oldu."
+msgstr "Post-install betiği başarısız oldu."
#: main.c:877
#, c-format
"%s was successfully installed!\n"
"\n"
"Please remove any installation mediums from this system and hit the reboot button. Once the system has restarted you will be asked to setup networking and system passwords. After that, you should point your web browser at https://%s:444 (or what ever you name your %s) for the web configuration console."
-msgstr "%s başarıyla yüklendi!\n\nLütfen yükleme ortamlarını bu sistemden çıkarın ve yeniden başlatma butonuna tıklayın. Sistem yeniden başlatıldığında ağ ve sistem şifrenizi ayarlamanız istenecek. Daha sonra web yapılandırma konsoluna gitmek için yarayıcınızdan https://%s:444 (veya %s yerine ne isim verdiyseniz) adresine gidin."
+msgstr "%s başarıyla yüklendi!\n\nLütfen yükleme ortamını sistemden çıkarın ve Yeniden Başlat düğmesine tıklayın. Sistem yeniden başlatıldığında ağ kartları, ağ ve sistem parolalarını yapılandırabileceğiniz programı çalıştıracaktır. Kurulum tamamlandıktan sonra bir internet tarayıcısı açıp yapılandırma sayfasına gitmek için adres satırına https://%s:444 (veya %s yerine ne ad verdiyseniz) adresini girin."
#: main.c:882
msgid "Congratulations!"
#: main.c:882
msgid "Reboot"
-msgstr "Yeniden başlat."
+msgstr "Yeniden Başlat"
#: main.c:893
msgid "Setup has failed. Press Ok to reboot."
-msgstr "Kurulum başarısız oldu. Yeniden başlatmak için Tamam'a basın."
+msgstr "Kurulum başarısız oldu. Yeniden başlatmak için Tamam düğmesine basın."
############################################################################
#
. /opt/pakfire/lib/functions.sh
-extract_files
-#
-KVER=xxxKVERxxx
-ROOT=`mount | grep " / " | cut -d" " -f1`
-ROOTUUID=`blkid -c /dev/null -sUUID $ROOT | cut -d'"' -f2`
-if [ ! -z $ROOTUUID ]; then
- ROOT="UUID=$ROOTUUID"
-fi
-if [ -f /boot/grub/grub.conf ]; then
-MOUNT=`grep "kernel" /boot/grub/grub.conf | tail -n 1`
-# Nur den letzten Parameter verwenden
-echo $MOUNT > /dev/null
-MOUNT=$_
-if [ ! $MOUNT == "rw" ]; then
- MOUNT="ro"
-fi
-ENTRY=`grep "savedefault" /boot/grub/grub.conf | tail -n 1`
-# Nur den letzten Parameter verwenden
-echo $ENTRY > /dev/null
-let ENTRY=$_+1
+function find_partition() {
+ local mountpoint="${1}"
-#Check if the system use serial console...
-if [ "$(grep "^serial" /boot/grub/grub.conf)" == "" ]; then
- console=""
-else
- console=" console=ttyS0,115200n8"
-fi
+ local root
+ local dev mp fs flags rest
+ while read -r dev mp fs flags rest; do
+ # Skip unwanted entries
+ [ "${dev}" = "rootfs" ] && continue
+ if [ "${mp}" = "${mountpoint}" ] && [ -b "${dev}" ]; then
+ root="$(basename "${dev}")"
+ break
+ fi
+ done < /proc/mounts
+ echo ${root}
+ return 0
+}
+
+extract_files
#
-# backup grub.conf
-#
-cp /boot/grub/grub.conf /boot/grub/grub-backup-$KVER-pae_install.conf
-#
-# Add new Entry to grub.conf
-#
-echo "" >> /boot/grub/grub.conf
-echo "title IPFire (PAE-Kernel)" >> /boot/grub/grub.conf
-echo " kernel /vmlinuz-$KVER-ipfire-pae root=$ROOT panic=10$console $MOUNT" >> /boot/grub/grub.conf
-echo " initrd /ipfirerd-$KVER-pae.img" >> /boot/grub/grub.conf
-echo " savedefault $ENTRY" >> /boot/grub/grub.conf
-fi
+KVER=xxxKVERxxx
#
# Create new module depency
#
/usr/bin/dracut --force --xz /boot/initramfs-$KVER-ipfire-pae.img $KVER-ipfire-pae
-#
-# Update grub2 config
-#
-grub-mkconfig > /boot/grub/grub.cfg
+
+ROOT="$(find_partition "/")"
+case $ROOT in
+ xvd* )
+ #
+ # We are on XEN so create new grub.conf / menu.lst for pygrub
+ #
+ echo "timeout 10" > /boot/grub/grub.conf
+ echo "default 0" >> /boot/grub/grub.conf
+ echo "title IPFire (pae-kernel)" >> /boot/grub/grub.conf
+ echo " kernel /vmlinuz-$KVER-ipfire-pae root=/dev/$ROOT rootdelay=10 panic=10 console=hvc0" \
+ >> /boot/grub/grub.conf
+ echo " initrd /initramfs-$KVER-ipfire-pae.img" >> /boot/grub/grub.conf
+ echo "# savedefault 0" >> /boot/grub/grub.conf
+ ln -s grub.conf $MNThdd/boot/grub/menu.lst
+ ;;
+ * )
+ #
+ # Update grub2 config
+ #
+ grub-mkconfig > /boot/grub/grub.cfg
+ ;;
+esac
# request a reboot if pae is supported
if [ ! "$(grep "^flags.* pae " /proc/cpuinfo)" == "" ]; then
############################################################################
#
. /opt/pakfire/lib/functions.sh
+if [ -f /boot/grub/grub.conf ]; then
+ echo "Error! Connot remove linux-pae because we are on XEN."
+ exit 1
+fi
remove_files
rm -rf /boot/initramfs-*-pae.img
rm -rf /boot/vmlinuz-*-pae
rm -rf /lib/modules/*-ipfire-pae
-if [ -f /boot/grub/grub.conf ]; then
- cp /boot/grub/grub.conf /boot/grub/grub-backup-pae_uninstall.conf
- sed -i "/title IPFire (PAE-Kernel)/,+3d" /boot/grub/grub.conf
-fi
grub-mkconfig > /boot/grub/grub.cfg
sync && sync
############################################################################
#
. /opt/pakfire/lib/functions.sh
-./uninstall.sh
+remove_files
+rm -rf /boot/initramfs-*-pae.img
+rm -rf /boot/vmlinuz-*-pae
+rm -rf /lib/modules/*-ipfire-pae
+if [ ! -f /boot/grub/grub.conf ]; then
+ grub-mkconfig > /boot/grub/grub.cfg
+fi
./install.sh
+++ /dev/null
-#!/bin/bash
-############################################################################
-# #
-# This file is part of the IPFire Firewall. #
-# #
-# IPFire is free software; you can redistribute it and/or modify #
-# it under the terms of the GNU General Public License as published by #
-# the Free Software Foundation; either version 2 of the License, or #
-# (at your option) any later version. #
-# #
-# IPFire is distributed in the hope that it will be useful, #
-# but WITHOUT ANY WARRANTY; without even the implied warranty of #
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
-# GNU General Public License for more details. #
-# #
-# You should have received a copy of the GNU General Public License #
-# along with IPFire; if not, write to the Free Software #
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
-# #
-# Copyright (C) 2008 IPFire-Team <info@ipfire.org>. #
-# #
-############################################################################
-#
-. /opt/pakfire/lib/functions.sh
-
-extract_files
-
-[ -d /opt/teamspeak ] || mkdir -p /opt/teamspeak
-
-cd /tmp
-wget -c ftp://ftp.freenet.de/pub/4players/teamspeak.org/releases/ts2_server_rc2_202319.tar.bz2 \
- ftp://ftp.freenet.de/pub/4players/teamspeak.org/developer/server/202401/server_linux
-
-tar xvfj ts2_server_rc2_202319.tar.bz2 -C /tmp
-
-cp -av /tmp/tss2_rc2/* /opt/teamspeak
-mv /tmp/server_linux /opt/teamspeak/server_linux
-chmod 755 -v /opt/teamspeak/server_linux
-
-rm -rf /tmp/tss2_rc2 ts2_server_rc2_202319.tar.bz2
-
-groupadd teamspeak
-useradd -g teamspeak teamspeak
-
-chown teamspeak.teamspeak /opt/teamspeak -Rv
-
-restore_backup ${NAME}
-start_service --background ${NAME}
-
-ln -sf ../init.d/teamspeak /etc/rc.d/rc0.d/K00teamspeak
-ln -sf ../init.d/teamspeak /etc/rc.d/rc3.d/S99teamspeak
-ln -sf ../init.d/teamspeak /etc/rc.d/rc6.d/K00teamspeak
-
-
+++ /dev/null
-#!/bin/bash
-############################################################################
-# #
-# This file is part of the IPFire Firewall. #
-# #
-# IPFire is free software; you can redistribute it and/or modify #
-# it under the terms of the GNU General Public License as published by #
-# the Free Software Foundation; either version 2 of the License, or #
-# (at your option) any later version. #
-# #
-# IPFire is distributed in the hope that it will be useful, #
-# but WITHOUT ANY WARRANTY; without even the implied warranty of #
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
-# GNU General Public License for more details. #
-# #
-# You should have received a copy of the GNU General Public License #
-# along with IPFire; if not, write to the Free Software #
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
-# #
-# Copyright (C) 2007 IPFire-Team <info@ipfire.org>. #
-# #
-############################################################################
-#
-. /opt/pakfire/lib/functions.sh
-stop_service ${NAME}
-
-if [ ! -e "/var/ipfire/backup/addons/includes/teamspeak" ]; then
- echo /opt/teamspeak/bad_names.txt > /var/ipfire/backup/addons/includes/teamspeak
- echo /opt/teamspeak/server.dbs >> /var/ipfire/backup/addons/includes/teamspeak
- echo /opt/teamspeak/server.ini >> /var/ipfire/backup/addons/includes/teamspeak
- echo /opt/teamspeak/server.log >> /var/ipfire/backup/addons/includes/teamspeak
- echo /opt/teamspeak/whitelist.txt >> /var/ipfire/backup/addons/includes/teamspeak
-fi
-make_backup ${NAME}
-rm -rf /opt/teamspeak
-userdel teamspeak
-rm -rf /etc/rc.d/rc*.d/*teamspeak
-
-
+++ /dev/null
-#!/bin/bash
-############################################################################
-# #
-# This file is part of the IPFire Firewall. #
-# #
-# IPFire is free software; you can redistribute it and/or modify #
-# it under the terms of the GNU General Public License as published by #
-# the Free Software Foundation; either version 2 of the License, or #
-# (at your option) any later version. #
-# #
-# IPFire is distributed in the hope that it will be useful, #
-# but WITHOUT ANY WARRANTY; without even the implied warranty of #
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
-# GNU General Public License for more details. #
-# #
-# You should have received a copy of the GNU General Public License #
-# along with IPFire; if not, write to the Free Software #
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
-# #
-# Copyright (C) 2007 IPFire-Team <info@ipfire.org>. #
-# #
-############################################################################
-#
-. /opt/pakfire/lib/functions.sh
-./uninstall.sh
-./install.sh
--- /dev/null
+Index: clamav-0.97.3/libclamav/c++/llvm/lib/ExecutionEngine/JIT/Intercept.cpp
+===================================================================
+--- clamav-0.97.3.orig/libclamav/c++/llvm/lib/ExecutionEngine/JIT/Intercept.cpp
++++ clamav-0.97.3/libclamav/c++/llvm/lib/ExecutionEngine/JIT/Intercept.cpp
+@@ -52,6 +52,7 @@ static void runAtExitHandlers() {
+ #include <sys/stat.h>
+ #endif
+ #include <fcntl.h>
++#include <unistd.h>
+ /* stat functions are redirecting to __xstat with a version number. On x86-64
+ * linking with libc_nonshared.a and -Wl,--export-dynamic doesn't make 'stat'
+ * available as an exported symbol, so we have to add it explicitly.
+++ /dev/null
-diff -up dhcp-4.2.0/common/dispatch.c.dracut dhcp-4.2.0/common/dispatch.c
---- dhcp-4.2.0/common/dispatch.c.dracut 2010-06-01 19:29:59.000000000 +0200
-+++ dhcp-4.2.0/common/dispatch.c 2010-07-21 16:10:09.000000000 +0200
-@@ -189,6 +189,10 @@ void add_timeout (when, where, what, ref
- isc_interval_t interval;
- isc_time_t expires;
-
-+ if (when == NULL) {
-+ return;
-+ }
-+
- /* See if this timeout supersedes an existing timeout. */
- t = (struct timeout *)0;
- for (q = timeouts; q; q = q->next) {
+++ /dev/null
-diff -up dhcp-4.2.0/omapip/errwarn.c.errwarn dhcp-4.2.0/omapip/errwarn.c
---- dhcp-4.2.0/omapip/errwarn.c.errwarn 2009-07-23 20:52:21.000000000 +0200
-+++ dhcp-4.2.0/omapip/errwarn.c 2010-07-21 13:23:47.000000000 +0200
-@@ -76,20 +76,13 @@ void log_fatal (const char * fmt, ... )
-
- #if !defined (NOMINUM)
- log_error ("%s", "");
-- log_error ("If you did not get this software from ftp.isc.org, please");
-- log_error ("get the latest from ftp.isc.org and install that before");
-- log_error ("requesting help.");
-+ log_error ("This version of ISC DHCP is based on the release available");
-+ log_error ("on ftp.isc.org. Features have been added and other changes");
-+ log_error ("have been made to the base software release in order to make");
-+ log_error ("it work better with this distribution.");
- log_error ("%s", "");
-- log_error ("If you did get this software from ftp.isc.org and have not");
-- log_error ("yet read the README, please read it before requesting help.");
-- log_error ("If you intend to request help from the dhcp-server@isc.org");
-- log_error ("mailing list, please read the section on the README about");
-- log_error ("submitting bug reports and requests for help.");
-- log_error ("%s", "");
-- log_error ("Please do not under any circumstances send requests for");
-- log_error ("help directly to the authors of this software - please");
-- log_error ("send them to the appropriate mailing list as described in");
-- log_error ("the README file.");
-+ log_error ("Please report for this software via the Red Hat Bugzilla site:");
-+ log_error (" http://bugzilla.redhat.com");
- log_error ("%s", "");
- log_error ("exiting.");
- #endif
+++ /dev/null
-diff -up dhcp-4.2.0/common/tables.c.garbage dhcp-4.2.0/common/tables.c
---- dhcp-4.2.0/common/tables.c.garbage 2009-11-20 02:49:01.000000000 +0100
-+++ dhcp-4.2.0/common/tables.c 2010-07-21 14:40:56.000000000 +0200
-@@ -207,7 +207,7 @@ static struct option dhcp_options[] = {
- { "netinfo-server-tag", "t", &dhcp_universe, 113, 1 },
- { "default-url", "t", &dhcp_universe, 114, 1 },
- { "subnet-selection", "I", &dhcp_universe, 118, 1 },
-- { "domain-search", "Dc", &dhcp_universe, 119, 1 },
-+ { "domain-search", "D", &dhcp_universe, 119, 1 },
- { "vivco", "Evendor-class.", &dhcp_universe, 124, 1 },
- { "vivso", "Evendor.", &dhcp_universe, 125, 1 },
- #if 0
+++ /dev/null
-diff -up dhcp-4.2.0/client/dhclient.c.inherit dhcp-4.2.0/client/dhclient.c
---- dhcp-4.2.0/client/dhclient.c.inherit 2010-07-21 14:33:44.000000000 +0200
-+++ dhcp-4.2.0/client/dhclient.c 2010-07-21 14:40:05.000000000 +0200
-@@ -2322,6 +2322,7 @@ void send_request (cpp)
- {
- struct client_state *client = cpp;
-
-+ int i;
- int result;
- int interval;
- struct sockaddr_in destination;
-@@ -2381,6 +2382,22 @@ void send_request (cpp)
- /* Now do a preinit on the interface so that we can
- discover a new address. */
- script_init (client, "PREINIT", (struct string_list *)0);
-+
-+ /* Has an active lease */
-+ if (client -> interface -> addresses != NULL) {
-+ for (i = 0; i < client -> interface -> address_count; i++) {
-+ if (client -> active &&
-+ client -> active -> is_bootp &&
-+ client -> active -> expiry > cur_time &&
-+ client -> interface -> addresses[i].s_addr != 0 &&
-+ client -> active -> address.len == 4 &&
-+ memcpy (client -> active -> address.iabuf, &(client -> interface -> addresses[i]), 4) == 0) {
-+ client_envadd (client, "", "keep_old_ip", "%s", "yes");
-+ break;
-+ }
-+ }
-+ }
-+
- if (client -> alias)
- script_write_params (client, "alias_",
- client -> alias);
+++ /dev/null
-diff -up dhcp-4.2.0/client/dhclient.c.logpid dhcp-4.2.0/client/dhclient.c
---- dhcp-4.2.0/client/dhclient.c.logpid 2010-07-21 16:13:52.000000000 +0200
-+++ dhcp-4.2.0/client/dhclient.c 2010-07-21 16:16:51.000000000 +0200
-@@ -154,7 +154,7 @@ main(int argc, char **argv) {
- else if (fd != -1)
- close(fd);
-
-- openlog("dhclient", LOG_NDELAY, LOG_DAEMON);
-+ openlog("dhclient", LOG_NDELAY | LOG_PID, LOG_DAEMON);
-
- #if !(defined(DEBUG) || defined(__CYGWIN32__))
- setlogmask(LOG_UPTO(LOG_INFO));
+++ /dev/null
-diff -up dhcp-4.2.0/common/discover.c.noipv6 dhcp-4.2.0/common/discover.c
---- dhcp-4.2.0/common/discover.c.noipv6 2010-07-21 14:31:13.000000000 +0200
-+++ dhcp-4.2.0/common/discover.c 2010-07-21 16:04:57.000000000 +0200
-@@ -443,7 +443,7 @@ begin_iface_scan(struct iface_conf_list
- }
-
- #ifdef DHCPv6
-- if (local_family == AF_INET6) {
-+ if ((local_family == AF_INET6) && !access("/proc/net/if_inet6", R_OK)) {
- ifaces->fp6 = fopen("/proc/net/if_inet6", "re");
- if (ifaces->fp6 == NULL) {
- log_error("Error opening '/proc/net/if_inet6' to "
-@@ -454,6 +454,8 @@ begin_iface_scan(struct iface_conf_list
- ifaces->fp = NULL;
- return 0;
- }
-+ } else {
-+ ifaces->fp6 = NULL;
- }
- #endif
-
-@@ -721,7 +723,7 @@ next_iface(struct iface_info *info, int
- return 1;
- }
- #ifdef DHCPv6
-- if (!(*err)) {
-+ if (!(*err) && ifaces->fp6) {
- if (local_family == AF_INET6)
- return next_iface6(info, err, ifaces);
- }
-@@ -740,7 +742,8 @@ end_iface_scan(struct iface_conf_list *i
- ifaces->sock = -1;
- #ifdef DHCPv6
- if (local_family == AF_INET6) {
-- fclose(ifaces->fp6);
-+ if (ifaces->fp6)
-+ fclose(ifaces->fp6);
- ifaces->fp6 = NULL;
- }
- #endif
+++ /dev/null
-diff -up dhcp-4.2.0/server/dhcpv6.c.noprefixavail dhcp-4.2.0/server/dhcpv6.c
---- dhcp-4.2.0/server/dhcpv6.c.noprefixavail 2010-10-07 13:48:45.000000000 +0200
-+++ dhcp-4.2.0/server/dhcpv6.c 2010-10-13 11:00:25.000000000 +0200
-@@ -1134,7 +1134,7 @@ try_client_v6_prefix(struct iasubopt **p
- return DHCP_R_INVALIDARG;
- }
- tmp_plen = (int) requested_pref->data[0];
-- if ((tmp_plen < 3) || (tmp_plen > 128)) {
-+ if ((tmp_plen < 3) || (tmp_plen > 128) ||((int)tmp_plen != pool->units)) {
- return ISC_R_FAILURE;
- }
- memcpy(&tmp_pref, requested_pref->data + 1, sizeof(tmp_pref));
-@@ -1147,9 +1147,8 @@ try_client_v6_prefix(struct iasubopt **p
- return ISC_R_FAILURE;
- }
-
-- if (((int)tmp_plen != pool->units) ||
-- !ipv6_in_pool(&tmp_pref, pool)) {
-- return ISC_R_FAILURE;
-+ if (!ipv6_in_pool(&tmp_pref, pool)) {
-+ return ISC_R_ADDRNOTAVAIL;
- }
-
- if (prefix6_exists(pool, &tmp_pref, tmp_plen)) {
-@@ -1409,13 +1408,6 @@ lease_to_client(struct data_string *repl
- if ((status != ISC_R_SUCCESS) &&
- (status != ISC_R_NORESOURCES))
- goto exit;
--
-- /*
-- * If any prefix cannot be given to any IA_PD, then
-- * set the NoPrefixAvail status code.
-- */
-- if (reply.client_resources == 0)
-- no_resources_avail = ISC_TRUE;
- }
-
- /*
-@@ -1549,36 +1541,6 @@ lease_to_client(struct data_string *repl
- reply.opt_state, reply.packet,
- required_opts_NAA,
- NULL);
-- } else if (no_resources_avail && (reply.ia_count == 0) &&
-- (reply.packet->dhcpv6_msg_type == DHCPV6_SOLICIT))
-- {
-- /* Set the NoPrefixAvail status code. */
-- if (!set_status_code(STATUS_NoPrefixAvail,
-- "No prefixes available for this "
-- "interface.", reply.opt_state)) {
-- log_error("lease_to_client: Unable to set "
-- "NoPrefixAvail status code.");
-- goto exit;
-- }
--
-- /* Rewind the cursor to the start. */
-- reply.cursor = REPLY_OPTIONS_INDEX;
--
-- /*
-- * Produce an advertise that includes only:
-- *
-- * Status code.
-- * Server DUID.
-- * Client DUID.
-- */
-- reply.buf.reply.msg_type = DHCPV6_ADVERTISE;
-- reply.cursor += store_options6((char *)reply.buf.data +
-- reply.cursor,
-- sizeof(reply.buf) -
-- reply.cursor,
-- reply.opt_state, reply.packet,
-- required_opts_NAA,
-- NULL);
- } else {
- /*
- * Having stored the client's IA's, store any options that
-@@ -2793,16 +2755,18 @@ find_client_temporaries(struct reply_sta
- */
- static isc_result_t
- reply_process_try_addr(struct reply_state *reply, struct iaddr *addr) {
-- isc_result_t status = ISC_R_NORESOURCES;
-+ isc_result_t status = ISC_R_ADDRNOTAVAIL;
- struct ipv6_pool *pool;
- int i;
- struct data_string data_addr;
-
- if ((reply == NULL) || (reply->shared == NULL) ||
-- (reply->shared->ipv6_pools == NULL) || (addr == NULL) ||
-- (reply->lease != NULL))
-+ (addr == NULL) || (reply->lease != NULL))
- return DHCP_R_INVALIDARG;
-
-+ if (reply->shared->ipv6_pools == NULL)
-+ return ISC_R_ADDRNOTAVAIL;
-+
- memset(&data_addr, 0, sizeof(data_addr));
- data_addr.len = addr->len;
- data_addr.data = addr->iabuf;
-@@ -3314,7 +3278,9 @@ reply_process_ia_pd(struct reply_state *
- if (status == ISC_R_CANCELED)
- break;
-
-- if ((status != ISC_R_SUCCESS) && (status != ISC_R_ADDRINUSE))
-+ if ((status != ISC_R_SUCCESS) &&
-+ (status != ISC_R_ADDRINUSE) &&
-+ (status != ISC_R_ADDRNOTAVAIL))
- goto cleanup;
- }
-
-@@ -3594,7 +3560,8 @@ reply_process_prefix(struct reply_state
-
- /* Either error out or skip this prefix. */
- if ((status != ISC_R_SUCCESS) &&
-- (status != ISC_R_ADDRINUSE))
-+ (status != ISC_R_ADDRINUSE) &&
-+ (status != ISC_R_ADDRNOTAVAIL))
- goto cleanup;
-
- if (reply->lease == NULL) {
-@@ -3773,16 +3740,18 @@ prefix_is_owned(struct reply_state *repl
- static isc_result_t
- reply_process_try_prefix(struct reply_state *reply,
- struct iaddrcidrnet *pref) {
-- isc_result_t status = ISC_R_NORESOURCES;
-+ isc_result_t status = ISC_R_ADDRNOTAVAIL;
- struct ipv6_pool *pool;
- int i;
- struct data_string data_pref;
-
- if ((reply == NULL) || (reply->shared == NULL) ||
-- (reply->shared->ipv6_pools == NULL) || (pref == NULL) ||
-- (reply->lease != NULL))
-+ (pref == NULL) || (reply->lease != NULL))
- return DHCP_R_INVALIDARG;
-
-+ if (reply->shared->ipv6_pools == NULL)
-+ return ISC_R_ADDRNOTAVAIL;
-+
- memset(&data_pref, 0, sizeof(data_pref));
- data_pref.len = 17;
- if (!buffer_allocate(&data_pref.buffer, data_pref.len, MDL)) {
+++ /dev/null
-diff -up dhcp-4.2.1b1/common/dispatch.c.64-bit_lease_parse dhcp-4.2.1b1/common/dispatch.c
-diff -up dhcp-4.2.1b1/common/parse.c.64-bit_lease_parse dhcp-4.2.1b1/common/parse.c
---- dhcp-4.2.1b1/common/parse.c.64-bit_lease_parse 2010-12-30 00:01:42.000000000 +0100
-+++ dhcp-4.2.1b1/common/parse.c 2011-01-28 08:01:10.000000000 +0100
-@@ -909,8 +909,8 @@ TIME
- parse_date_core(cfile)
- struct parse *cfile;
- {
-- int guess;
-- int tzoff, wday, year, mon, mday, hour, min, sec;
-+ TIME guess;
-+ long int tzoff, wday, year, mon, mday, hour, min, sec;
- const char *val;
- enum dhcp_token token;
- static int months[11] = { 31, 59, 90, 120, 151, 181,
-@@ -936,7 +936,7 @@ parse_date_core(cfile)
- }
-
- token = next_token(&val, NULL, cfile); /* consume number */
-- guess = atoi(val);
-+ guess = atol(val);
-
- return((TIME)guess);
- }
-@@ -948,7 +948,7 @@ parse_date_core(cfile)
- return((TIME)0);
- }
- token = next_token(&val, NULL, cfile); /* consume day of week */
-- wday = atoi(val);
-+ wday = atol(val);
-
- /* Year... */
- token = peek_token(&val, NULL, cfile);
-@@ -964,7 +964,7 @@ parse_date_core(cfile)
- somebody invents a time machine, I think we can safely disregard
- it. This actually works around a stupid Y2K bug that was present
- in a very early beta release of dhcpd. */
-- year = atoi(val);
-+ year = atol(val);
- if (year > 1900)
- year -= 1900;
-
-@@ -988,7 +988,7 @@ parse_date_core(cfile)
- return((TIME)0);
- }
- token = next_token(&val, NULL, cfile); /* consume month */
-- mon = atoi(val) - 1;
-+ mon = atol(val) - 1;
-
- /* Slash separating month from day... */
- token = peek_token(&val, NULL, cfile);
-@@ -1010,7 +1010,7 @@ parse_date_core(cfile)
- return((TIME)0);
- }
- token = next_token(&val, NULL, cfile); /* consume day of month */
-- mday = atoi(val);
-+ mday = atol(val);
-
- /* Hour... */
- token = peek_token(&val, NULL, cfile);
-@@ -1021,7 +1021,7 @@ parse_date_core(cfile)
- return((TIME)0);
- }
- token = next_token(&val, NULL, cfile); /* consume hour */
-- hour = atoi(val);
-+ hour = atol(val);
-
- /* Colon separating hour from minute... */
- token = peek_token(&val, NULL, cfile);
-@@ -1043,7 +1043,7 @@ parse_date_core(cfile)
- return((TIME)0);
- }
- token = next_token(&val, NULL, cfile); /* consume minute */
-- min = atoi(val);
-+ min = atol(val);
-
- /* Colon separating minute from second... */
- token = peek_token(&val, NULL, cfile);
-@@ -1065,13 +1065,13 @@ parse_date_core(cfile)
- return((TIME)0);
- }
- token = next_token(&val, NULL, cfile); /* consume second */
-- sec = atoi(val);
-+ sec = atol(val);
-
- tzoff = 0;
- token = peek_token(&val, NULL, cfile);
- if (token == NUMBER) {
- token = next_token(&val, NULL, cfile); /* consume tzoff */
-- tzoff = atoi(val);
-+ tzoff = atol(val);
- } else if (token != SEMI) {
- token = next_token(&val, NULL, cfile);
- parse_warn(cfile,
+++ /dev/null
-diff -up dhcp-4.2.1b1/client/dhclient.conf.supersede dhcp-4.2.1b1/client/dhclient.conf
---- dhcp-4.2.1b1/client/dhclient.conf.supersede 2010-09-15 01:03:56.000000000 +0200
-+++ dhcp-4.2.1b1/client/dhclient.conf 2011-01-27 18:38:28.000000000 +0100
-@@ -4,7 +4,7 @@ send dhcp-lease-time 3600;
- supersede domain-search "fugue.com", "home.vix.com";
- prepend domain-name-servers 127.0.0.1;
- request subnet-mask, broadcast-address, time-offset, routers,
-- domain-name, domain-name-servers, host-name;
-+ domain-search, domain-name-servers, host-name;
- require subnet-mask, domain-name-servers;
- timeout 60;
- retry 60;
+++ /dev/null
-diff -up dhcp-4.2.1b1/client/dhc6.c.retransmission dhcp-4.2.1b1/client/dhc6.c
---- dhcp-4.2.1b1/client/dhc6.c.retransmission 2011-01-28 08:40:56.000000000 +0100
-+++ dhcp-4.2.1b1/client/dhc6.c 2011-01-28 08:39:22.000000000 +0100
-@@ -361,7 +361,7 @@ dhc6_retrans_init(struct client_state *c
- static void
- dhc6_retrans_advance(struct client_state *client)
- {
-- struct timeval elapsed;
-+ struct timeval elapsed, elapsed_after_RT;
-
- /* elapsed = cur - start */
- elapsed.tv_sec = cur_tv.tv_sec - client->start_time.tv_sec;
-@@ -378,6 +378,8 @@ dhc6_retrans_advance(struct client_state
- elapsed.tv_sec += 1;
- elapsed.tv_usec -= 1000000;
- }
-+ elapsed_after_RT.tv_sec = elapsed.tv_sec;
-+ elapsed_after_RT.tv_usec = elapsed.tv_usec;
-
- /*
- * RT for each subsequent message transmission is based on the previous
-@@ -415,13 +417,10 @@ dhc6_retrans_advance(struct client_state
- elapsed.tv_usec -= 1000000;
- }
- if (elapsed.tv_sec >= client->MRD) {
-- /*
-- * wake at RT + cur = start + MRD
-- */
-- client->RT = client->MRD +
-- (client->start_time.tv_sec - cur_tv.tv_sec);
-- client->RT = client->RT * 100 +
-- (client->start_time.tv_usec - cur_tv.tv_usec) / 10000;
-+ client->RT = client->MRD - elapsed_after_RT.tv_sec;
-+ client->RT = client->RT * 100 - elapsed_after_RT.tv_usec / 10000;
-+ if (client->RT < 0)
-+ client->RT = 0;
- }
- client->txcount++;
- }
-@@ -1497,7 +1496,7 @@ check_timing6 (struct client_state *clie
- }
-
- /* Check if finished (-1 argument). */
-- if ((client->MRD != 0) && (elapsed.tv_sec > client->MRD)) {
-+ if ((client->MRD != 0) && (elapsed.tv_sec >= client->MRD)) {
- log_info("Max retransmission duration exceeded.");
- return(CHK_TIM_MRD_EXCEEDED);
- }
+++ /dev/null
-diff -up dhcp-4.2.2b1/client/dhclient.c.usage dhcp-4.2.2b1/client/dhclient.c
---- dhcp-4.2.2b1/client/dhclient.c.usage 2011-07-01 13:55:16.000000000 +0200
-+++ dhcp-4.2.2b1/client/dhclient.c 2011-07-01 13:58:55.243800602 +0200
-@@ -1047,6 +1047,10 @@ static void usage()
- " [-s server-addr] [-cf config-file] "
- "[-lf lease-file]\n"
- " [-pf pid-file] [--no-pid] [-e VAR=val]\n"
-+ " [-I <dhcp-client-identifier>] [-B]\n"
-+ " [-H <host-name> | -F <fqdn.fqdn>] [-timeout <timeout>]\n"
-+ " [-V <vendor-class-identifier>]\n"
-+ " [-R <request option list>]\n"
- " [-sf script-file] [interface]");
- }
-
+++ /dev/null
-diff -up dhcp-4.2.2/client/Makefile.am.rh637017 dhcp-4.2.2/client/Makefile.am
---- dhcp-4.2.2/client/Makefile.am.rh637017 2010-09-15 00:32:36.000000000 +0200
-+++ dhcp-4.2.2/client/Makefile.am 2011-08-11 17:28:58.923897561 +0200
-@@ -5,7 +5,7 @@ dhclient_SOURCES = clparse.c dhclient.c
- scripts/netbsd scripts/nextstep scripts/openbsd \
- scripts/solaris scripts/openwrt
- dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-- ../bind/lib/libdns.a ../bind/lib/libisc.a
-+ $(BIND9_LIBDIR) -ldns-export -lisc-export
- man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5
- EXTRA_DIST = $(man_MANS)
-
-diff -up dhcp-4.2.2/common/tests/Makefile.am.rh637017 dhcp-4.2.2/common/tests/Makefile.am
---- dhcp-4.2.2/common/tests/Makefile.am.rh637017 2009-10-28 05:12:30.000000000 +0100
-+++ dhcp-4.2.2/common/tests/Makefile.am 2011-08-11 17:33:45.258637236 +0200
-@@ -6,6 +6,5 @@ TESTS = test_alloc
-
- test_alloc_SOURCES = test_alloc.c
- test_alloc_LDADD = ../libdhcp.a ../../tests/libt_api.a \
-- ../../omapip/libomapi.a ../../bind/lib/libdns.a \
-- ../../bind/lib/libisc.a
--
-+ ../../omapip/libomapi.a \
-+ $(BIND9_LIBDIR) -ldns-export -lisc-export
-diff -up dhcp-4.2.2/configure.ac.rh637017 dhcp-4.2.2/configure.ac
---- dhcp-4.2.2/configure.ac.rh637017 2011-07-20 02:32:18.000000000 +0200
-+++ dhcp-4.2.2/configure.ac 2011-08-11 17:28:58.924897535 +0200
-@@ -512,20 +512,37 @@ AC_CHECK_MEMBER(struct msghdr.msg_contro
- libbind=
- AC_ARG_WITH(libbind,
- AC_HELP_STRING([--with-libbind=PATH],
-- [bind includes and libraries are in PATH
-- (default is ./bind)]),
-+ [bind includes are in PATH
-+ (default is ./bind/includes)]),
- use_libbind="$withval", use_libbind="no")
- case "$use_libbind" in
-+yes|no)
-+ libbind="\${top_srcdir}/bind/include"
-+ ;;
-+*)
-+ libbind="$use_libbind"
-+ ;;
-+esac
-+
-+BIND9_LIBDIR='-L$(top_builddir)/bind/lib'
-+AC_ARG_WITH(libbind-libs,
-+ AC_HELP_STRING([--with-libbind-libs=PATH],
-+ [bind9 export libraries are in PATH]),
-+ [libbind_libs="$withval"], [libbind_libs='no'])
-+case "$libbind_libs" in
- yes)
-- libbind="\${top_srcdir}/bind"
-+ AC_MSG_ERROR([Specify path to bind9 libraries])
- ;;
- no)
-- libbind="\${top_srcdir}/bind"
-+ BUNDLED_BIND=yes
- ;;
- *)
-- libbind="$use_libbind"
-+ BIND9_LIBDIR="-L$libbind_libs"
-+ BUNDLED_BIND=no
- ;;
- esac
-+AM_CONDITIONAL([BUNDLED_BIND], [test "$BUNDLED_BIND" = yes])
-+AC_SUBST([BIND9_LIBDIR])
-
- # OpenLDAP support.
- AC_ARG_WITH(ldap,
-@@ -562,7 +579,7 @@ fi
- CFLAGS="$CFLAGS $STD_CWARNINGS"
-
- # Try to add the bind include directory
--CFLAGS="$CFLAGS -I$libbind/include"
-+CFLAGS="$CFLAGS -I$libbind"
-
- AC_C_FLEXIBLE_ARRAY_MEMBER
-
-diff -up dhcp-4.2.2/dhcpctl/Makefile.am.rh637017 dhcp-4.2.2/dhcpctl/Makefile.am
---- dhcp-4.2.2/dhcpctl/Makefile.am.rh637017 2009-10-28 05:12:30.000000000 +0100
-+++ dhcp-4.2.2/dhcpctl/Makefile.am 2011-08-11 17:28:58.924897535 +0200
-@@ -6,10 +6,10 @@ EXTRA_DIST = $(man_MANS)
-
- omshell_SOURCES = omshell.c
- omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
-- ../bind/lib/libdns.a ../bind/lib/libisc.a
-+ $(BIND9_LIBDIR) -ldns-export -lisc-export
-
- libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c
-
- cltest_SOURCES = cltest.c
- cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
-- ../bind/lib/libdns.a ../bind/lib/libisc.a
-\ No newline at end of file
-+ $(BIND9_LIBDIR) -ldns-export -lisc-export
-diff -up dhcp-4.2.2/Makefile.am.rh637017 dhcp-4.2.2/Makefile.am
---- dhcp-4.2.2/Makefile.am.rh637017 2010-03-25 00:30:38.000000000 +0100
-+++ dhcp-4.2.2/Makefile.am 2011-08-11 17:28:58.925897509 +0200
-@@ -21,7 +21,13 @@ EXTRA_DIST = RELNOTES LICENSE \
- util/bindvar.sh \
- bind/Makefile bind/bind.tar.gz bind/version.tmp
-
--SUBDIRS = bind includes tests common dst omapip client dhcpctl relay server
-+if BUNDLED_BIND
-+SUBDIRS = bind
-+else
-+SUBDIRS =
-+endif
-+
-+SUBDIRS += includes tests common dst omapip client dhcpctl relay server
-
- nobase_include_HEADERS = dhcpctl/dhcpctl.h
-
-diff -up dhcp-4.2.2/omapip/Makefile.am.rh637017 dhcp-4.2.2/omapip/Makefile.am
---- dhcp-4.2.2/omapip/Makefile.am.rh637017 2010-02-12 01:13:54.000000000 +0100
-+++ dhcp-4.2.2/omapip/Makefile.am 2011-08-11 17:28:58.939897149 +0200
-@@ -10,5 +10,5 @@ man_MANS = omapi.3
- EXTRA_DIST = $(man_MANS)
-
- svtest_SOURCES = test.c
--svtest_LDADD = libomapi.a ../bind/lib/libdns.a ../bind/lib/libisc.a
-+svtest_LDADD = libomapi.a $(BIND9_LIBDIR) -ldns-export -lisc-export
-
-diff -up dhcp-4.2.2/relay/Makefile.am.rh637017 dhcp-4.2.2/relay/Makefile.am
---- dhcp-4.2.2/relay/Makefile.am.rh637017 2009-10-28 05:12:30.000000000 +0100
-+++ dhcp-4.2.2/relay/Makefile.am 2011-08-11 17:28:58.940897123 +0200
-@@ -3,7 +3,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localst
- sbin_PROGRAMS = dhcrelay
- dhcrelay_SOURCES = dhcrelay.c
- dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-- ../bind/lib/libdns.a ../bind/lib/libisc.a
-+ $(BIND9_LIBDIR) -ldns-export -lisc-export
- man_MANS = dhcrelay.8
- EXTRA_DIST = $(man_MANS)
-
-diff -up dhcp-4.2.2/server/Makefile.am.rh637017 dhcp-4.2.2/server/Makefile.am
---- dhcp-4.2.2/server/Makefile.am.rh637017 2010-03-24 22:49:47.000000000 +0100
-+++ dhcp-4.2.2/server/Makefile.am 2011-08-11 17:28:58.944897021 +0200
-@@ -8,8 +8,7 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c c
-
- dhcpd_CFLAGS = $(LDAP_CFLAGS)
- dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-- ../dhcpctl/libdhcpctl.a ../bind/lib/libdns.a \
-- ../bind/lib/libisc.a
-+ ../dhcpctl/libdhcpctl.a $(BIND9_LIBDIR) -ldns-export -lisc-export
-
- man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
- EXTRA_DIST = $(man_MANS)
+++ /dev/null
-diff -up dhcp-4.2.2/client/Makefile.am.sharedlib dhcp-4.2.2/client/Makefile.am
---- dhcp-4.2.2/client/Makefile.am.sharedlib 2011-09-09 16:35:56.000000000 +0200
-+++ dhcp-4.2.2/client/Makefile.am 2011-09-09 16:36:29.849007951 +0200
-@@ -4,7 +4,7 @@ dhclient_SOURCES = clparse.c dhclient.c
- scripts/bsdos scripts/freebsd scripts/linux scripts/macos \
- scripts/netbsd scripts/nextstep scripts/openbsd \
- scripts/solaris scripts/openwrt
--dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-+dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.la \
- $(BIND9_LIBDIR) -ldns-export -lisc-export $(CAPNG_LDADD)
- man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5
- EXTRA_DIST = $(man_MANS)
-diff -up dhcp-4.2.2/configure.ac.sharedlib dhcp-4.2.2/configure.ac
---- dhcp-4.2.2/configure.ac.sharedlib 2011-09-09 16:35:56.097000001 +0200
-+++ dhcp-4.2.2/configure.ac 2011-09-09 16:35:56.383000000 +0200
-@@ -30,7 +30,8 @@ fi
- # Use this to define _GNU_SOURCE to pull in the IPv6 Advanced Socket API.
- AC_USE_SYSTEM_EXTENSIONS
-
--AC_PROG_RANLIB
-+# Use libtool to simplify building of shared libraries
-+AC_PROG_LIBTOOL
- AC_CONFIG_HEADERS([includes/config.h])
-
- # we sometimes need to know byte order for building packets
-diff -up dhcp-4.2.2/dhcpctl/Makefile.am.sharedlib dhcp-4.2.2/dhcpctl/Makefile.am
---- dhcp-4.2.2/dhcpctl/Makefile.am.sharedlib 2011-09-09 16:35:55.459000001 +0200
-+++ dhcp-4.2.2/dhcpctl/Makefile.am 2011-09-09 16:35:56.384000000 +0200
-@@ -1,15 +1,15 @@
- bin_PROGRAMS = omshell
--lib_LIBRARIES = libdhcpctl.a
-+lib_LTLIBRARIES = libdhcpctl.la
- noinst_PROGRAMS = cltest
- man_MANS = omshell.1 dhcpctl.3
- EXTRA_DIST = $(man_MANS)
-
- omshell_SOURCES = omshell.c
--omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
-+omshell_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \
- $(BIND9_LIBDIR) -ldns-export -lisc-export
-
--libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c
-+libdhcpctl_la_SOURCES = dhcpctl.c callback.c remote.c
-
- cltest_SOURCES = cltest.c
--cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
-+cltest_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \
- $(BIND9_LIBDIR) -ldns-export -lisc-export
-diff -up dhcp-4.2.2/dst/base64.c.sharedlib dhcp-4.2.2/dst/base64.c
---- dhcp-4.2.2/dst/base64.c.sharedlib 2009-11-20 02:49:01.000000000 +0100
-+++ dhcp-4.2.2/dst/base64.c 2011-09-09 16:35:56.385000000 +0200
-@@ -64,6 +64,7 @@ static const char rcsid[] = "$Id: base64
-
- #include <sys/socket.h>
-
-+#include "dst_internal.h"
- #include "cdefs.h"
- #include "osdep.h"
- #include "arpa/nameser.h"
-diff -up dhcp-4.2.2/dst/Makefile.am.sharedlib dhcp-4.2.2/dst/Makefile.am
---- dhcp-4.2.2/dst/Makefile.am.sharedlib 2007-05-29 18:32:10.000000000 +0200
-+++ dhcp-4.2.2/dst/Makefile.am 2011-09-09 16:35:56.386000000 +0200
-@@ -1,8 +1,8 @@
- AM_CPPFLAGS = -DMINIRES_LIB -DHMAC_MD5
-
--lib_LIBRARIES = libdst.a
-+lib_LTLIBRARIES = libdst.la
-
--libdst_a_SOURCES = dst_support.c dst_api.c hmac_link.c md5_dgst.c \
-+libdst_la_SOURCES = dst_support.c dst_api.c hmac_link.c md5_dgst.c \
- base64.c prandom.c
-
- EXTRA_DIST = dst_internal.h md5.h md5_locl.h
-diff -up dhcp-4.2.2/omapip/Makefile.am.sharedlib dhcp-4.2.2/omapip/Makefile.am
---- dhcp-4.2.2/omapip/Makefile.am.sharedlib 2011-09-09 16:35:55.000000000 +0200
-+++ dhcp-4.2.2/omapip/Makefile.am 2011-09-09 16:37:36.734000324 +0200
-@@ -1,7 +1,7 @@
--lib_LIBRARIES = libomapi.a
-+lib_LTLIBRARIES = libomapi.la
- noinst_PROGRAMS = svtest
-
--libomapi_a_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \
-+libomapi_la_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \
- errwarn.c listener.c dispatch.c generic.c support.c \
- handle.c message.c convert.c hash.c auth.c inet_addr.c \
- array.c trace.c toisc.c iscprint.c isclib.c
-@@ -10,5 +10,5 @@ man_MANS = omapi.3
- EXTRA_DIST = $(man_MANS)
-
- svtest_SOURCES = test.c
--svtest_LDADD = libomapi.a $(BIND9_LIBDIR) -ldns-export -lisc-export
-+svtest_LDADD = libomapi.la $(BIND9_LIBDIR) -ldns-export -lisc-export
-
-diff -up dhcp-4.2.2/relay/Makefile.am.sharedlib dhcp-4.2.2/relay/Makefile.am
---- dhcp-4.2.2/relay/Makefile.am.sharedlib 2011-09-09 16:35:56.000000000 +0200
-+++ dhcp-4.2.2/relay/Makefile.am 2011-09-09 16:37:57.058019749 +0200
-@@ -2,7 +2,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localst
-
- sbin_PROGRAMS = dhcrelay
- dhcrelay_SOURCES = dhcrelay.c
--dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-+dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.la \
- $(BIND9_LIBDIR) -ldns-export -lisc-export $(CAPNG_LDADD)
- man_MANS = dhcrelay.8
- EXTRA_DIST = $(man_MANS)
-diff -up dhcp-4.2.2/server/Makefile.am.sharedlib dhcp-4.2.2/server/Makefile.am
---- dhcp-4.2.2/server/Makefile.am.sharedlib 2011-09-09 16:35:56.000000000 +0200
-+++ dhcp-4.2.2/server/Makefile.am 2011-09-09 16:38:56.291004599 +0200
-@@ -7,8 +7,8 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c c
- dhcpv6.c mdb6.c ldap.c ldap_casa.c
-
- dhcpd_CFLAGS = $(LDAP_CFLAGS)
--dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-- ../dhcpctl/libdhcpctl.a $(BIND9_LIBDIR) -ldns-export -lisc-export \
-+dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.la \
-+ ../dhcpctl/libdhcpctl.la $(BIND9_LIBDIR) -ldns-export -lisc-export \
- $(CAPNG_LDADD)
-
- man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
--- /dev/null
+diff -up dhcp-4.3.0a1/common/parse.c.64-bit_lease_parse dhcp-4.3.0a1/common/parse.c
+--- dhcp-4.3.0a1/common/parse.c.64-bit_lease_parse 2013-12-11 01:25:12.000000000 +0100
++++ dhcp-4.3.0a1/common/parse.c 2013-12-19 15:45:25.990771814 +0100
+@@ -938,8 +938,8 @@ TIME
+ parse_date_core(cfile)
+ struct parse *cfile;
+ {
+- int guess;
+- int tzoff, year, mon, mday, hour, min, sec;
++ TIME guess;
++ long int tzoff, year, mon, mday, hour, min, sec;
+ const char *val;
+ enum dhcp_token token;
+ static int months[11] = { 31, 59, 90, 120, 151, 181,
+@@ -965,7 +965,7 @@ parse_date_core(cfile)
+ }
+
+ skip_token(&val, NULL, cfile); /* consume number */
+- guess = atoi(val);
++ guess = atol(val);
+
+ return((TIME)guess);
+ }
+@@ -993,7 +993,7 @@ parse_date_core(cfile)
+ somebody invents a time machine, I think we can safely disregard
+ it. This actually works around a stupid Y2K bug that was present
+ in a very early beta release of dhcpd. */
+- year = atoi(val);
++ year = atol(val);
+ if (year > 1900)
+ year -= 1900;
+
+@@ -1039,7 +1039,7 @@ parse_date_core(cfile)
+ return((TIME)0);
+ }
+ skip_token(&val, NULL, cfile); /* consume day of month */
+- mday = atoi(val);
++ mday = atol(val);
+
+ /* Hour... */
+ token = peek_token(&val, NULL, cfile);
+@@ -1050,7 +1050,7 @@ parse_date_core(cfile)
+ return((TIME)0);
+ }
+ skip_token(&val, NULL, cfile); /* consume hour */
+- hour = atoi(val);
++ hour = atol(val);
+
+ /* Colon separating hour from minute... */
+ token = peek_token(&val, NULL, cfile);
+@@ -1072,7 +1072,7 @@ parse_date_core(cfile)
+ return((TIME)0);
+ }
+ skip_token(&val, NULL, cfile); /* consume minute */
+- min = atoi(val);
++ min = atol(val);
+
+ /* Colon separating minute from second... */
+ token = peek_token(&val, NULL, cfile);
+@@ -1094,13 +1094,13 @@ parse_date_core(cfile)
+ return((TIME)0);
+ }
+ skip_token(&val, NULL, cfile); /* consume second */
+- sec = atoi(val);
++ sec = atol(val);
+
+ tzoff = 0;
+ token = peek_token(&val, NULL, cfile);
+ if (token == NUMBER) {
+ skip_token(&val, NULL, cfile); /* consume tzoff */
+- tzoff = atoi(val);
++ tzoff = atol(val);
+ } else if (token != SEMI) {
+ skip_token(&val, NULL, cfile);
+ parse_warn(cfile,
-diff -up dhcp-4.2.2b1/client/clparse.c.cloexec dhcp-4.2.2b1/client/clparse.c
---- dhcp-4.2.2b1/client/clparse.c.cloexec 2011-07-01 14:13:30.973887714 +0200
-+++ dhcp-4.2.2b1/client/clparse.c 2011-07-01 14:15:15.021580693 +0200
-@@ -246,7 +246,7 @@ int read_client_conf_file (const char *n
+diff -up dhcp-4.3.0a1/client/clparse.c.cloexec dhcp-4.3.0a1/client/clparse.c
+--- dhcp-4.3.0a1/client/clparse.c.cloexec 2013-12-19 15:34:41.638886256 +0100
++++ dhcp-4.3.0a1/client/clparse.c 2013-12-19 15:34:41.657885985 +0100
+@@ -253,7 +253,7 @@ int read_client_conf_file (const char *n
int token;
isc_result_t status;
return uerr2isc (errno);
cfile = NULL;
-@@ -283,7 +283,7 @@ void read_client_leases ()
+@@ -290,7 +290,7 @@ void read_client_leases ()
/* Open the lease file. If we can't open it, just return -
we can safely trust the server to remember our state. */
return;
cfile = NULL;
-diff -up dhcp-4.2.2b1/client/dhclient.c.cloexec dhcp-4.2.2b1/client/dhclient.c
---- dhcp-4.2.2b1/client/dhclient.c.cloexec 2011-07-01 14:13:30.970887717 +0200
-+++ dhcp-4.2.2b1/client/dhclient.c 2011-07-01 14:16:51.485930388 +0200
+diff -up dhcp-4.3.0a1/client/dhclient.c.cloexec dhcp-4.3.0a1/client/dhclient.c
+--- dhcp-4.3.0a1/client/dhclient.c.cloexec 2013-12-19 15:34:41.629886384 +0100
++++ dhcp-4.3.0a1/client/dhclient.c 2013-12-19 15:36:41.608180467 +0100
@@ -148,11 +148,11 @@ main(int argc, char **argv) {
/* Make sure that file descriptors 0 (stdin), 1, (stdout), and
2 (stderr) are open. To do this, we assume that when we
if (fd == 2)
log_perror = 0; /* No sense logging to /dev/null. */
else if (fd != -1)
-@@ -506,7 +506,7 @@ main(int argc, char **argv) {
+@@ -504,7 +504,7 @@ main(int argc, char **argv) {
+ long temp;
int e;
- oldpid = 0;
- if ((pidfd = fopen(path_dhclient_pid, "r")) != NULL) {
+ if ((pidfd = fopen(path_dhclient_pid, "re")) != NULL) {
e = fscanf(pidfd, "%ld\n", &temp);
oldpid = (pid_t)temp;
-@@ -548,7 +548,7 @@ main(int argc, char **argv) {
+@@ -554,7 +554,7 @@ main(int argc, char **argv) {
strncpy(new_path_dhclient_pid, path_dhclient_pid, pfx);
sprintf(new_path_dhclient_pid + pfx, "-%s.pid", ip->name);
e = fscanf(pidfd, "%ld\n", &temp);
oldpid = (pid_t)temp;
-@@ -573,7 +573,7 @@ main(int argc, char **argv) {
+@@ -579,7 +579,7 @@ main(int argc, char **argv) {
int dhc_running = 0;
char procfn[256] = "";
if ((fscanf(pidfp, "%ld", &temp)==1) && ((dhcpid=(pid_t)temp) > 0)) {
snprintf(procfn,256,"/proc/%u",dhcpid);
dhc_running = (access(procfn, F_OK) == 0);
-@@ -2995,7 +2995,7 @@ void rewrite_client_leases ()
+@@ -3077,7 +3077,7 @@ void rewrite_client_leases ()
if (leaseFile != NULL)
fclose (leaseFile);
if (leaseFile == NULL) {
log_error ("can't create %s: %m", path_dhclient_db);
return;
-@@ -3105,7 +3105,7 @@ write_duid(struct data_string *duid)
+@@ -3261,7 +3261,7 @@ write_duid(struct data_string *duid)
return DHCP_R_INVALIDARG;
if (leaseFile == NULL) { /* XXX? */
if (leaseFile == NULL) {
log_error("can't create %s: %m", path_dhclient_db);
return ISC_R_IOERROR;
-@@ -3285,7 +3285,7 @@ int write_client_lease (client, lease, r
+@@ -3441,7 +3441,7 @@ int write_client_lease (client, lease, r
return 1;
if (leaseFile == NULL) { /* XXX */
if (leaseFile == NULL) {
log_error ("can't create %s: %m", path_dhclient_db);
return 0;
-@@ -3772,9 +3772,9 @@ void go_daemon ()
- close(2);
+@@ -3952,9 +3952,9 @@ void go_daemon ()
+ (void) close(2);
/* Reopen them on /dev/null. */
-- open("/dev/null", O_RDWR);
-- open("/dev/null", O_RDWR);
-- open("/dev/null", O_RDWR);
-+ open("/dev/null", O_RDWR | O_CLOEXEC);
-+ open("/dev/null", O_RDWR | O_CLOEXEC);
-+ open("/dev/null", O_RDWR | O_CLOEXEC);
+- (void) open("/dev/null", O_RDWR);
+- (void) open("/dev/null", O_RDWR);
+- (void) open("/dev/null", O_RDWR);
++ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
++ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
++ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
write_client_pid_file ();
-@@ -3791,14 +3791,14 @@ void write_client_pid_file ()
+@@ -3971,14 +3971,14 @@ void write_client_pid_file ()
return;
}
if (!pf) {
close(pfdesc);
log_error ("Can't fdopen %s: %m", path_dhclient_pid);
-diff -up dhcp-4.2.2b1/common/bpf.c.cloexec dhcp-4.2.2b1/common/bpf.c
---- dhcp-4.2.2b1/common/bpf.c.cloexec 2011-07-01 14:13:30.976887712 +0200
-+++ dhcp-4.2.2b1/common/bpf.c 2011-07-01 14:13:31.030887673 +0200
-@@ -94,7 +94,7 @@ int if_register_bpf (info)
+diff -up dhcp-4.3.0a1/common/bpf.c.cloexec dhcp-4.3.0a1/common/bpf.c
+--- dhcp-4.3.0a1/common/bpf.c.cloexec 2013-12-19 15:34:41.640886227 +0100
++++ dhcp-4.3.0a1/common/bpf.c 2013-12-19 15:34:41.661885928 +0100
+@@ -95,7 +95,7 @@ int if_register_bpf (info)
for (b = 0; 1; b++) {
/* %Audit% 31 bytes max. %2004.06.17,Safe% */
sprintf(filename, BPF_FORMAT, b);
if (sock < 0) {
if (errno == EBUSY) {
continue;
-diff -up dhcp-4.2.2b1/common/discover.c.cloexec dhcp-4.2.2b1/common/discover.c
---- dhcp-4.2.2b1/common/discover.c.cloexec 2011-06-27 18:18:20.000000000 +0200
-+++ dhcp-4.2.2b1/common/discover.c 2011-07-01 14:13:31.031887673 +0200
-@@ -421,7 +421,7 @@ begin_iface_scan(struct iface_conf_list
- int len;
- int i;
-
-- ifaces->fp = fopen("/proc/net/dev", "r");
-+ ifaces->fp = fopen("/proc/net/dev", "re");
- if (ifaces->fp == NULL) {
- log_error("Error opening '/proc/net/dev' to list interfaces");
- return 0;
-@@ -456,7 +456,7 @@ begin_iface_scan(struct iface_conf_list
-
- #ifdef DHCPv6
- if (local_family == AF_INET6) {
-- ifaces->fp6 = fopen("/proc/net/if_inet6", "r");
-+ ifaces->fp6 = fopen("/proc/net/if_inet6", "re");
- if (ifaces->fp6 == NULL) {
- log_error("Error opening '/proc/net/if_inet6' to "
- "list IPv6 interfaces; %m");
-diff -up dhcp-4.2.2b1/common/dlpi.c.cloexec dhcp-4.2.2b1/common/dlpi.c
---- dhcp-4.2.2b1/common/dlpi.c.cloexec 2011-07-01 14:13:30.977887712 +0200
-+++ dhcp-4.2.2b1/common/dlpi.c 2011-07-01 14:13:31.032887673 +0200
-@@ -806,7 +806,7 @@ dlpiopen(const char *ifname) {
+diff -up dhcp-4.3.0a1/common/dlpi.c.cloexec dhcp-4.3.0a1/common/dlpi.c
+--- dhcp-4.3.0a1/common/dlpi.c.cloexec 2013-12-19 15:34:41.641886213 +0100
++++ dhcp-4.3.0a1/common/dlpi.c 2013-12-19 15:34:41.662885914 +0100
+@@ -804,7 +804,7 @@ dlpiopen(const char *ifname) {
}
*dp = '\0';
}
/*
-diff -up dhcp-4.2.2b1/common/nit.c.cloexec dhcp-4.2.2b1/common/nit.c
---- dhcp-4.2.2b1/common/nit.c.cloexec 2011-07-01 14:13:30.978887712 +0200
-+++ dhcp-4.2.2b1/common/nit.c 2011-07-01 14:13:31.033887672 +0200
+diff -up dhcp-4.3.0a1/common/nit.c.cloexec dhcp-4.3.0a1/common/nit.c
+--- dhcp-4.3.0a1/common/nit.c.cloexec 2013-12-19 15:34:41.642886199 +0100
++++ dhcp-4.3.0a1/common/nit.c 2013-12-19 15:34:41.662885914 +0100
@@ -81,7 +81,7 @@ int if_register_nit (info)
struct strioctl sio;
if (sock < 0)
log_fatal ("Can't open NIT device for %s: %m", info -> name);
-diff -up dhcp-4.2.2b1/common/resolv.c.cloexec dhcp-4.2.2b1/common/resolv.c
---- dhcp-4.2.2b1/common/resolv.c.cloexec 2009-11-20 02:49:01.000000000 +0100
-+++ dhcp-4.2.2b1/common/resolv.c 2011-07-01 14:13:31.033887672 +0200
-@@ -49,7 +49,7 @@ void read_resolv_conf (parse_time)
+diff -up dhcp-4.3.0a1/common/resolv.c.cloexec dhcp-4.3.0a1/common/resolv.c
+--- dhcp-4.3.0a1/common/resolv.c.cloexec 2013-12-11 01:25:12.000000000 +0100
++++ dhcp-4.3.0a1/common/resolv.c 2013-12-19 15:34:41.663885900 +0100
+@@ -50,7 +50,7 @@ void read_resolv_conf (parse_time)
struct domain_search_list *dp, *dl, *nd;
isc_result_t status;
log_error ("Can't open %s: %m", path_resolv_conf);
return;
}
-diff -up dhcp-4.2.2b1/common/upf.c.cloexec dhcp-4.2.2b1/common/upf.c
---- dhcp-4.2.2b1/common/upf.c.cloexec 2011-07-01 14:13:30.979887712 +0200
-+++ dhcp-4.2.2b1/common/upf.c 2011-07-01 14:13:31.034887671 +0200
+diff -up dhcp-4.3.0a1/common/upf.c.cloexec dhcp-4.3.0a1/common/upf.c
+--- dhcp-4.3.0a1/common/upf.c.cloexec 2013-12-19 15:34:41.642886199 +0100
++++ dhcp-4.3.0a1/common/upf.c 2013-12-19 15:34:41.663885900 +0100
@@ -77,7 +77,7 @@ int if_register_upf (info)
/* %Audit% Cannot exceed 36 bytes. %2004.06.17,Safe% */
sprintf(filename, "/dev/pf/pfilt%d", b);
if (sock < 0) {
if (errno == EBUSY) {
continue;
-diff -up dhcp-4.2.2b1/dst/dst_api.c.cloexec dhcp-4.2.2b1/dst/dst_api.c
---- dhcp-4.2.2b1/dst/dst_api.c.cloexec 2009-10-29 01:46:48.000000000 +0100
-+++ dhcp-4.2.2b1/dst/dst_api.c 2011-07-01 14:13:31.035887670 +0200
-@@ -437,7 +437,7 @@ dst_s_write_private_key(const DST_KEY *k
- PRIVATE_KEY, PATH_MAX);
-
- /* Do not overwrite an existing file */
-- if ((fp = dst_s_fopen(file, "w", 0600)) != NULL) {
-+ if ((fp = dst_s_fopen(file, "we", 0600)) != NULL) {
- int nn;
- if ((nn = fwrite(encoded_block, 1, len, fp)) != len) {
- EREPORT(("dst_write_private_key(): Write failure on %s %d != %d errno=%d\n",
-@@ -494,7 +494,7 @@ dst_s_read_public_key(const char *in_nam
- * flags, proto, alg stored as decimal (or hex numbers FIXME).
- * (FIXME: handle parentheses for line continuation.)
- */
-- if ((fp = dst_s_fopen(name, "r", 0)) == NULL) {
-+ if ((fp = dst_s_fopen(name, "re", 0)) == NULL) {
- EREPORT(("dst_read_public_key(): Public Key not found %s\n",
- name));
- return (NULL);
-@@ -620,7 +620,7 @@ dst_s_write_public_key(const DST_KEY *ke
- return (0);
- }
- /* create public key file */
-- if ((fp = dst_s_fopen(filename, "w+", 0644)) == NULL) {
-+ if ((fp = dst_s_fopen(filename, "w+e", 0644)) == NULL) {
- EREPORT(("DST_write_public_key: open of file:%s failed (errno=%d)\n",
- filename, errno));
- return (0);
-@@ -854,7 +854,7 @@ dst_s_read_private_key_file(char *name,
- return (0);
- }
- /* first check if we can find the key file */
-- if ((fp = dst_s_fopen(filename, "r", 0)) == NULL) {
-+ if ((fp = dst_s_fopen(filename, "re", 0)) == NULL) {
- EREPORT(("dst_s_read_private_key_file: Could not open file %s in directory %s\n",
- filename, dst_path[0] ? dst_path :
- (char *) getcwd(NULL, PATH_MAX - 1)));
-diff -up dhcp-4.2.2b1/dst/prandom.c.cloexec dhcp-4.2.2b1/dst/prandom.c
---- dhcp-4.2.2b1/dst/prandom.c.cloexec 2009-11-20 02:49:01.000000000 +0100
-+++ dhcp-4.2.2b1/dst/prandom.c 2011-07-01 14:13:31.035887670 +0200
-@@ -269,7 +269,7 @@ get_dev_random(u_char *output, unsigned
-
- s = stat("/dev/random", &st);
- if (s == 0 && S_ISCHR(st.st_mode)) {
-- if ((fd = open("/dev/random", O_RDONLY | O_NONBLOCK)) != -1) {
-+ if ((fd = open("/dev/random", O_RDONLY | O_NONBLOCK | O_CLOEXEC)) != -1) {
- if ((n = read(fd, output, size)) < 0)
- n = 0;
- close(fd);
-@@ -480,7 +480,7 @@ digest_file(dst_work *work)
- work->file_digest = dst_free_key(work->file_digest);
- return (0);
- }
-- if ((fp = fopen(name, "r")) == NULL)
-+ if ((fp = fopen(name, "re")) == NULL)
- return (0);
- for (no = 0; (i = fread(buf, sizeof(*buf), sizeof(buf), fp)) > 0;
- no += i)
-diff -up dhcp-4.2.2b1/omapip/trace.c.cloexec dhcp-4.2.2b1/omapip/trace.c
---- dhcp-4.2.2b1/omapip/trace.c.cloexec 2010-05-27 02:34:57.000000000 +0200
-+++ dhcp-4.2.2b1/omapip/trace.c 2011-07-01 14:13:31.036887669 +0200
-@@ -141,10 +141,10 @@ isc_result_t trace_begin (const char *fi
+diff -up dhcp-4.3.0a1/omapip/trace.c.cloexec dhcp-4.3.0a1/omapip/trace.c
+--- dhcp-4.3.0a1/omapip/trace.c.cloexec 2013-12-11 01:01:03.000000000 +0100
++++ dhcp-4.3.0a1/omapip/trace.c 2013-12-19 15:34:41.663885900 +0100
+@@ -142,10 +142,10 @@ isc_result_t trace_begin (const char *fi
return DHCP_R_INVALIDARG;
}
0600);
}
-@@ -431,7 +431,7 @@ void trace_file_replay (const char *file
+@@ -433,7 +433,7 @@ void trace_file_replay (const char *file
isc_result_t result;
int len;
if (!traceinfile) {
log_error("Can't open tracefile %s: %m", filename);
return;
-diff -up dhcp-4.2.2b1/relay/dhcrelay.c.cloexec dhcp-4.2.2b1/relay/dhcrelay.c
---- dhcp-4.2.2b1/relay/dhcrelay.c.cloexec 2011-05-10 15:07:37.000000000 +0200
-+++ dhcp-4.2.2b1/relay/dhcrelay.c 2011-07-01 14:18:07.630209767 +0200
-@@ -183,11 +183,11 @@ main(int argc, char **argv) {
+diff -up dhcp-4.3.0a1/relay/dhcrelay.c.cloexec dhcp-4.3.0a1/relay/dhcrelay.c
+--- dhcp-4.3.0a1/relay/dhcrelay.c.cloexec 2013-12-13 22:26:21.000000000 +0100
++++ dhcp-4.3.0a1/relay/dhcrelay.c 2013-12-19 15:34:41.664885886 +0100
+@@ -193,11 +193,11 @@ main(int argc, char **argv) {
/* Make sure that file descriptors 0(stdin), 1,(stdout), and
2(stderr) are open. To do this, we assume that when we
open a file the lowest available file descriptor is used. */
if (fd == 2)
log_perror = 0; /* No sense logging to /dev/null. */
else if (fd != -1)
-@@ -540,13 +540,13 @@ main(int argc, char **argv) {
+@@ -564,13 +564,13 @@ main(int argc, char **argv) {
if (no_pid_file == ISC_FALSE) {
pfdesc = open(path_dhcrelay_pid,
if (!pf)
log_error("Can't fdopen %s: %m",
path_dhcrelay_pid);
-diff -up dhcp-4.2.2b1/server/confpars.c.cloexec dhcp-4.2.2b1/server/confpars.c
---- dhcp-4.2.2b1/server/confpars.c.cloexec 2010-10-14 00:34:45.000000000 +0200
-+++ dhcp-4.2.2b1/server/confpars.c 2011-07-01 14:13:31.039887666 +0200
-@@ -116,7 +116,7 @@ isc_result_t read_conf_file (const char
+diff -up dhcp-4.3.0a1/server/confpars.c.cloexec dhcp-4.3.0a1/server/confpars.c
+--- dhcp-4.3.0a1/server/confpars.c.cloexec 2013-12-11 01:25:12.000000000 +0100
++++ dhcp-4.3.0a1/server/confpars.c 2013-12-19 15:34:41.665885871 +0100
+@@ -117,7 +117,7 @@ isc_result_t read_conf_file (const char
}
#endif
if (leasep) {
log_error ("Can't open lease database %s: %m --",
path_dhcpd_db);
-diff -up dhcp-4.2.2b1/server/db.c.cloexec dhcp-4.2.2b1/server/db.c
---- dhcp-4.2.2b1/server/db.c.cloexec 2010-09-14 00:15:26.000000000 +0200
-+++ dhcp-4.2.2b1/server/db.c 2011-07-01 14:13:31.040887665 +0200
-@@ -1035,7 +1035,7 @@ void db_startup (testp)
+diff -up dhcp-4.3.0a1/server/db.c.cloexec dhcp-4.3.0a1/server/db.c
+--- dhcp-4.3.0a1/server/db.c.cloexec 2013-12-11 01:25:12.000000000 +0100
++++ dhcp-4.3.0a1/server/db.c 2013-12-19 15:34:41.666885857 +0100
+@@ -1081,7 +1081,7 @@ void db_startup (testp)
}
#endif
if (!testp) {
if (!db_file)
log_fatal ("Can't open %s for append.", path_dhcpd_db);
expire_all_pools ();
-@@ -1083,12 +1083,12 @@ int new_lease_file ()
+@@ -1129,12 +1129,12 @@ int new_lease_file ()
path_dhcpd_db, (int)t) >= sizeof newfname)
log_fatal("new_lease_file: lease file path too long");
log_error("Can't fdopen new lease file: %m");
close(db_fd);
goto fdfail;
-diff -up dhcp-4.2.2b1/server/dhcpd.c.cloexec dhcp-4.2.2b1/server/dhcpd.c
---- dhcp-4.2.2b1/server/dhcpd.c.cloexec 2011-04-21 16:08:15.000000000 +0200
-+++ dhcp-4.2.2b1/server/dhcpd.c 2011-07-01 14:19:40.354124505 +0200
-@@ -270,11 +270,11 @@ main(int argc, char **argv) {
+diff -up dhcp-4.3.0a1/server/dhcpd.c.cloexec dhcp-4.3.0a1/server/dhcpd.c
+--- dhcp-4.3.0a1/server/dhcpd.c.cloexec 2013-12-13 22:26:01.000000000 +0100
++++ dhcp-4.3.0a1/server/dhcpd.c 2013-12-19 15:37:17.258674472 +0100
+@@ -193,11 +193,11 @@ main(int argc, char **argv) {
/* Make sure that file descriptors 0 (stdin), 1, (stdout), and
2 (stderr) are open. To do this, we assume that when we
open a file the lowest available file descriptor is used. */
if (fd == 2)
log_perror = 0; /* No sense logging to /dev/null. */
else if (fd != -1)
-@@ -793,7 +793,7 @@ main(int argc, char **argv) {
+@@ -716,7 +716,7 @@ main(int argc, char **argv) {
*/
if (no_pid_file == ISC_FALSE) {
/*Read previous pid file. */
status = read(i, pbuf, (sizeof pbuf) - 1);
close (i);
if (status > 0) {
-@@ -812,7 +812,7 @@ main(int argc, char **argv) {
+@@ -735,7 +735,7 @@ main(int argc, char **argv) {
}
/* Write new pid file. */
if (i >= 0) {
sprintf(pbuf, "%d\n", (int) getpid());
IGNORE_RET (write(i, pbuf, strlen(pbuf)));
-@@ -840,9 +840,9 @@ main(int argc, char **argv) {
- close(2);
+@@ -763,9 +763,9 @@ main(int argc, char **argv) {
+ (void) close(2);
/* Reopen them on /dev/null. */
-- open("/dev/null", O_RDWR);
-- open("/dev/null", O_RDWR);
-- open("/dev/null", O_RDWR);
-+ open("/dev/null", O_RDWR | O_CLOEXEC);
-+ open("/dev/null", O_RDWR | O_CLOEXEC);
-+ open("/dev/null", O_RDWR | O_CLOEXEC);
+- (void) open("/dev/null", O_RDWR);
+- (void) open("/dev/null", O_RDWR);
+- (void) open("/dev/null", O_RDWR);
++ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
++ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
++ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
log_perror = 0; /* No sense logging to /dev/null. */
IGNORE_RET (chdir("/"));
-diff -up dhcp-4.2.2b1/server/ldap.c.cloexec dhcp-4.2.2b1/server/ldap.c
---- dhcp-4.2.2b1/server/ldap.c.cloexec 2010-03-25 16:26:58.000000000 +0100
-+++ dhcp-4.2.2b1/server/ldap.c 2011-07-01 14:13:31.043887665 +0200
-@@ -685,7 +685,7 @@ ldap_start (void)
+diff -up dhcp-4.3.0a1/server/ldap.c.cloexec dhcp-4.3.0a1/server/ldap.c
+--- dhcp-4.3.0a1/server/ldap.c.cloexec 2013-12-11 01:25:12.000000000 +0100
++++ dhcp-4.3.0a1/server/ldap.c 2013-12-19 15:34:41.667885843 +0100
+@@ -684,7 +684,7 @@ ldap_start (void)
if (ldap_debug_file != NULL && ldap_debug_fd == -1)
{
-diff -up dhcp-4.2.0-P1/client/dhc6.c.PPP dhcp-4.2.0-P1/client/dhc6.c
---- dhcp-4.2.0-P1/client/dhc6.c.PPP 2010-11-05 10:47:37.000000000 +0100
-+++ dhcp-4.2.0-P1/client/dhc6.c 2010-11-09 15:54:12.000000000 +0100
-@@ -129,7 +129,7 @@ extern int stateless;
+diff -up dhcp-4.3.1b1/client/dhc6.c.mRfpsB dhcp-4.3.1b1/client/dhc6.c
+--- dhcp-4.3.1b1/client/dhc6.c.mRfpsB 2014-07-10 17:48:03.779424870 +0200
++++ dhcp-4.3.1b1/client/dhc6.c 2014-07-10 17:48:03.795424644 +0200
+@@ -5088,7 +5088,8 @@ make_client6_options(struct client_state
+ */
+ if ((oc = lookup_option(&dhcpv6_universe, *op,
+ D6O_CLIENTID)) == NULL) {
+- if (!option_cache(&oc, &default_duid, NULL, clientid_option,
++ if (default_duid.len == 0 ||
++ !option_cache(&oc, &default_duid, NULL, clientid_option,
+ MDL))
+ log_fatal("Failure assembling a DUID.");
+
+diff -up dhcp-4.3.1b1/client/dhclient.c.mRfpsB dhcp-4.3.1b1/client/dhclient.c
+--- dhcp-4.3.1b1/client/dhclient.c.mRfpsB 2014-07-10 17:39:25.853763858 +0200
++++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:49:49.882925843 +0200
+@@ -948,8 +948,8 @@ main(int argc, char **argv) {
+ if (default_duid.buffer != NULL)
+ data_string_forget(&default_duid, MDL);
+
+- form_duid(&default_duid, MDL);
+- write_duid(&default_duid);
++ if (form_duid(&default_duid, MDL) == ISC_R_SUCCESS)
++ write_duid(&default_duid);
+ }
+ }
+
+@@ -3267,7 +3267,7 @@ write_options(struct client_state *clien
* is not how it is intended. Upcoming rearchitecting the client should
* address this "one daemon model."
*/
form_duid(struct data_string *duid, const char *file, int line)
{
struct interface_info *ip;
-@@ -141,6 +141,15 @@ form_duid(struct data_string *duid, cons
+@@ -3280,6 +3280,15 @@ form_duid(struct data_string *duid, cons
if (ip == NULL)
log_fatal("Impossible condition at %s:%d.", MDL);
if ((ip->hw_address.hlen == 0) ||
(ip->hw_address.hlen > sizeof(ip->hw_address.hbuf)))
log_fatal("Impossible hardware address length at %s:%d.", MDL);
-@@ -176,6 +185,8 @@ form_duid(struct data_string *duid, cons
- memcpy(duid->buffer->data + 4, ip->hw_address.hbuf + 1,
- ip->hw_address.hlen - 1);
+@@ -3323,6 +3332,8 @@ form_duid(struct data_string *duid, cons
+ log_info("Created duid %s.", str);
+ dfree(str, MDL);
}
-+
++
+ return ISC_R_SUCCESS;
}
- /*
-@@ -5289,7 +5300,8 @@ make_client6_options(struct client_state
- */
- if ((oc = lookup_option(&dhcpv6_universe, *op,
- D6O_CLIENTID)) == NULL) {
-- if (!option_cache(&oc, &default_duid, NULL, clientid_option,
-+ if (default_duid.len == 0 ||
-+ !option_cache(&oc, &default_duid, NULL, clientid_option,
- MDL))
- log_fatal("Failure assembling a DUID.");
-
-diff -up dhcp-4.2.0-P1/client/dhclient.c.PPP dhcp-4.2.0-P1/client/dhclient.c
---- dhcp-4.2.0-P1/client/dhclient.c.PPP 2010-11-05 10:47:37.000000000 +0100
-+++ dhcp-4.2.0-P1/client/dhclient.c 2010-11-09 15:37:26.000000000 +0100
-@@ -911,8 +911,8 @@ main(int argc, char **argv) {
- if (default_duid.buffer != NULL)
- data_string_forget(&default_duid, MDL);
-
-- form_duid(&default_duid, MDL);
-- write_duid(&default_duid);
-+ if (form_duid(&default_duid, MDL) == ISC_R_SUCCESS)
-+ write_duid(&default_duid);
- }
-
- for (ip = interfaces ; ip != NULL ; ip = ip->next) {
-diff -up dhcp-4.2.0-P1/common/bpf.c.PPP dhcp-4.2.0-P1/common/bpf.c
---- dhcp-4.2.0-P1/common/bpf.c.PPP 2010-11-05 10:47:37.000000000 +0100
-+++ dhcp-4.2.0-P1/common/bpf.c 2010-11-09 15:42:42.000000000 +0100
-@@ -599,6 +599,22 @@ get_hw_addr(const char *name, struct har
+ /* Write the default DUID to the lease store. */
+diff -up dhcp-4.3.1b1/common/bpf.c.mRfpsB dhcp-4.3.1b1/common/bpf.c
+--- dhcp-4.3.1b1/common/bpf.c.mRfpsB 2014-07-10 17:39:25.797764653 +0200
++++ dhcp-4.3.1b1/common/bpf.c 2014-07-10 17:48:03.797424616 +0200
+@@ -600,6 +600,22 @@ get_hw_addr(const char *name, struct har
memcpy(&hw->hbuf[1], LLADDR(sa), sa->sdl_alen);
break;
#endif /* IFT_FDDI */
default:
log_fatal("Unsupported device type %d for \"%s\"",
sa->sdl_type, name);
-diff -up dhcp-4.2.0-P1/common/lpf.c.PPP dhcp-4.2.0-P1/common/lpf.c
---- dhcp-4.2.0-P1/common/lpf.c.PPP 2010-11-05 10:47:37.000000000 +0100
-+++ dhcp-4.2.0-P1/common/lpf.c 2010-11-09 15:45:40.000000000 +0100
-@@ -502,6 +502,22 @@ get_hw_addr(const char *name, struct har
+diff -up dhcp-4.3.1b1/common/lpf.c.mRfpsB dhcp-4.3.1b1/common/lpf.c
+--- dhcp-4.3.1b1/common/lpf.c.mRfpsB 2014-07-10 17:39:25.744765404 +0200
++++ dhcp-4.3.1b1/common/lpf.c 2014-07-10 17:48:03.797424616 +0200
+@@ -511,6 +511,22 @@ get_hw_addr(const char *name, struct har
hw->hbuf[0] = HTYPE_FDDI;
- memcpy(&hw->hbuf[1], sa->sa_data, 16);
+ memcpy(&hw->hbuf[1], sa->sa_data, 6);
break;
+#if defined(ARPHRD_PPP)
+ case ARPHRD_PPP:
default:
log_fatal("Unsupported device type %ld for \"%s\"",
(long int)sa->sa_family, name);
-diff -up dhcp-4.2.0-P1/includes/dhcpd.h.PPP dhcp-4.2.0-P1/includes/dhcpd.h
---- dhcp-4.2.0-P1/includes/dhcpd.h.PPP 2010-11-05 10:47:37.000000000 +0100
-+++ dhcp-4.2.0-P1/includes/dhcpd.h 2010-11-09 15:46:58.000000000 +0100
-@@ -2733,7 +2733,7 @@ void dhcpv4_client_assignments(void);
- void dhcpv6_client_assignments(void);
+diff -up dhcp-4.3.1b1/includes/dhcpd.h.mRfpsB dhcp-4.3.1b1/includes/dhcpd.h
+--- dhcp-4.3.1b1/includes/dhcpd.h.mRfpsB 2014-07-10 17:48:03.761425124 +0200
++++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:48:03.798424601 +0200
+@@ -2839,7 +2839,7 @@ void client_dns_remove(struct client_sta
- /* dhc6.c */
+ void dhcpv4_client_assignments(void);
+ void dhcpv6_client_assignments(void);
-void form_duid(struct data_string *duid, const char *file, int line);
+isc_result_t form_duid(struct data_string *duid, const char *file, int line);
+
+ /* dhc6.c */
void dhc6_lease_destroy(struct dhc6_lease **src, const char *file, int line);
- void start_init6(struct client_state *client);
- void start_info_request6(struct client_state *client);
-diff -up dhcp-4.2.0-P1/includes/dhcp.h.PPP dhcp-4.2.0-P1/includes/dhcp.h
---- dhcp-4.2.0-P1/includes/dhcp.h.PPP 2010-11-05 10:47:37.000000000 +0100
-+++ dhcp-4.2.0-P1/includes/dhcp.h 2010-11-09 15:48:53.000000000 +0100
-@@ -80,6 +80,8 @@ struct dhcp_packet {
- #define HTYPE_IEEE802 6 /* IEEE 802.2 Token Ring... */
- #define HTYPE_FDDI 8 /* FDDI... */
+diff -up dhcp-4.3.1b1/includes/dhcp.h.mRfpsB dhcp-4.3.1b1/includes/dhcp.h
+--- dhcp-4.3.1b1/includes/dhcp.h.mRfpsB 2014-07-10 17:48:03.761425124 +0200
++++ dhcp-4.3.1b1/includes/dhcp.h 2014-07-10 17:48:03.798424601 +0200
+@@ -81,6 +81,8 @@ struct dhcp_packet {
+ * is no standard for this so we
+ * just steal a type */
-+#define HTYPE_RESERVED 0 /* RFC 5494 */
++#define HTYPE_RESERVED 0 /* RFC 5494 */
+
/* Magic cookie validating dhcp options field (and bootp vendor
extensions field). */
#define DHCP_OPTIONS_COOKIE "\143\202\123\143"
-diff -up dhcp-4.2.0-P1/server/dhcpv6.c.PPP dhcp-4.2.0-P1/server/dhcpv6.c
---- dhcp-4.2.0-P1/server/dhcpv6.c.PPP 2010-11-05 10:47:37.000000000 +0100
-+++ dhcp-4.2.0-P1/server/dhcpv6.c 2010-11-09 15:50:17.000000000 +0100
-@@ -300,6 +300,9 @@ generate_new_server_duid(void) {
+diff -up dhcp-4.3.1b1/server/dhcpv6.c.mRfpsB dhcp-4.3.1b1/server/dhcpv6.c
+--- dhcp-4.3.1b1/server/dhcpv6.c.mRfpsB 2014-07-10 17:47:31.464881409 +0200
++++ dhcp-4.3.1b1/server/dhcpv6.c 2014-07-10 17:48:03.800424573 +0200
+@@ -330,6 +330,9 @@ generate_new_server_duid(void) {
if (p->hw_address.hlen > 0) {
break;
}
-diff -up dhcp-4.2.0/server/dhcpv6.c.UseMulticast dhcp-4.2.0/server/dhcpv6.c
---- dhcp-4.2.0/server/dhcpv6.c.UseMulticast 2010-06-01 19:30:00.000000000 +0200
-+++ dhcp-4.2.0/server/dhcpv6.c 2010-07-21 16:17:30.000000000 +0200
-@@ -346,6 +346,48 @@ generate_new_server_duid(void) {
+diff -up dhcp-4.3.1b1/server/dhcpv6.c.UseMulticast dhcp-4.3.1b1/server/dhcpv6.c
+--- dhcp-4.3.1b1/server/dhcpv6.c.UseMulticast 2014-07-02 19:58:40.000000000 +0200
++++ dhcp-4.3.1b1/server/dhcpv6.c 2014-07-10 18:20:03.066256219 +0200
+@@ -376,6 +376,48 @@ generate_new_server_duid(void) {
}
/*
+ }
+
+ execute_statements_in_scope(NULL, NULL, NULL, NULL, NULL,
-+ opt_state, &global_scope, root_group, NULL);
++ opt_state, &global_scope, root_group, NULL, NULL);
+
+ oc = lookup_option(&dhcpv6_universe, opt_state, D6O_UNICAST);
+ unicast_option_defined = (oc != NULL);
* Get the client identifier from the packet.
*/
isc_result_t
-@@ -1405,6 +1447,56 @@ lease_to_client(struct data_string *repl
- reply.shared->group);
+@@ -706,6 +748,12 @@ static const int required_opts[] = {
+ D6O_PREFERENCE,
+ 0
+ };
++static const int required_opts_NAA[] = {
++ D6O_CLIENTID,
++ D6O_SERVERID,
++ D6O_STATUS_CODE,
++ 0
++};
+ static const int required_opts_solicit[] = {
+ D6O_CLIENTID,
+ D6O_SERVERID,
+@@ -1587,6 +1635,56 @@ lease_to_client(struct data_string *repl
+ reply.shared->group, NULL);
}
+ /* reject unicast message, unless we set unicast option */
+ reply.opt_state, reply.packet,
+ required_opts_NAA,
+ NULL);
-+ } else if (no_resources_avail && (reply.ia_count != 0) &&
-+ (reply.packet->dhcpv6_msg_type == DHCPV6_SOLICIT))
++ }
++
/*
* RFC3315 section 17.2.2 (Solicit):
*
-@@ -1429,8 +1521,6 @@ lease_to_client(struct data_string *repl
- * the server.
- * Sends a Renew/Rebind if the IA is not in the Reply message.
+@@ -1619,6 +1717,7 @@ lease_to_client(struct data_string *repl
+ * Having stored the client's IA's, store any options that
+ * will fit in the remaining space.
*/
-- if (no_resources_avail && (reply.ia_count != 0) &&
-- (reply.packet->dhcpv6_msg_type == DHCPV6_SOLICIT))
- {
- /* Set the NoAddrsAvail status code. */
- if (!set_status_code(STATUS_NoAddrsAvail,
-@@ -4128,7 +4218,6 @@ dhcpv6_solicit(struct data_string *reply
++ else
+ reply.cursor += store_options6((char *)reply.buf.data + reply.cursor,
+ sizeof(reply.buf) - reply.cursor,
+ reply.opt_state, reply.packet,
+@@ -4748,7 +4847,6 @@ dhcpv6_solicit(struct data_string *reply
* Very similar to Solicit handling, except the server DUID is required.
*/
static void
dhcpv6_request(struct data_string *reply_ret, struct packet *packet) {
struct data_string client_id;
-@@ -4443,7 +4532,6 @@ exit:
+@@ -5078,7 +5176,6 @@ exit:
* except for the error code of when addresses don't match.
*/
static void
dhcpv6_renew(struct data_string *reply, struct packet *packet) {
struct data_string client_id;
-@@ -4688,18 +4776,60 @@ iterate_over_ia_na(struct data_string *r
+@@ -5322,18 +5419,60 @@ iterate_over_ia_na(struct data_string *r
goto exit;
}
/*
* Loop through the IA_NA reported by the client, and deal with
-@@ -4838,6 +4968,7 @@ iterate_over_ia_na(struct data_string *r
+@@ -5471,6 +5610,7 @@ iterate_over_ia_na(struct data_string *r
/*
* Return our reply to the caller.
*/
reply_ret->len = reply_ofs;
reply_ret->buffer = NULL;
if (!buffer_allocate(&reply_ret->buffer, reply_ofs, MDL)) {
-@@ -4883,7 +5014,6 @@ exit:
+@@ -5516,7 +5656,6 @@ exit:
* we still need to be aware of this possibility.
*/
/* TODO: IA_TA */
static void
dhcpv6_decline(struct data_string *reply, struct packet *packet) {
-@@ -5355,7 +5485,6 @@ exit:
+@@ -5986,7 +6125,6 @@ exit:
* Release means a client is done with the leases.
*/
--- /dev/null
+diff -up dhcp-4.3.0a1/common/dispatch.c.dracut dhcp-4.3.0a1/common/dispatch.c
+--- dhcp-4.3.0a1/common/dispatch.c.dracut 2013-12-11 01:25:12.000000000 +0100
++++ dhcp-4.3.0a1/common/dispatch.c 2013-12-19 15:39:50.350505860 +0100
+@@ -210,6 +210,10 @@ void add_timeout (when, where, what, ref
+ isc_interval_t interval;
+ isc_time_t expires;
+
++ if (when == NULL) {
++ return;
++ }
++
+ /* See if this timeout supersedes an existing timeout. */
+ t = (struct timeout *)0;
+ for (q = timeouts; q; q = q->next) {
-diff -up dhcp-4.2.2b1/client/dhclient.8.capability dhcp-4.2.2b1/client/dhclient.8
---- dhcp-4.2.2b1/client/dhclient.8.capability 2011-07-01 15:09:06.603784531 +0200
-+++ dhcp-4.2.2b1/client/dhclient.8 2011-07-01 15:09:06.663783913 +0200
-@@ -118,6 +118,9 @@ dhclient - Dynamic Host Configuration Pr
+diff -up dhcp-4.3.1b1/client/dhclient.8.zzftXp dhcp-4.3.1b1/client/dhclient.8
+--- dhcp-4.3.1b1/client/dhclient.8.zzftXp 2014-07-10 17:38:26.938599402 +0200
++++ dhcp-4.3.1b1/client/dhclient.8 2014-07-10 17:39:25.852763873 +0200
+@@ -128,6 +128,9 @@ dhclient - Dynamic Host Configuration Pr
.B -w
]
[
.B -B
]
[
-@@ -296,6 +299,32 @@ has been added or removed, so that the c
+@@ -304,6 +307,32 @@ has been added or removed, so that the c
address on that interface.
.TP
.BI \-B
Set the BOOTP broadcast flag in request packets so servers will always
broadcast replies.
-diff -up dhcp-4.2.2b1/client/dhclient.c.capability dhcp-4.2.2b1/client/dhclient.c
---- dhcp-4.2.2b1/client/dhclient.c.capability 2011-07-01 15:09:06.644784107 +0200
-+++ dhcp-4.2.2b1/client/dhclient.c 2011-07-01 15:09:06.664783903 +0200
+diff -up dhcp-4.3.1b1/client/dhclient.c.zzftXp dhcp-4.3.1b1/client/dhclient.c
+--- dhcp-4.3.1b1/client/dhclient.c.zzftXp 2014-07-10 17:39:25.797764653 +0200
++++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:39:25.853763858 +0200
@@ -39,6 +39,10 @@
#include <limits.h>
#include <dns/result.h>
/*
* Defined in stdio.h when _GNU_SOURCE is set, but we don't want to define
* that when building ISC code.
-@@ -141,6 +145,9 @@ main(int argc, char **argv) {
+@@ -143,6 +147,9 @@ main(int argc, char **argv) {
int timeout_arg = 0;
char *arg_conf = NULL;
int arg_conf_len = 0;
/* Initialize client globals. */
memset(&default_duid, 0, sizeof(default_duid));
-@@ -410,6 +417,10 @@ main(int argc, char **argv) {
+@@ -425,6 +432,10 @@ main(int argc, char **argv) {
}
dhclient_request_options = argv[i];
} else if (argv[i][0] == '-') {
usage();
} else if (interfaces_requested < 0) {
-@@ -458,6 +469,19 @@ main(int argc, char **argv) {
+@@ -473,6 +484,19 @@ main(int argc, char **argv) {
path_dhclient_script = s;
}
/* Set up the initial dhcp option universe. */
initialize_common_option_spaces();
-diff -up dhcp-4.2.2b1/client/dhclient-script.8.capability dhcp-4.2.2b1/client/dhclient-script.8
---- dhcp-4.2.2b1/client/dhclient-script.8.capability 2011-07-01 15:09:06.604784521 +0200
-+++ dhcp-4.2.2b1/client/dhclient-script.8 2011-07-01 15:09:06.666783883 +0200
-@@ -239,6 +239,16 @@ repeatedly initialized to the values pro
+diff -up dhcp-4.3.1b1/client/dhclient-script.8.zzftXp dhcp-4.3.1b1/client/dhclient-script.8
+--- dhcp-4.3.1b1/client/dhclient-script.8.zzftXp 2014-07-10 17:39:25.761765163 +0200
++++ dhcp-4.3.1b1/client/dhclient-script.8 2014-07-10 17:39:25.851763887 +0200
+@@ -243,6 +243,16 @@ repeatedly initialized to the values pro
the other. Assuming the information provided by both servers is
valid, this shouldn't cause any real problems, but it could be
confusing.
.SH SEE ALSO
dhclient(8), dhcpd(8), dhcrelay(8), dhclient.conf(5) and
dhclient.leases(5).
-diff -up dhcp-4.2.2b1/client/Makefile.am.capability dhcp-4.2.2b1/client/Makefile.am
---- dhcp-4.2.2b1/client/Makefile.am.capability 2011-07-01 15:09:06.526785327 +0200
-+++ dhcp-4.2.2b1/client/Makefile.am 2011-07-01 15:09:06.667783873 +0200
-@@ -5,7 +5,7 @@ dhclient_SOURCES = clparse.c dhclient.c
+diff -up dhcp-4.3.1b1/client/Makefile.am.zzftXp dhcp-4.3.1b1/client/Makefile.am
+--- dhcp-4.3.1b1/client/Makefile.am.zzftXp 2014-07-10 17:38:10.778828583 +0200
++++ dhcp-4.3.1b1/client/Makefile.am 2014-07-10 17:39:25.851763887 +0200
+@@ -10,7 +10,7 @@ dhclient_SOURCES = clparse.c dhclient.c
+ scripts/bsdos scripts/freebsd scripts/linux scripts/macos \
scripts/netbsd scripts/nextstep scripts/openbsd \
scripts/solaris scripts/openwrt
- dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-- $(BIND9_LIBDIR) -ldns-export -lisc-export
-+ $(BIND9_LIBDIR) -ldns-export -lisc-export $(CAPNG_LDADD)
+-dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
++dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.la $(CAPNG_LDADD) \
+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5
EXTRA_DIST = $(man_MANS)
-
-diff -up dhcp-4.2.2b1/configure.ac.capability dhcp-4.2.2b1/configure.ac
---- dhcp-4.2.2b1/configure.ac.capability 2011-07-01 15:09:06.527785317 +0200
-+++ dhcp-4.2.2b1/configure.ac 2011-07-01 15:09:06.667783873 +0200
-@@ -449,6 +449,41 @@ AC_TRY_LINK(
+diff -up dhcp-4.3.1b1/configure.ac.zzftXp dhcp-4.3.1b1/configure.ac
+--- dhcp-4.3.1b1/configure.ac.zzftXp 2014-07-10 17:38:10.779828569 +0200
++++ dhcp-4.3.1b1/configure.ac 2014-07-10 17:39:25.854763844 +0200
+@@ -499,6 +499,41 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],
# Look for optional headers.
AC_CHECK_HEADERS(sys/socket.h net/if_dl.h net/if6.h regex.h)
# Solaris needs some libraries for functions
AC_SEARCH_LIBS(socket, [socket])
AC_SEARCH_LIBS(inet_ntoa, [nsl])
-diff -up dhcp-4.2.2b1/relay/dhcrelay.c.capability dhcp-4.2.2b1/relay/dhcrelay.c
---- dhcp-4.2.2b1/relay/dhcrelay.c.capability 2011-07-01 15:09:06.626784295 +0200
-+++ dhcp-4.2.2b1/relay/dhcrelay.c 2011-07-01 15:12:05.362223794 +0200
-@@ -36,6 +36,11 @@
- #include <syslog.h>
+diff -up dhcp-4.3.1b1/relay/dhcrelay.c.zzftXp dhcp-4.3.1b1/relay/dhcrelay.c
+--- dhcp-4.3.1b1/relay/dhcrelay.c.zzftXp 2014-07-10 17:39:25.799764624 +0200
++++ dhcp-4.3.1b1/relay/dhcrelay.c 2014-07-10 17:40:19.191007421 +0200
+@@ -31,6 +31,11 @@
+ #include <signal.h>
#include <sys/time.h>
+#ifdef HAVE_LIBCAP_NG
TIME default_lease_time = 43200; /* 12 hours... */
TIME max_lease_time = 86400; /* 24 hours... */
struct tree_cache *global_options[256];
-@@ -356,6 +361,10 @@ main(int argc, char **argv) {
- sl->next = upstreams;
- upstreams = sl;
+@@ -376,6 +381,10 @@ main(int argc, char **argv) {
+ usage();
+ dhcrelay_sub_id = argv[i];
#endif
+ } else if (!strcmp(argv[i], "-nc")) {
+#ifdef HAVE_LIBCAP_NG
} else if (!strcmp(argv[i], "-pf")) {
if (++i == argc)
usage();
-@@ -426,6 +435,17 @@ main(int argc, char **argv) {
+@@ -446,6 +455,17 @@ main(int argc, char **argv) {
#endif
}
if (!quiet) {
log_info("%s %s", message, PACKAGE_VERSION);
log_info(copyright);
-@@ -573,6 +593,15 @@ main(int argc, char **argv) {
- dhcpv6_packet_handler = do_packet6;
+@@ -598,6 +618,15 @@ main(int argc, char **argv) {
+ signal(SIGTERM, dhcp_signal_handler); /* kill */
#endif
+#ifdef HAVE_LIBCAP_NG
/* Start dispatching packets and timeouts... */
dispatch();
-diff -up dhcp-4.2.2b1/relay/Makefile.am.capability dhcp-4.2.2b1/relay/Makefile.am
---- dhcp-4.2.2b1/relay/Makefile.am.capability 2011-07-01 15:09:06.546785121 +0200
-+++ dhcp-4.2.2b1/relay/Makefile.am 2011-07-01 15:09:06.670783841 +0200
-@@ -3,7 +3,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localst
+diff -up dhcp-4.3.1b1/relay/Makefile.am.zzftXp dhcp-4.3.1b1/relay/Makefile.am
+--- dhcp-4.3.1b1/relay/Makefile.am.zzftXp 2014-07-10 17:38:10.780828554 +0200
++++ dhcp-4.3.1b1/relay/Makefile.am 2014-07-10 17:39:25.854763844 +0200
+@@ -2,7 +2,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localst
+
sbin_PROGRAMS = dhcrelay
dhcrelay_SOURCES = dhcrelay.c
- dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-- $(BIND9_LIBDIR) -ldns-export -lisc-export
-+ $(BIND9_LIBDIR) -ldns-export -lisc-export $(CAPNG_LDADD)
+-dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
++dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.la $(CAPNG_LDADD) \
+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
man_MANS = dhcrelay.8
EXTRA_DIST = $(man_MANS)
-
-diff -up dhcp-4.2.2b1/server/dhcpd.c.capability dhcp-4.2.2b1/server/dhcpd.c
---- dhcp-4.2.2b1/server/dhcpd.c.capability 2011-07-01 15:09:06.636784192 +0200
-+++ dhcp-4.2.2b1/server/dhcpd.c 2011-07-01 15:09:06.670783841 +0200
-@@ -58,6 +58,11 @@ static const char url [] =
- # undef group
- #endif /* PARANOIA */
-
-+#ifdef HAVE_LIBCAP_NG
-+# include <cap-ng.h>
-+ int keep_capabilities = 0;
-+#endif
-+
- static void usage(void);
-
- struct iaddr server_identifier;
-@@ -403,6 +408,10 @@ main(int argc, char **argv) {
- traceinfile = argv [i];
- trace_replay_init ();
- #endif /* TRACING */
-+ } else if (!strcmp(argv[i], "-nc")) {
-+#ifdef HAVE_LIBCAP_NG
-+ keep_capabilities = 1;
-+#endif
- } else if (argv [i][0] == '-') {
- usage ();
- } else {
-@@ -459,6 +468,17 @@ main(int argc, char **argv) {
- }
- #endif /* DHCPv6 */
-
-+#ifdef HAVE_LIBCAP_NG
-+ /* Drop capabilities */
-+ if (!keep_capabilities) {
-+ capng_clear(CAPNG_SELECT_BOTH);
-+ capng_updatev(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
-+ CAP_NET_RAW, CAP_NET_BIND_SERVICE, CAP_SYS_CHROOT, CAP_SETUID, CAP_SETGID, -1);
-+ capng_apply(CAPNG_SELECT_BOTH);
-+ log_info ("Dropped all unnecessary capabilities.");
-+ }
-+#endif
-+
- /*
- * convert relative path names to absolute, for files that need
- * to be reopened after chdir() has been called
-@@ -859,6 +879,15 @@ main(int argc, char **argv) {
- omapi_set_int_value ((omapi_object_t *)dhcp_control_object,
- (omapi_object_t *)0, "state", server_running);
-
-+#ifdef HAVE_LIBCAP_NG
-+ /* Drop all capabilities */
-+ if (!keep_capabilities) {
-+ capng_clear(CAPNG_SELECT_BOTH);
-+ capng_apply(CAPNG_SELECT_BOTH);
-+ log_info ("Dropped all capabilities.");
-+ }
-+#endif
-+
- /* Receive packets and dispatch them... */
- dispatch ();
-
-diff -up dhcp-4.2.2b1/server/Makefile.am.capability dhcp-4.2.2b1/server/Makefile.am
---- dhcp-4.2.2b1/server/Makefile.am.capability 2011-07-01 15:09:06.546785121 +0200
-+++ dhcp-4.2.2b1/server/Makefile.am 2011-07-01 15:09:06.671783830 +0200
-@@ -8,7 +8,8 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c c
-
- dhcpd_CFLAGS = $(LDAP_CFLAGS)
- dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-- ../dhcpctl/libdhcpctl.a $(BIND9_LIBDIR) -ldns-export -lisc-export
-+ ../dhcpctl/libdhcpctl.a $(BIND9_LIBDIR) -ldns-export -lisc-export \
-+ $(CAPNG_LDADD)
-
- man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
- EXTRA_DIST = $(man_MANS)
-diff -up dhcp-4.2.0/client/clparse.c.requested dhcp-4.2.0/client/clparse.c
---- dhcp-4.2.0/client/clparse.c.requested 2010-07-21 13:29:05.000000000 +0200
-+++ dhcp-4.2.0/client/clparse.c 2010-07-21 13:50:29.000000000 +0200
+diff -up dhcp-4.3.0a1/client/clparse.c.requested dhcp-4.3.0a1/client/clparse.c
+--- dhcp-4.3.0a1/client/clparse.c.requested 2013-12-19 15:13:27.276631307 +0100
++++ dhcp-4.3.0a1/client/clparse.c 2013-12-19 15:13:27.313630789 +0100
@@ -37,7 +37,7 @@
struct client_config top_level_config;
struct option *default_requested_options[NUM_DEFAULT_REQUESTED_OPTS + 1];
static void parse_client_default_duid(struct parse *cfile);
-@@ -111,6 +111,31 @@ isc_result_t read_client_conf ()
+@@ -119,6 +119,31 @@ isc_result_t read_client_conf ()
option_code_hash_lookup(&default_requested_options[8],
dhcpv6_universe.code_hash, &code, 0, MDL);
-diff -up dhcp-4.2.0/client/dhclient.c.backoff dhcp-4.2.0/client/dhclient.c
---- dhcp-4.2.0/client/dhclient.c.backoff 2010-07-21 13:37:03.000000000 +0200
-+++ dhcp-4.2.0/client/dhclient.c 2010-07-21 13:38:31.000000000 +0200
-@@ -1208,6 +1208,8 @@ void state_init (cpp)
+diff -up dhcp-4.3.1b1/client/dhclient.c.JwFUZj dhcp-4.3.1b1/client/dhclient.c
+--- dhcp-4.3.1b1/client/dhclient.c.JwFUZj 2014-07-10 17:38:50.511265091 +0200
++++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:39:16.164901267 +0200
+@@ -1281,6 +1281,8 @@ void state_init (cpp)
void *cpp;
{
struct client_state *client = cpp;
ASSERT_STATE(state, S_INIT);
-@@ -1220,9 +1222,18 @@ void state_init (cpp)
+@@ -1293,9 +1295,18 @@ void state_init (cpp)
client -> first_sending = cur_time;
client -> interval = client -> config -> initial_interval;
}
/*
-@@ -1501,6 +1512,7 @@ void bind_lease (client)
- send_decline (client);
- destroy_client_lease (client -> new);
- client -> new = (struct client_lease *)0;
-+ client -> state = S_DECLINED;
- state_init (client);
- return;
- }
-@@ -3711,6 +3723,7 @@ void client_location_changed ()
+@@ -1592,6 +1603,7 @@ void bind_lease (client)
+ "try (declined). Exiting.");
+ exit(2);
+ } else {
++ client -> state = S_DECLINED;
+ state_init(client);
+ return;
+ }
+@@ -4059,6 +4071,7 @@ void client_location_changed ()
case S_INIT:
case S_REBINDING:
case S_STOPPED:
break;
}
client -> state = S_INIT;
-diff -up dhcp-4.2.0/includes/dhcpd.h.backoff dhcp-4.2.0/includes/dhcpd.h
---- dhcp-4.2.0/includes/dhcpd.h.backoff 2010-07-21 13:29:05.000000000 +0200
-+++ dhcp-4.2.0/includes/dhcpd.h 2010-07-21 13:38:31.000000000 +0200
-@@ -1056,7 +1056,8 @@ enum dhcp_state {
+diff -up dhcp-4.3.1b1/includes/dhcpd.h.JwFUZj dhcp-4.3.1b1/includes/dhcpd.h
+--- dhcp-4.3.1b1/includes/dhcpd.h.JwFUZj 2014-07-10 17:38:26.941599360 +0200
++++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:38:50.526264878 +0200
+@@ -1087,7 +1087,8 @@ enum dhcp_state {
S_BOUND = 5,
S_RENEWING = 6,
S_REBINDING = 7,
-diff -up dhcp-4.2.2b1/client/clparse.c.options dhcp-4.2.2b1/client/clparse.c
---- dhcp-4.2.2b1/client/clparse.c.options 2011-04-21 16:08:14.000000000 +0200
-+++ dhcp-4.2.2b1/client/clparse.c 2011-07-01 13:51:52.935755570 +0200
-@@ -146,6 +146,7 @@ isc_result_t read_client_conf ()
+diff -up dhcp-4.3.1b1/client/clparse.c.fLPqYB dhcp-4.3.1b1/client/clparse.c
+--- dhcp-4.3.1b1/client/clparse.c.fLPqYB 2014-07-02 19:58:38.000000000 +0200
++++ dhcp-4.3.1b1/client/clparse.c 2014-07-10 17:38:26.938599402 +0200
+@@ -148,6 +148,7 @@ isc_result_t read_client_conf ()
/* Requested lease time, used by DHCPv6 (DHCPv4 uses the option cache)
*/
top_level_config.requested_lease = 7200;
group_allocate (&top_level_config.on_receipt, MDL);
if (!top_level_config.on_receipt)
-@@ -313,7 +314,8 @@ void read_client_leases ()
+@@ -353,7 +354,8 @@ void read_client_leases ()
interface-declaration |
LEASE client-lease-statement |
ALIAS client-lease-statement |
void parse_client_statement (cfile, ip, config)
struct parse *cfile;
-@@ -732,6 +734,12 @@ void parse_client_statement (cfile, ip,
+@@ -771,6 +773,12 @@ void parse_client_statement (cfile, ip,
parse_reject_statement (cfile, config);
return;
default:
lose = 0;
stmt = (struct executable_statement *)0;
-diff -up dhcp-4.2.2b1/client/dhclient.c.options dhcp-4.2.2b1/client/dhclient.c
---- dhcp-4.2.2b1/client/dhclient.c.options 2011-05-11 16:20:59.000000000 +0200
-+++ dhcp-4.2.2b1/client/dhclient.c 2011-07-01 13:51:52.936755545 +0200
+diff -up dhcp-4.3.1b1/client/dhclient.8.fLPqYB dhcp-4.3.1b1/client/dhclient.8
+--- dhcp-4.3.1b1/client/dhclient.8.fLPqYB 2014-07-02 19:58:38.000000000 +0200
++++ dhcp-4.3.1b1/client/dhclient.8 2014-07-10 17:38:26.938599402 +0200
+@@ -128,6 +128,33 @@ dhclient - Dynamic Host Configuration Pr
+ .B -w
+ ]
+ [
++.B -B
++]
++[
++.B -C
++.I dhcp-client-identifier
++]
++[
++.B -H
++.I host-name
++]
++[
++.B -F
++.I fqdn.fqdn
++]
++[
++.B -V
++.I vendor-class-identifier
++]
++[
++.B -R
++.I request-option-list
++]
++[
++.B -timeout
++.I timeout
++]
++[
+ .B -v
+ ]
+ [
+@@ -275,6 +302,69 @@ not to exit when it doesn't find any suc
+ program can then be used to notify the client when a network interface
+ has been added or removed, so that the client can attempt to configure an IP
+ address on that interface.
++
++.TP
++.BI \-B
++Set the BOOTP broadcast flag in request packets so servers will always
++broadcast replies.
++
++.TP
++.BI \-C\ <dhcp-client-identifier>
++Specify the dhcp-client-identifier option to send to the DHCP server.
++
++.TP
++.BI \-H\ <host-name>
++Specify the host-name option to send to the DHCP server. The host-name
++string only contains the client's hostname prefix, to which the server will
++append the ddns-domainname or domain-name options, if any, to derive the
++fully qualified domain name of the client. The
++.B -H
++option cannot be used with the
++.B -F
++option.
++
++.TP
++.BI \-F\ <fqdn.fqdn>
++Specify the fqdn.fqdn option to send to the DHCP server. This option cannot
++be used with the
++.B -H
++option. The fqdn.fqdn option must specify the complete domain name of the
++client host, which the server may use for dynamic DNS updates.
++
++.TP
++.BI \-V\ <vendor-class-identifier>
++Specify the vendor-class-identifier option to send to the DHCP server.
++
++.TP
++.BI \-R\ <option>[,<option>...]
++Specify the list of options the client is to request from the server. The
++option list must be a single string consisting of option names separated
++by at least one command and optional space characters. The default option
++list is:
++
++.BR
++ subnet-mask, broadcast-address, time-offset, routers,
++.BR
++ domain-search, domain-name, domain-name-servers, host-name,
++.BR
++ nis-domain, nis-servers, ntp-servers, interface-mtu
++
++.TP
++.B -R
++option does not append options to the default request, it overrides the
++default request list. Keep this in mind if you want to request an
++additional option besides the default request list. You will have to
++specify all option names for the
++.B -R
++parameter.
++
++.TP
++.BI \-timeout\ <timeout>
++Specify the time after which
++.B dhclient
++will decide that no DHCP servers can be contacted when no responses have been
++received.
++
+ .TP
+ .BI \-n
+ Do not configure any interfaces. This is most likely to be useful in
+diff -up dhcp-4.3.1b1/client/dhclient.c.fLPqYB dhcp-4.3.1b1/client/dhclient.c
+--- dhcp-4.3.1b1/client/dhclient.c.fLPqYB 2014-07-02 19:58:38.000000000 +0200
++++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:38:44.520350055 +0200
@@ -39,6 +39,12 @@
#include <limits.h>
#include <dns/result.h>
TIME default_lease_time = 43200; /* 12 hours... */
TIME max_lease_time = 86400; /* 24 hours... */
-@@ -87,6 +93,9 @@ int wanted_ia_na = -1; /* the absolute
+@@ -88,6 +94,9 @@ int wanted_ia_na = -1; /* the absolute
int wanted_ia_ta = 0;
int wanted_ia_pd = 0;
char *mockup_relay = NULL;
+int bootp_broadcast_always = 0;
+
-+extern u_int32_t default_requested_options[];
++extern struct option *default_requested_options[];
void run_stateless(int exit_mode);
-@@ -123,6 +132,15 @@ main(int argc, char **argv) {
+@@ -125,6 +134,15 @@ main(int argc, char **argv) {
int local_family_set = 0;
#endif /* DHCPv6 */
char *s;
/* Initialize client globals. */
memset(&default_duid, 0, sizeof(default_duid));
-@@ -310,6 +328,88 @@ main(int argc, char **argv) {
- } else if (!strcmp(argv[i], "--version")) {
- log_info("isc-dhclient-%s", PACKAGE_VERSION);
+@@ -325,6 +343,88 @@ main(int argc, char **argv) {
+ strlen(PACKAGE_VERSION)));
+ IGNORE_RET(write(STDERR_FILENO, "\n", 1));
exit(0);
-+ } else if (!strcmp(argv[i], "-I")) {
++ } else if (!strcmp(argv[i], "-C")) {
+ if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
+ usage();
+ exit(1);
+ }
+
+ if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
-+ log_error("-I option dhcp-client-identifier string \"%s\" is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
++ log_error("-C option dhcp-client-identifier string \"%s\" is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
+ exit(1);
+ }
+
+ }
+
+ if ((timeout_arg = atoi(argv[i])) <= 0) {
-+ log_error("-T timeout option must be > 0 - bad value: %s",argv[i]);
++ log_error("timeout option must be > 0 - bad value: %s",argv[i]);
+ exit(1);
+ }
+ } else if (!strcmp(argv[i], "-V")) {
} else if (argv[i][0] == '-') {
usage();
} else if (interfaces_requested < 0) {
-@@ -484,6 +584,166 @@ main(int argc, char **argv) {
+@@ -507,6 +607,156 @@ main(int argc, char **argv) {
/* Parse the dhclient.conf file. */
read_client_conf();
+ arg_conf_len = asprintf(&arg_conf, "send dhcp-client-identifier \"%s\";", dhcp_client_identifier_arg);
+
+ if ((arg_conf == 0) || (arg_conf_len <= 0))
-+ log_fatal("Unable to send -I option dhcp-client-identifier");
++ log_fatal("Unable to send -C option dhcp-client-identifier");
+ }
+
+ if ((dhcp_host_name_arg != NULL) && (*dhcp_host_name_arg != '\0')) {
+ if (arg_conf_len == 0)
+ if ((arg_conf_len = strlen(arg_conf)) == 0)
+ /* huh ? cannot happen ! */
-+ log_fatal("Unable to process -I/-H/-F/-timeout/-V/-R configuration arguments");
++ log_fatal("Unable to process -C/-H/-F/-timeout/-V/-R configuration arguments");
+
+ /* parse the extra dhclient.conf configuration arguments
+ * into top level config: */
+ const char *val = NULL;
+ int token;
+
-+ status = new_parse(&cfile, -1, arg_conf, arg_conf_len, "extra dhclient -I/-H/-F/-timeout/-V/-R configuration arguments", 0);
++ status = new_parse(&cfile, -1, arg_conf, arg_conf_len, "extra dhclient -C/-H/-F/-timeout/-V/-R configuration arguments", 0);
+
+ if ((status != ISC_R_SUCCESS) || (cfile -> warnings_occurred))
-+ log_fatal("Cannot parse -I/-H/-F/-timeout/-V/-R configuration arguments !");
++ log_fatal("Cannot parse -C/-H/-F/-timeout/-V/-R configuration arguments !");
+ /* more detailed parse failures will be logged */
+
+ do {
+ } while (1);
+
+ if (cfile -> warnings_occurred)
-+ log_fatal("Cannot parse -I/-H/-F/-timeout/-V/-R configuration arguments !");
++ log_fatal("Cannot parse -C/-H/-F/-timeout/-V/-R configuration arguments !");
+ end_parse(&cfile);
+
+ if (timeout_arg) {
+ /* we just set the toplevel timeout, but per-client
-+ * timeouts may still be at defaults. Also, it makes no
-+ * sense having the reboot_timeout or backoff_cutoff
-+ * greater than the timeout:
++ * timeouts may still be at defaults.
+ */
-+ if ((top_level_config.backoff_cutoff == 15) && (top_level_config.backoff_cutoff > (timeout_arg / 2)))
-+ top_level_config.backoff_cutoff = (((unsigned long)(timeout_arg / 2)) == 0) ? timeout_arg : (unsigned long)(timeout_arg / 2);
-+
+ for (ip=interfaces; ip; ip = ip->next) {
+ if (ip->client->config->timeout == 60)
+ ip->client->config->timeout = timeout_arg;
-+
-+ if ((ip->client->config->reboot_timeout == 10) && (ip->client->config->reboot_timeout > ip->client->config->timeout))
-+ ip->client->config->reboot_timeout = ip->client->config->timeout;
-+ if ((ip->client->config->backoff_cutoff == 15) && (ip->client->config->backoff_cutoff > top_level_config.backoff_cutoff))
-+ ip->client->config->backoff_cutoff = top_level_config.backoff_cutoff;
+ }
+ }
+
/* Parse the lease database. */
read_client_leases();
-@@ -2397,7 +2657,8 @@ void make_discover (client, lease)
+@@ -756,6 +1006,10 @@ static void usage()
+ " [-s server-addr] [-cf config-file]\n"
+ " [-df duid-file] [-lf lease-file]\n"
+ " [-pf pid-file] [--no-pid] [-e VAR=val]\n"
++ " [-C <dhcp-client-identifier>] [-B]\n"
++ " [-H <host-name> | -F <fqdn.fqdn>] [-timeout <timeout>]\n"
++ " [-V <vendor-class-identifier>]\n"
++ " [-R <request option list>]\n"
+ " [-sf script-file] [interface]");
+ }
+
+@@ -2531,7 +2785,8 @@ void make_discover (client, lease)
client -> packet.xid = random ();
client -> packet.secs = 0; /* filled in by send_discover. */
client -> packet.flags = 0;
else
client -> packet.flags = htons (BOOTP_BROADCAST);
-@@ -2481,7 +2742,9 @@ void make_request (client, lease)
+@@ -2615,7 +2870,9 @@ void make_request (client, lease)
} else {
memset (&client -> packet.ciaddr, 0,
sizeof client -> packet.ciaddr);
client -> packet.flags = 0;
else
client -> packet.flags = htons (BOOTP_BROADCAST);
-@@ -2543,7 +2806,8 @@ void make_decline (client, lease)
+@@ -2677,7 +2934,8 @@ void make_decline (client, lease)
client -> packet.hops = 0;
client -> packet.xid = client -> xid;
client -> packet.secs = 0; /* Filled in by send_request. */
client -> packet.flags = 0;
else
client -> packet.flags = htons (BOOTP_BROADCAST);
-diff -up dhcp-4.2.2b1/common/conflex.c.options dhcp-4.2.2b1/common/conflex.c
---- dhcp-4.2.2b1/common/conflex.c.options 2011-05-11 16:20:59.000000000 +0200
-+++ dhcp-4.2.2b1/common/conflex.c 2011-07-01 13:51:52.938755494 +0200
-@@ -808,6 +808,8 @@ intern(char *atom, enum dhcp_token dfv)
+diff -up dhcp-4.3.1b1/common/conflex.c.fLPqYB dhcp-4.3.1b1/common/conflex.c
+--- dhcp-4.3.1b1/common/conflex.c.fLPqYB 2014-07-02 19:58:38.000000000 +0200
++++ dhcp-4.3.1b1/common/conflex.c 2014-07-10 17:38:26.940599374 +0200
+@@ -811,6 +811,8 @@ intern(char *atom, enum dhcp_token dfv)
return BALANCE;
if (!strcasecmp (atom + 1, "ound"))
return BOUND;
break;
case 'c':
if (!strcasecmp(atom + 1, "ase"))
-diff -up dhcp-4.2.2b1/includes/dhcpd.h.options dhcp-4.2.2b1/includes/dhcpd.h
---- dhcp-4.2.2b1/includes/dhcpd.h.options 2011-05-20 16:21:11.000000000 +0200
-+++ dhcp-4.2.2b1/includes/dhcpd.h 2011-07-01 13:51:52.940755442 +0200
-@@ -1147,6 +1147,9 @@ struct client_config {
+diff -up dhcp-4.3.1b1/includes/dhcpd.h.fLPqYB dhcp-4.3.1b1/includes/dhcpd.h
+--- dhcp-4.3.1b1/includes/dhcpd.h.fLPqYB 2014-07-02 19:58:39.000000000 +0200
++++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:38:26.941599360 +0200
+@@ -1152,6 +1152,9 @@ struct client_config {
int do_forward_update; /* If nonzero, and if we have the
information we need, update the
A record for the address we get. */
};
/* Per-interface state used in the dhcp client... */
-diff -up dhcp-4.2.2b1/includes/dhctoken.h.options dhcp-4.2.2b1/includes/dhctoken.h
---- dhcp-4.2.2b1/includes/dhctoken.h.options 2011-05-12 14:02:47.000000000 +0200
-+++ dhcp-4.2.2b1/includes/dhctoken.h 2011-07-01 13:53:43.316861637 +0200
-@@ -361,7 +361,8 @@ enum dhcp_token {
- GETHOSTNAME = 662,
- REWIND = 663,
- INITIAL_DELAY = 664,
-- GETHOSTBYNAME = 665
-+ GETHOSTBYNAME = 665,
-+ BOOTP_BROADCAST_ALWAYS = 666
+diff -up dhcp-4.3.1b1/includes/dhctoken.h.fLPqYB dhcp-4.3.1b1/includes/dhctoken.h
+--- dhcp-4.3.1b1/includes/dhctoken.h.fLPqYB 2014-07-02 19:58:39.000000000 +0200
++++ dhcp-4.3.1b1/includes/dhctoken.h 2014-07-10 17:38:26.942599346 +0200
+@@ -367,7 +367,8 @@ enum dhcp_token {
+ TOKEN_INFINIBAND = 668,
+ POOL6 = 669,
+ V6RELAY = 670,
+- V6RELOPT = 671
++ V6RELOPT = 671,
++ BOOTP_BROADCAST_ALWAYS = 672
};
#define is_identifier(x) ((x) >= FIRST_TOKEN && \
--- /dev/null
+diff -up dhcp-4.3.0b1/omapip/errwarn.c.errwarn dhcp-4.3.0b1/omapip/errwarn.c
+--- dhcp-4.3.0b1/omapip/errwarn.c.errwarn 2014-01-21 09:31:47.301334249 +0100
++++ dhcp-4.3.0b1/omapip/errwarn.c 2014-01-21 09:33:20.569039072 +0100
+@@ -76,11 +76,13 @@ void log_fatal (const char * fmt, ... )
+ }
+
+ log_error ("%s", "");
+- log_error ("If you think you have received this message due to a bug rather");
+- log_error ("than a configuration issue please read the section on submitting");
+- log_error ("bugs on either our web page at www.isc.org or in the README file");
+- log_error ("before submitting a bug. These pages explain the proper");
+- log_error ("process and the information we find helpful for debugging..");
++ log_error ("This version of ISC DHCP is based on the release available");
++ log_error ("on ftp.isc.org. Features have been added and other changes");
++ log_error ("have been made to the base software release in order to make");
++ log_error ("it work better with this distribution.");
++ log_error ("%s", "");
++ log_error ("Please report for this software via the Red Hat Bugzilla site:");
++ log_error (" http://bugzilla.redhat.com");
+ log_error ("%s", "");
+ log_error ("exiting.");
+
--- /dev/null
+diff -up dhcp-4.3.0rc1/common/tables.c.garbage dhcp-4.3.0rc1/common/tables.c
+--- dhcp-4.3.0rc1/common/tables.c.garbage 2014-01-29 10:03:52.132624677 +0100
++++ dhcp-4.3.0rc1/common/tables.c 2014-01-29 10:04:51.413875343 +0100
+@@ -213,7 +213,7 @@ static struct option dhcp_options[] = {
+ { "name-service-search", "Sa", &dhcp_universe, 117, 1 },
+ #endif
+ { "subnet-selection", "I", &dhcp_universe, 118, 1 },
+- { "domain-search", "Dc", &dhcp_universe, 119, 1 },
++ { "domain-search", "D", &dhcp_universe, 119, 1 },
+ { "vivco", "Evendor-class.", &dhcp_universe, 124, 1 },
+ { "vivso", "Evendor.", &dhcp_universe, 125, 1 },
+ #if 0
-diff -up dhcp-4.2.2/client/dhclient.c.gpxe-cid dhcp-4.2.2/client/dhclient.c
---- dhcp-4.2.2/client/dhclient.c.gpxe-cid 2011-09-16 18:23:20.190453902 +0200
-+++ dhcp-4.2.2/client/dhclient.c 2011-09-16 18:27:15.568463599 +0200
-@@ -58,6 +58,13 @@ const char *path_dhclient_pid = NULL;
+diff -up dhcp-4.3.0a1/client/dhclient.c.gpxe-cid dhcp-4.3.0a1/client/dhclient.c
+--- dhcp-4.3.0a1/client/dhclient.c.gpxe-cid 2013-12-20 13:28:45.105048317 +0100
++++ dhcp-4.3.0a1/client/dhclient.c 2013-12-20 13:28:45.109048261 +0100
+@@ -47,6 +47,14 @@
+ const char *path_dhclient_pid = NULL;
static char path_dhclient_script_array[] = _PATH_DHCLIENT_SCRIPT;
char *path_dhclient_script = path_dhclient_script_array;
-
++
+/* Default Prefix */
+static unsigned char default_prefix[12] = {
+ 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0xc9, 0x00
+};
+
- /* False (default) => we write and use a pid file */
- isc_boolean_t no_pid_file = ISC_FALSE;
+ const char *path_dhclient_duid = NULL;
-@@ -1250,6 +1257,12 @@ int find_subnet (struct subnet **sp,
+ /* False (default) => we write and use a pid file */
+@@ -1253,6 +1260,12 @@ int find_subnet (struct subnet **sp,
static void setup_ib_interface(struct interface_info *ip)
{
struct group *g;
/* Set the broadcast flag */
ip->client->config->bootp_broadcast_always = 1;
-@@ -1266,8 +1279,39 @@ static void setup_ib_interface(struct in
+@@ -1269,8 +1282,39 @@ static void setup_ib_interface(struct in
}
}
}
/* Individual States:
-diff -up dhcp-4.2.2/common/lpf.c.gpxe-cid dhcp-4.2.2/common/lpf.c
---- dhcp-4.2.2/common/lpf.c.gpxe-cid 2011-09-16 18:23:20.183453996 +0200
-+++ dhcp-4.2.2/common/lpf.c 2011-09-16 18:25:28.235804421 +0200
-@@ -591,6 +591,37 @@ void maybe_setup_fallback ()
- }
- }
-
-+static unsigned char * get_ib_hw_addr(char * name)
-+{
-+ struct ifaddrs *ifaddrs;
-+ struct ifaddrs *ifa;
-+ struct sockaddr_ll *sll = NULL;
-+ static unsigned char hw_addr[8];
-+
-+ if (getifaddrs(&ifaddrs) == -1)
-+ return NULL;
-+
-+ for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) {
-+ if (ifa->ifa_addr == NULL)
-+ continue;
-+ if (ifa->ifa_addr->sa_family != AF_PACKET)
-+ continue;
-+ if (ifa->ifa_flags & IFF_LOOPBACK)
-+ continue;
-+ if (strcmp(ifa->ifa_name, name) == 0) {
-+ sll = (struct sockaddr_ll *)(void *)ifa->ifa_addr;
-+ break;
-+ }
-+ }
-+ if (sll == NULL) {
-+ freeifaddrs(ifaddrs);
-+ return NULL;
-+ }
-+ memcpy(hw_addr, &sll->sll_addr[sll->sll_halen - 8], 8);
-+ freeifaddrs(ifaddrs);
-+ return (unsigned char *)&hw_addr;
-+}
-+
- void
- get_hw_addr(struct interface_info *info)
- {
-@@ -599,6 +630,7 @@ get_hw_addr(struct interface_info *info)
- struct ifaddrs *ifaddrs;
- struct ifaddrs *ifa;
- struct sockaddr_ll *sll = NULL;
-+ unsigned char *hw_addr;
-
- if (getifaddrs(&ifaddrs) == -1)
- log_fatal("Failed to get interfaces");
-@@ -660,6 +692,10 @@ get_hw_addr(struct interface_info *info)
-
- hw->hlen = 1;
- hw->hbuf[0] = HTYPE_INFINIBAND;
-+ hw_addr = get_ib_hw_addr(name);
-+ if (!hw_addr)
-+ log_fatal("Failed getting %s hw addr", name);
-+ memcpy (&hw->hbuf [1], hw_addr, 8);
- break;
- #if defined(ARPHRD_PPP)
- case ARPHRD_PPP:
-diff -up dhcp-4.2.0/client/dhc6.c.honor-expired dhcp-4.2.0/client/dhc6.c
---- dhcp-4.2.0/client/dhc6.c.honor-expired 2010-10-07 12:55:37.000000000 +0200
-+++ dhcp-4.2.0/client/dhc6.c 2010-10-07 12:56:43.000000000 +0200
-@@ -1405,6 +1405,32 @@ start_info_request6(struct client_state
+diff -up dhcp-4.3.0a1/client/dhc6.c.honor-expired dhcp-4.3.0a1/client/dhc6.c
+--- dhcp-4.3.0a1/client/dhc6.c.honor-expired 2013-12-19 16:00:28.062183037 +0100
++++ dhcp-4.3.0a1/client/dhc6.c 2013-12-19 16:00:28.076182842 +0100
+@@ -1351,6 +1351,32 @@ start_info_request6(struct client_state
go_daemon();
}
/*
* start_confirm6() kicks off an "init-reboot" version of the process, at
* startup to find out if old bindings are 'fair' and at runtime whenever
-@@ -1417,8 +1446,10 @@ start_confirm6(struct client_state *clie
+@@ -1363,8 +1389,10 @@ start_confirm6(struct client_state *clie
/* If there is no active lease, there is nothing to check. */
if ((client->active_lease == NULL) ||
-diff -up dhcp-4.2.2/client/dhclient.c.improved-xid dhcp-4.2.2/client/dhclient.c
---- dhcp-4.2.2/client/dhclient.c.improved-xid 2011-09-16 18:18:00.649730661 +0200
-+++ dhcp-4.2.2/client/dhclient.c 2011-09-16 18:22:36.815035513 +0200
-@@ -898,6 +898,26 @@ main(int argc, char **argv) {
+diff -up dhcp-4.3.0a1/client/dhclient.c.improved-xid dhcp-4.3.0a1/client/dhclient.c
+--- dhcp-4.3.0a1/client/dhclient.c.improved-xid 2013-12-20 13:29:41.836260810 +0100
++++ dhcp-4.3.0a1/client/dhclient.c 2013-12-20 13:29:41.843260713 +0100
+@@ -894,6 +894,26 @@ main(int argc, char **argv) {
}
}
/* At this point, all the interfaces that the script thinks
are relevant should be running, so now we once again call
discover_interfaces(), and this time ask it to actually set
-@@ -912,14 +932,36 @@ main(int argc, char **argv) {
+@@ -908,14 +928,36 @@ main(int argc, char **argv) {
Not much entropy, but we're booting, so we're not likely to
find anything better. */
seed = 0;
/* Setup specific Infiniband options */
for (ip = interfaces; ip; ip = ip->next) {
-@@ -1457,7 +1499,7 @@ void dhcpack (packet)
+@@ -1460,7 +1502,7 @@ void dhcpack (packet)
return;
}
lease = packet_to_lease (packet, client);
if (!lease) {
-@@ -2174,7 +2216,7 @@ void dhcpnak (packet)
+@@ -2171,7 +2213,7 @@ void dhcpnak (packet)
return;
}
if (!client -> active) {
#if defined (DEBUG)
-@@ -2300,10 +2342,10 @@ void send_discover (cpp)
+@@ -2298,10 +2340,10 @@ void send_discover (cpp)
client -> packet.secs = htons (65535);
client -> secs = client -> packet.secs;
+ ntohs (sockaddr_broadcast.sin_port), (long)(client -> interval), client -> xid);
/* Send out a packet. */
- result = send_packet (client -> interface, (struct packet *)0,
-@@ -2584,10 +2626,10 @@ void send_request (cpp)
+ result = send_packet(client->interface, NULL, &client->packet,
+@@ -2570,10 +2612,10 @@ void send_request (cpp)
client -> packet.secs = htons (65535);
}
+ ntohs (destination.sin_port), client -> xid);
if (destination.sin_addr.s_addr != INADDR_BROADCAST &&
- fallback_interface)
-@@ -2618,10 +2660,10 @@ void send_decline (cpp)
+ fallback_interface) {
+@@ -2613,10 +2655,10 @@ void send_decline (cpp)
int result;
- log_info ("DHCPDECLINE on %s to %s port %d",
+ log_info ("DHCPDECLINE on %s to %s port %d (xid=0x%x)",
- client -> name ? client -> name : client -> interface -> name,
- inet_ntoa (sockaddr_broadcast.sin_addr),
-- ntohs (sockaddr_broadcast.sin_port));
-+ ntohs (sockaddr_broadcast.sin_port), client -> xid);
+ client->name ? client->name : client->interface->name,
+ inet_ntoa(sockaddr_broadcast.sin_addr),
+- ntohs(sockaddr_broadcast.sin_port));
++ ntohs(sockaddr_broadcast.sin_port), client -> xid);
/* Send out a packet. */
- result = send_packet (client -> interface, (struct packet *)0,
-@@ -2661,10 +2703,10 @@ void send_release (cpp)
+ result = send_packet(client->interface, NULL, &client->packet,
+@@ -2659,10 +2701,10 @@ void send_release (cpp)
return;
}
- ntohs (destination.sin_port));
+ ntohs (destination.sin_port), client -> xid);
- if (fallback_interface)
- result = send_packet (fallback_interface,
+ if (fallback_interface) {
+ result = send_packet(fallback_interface, NULL, &client->packet,
--- /dev/null
+--- expanded_org/client/dhclient.c Wed Aug 06 23:35:00 2014
++++ expanded_logpid/client/dhclient.c Mon Feb 16 13:35:31 2015
+@@ -142,7 +142,7 @@
+ else if (fd != -1)
+ close(fd);
+
+- openlog("dhclient", DHCP_LOG_OPTIONS, LOG_DAEMON);
++ openlog("dhclient", LOG_NDELAY | LOG_PID, LOG_DAEMON);
+
+ #if !(defined(DEBUG) || defined(__CYGWIN32__))
+ setlogmask(LOG_UPTO(LOG_INFO));
-diff -up dhcp-4.2.2/client/dhclient.c.lpf-ib dhcp-4.2.2/client/dhclient.c
---- dhcp-4.2.2/client/dhclient.c.lpf-ib 2011-09-19 11:24:08.693775799 +0200
-+++ dhcp-4.2.2/client/dhclient.c 2011-09-19 11:24:08.703775541 +0200
-@@ -113,6 +113,8 @@ static int check_domain_name_list(const
+diff -up dhcp-4.3.1b1/client/dhclient.c.bmgpWV dhcp-4.3.1b1/client/dhclient.c
+--- dhcp-4.3.1b1/client/dhclient.c.bmgpWV 2014-07-10 17:50:26.922402550 +0200
++++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:53:43.629623477 +0200
+@@ -114,6 +114,8 @@ static int check_domain_name_list(const
static int check_option_values(struct universe *universe, unsigned int opt,
const char *ptr, size_t len);
+static void setup_ib_interface(struct interface_info *ip);
+
+ #ifndef UNIT_TEST
int
main(int argc, char **argv) {
- int fd;
-@@ -919,6 +921,14 @@ main(int argc, char **argv) {
+@@ -937,6 +939,13 @@ main(int argc, char **argv) {
}
srandom(seed + cur_time + (unsigned)getpid());
+ setup_ib_interface(ip);
+ }
+ }
-+
- /* Start a configuration state machine for each interface. */
- #ifdef DHCPv6
- if (local_family == AF_INET6) {
-@@ -1195,6 +1205,29 @@ int find_subnet (struct subnet **sp,
+
+ /*
+ * Establish a default DUID. We always do so for v6 and
+@@ -1230,6 +1239,29 @@ int find_subnet (struct subnet **sp,
return 0;
}
/* Individual States:
*
* Each routine is called from the dhclient_state_machine() in one of
-diff -up dhcp-4.2.2/common/bpf.c.lpf-ib dhcp-4.2.2/common/bpf.c
---- dhcp-4.2.2/common/bpf.c.lpf-ib 2011-09-19 11:24:08.694775773 +0200
-+++ dhcp-4.2.2/common/bpf.c 2011-09-19 11:24:08.704775516 +0200
-@@ -198,11 +198,44 @@ struct bpf_insn dhcp_bpf_filter [] = {
+diff -up dhcp-4.3.1b1/common/bpf.c.bmgpWV dhcp-4.3.1b1/common/bpf.c
+--- dhcp-4.3.1b1/common/bpf.c.bmgpWV 2014-07-10 17:48:03.797424616 +0200
++++ dhcp-4.3.1b1/common/bpf.c 2014-07-10 17:52:57.705272295 +0200
+@@ -199,11 +199,44 @@ struct bpf_insn dhcp_bpf_filter [] = {
BPF_STMT(BPF_RET+BPF_K, 0),
};
#if defined (HAVE_TR_SUPPORT)
struct bpf_insn dhcp_bpf_tr_filter [] = {
/* accept all token ring packets due to variable length header */
-diff -up dhcp-4.2.2/common/lpf.c.lpf-ib dhcp-4.2.2/common/lpf.c
---- dhcp-4.2.2/common/lpf.c.lpf-ib 2011-09-19 11:24:08.694775773 +0200
-+++ dhcp-4.2.2/common/lpf.c 2011-09-19 11:26:15.107109935 +0200
-@@ -42,6 +42,7 @@
- #include "includes/netinet/udp.h"
- #include "includes/netinet/if_ether.h"
+diff -up dhcp-4.3.1b1/common/lpf.c.bmgpWV dhcp-4.3.1b1/common/lpf.c
+--- dhcp-4.3.1b1/common/lpf.c.bmgpWV 2014-07-10 17:48:03.797424616 +0200
++++ dhcp-4.3.1b1/common/lpf.c 2014-07-10 17:52:57.706272281 +0200
+@@ -46,6 +46,17 @@
+ #if defined (USE_LPF_RECEIVE) || defined (USE_LPF_HWADDR)
+ #include <sys/ioctl.h>
#include <net/if.h>
+#include <ifaddrs.h>
-
- #ifndef PACKET_AUXDATA
- #define PACKET_AUXDATA 8
-@@ -59,6 +60,15 @@ struct tpacket_auxdata
- /* Reinitializes the specified interface after an address change. This
- is not required for packet-filter APIs. */
-
++
+/* Default broadcast address for IPoIB */
+static unsigned char default_ib_bcast_addr[20] = {
+ 0x00, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff
+};
+
- #ifdef USE_LPF_SEND
- void if_reinitialize_send (info)
- struct interface_info *info;
-@@ -86,10 +96,21 @@ int if_register_lpf (info)
+ #endif
+
+ #if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE)
+@@ -92,10 +103,21 @@ int if_register_lpf (info)
struct sockaddr common;
} sa;
struct ifreq ifr;
if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
errno == EAFNOSUPPORT || errno == EINVAL) {
-@@ -112,6 +133,7 @@ int if_register_lpf (info)
+@@ -118,6 +140,7 @@ int if_register_lpf (info)
/* Bind to the interface name */
memset (&sa, 0, sizeof sa);
sa.ll.sll_family = AF_PACKET;
sa.ll.sll_ifindex = ifr.ifr_ifindex;
if (bind (sock, &sa.common, sizeof sa)) {
if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
-@@ -127,8 +149,6 @@ int if_register_lpf (info)
+@@ -133,8 +156,6 @@ int if_register_lpf (info)
log_fatal ("Bind socket to interface: %m");
}
return sock;
}
#endif /* USE_LPF_SEND || USE_LPF_RECEIVE */
-@@ -183,6 +203,8 @@ void if_deregister_send (info)
+@@ -189,6 +210,8 @@ void if_deregister_send (info)
in bpf includes... */
extern struct sock_filter dhcp_bpf_filter [];
extern int dhcp_bpf_filter_len;
#if defined (HAVE_TR_SUPPORT)
extern struct sock_filter dhcp_bpf_tr_filter [];
-@@ -200,11 +222,13 @@ void if_register_receive (info)
+@@ -206,11 +229,13 @@ void if_register_receive (info)
/* Open a LPF device and hang it on this interface... */
info -> rfdesc = if_register_lpf (info);
}
#if defined (HAVE_TR_SUPPORT)
-@@ -250,15 +274,28 @@ static void lpf_gen_filter_setup (info)
+@@ -256,15 +281,28 @@ static void lpf_gen_filter_setup (info)
memset(&p, 0, sizeof(p));
if (setsockopt (info -> rfdesc, SOL_SOCKET, SO_ATTACH_FILTER, &p,
sizeof p) < 0) {
-@@ -315,6 +352,54 @@ static void lpf_tr_filter_setup (info)
+@@ -321,6 +359,54 @@ static void lpf_tr_filter_setup (info)
#endif /* USE_LPF_RECEIVE */
#ifdef USE_LPF_SEND
ssize_t send_packet (interface, packet, raw, len, from, to, hto)
struct interface_info *interface;
struct packet *packet;
-@@ -335,6 +420,11 @@ ssize_t send_packet (interface, packet,
+@@ -341,6 +427,11 @@ ssize_t send_packet (interface, packet,
return send_fallback (interface, packet, raw,
len, from, to, hto);
if (hto == NULL && interface->anycast_mac_addr.hlen)
hto = &interface->anycast_mac_addr;
-@@ -356,6 +446,42 @@ ssize_t send_packet (interface, packet,
+@@ -362,6 +453,42 @@ ssize_t send_packet (interface, packet,
#endif /* USE_LPF_SEND */
#ifdef USE_LPF_RECEIVE
ssize_t receive_packet (interface, buf, len, from, hfrom)
struct interface_info *interface;
unsigned char *buf;
-@@ -382,6 +508,10 @@ ssize_t receive_packet (interface, buf,
+@@ -388,6 +515,10 @@ ssize_t receive_packet (interface, buf,
};
struct cmsghdr *cmsg;
length = recvmsg (interface -> rfdesc, &msg, 0);
if (length <= 0)
return length;
-@@ -462,33 +592,44 @@ void maybe_setup_fallback ()
- }
+@@ -469,11 +600,33 @@ void maybe_setup_fallback ()
+ #endif
- void
+ #if defined (USE_LPF_RECEIVE) || defined (USE_LPF_HWADDR)
+-void
-get_hw_addr(const char *name, struct hardware *hw) {
-- int sock;
-- struct ifreq tmp;
-- struct sockaddr *sa;
-+get_hw_addr(struct interface_info *info)
++struct sockaddr_ll *
++get_ll (struct ifaddrs *ifaddrs, struct ifaddrs **ifa, char *name)
+{
-+ struct hardware *hw = &info->hw_address;
-+ char *name = info->name;
-+ struct ifaddrs *ifaddrs;
-+ struct ifaddrs *ifa;
-+ struct sockaddr_ll *sll = NULL;
-
-- if (strlen(name) >= sizeof(tmp.ifr_name)) {
-- log_fatal("Device name too long: \"%s\"", name);
-- }
-+ if (getifaddrs(&ifaddrs) == -1)
-+ log_fatal("Failed to get interfaces");
-
-- sock = socket(AF_INET, SOCK_DGRAM, 0);
-- if (sock < 0) {
-- log_fatal("Can't create socket for \"%s\": %m", name);
-+ for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) {
-+
-+ if (ifa->ifa_addr == NULL)
++ for (*ifa = ifaddrs; *ifa != NULL; *ifa = (*ifa)->ifa_next) {
++ if ((*ifa)->ifa_addr == NULL)
+ continue;
+
-+ if (ifa->ifa_addr->sa_family != AF_PACKET)
++ if ((*ifa)->ifa_addr->sa_family != AF_PACKET)
+ continue;
+
-+ if (ifa->ifa_flags & IFF_LOOPBACK)
++ if ((*ifa)->ifa_flags & IFF_LOOPBACK)
+ continue;
+
-+ if (strcmp(ifa->ifa_name, name) == 0) {
-+ sll = (struct sockaddr_ll *)(void *)ifa->ifa_addr;
-+ break;
-+ }
- }
++ if (strcmp((*ifa)->ifa_name, name) == 0)
++ return (struct sockaddr_ll *)(void *)(*ifa)->ifa_addr;
++ }
++ *ifa = NULL;
++ return NULL;
++}
++
++struct sockaddr_ll *
++ioctl_get_ll(char *name)
++{
+ int sock;
+ struct ifreq tmp;
+- struct sockaddr *sa;
++ struct sockaddr *sa = NULL;
++ struct sockaddr_ll *sll = NULL;
-- memset(&tmp, 0, sizeof(tmp));
-- strcpy(tmp.ifr_name, name);
-- if (ioctl(sock, SIOCGIFHWADDR, &tmp) < 0) {
+ if (strlen(name) >= sizeof(tmp.ifr_name)) {
+ log_fatal("Device name too long: \"%s\"", name);
+@@ -487,16 +640,62 @@ get_hw_addr(const char *name, struct har
+ memset(&tmp, 0, sizeof(tmp));
+ strcpy(tmp.ifr_name, name);
+ if (ioctl(sock, SIOCGIFHWADDR, &tmp) < 0) {
- log_fatal("Error getting hardware address for \"%s\": %m",
-- name);
-+ if (sll == NULL) {
-+ freeifaddrs(ifaddrs);
-+ log_fatal("Failed to get HW address for %s\n", name);
++ log_fatal("Error getting hardware address for \"%s\": %m",
+ name);
}
++ close(sock);
-- sa = &tmp.ifr_hwaddr;
+ sa = &tmp.ifr_hwaddr;
- switch (sa->sa_family) {
++ // needs to be freed outside this function
++ sll = dmalloc (sizeof (struct sockaddr_ll), MDL);
++ if (!sll)
++ log_fatal("Unable to allocate memory for link layer address");
++ memcpy(&sll->sll_hatype, &sa->sa_family, sizeof (sll->sll_hatype));
++ memcpy(sll->sll_addr, sa->sa_data, sizeof (sll->sll_addr));
++ switch (sll->sll_hatype) {
++ case ARPHRD_INFINIBAND:
++ /* ioctl limits hardware addresses to 8 bytes */
++ sll->sll_halen = 8;
++ break;
++ default:
++ break;
++ }
++ return sll;
++}
++
++void
++get_hw_addr(struct interface_info *info)
++{
++ struct hardware *hw = &info->hw_address;
++ char *name = info->name;
++ struct ifaddrs *ifaddrs = NULL;
++ struct ifaddrs *ifa = NULL;
++ struct sockaddr_ll *sll = NULL;
++ int sll_allocated = 0;
++ char *dup = NULL;
++ char *colon = NULL;
++
++ if (getifaddrs(&ifaddrs) == -1)
++ log_fatal("Failed to get interfaces");
++
++ if ((sll = get_ll(ifaddrs, &ifa, name)) == NULL) {
++ /*
++ * We were unable to get link-layer address for name.
++ * Fall back to ioctl(SIOCGIFHWADDR).
++ */
++ sll = ioctl_get_ll(name);
++ if (sll != NULL)
++ sll_allocated = 1;
++ else
++ // shouldn't happen
++ log_fatal("Unexpected internal error");
++ }
++
+ switch (sll->sll_hatype) {
case ARPHRD_ETHER:
hw->hlen = 7;
break;
case ARPHRD_IEEE802:
#ifdef ARPHRD_IEEE802_TR
-@@ -496,18 +637,35 @@ get_hw_addr(const char *name, struct har
+@@ -504,18 +703,48 @@ get_hw_addr(const char *name, struct har
#endif /* ARPHRD_IEEE802_TR */
hw->hlen = 7;
hw->hbuf[0] = HTYPE_IEEE802;
+ memcpy(&hw->hbuf[1], sll->sll_addr, 6);
break;
case ARPHRD_FDDI:
- hw->hlen = 17;
+ hw->hlen = 7;
hw->hbuf[0] = HTYPE_FDDI;
-- memcpy(&hw->hbuf[1], sa->sa_data, 16);
-+ memcpy(&hw->hbuf[1], sll->sll_addr, 16);
+- memcpy(&hw->hbuf[1], sa->sa_data, 6);
++ memcpy(&hw->hbuf[1], sll->sll_addr, 6);
+ break;
+ case ARPHRD_INFINIBAND:
++ dup = strdup(name);
++ /* Aliased infiniband interface is special case where
++ * neither get_ll() nor ioctl_get_ll() get's correct hw
++ * address, so we have to truncate the :0 and run
++ * get_ll() again for the rest.
++ */
++ if ((colon = strchr(dup, ':')) != NULL) {
++ *colon = '\0';
++ if ((sll = get_ll(ifaddrs, &ifa, dup)) == NULL)
++ log_fatal("Error getting hardware address for \"%s\": %m", name);
++ }
++ free (dup);
+ /* For Infiniband, save the broadcast address and store
+ * the port GUID into the hardware address.
+ */
-+ if (ifa->ifa_flags & IFF_BROADCAST) {
++ if (ifa && (ifa->ifa_flags & IFF_BROADCAST)) {
+ struct sockaddr_ll *bll;
+
+ bll = (struct sockaddr_ll *)ifa->ifa_broadaddr;
+
+ hw->hlen = 1;
+ hw->hbuf[0] = HTYPE_INFINIBAND;
++ memcpy(&hw->hbuf[1], &sll->sll_addr[sll->sll_halen - 8], 8);
break;
#if defined(ARPHRD_PPP)
case ARPHRD_PPP:
if (local_family != AF_INET6)
- log_fatal("Unsupported device type %d for \"%s\"",
- sa->sa_family, name);
-+ log_fatal("Unsupported device type %ld for \"%s\"",
-+ (long int)sll->sll_family, name);
++ log_fatal("local_family != AF_INET6 for \"%s\"",
++ name);
hw->hlen = 0;
hw->hbuf[0] = HTYPE_RESERVED;
/* 0xdeadbeef should never occur on the wire,
-@@ -520,10 +678,11 @@ get_hw_addr(const char *name, struct har
+@@ -528,10 +757,13 @@ get_hw_addr(const char *name, struct har
break;
#endif
default:
-+ freeifaddrs(ifaddrs);
- log_fatal("Unsupported device type %ld for \"%s\"",
+- log_fatal("Unsupported device type %ld for \"%s\"",
- (long int)sa->sa_family, name);
-+ (long int)sll->sll_family, name);
++ freeifaddrs(ifaddrs);
++ log_fatal("Unsupported device type %hu for \"%s\"",
++ sll->sll_hatype, name);
}
- close(sock);
++ if (sll_allocated)
++ dfree(sll, MDL);
+ freeifaddrs(ifaddrs);
}
#endif
-diff -up dhcp-4.2.2/common/socket.c.lpf-ib dhcp-4.2.2/common/socket.c
---- dhcp-4.2.2/common/socket.c.lpf-ib 2011-06-27 18:18:20.000000000 +0200
-+++ dhcp-4.2.2/common/socket.c 2011-09-19 11:24:08.705775490 +0200
-@@ -324,7 +324,7 @@ void if_register_send (info)
- info->wfdesc = if_register_socket(info, AF_INET, 0);
+diff -up dhcp-4.3.1b1/common/socket.c.bmgpWV dhcp-4.3.1b1/common/socket.c
+--- dhcp-4.3.1b1/common/socket.c.bmgpWV 2014-07-02 19:58:38.000000000 +0200
++++ dhcp-4.3.1b1/common/socket.c 2014-07-10 17:52:57.706272281 +0200
+@@ -322,7 +322,7 @@ void if_register_send (info)
+ info->wfdesc = if_register_socket(info, AF_INET, 0, NULL);
/* If this is a normal IPv4 address, get the hardware address. */
if (strcmp(info->name, "fallback") != 0)
- get_hw_addr(info->name, &info->hw_address);
#if defined (USE_SOCKET_FALLBACK)
/* Fallback only registers for send, but may need to receive as
well. */
-@@ -387,7 +387,7 @@ void if_register_receive (info)
+@@ -385,7 +385,7 @@ void if_register_receive (info)
#endif /* IP_PKTINFO... */
/* If this is a normal IPv4 address, get the hardware address. */
if (strcmp(info->name, "fallback") != 0)
if (!quiet_interface_discovery)
log_info ("Listening on Socket/%s%s%s",
-@@ -497,7 +497,7 @@ if_register6(struct interface_info *info
+@@ -499,7 +499,7 @@ if_register6(struct interface_info *info
if (req_multi)
if_register_multicast(info);
if (!quiet_interface_discovery) {
if (info->shared_network != NULL) {
-diff -up dhcp-4.2.2/includes/dhcpd.h.lpf-ib dhcp-4.2.2/includes/dhcpd.h
---- dhcp-4.2.2/includes/dhcpd.h.lpf-ib 2011-09-19 11:24:08.696775721 +0200
-+++ dhcp-4.2.2/includes/dhcpd.h 2011-09-19 11:24:08.707775438 +0200
-@@ -1243,6 +1243,7 @@ struct interface_info {
+@@ -555,7 +555,7 @@ if_register_linklocal6(struct interface_
+ info->rfdesc = sock;
+ info->wfdesc = sock;
+
+- get_hw_addr(info->name, &info->hw_address);
++ get_hw_addr(info);
+
+ if (!quiet_interface_discovery) {
+ if (info->shared_network != NULL) {
+diff -up dhcp-4.3.1b1/includes/dhcpd.h.bmgpWV dhcp-4.3.1b1/includes/dhcpd.h
+--- dhcp-4.3.1b1/includes/dhcpd.h.bmgpWV 2014-07-10 17:50:26.923402536 +0200
++++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:52:57.707272266 +0200
+@@ -1248,6 +1248,7 @@ struct interface_info {
struct shared_network *shared_network;
/* Networks connected to this interface. */
struct hardware hw_address; /* Its physical address. */
struct in_addr *addresses; /* Addresses associated with this
* interface.
*/
-@@ -2356,7 +2357,7 @@ void print_dns_status (int, struct dhcp_
+@@ -2439,7 +2440,7 @@ void print_dns_status (int, struct dhcp_
#endif
const char *print_time(TIME);
/* socket.c */
#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE) \
-diff -up dhcp-4.2.2/includes/dhcp.h.lpf-ib dhcp-4.2.2/includes/dhcp.h
---- dhcp-4.2.2/includes/dhcp.h.lpf-ib 2011-09-19 11:24:08.696775721 +0200
-+++ dhcp-4.2.2/includes/dhcp.h 2011-09-19 11:24:08.707775438 +0200
-@@ -79,6 +79,7 @@ struct dhcp_packet {
- #define HTYPE_ETHER 1 /* Ethernet 10Mbps */
- #define HTYPE_IEEE802 6 /* IEEE 802.2 Token Ring... */
- #define HTYPE_FDDI 8 /* FDDI... */
-+#define HTYPE_INFINIBAND 32 /* Infiniband IPoIB */
-
- #define HTYPE_RESERVED 0 /* RFC 5494 */
-
-diff -up dhcp-4.2.1b1/client/dhclient.8.man dhcp-4.2.1b1/client/dhclient.8
---- dhcp-4.2.1b1/client/dhclient.8.man 2010-07-14 22:09:34.000000000 +0200
-+++ dhcp-4.2.1b1/client/dhclient.8 2011-01-27 18:19:07.000000000 +0100
-@@ -115,6 +115,33 @@ dhclient - Dynamic Host Configuration Pr
- .B -w
- ]
- [
-+.B -B
-+]
-+[
-+.B -I
-+.I dhcp-client-identifier
-+]
-+[
-+.B -H
-+.I host-name
-+]
-+[
-+.B -F
-+.I fqdn.fqdn
-+]
-+[
-+.B -V
-+.I vendor-class-identifier
-+]
-+[
-+.B -R
-+.I request-option-list
-+]
-+[
-+.B -timeout
-+.I timeout
-+]
-+[
- .B -v
- ]
- [
-@@ -264,6 +291,69 @@ not to exit when it doesn't find any suc
- program can then be used to notify the client when a network interface
- has been added or removed, so that the client can attempt to configure an IP
- address on that interface.
-+
-+.TP
-+.BI \-B
-+Set the BOOTP broadcast flag in request packets so servers will always
-+broadcast replies.
-+
-+.TP
-+.BI \-I\ <dhcp-client-identifier>
-+Specify the dhcp-client-identifier option to send to the DHCP server.
-+
-+.TP
-+.BI \-H\ <host-name>
-+Specify the host-name option to send to the DHCP server. The host-name
-+string only contains the client's hostname prefix, to which the server will
-+append the ddns-domainname or domain-name options, if any, to derive the
-+fully qualified domain name of the client. The
-+.B -H
-+option cannot be used with the
-+.B -F
-+option.
-+
-+.TP
-+.BI \-F\ <fqdn.fqdn>
-+Specify the fqdn.fqdn option to send to the DHCP server. This option cannot
-+be used with the
-+.B -H
-+option. The fqdn.fqdn option must specify the complete domain name of the
-+client host, which the server may use for dynamic DNS updates.
-+
-+.TP
-+.BI \-V\ <vendor-class-identifier>
-+Specify the vendor-class-identifier option to send to the DHCP server.
-+
-+.TP
-+.BI \-R\ <option>[,<option>...]
-+Specify the list of options the client is to request from the server. The
-+option list must be a single string consisting of option names separated
-+by at least one command and optional space characters. The default option
-+list is:
-+
-+.BR
-+ subnet-mask, broadcast-address, time-offset, routers,
-+.BR
-+ domain-search, domain-name, domain-name-servers, host-name,
-+.BR
-+ nis-domain, nis-servers, ntp-servers, interface-mtu
-+
-+.TP
-+.B -R
-+option does not append options to the default request, it overrides the
-+default request list. Keep this in mind if you want to request an
-+additional option besides the default request list. You will have to
-+specify all option names for the
-+.B -R
-+parameter.
-+
-+.TP
-+.BI \-timeout\ <timeout>
-+Specify the time after which
-+.B dhclient
-+will decide that no DHCP servers can be contacted when no responses have been
-+received.
-+
- .TP
- .BI \-n
- Do not configure any interfaces. This is most likely to be useful in
-diff -up dhcp-4.2.1b1/client/dhclient.conf.5.man dhcp-4.2.1b1/client/dhclient.conf.5
---- dhcp-4.2.1b1/client/dhclient.conf.5.man 2010-09-15 01:03:56.000000000 +0200
-+++ dhcp-4.2.1b1/client/dhclient.conf.5 2011-01-27 18:22:56.000000000 +0100
-@@ -186,7 +186,8 @@ responding to the client send the client
- options. Only the option names should be specified in the request
- statement - not option parameters. By default, the DHCPv4 client
- requests the subnet-mask, broadcast-address, time-offset, routers,
--domain-name, domain-name-servers and host-name options while the DHCPv6
-+domain-search, domain-name, domain-name-servers, host-name, nis-domain,
-+nis-servers, ntp-servers and interface-mtu options while the DHCPv6
- client requests the dhcp6 name-servers and domain-search options. Note
- that if you enter a \'request\' statement, you over-ride these defaults
- and these options will not be requested.
-@@ -672,6 +673,17 @@ know the DHCP service(s) anycast MAC add
- client. The \fIlink-type\fR and \fImac-address\fR parameters are configured
- in a similar manner to the \fBhardware\fR statement.
- .PP
-+ \fBbootp-broadcast-always;\fR
-+.PP
-+The
-+.B bootp-broadcast-always
-+statement instructs dhclient to always set the bootp broadcast flag in
-+request packets, so that servers will always broadcast replies.
-+This is equivalent to supplying the dhclient -B argument, and has
-+the same effect as specifying 'always-broadcast' in the server's dhcpd.conf.
-+This option is provided as an extension to enable dhclient to work
-+on IBM s390 Linux guests.
-+.PP
- .SH SAMPLE
- The following configuration file is used on a laptop running NetBSD
- 1.3. The laptop has an IP alias of 192.5.5.213, and has one
-@@ -697,7 +709,7 @@ interface "ep0" {
- supersede domain-search "fugue.com", "rc.vix.com", "home.vix.com";
- prepend domain-name-servers 127.0.0.1;
- request subnet-mask, broadcast-address, time-offset, routers,
-- domain-name, domain-name-servers, host-name;
-+ domain-search, domain-name, domain-name-servers, host-name;
- require subnet-mask, domain-name-servers;
- script "CLIENTBINDIR/dhclient-script";
- media "media 10baseT/UTP", "media 10base2/BNC";
-diff -up dhcp-4.2.1b1/client/dhclient-script.8.man dhcp-4.2.1b1/client/dhclient-script.8
---- dhcp-4.2.1b1/client/dhclient-script.8.man 2010-07-06 21:03:11.000000000 +0200
-+++ dhcp-4.2.1b1/client/dhclient-script.8 2011-01-27 18:24:44.000000000 +0100
-@@ -47,7 +47,7 @@ customizations are needed, they should b
+diff -up dhcp-4.3.0a1/client/dhclient-script.8.man dhcp-4.3.0a1/client/dhclient-script.8
+--- dhcp-4.3.0a1/client/dhclient-script.8.man 2013-12-11 01:01:02.000000000 +0100
++++ dhcp-4.3.0a1/client/dhclient-script.8 2013-12-19 15:27:17.617118805 +0100
+@@ -48,7 +48,7 @@ customizations are needed, they should b
exit hooks provided (see HOOKS for details). These hooks will allow the
user to override the default behaviour of the client in creating a
.B /etc/resolv.conf
.PP
No standard client script exists for some operating systems, even though
the actual client may work, so a pioneering user may well need to create
-@@ -91,6 +91,26 @@ present. The
+@@ -92,6 +92,26 @@ present. The
.B ETCDIR/dhclient-exit-hooks
script can modify the valid of exit_status to change the exit status
of dhclient-script.
.SH OPERATION
When dhclient needs to invoke the client configuration script, it
defines a set of variables in the environment, and then invokes
-diff -up dhcp-4.2.1b1/common/dhcp-options.5.man dhcp-4.2.1b1/common/dhcp-options.5
---- dhcp-4.2.1b1/common/dhcp-options.5.man 2010-07-13 22:56:56.000000000 +0200
-+++ dhcp-4.2.1b1/common/dhcp-options.5 2011-01-27 18:25:57.000000000 +0100
-@@ -913,6 +913,21 @@ classless IP routing - it does not inclu
+diff -up dhcp-4.3.0a1/client/dhclient.conf.5.man dhcp-4.3.0a1/client/dhclient.conf.5
+--- dhcp-4.3.0a1/client/dhclient.conf.5.man 2013-12-11 01:01:02.000000000 +0100
++++ dhcp-4.3.0a1/client/dhclient.conf.5 2013-12-19 15:27:17.617118805 +0100
+@@ -202,7 +202,8 @@ responding to the client send the client
+ options. Only the option names should be specified in the request
+ statement - not option parameters. By default, the DHCPv4 client
+ requests the subnet-mask, broadcast-address, time-offset, routers,
+-domain-name, domain-name-servers and host-name options while the DHCPv6
++domain-search, domain-name, domain-name-servers, host-name, nis-domain,
++nis-servers, ntp-servers and interface-mtu options while the DHCPv6
+ client requests the dhcp6 name-servers and domain-search options. Note
+ that if you enter a \'request\' statement, you over-ride these defaults
+ and these options will not be requested.
+@@ -688,6 +689,17 @@ know the DHCP service(s) anycast MAC add
+ client. The \fIlink-type\fR and \fImac-address\fR parameters are configured
+ in a similar manner to the \fBhardware\fR statement.
+ .PP
++ \fBbootp-broadcast-always;\fR
++.PP
++The
++.B bootp-broadcast-always
++statement instructs dhclient to always set the bootp broadcast flag in
++request packets, so that servers will always broadcast replies.
++This is equivalent to supplying the dhclient -B argument, and has
++the same effect as specifying 'always-broadcast' in the server's dhcpd.conf.
++This option is provided as an extension to enable dhclient to work
++on IBM s390 Linux guests.
++.PP
+ .SH SAMPLE
+ The following configuration file is used on a laptop running NetBSD
+ 1.3. The laptop has an IP alias of 192.5.5.213, and has one
+@@ -713,7 +725,7 @@ interface "ep0" {
+ supersede domain-search "fugue.com", "rc.vix.com", "home.vix.com";
+ prepend domain-name-servers 127.0.0.1;
+ request subnet-mask, broadcast-address, time-offset, routers,
+- domain-name, domain-name-servers, host-name;
++ domain-search, domain-name, domain-name-servers, host-name;
+ require subnet-mask, domain-name-servers;
+ script "CLIENTBINDIR/dhclient-script";
+ media "media 10baseT/UTP", "media 10base2/BNC";
+diff -up dhcp-4.3.0a1/common/dhcp-options.5.man dhcp-4.3.0a1/common/dhcp-options.5
+--- dhcp-4.3.0a1/common/dhcp-options.5.man 2013-12-11 01:25:12.000000000 +0100
++++ dhcp-4.3.0a1/common/dhcp-options.5 2013-12-19 15:27:17.618118791 +0100
+@@ -914,6 +914,21 @@ classless IP routing - it does not inclu
classless IP routing is now the most widely deployed routing standard,
this option is virtually useless, and is not implemented by any of the
popular DHCP clients, for example the Microsoft DHCP client.
.RE
.PP
.nf
-diff -up dhcp-4.2.1b1/server/dhcpd.conf.5.man dhcp-4.2.1b1/server/dhcpd.conf.5
---- dhcp-4.2.1b1/server/dhcpd.conf.5.man 2010-07-06 21:03:12.000000000 +0200
-+++ dhcp-4.2.1b1/server/dhcpd.conf.5 2011-01-27 18:29:12.000000000 +0100
-@@ -519,6 +519,9 @@ pool {
+diff -up dhcp-4.3.0a1/server/dhcpd.conf.5.man dhcp-4.3.0a1/server/dhcpd.conf.5
+--- dhcp-4.3.0a1/server/dhcpd.conf.5.man 2013-12-13 21:49:44.000000000 +0100
++++ dhcp-4.3.0a1/server/dhcpd.conf.5 2013-12-19 15:30:14.266670962 +0100
+@@ -527,6 +527,9 @@ pool {
};
.fi
.PP
The server currently does very little sanity checking, so if you
configure it wrong, it will just fail in odd ways. I would recommend
therefore that you either do failover or don't do failover, but don't
-@@ -533,9 +536,9 @@ primary server might look like this:
+@@ -541,9 +544,9 @@ primary server might look like this:
failover peer "foo" {
primary;
address anthrax.rc.vix.com;
max-response-delay 60;
max-unacked-updates 10;
mclt 3600;
-@@ -1305,7 +1308,7 @@ the zone containing PTR records - for IS
+@@ -1241,7 +1244,7 @@ the zone containing PTR records - for IS
.PP
.nf
key DHCP_UPDATER {
secret pRP5FapFoJ95JEL06sv4PQ==;
};
-@@ -1328,7 +1331,7 @@ dhcpd.conf file:
+@@ -1264,7 +1267,7 @@ dhcpd.conf file:
.PP
.nf
key DHCP_UPDATER {
secret pRP5FapFoJ95JEL06sv4PQ==;
};
-@@ -2540,7 +2543,8 @@ statement
+@@ -2539,7 +2542,8 @@ statement
The \fInext-server\fR statement is used to specify the host address of
the server from which the initial boot file (specified in the
- \fIfilename\fR statement) is to be loaded. \fIServer-name\fR should
+ \fIfilename\fR statement) is to be loaded. \fIServer-name\fR should
-be a numeric IP address or a domain name.
+be a numeric IP address or a domain name. If no \fInext-server\fR statement
+applies to a given client, the address 0.0.0.0 is used.
--- /dev/null
+diff -up dhcp-4.3.1b1/client/dhclient.c.dlTsyN dhcp-4.3.1b1/client/dhclient.c
+--- dhcp-4.3.1b1/client/dhclient.c.dlTsyN 2014-07-10 17:49:49.882925843 +0200
++++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:50:26.922402550 +0200
+@@ -1748,11 +1748,6 @@ int write_host (host)
+ return 0;
+ }
+
+-void db_startup (testp)
+- int testp;
+-{
+-}
+-
+ void bootp (packet)
+ struct packet *packet;
+ {
+diff -up dhcp-4.3.1b1/includes/dhcpd.h.dlTsyN dhcp-4.3.1b1/includes/dhcpd.h
+--- dhcp-4.3.1b1/includes/dhcpd.h.dlTsyN 2014-07-10 17:48:03.798424601 +0200
++++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:50:26.923402536 +0200
+@@ -2866,7 +2866,11 @@ void commit_leases_timeout (void *);
+ void commit_leases_readerdry(void *);
+ int commit_leases (void);
+ int commit_leases_timed (void);
++#if defined (PARANOIA)
++void db_startup (int, uid_t, gid_t);
++#else
+ void db_startup (int);
++#endif /* PARANOIA */
+ int new_lease_file (void);
+ int group_writer (struct group_object *);
+ int write_ia(const struct ia_xx *);
+diff -up dhcp-4.3.1b1/server/confpars.c.dlTsyN dhcp-4.3.1b1/server/confpars.c
+--- dhcp-4.3.1b1/server/confpars.c.dlTsyN 2014-07-10 17:39:25.801764596 +0200
++++ dhcp-4.3.1b1/server/confpars.c 2014-07-10 17:50:26.924402522 +0200
+@@ -219,7 +219,11 @@ void trace_conf_input (trace_type_t *tty
+ }
+
+ if (!leaseconf_initialized && ttype == trace_readleases_type) {
++#if defined (PARANOIA)
++ db_startup (0, 0, 0);
++#else
+ db_startup (0);
++#endif /* PARANOIA */
+ leaseconf_initialized = 1;
+ postdb_startup ();
+ }
+diff -up dhcp-4.3.1b1/server/db.c.dlTsyN dhcp-4.3.1b1/server/db.c
+--- dhcp-4.3.1b1/server/db.c.dlTsyN 2014-07-10 17:39:25.801764596 +0200
++++ dhcp-4.3.1b1/server/db.c 2014-07-10 17:50:26.925402508 +0200
+@@ -42,6 +42,10 @@ static int counting = 0;
+ static int count = 0;
+ TIME write_time;
+ int lease_file_is_corrupt = 0;
++#if defined (PARANOIA)
++uid_t global_set_uid = 0;
++gid_t global_set_gid = 0;
++#endif /* PARANOIA */
+
+ /* Write a single binding scope value in parsable format.
+ */
+@@ -1046,8 +1050,11 @@ int commit_leases_timed()
+ return (1);
+ }
+
+-void db_startup (testp)
+- int testp;
++#if defined (PARANOIA)
++void db_startup (int testp, uid_t set_uid, gid_t set_gid)
++#else
++void db_startup (int testp)
++#endif /* PARANOIA */
+ {
+ isc_result_t status;
+
+@@ -1066,6 +1073,11 @@ void db_startup (testp)
+ }
+ #endif
+
++#if defined (PARANOIA)
++ global_set_uid = set_uid;
++ global_set_gid = set_gid;
++#endif /* PARANOIA */
++
+ #if defined (TRACING)
+ /* If we're playing back, there is no lease file, so we can't
+ append it, so we create one immediately (maybe this isn't
+@@ -1128,6 +1140,17 @@ int new_lease_file ()
+ log_error ("Can't create new lease file: %m");
+ return 0;
+ }
++
++#if defined (PARANOIA)
++ if (global_set_uid && !geteuid() &&
++ global_set_gid && !getegid())
++ if (fchown(db_fd, global_set_uid, global_set_gid)) {
++ log_fatal ("Can't chown new lease file: %m");
++ close(db_fd);
++ goto fdfail;
++ }
++#endif /* PARANOIA */
++
+ if ((new_db_file = fdopen(db_fd, "we")) == NULL) {
+ log_error("Can't fdopen new lease file: %m");
+ close(db_fd);
+diff -up dhcp-4.3.1b1/server/dhcpd.8.dlTsyN dhcp-4.3.1b1/server/dhcpd.8
+--- dhcp-4.3.1b1/server/dhcpd.8.dlTsyN 2014-07-02 19:58:39.000000000 +0200
++++ dhcp-4.3.1b1/server/dhcpd.8 2014-07-10 17:50:26.925402508 +0200
+@@ -82,6 +82,18 @@ dhcpd - Dynamic Host Configuration Proto
+ .I trace-output-file
+ ]
+ [
++.B -user
++.I user
++]
++[
++.B -group
++.I group
++]
++[
++.B -chroot
++.I dir
++]
++[
+ .B -play
+ .I trace-playback-file
+ ]
+@@ -269,6 +281,15 @@ lease file.
+ .TP
+ .BI --version
+ Print version number and exit.
++.TP
++.BI \-user \ user
++Setuid to user after completing privileged operations, such as creating sockets that listen on privileged ports.
++.TP
++.BI \-group \ group
++Setgid to group after completing privileged operations, such as creating sockets that listen on privileged ports.
++.TP
++.BI \-chroot \ dir
++Chroot to directory after processing the command line arguments, but before reading the configuration file.
+ .PP
+ .I Modifying default file locations:
+ The following options can be used to modify the locations
+diff -up dhcp-4.3.1b1/server/dhcpd.c.dlTsyN dhcp-4.3.1b1/server/dhcpd.c
+--- dhcp-4.3.1b1/server/dhcpd.c.dlTsyN 2014-07-10 17:39:25.802764582 +0200
++++ dhcp-4.3.1b1/server/dhcpd.c 2014-07-10 17:52:35.341588248 +0200
+@@ -628,7 +628,11 @@ main(int argc, char **argv) {
+ group_write_hook = group_writer;
+
+ /* Start up the database... */
++#if defined (PARANOIA)
++ db_startup (lftest, set_uid, set_gid);
++#else
+ db_startup (lftest);
++#endif /* PARANOIA */
+
+ if (lftest)
+ exit (0);
-diff -up dhcp-4.2.0/includes/dhcpd.h.paths dhcp-4.2.0/includes/dhcpd.h
---- dhcp-4.2.0/includes/dhcpd.h.paths 2010-07-21 13:55:42.000000000 +0200
-+++ dhcp-4.2.0/includes/dhcpd.h 2010-07-21 14:29:57.000000000 +0200
-@@ -1390,15 +1390,15 @@ typedef unsigned char option_mask [16];
+--- expanded_org/includes/dhcpd.h Wed Aug 06 23:35:02 2014
++++ expanded_patched_51_4_2_0_paths_patch/includes/dhcpd.h Mon Feb 16 13:22:11 2015
+@@ -1424,15 +1424,15 @@
#else /* !DEBUG */
#ifndef _PATH_DHCPD_CONF
#endif
#ifndef _PATH_DHCPD_PID
-@@ -1412,7 +1412,7 @@ typedef unsigned char option_mask [16];
+@@ -1446,7 +1446,7 @@
#endif /* DEBUG */
#ifndef _PATH_DHCLIENT_CONF
#endif
#ifndef _PATH_DHCLIENT_SCRIPT
-@@ -1428,11 +1428,11 @@ typedef unsigned char option_mask [16];
+@@ -1462,11 +1462,11 @@
#endif
#ifndef _PATH_DHCLIENT_DB
-diff -up dhcp-4.2.0/client/dhclient.c.ifup dhcp-4.2.0/client/dhclient.c
---- dhcp-4.2.0/client/dhclient.c.ifup 2010-07-21 13:30:10.000000000 +0200
-+++ dhcp-4.2.0/client/dhclient.c 2010-07-21 13:37:03.000000000 +0200
-@@ -497,9 +497,81 @@ main(int argc, char **argv) {
- kill(oldpid, SIGTERM);
+diff -up dhcp-4.3.0a1/client/dhclient.c.ifup dhcp-4.3.0a1/client/dhclient.c
+--- dhcp-4.3.0a1/client/dhclient.c.ifup 2013-12-19 14:53:08.817760677 +0100
++++ dhcp-4.3.0a1/client/dhclient.c 2013-12-19 15:05:16.290518574 +0100
+@@ -521,9 +521,81 @@ main(int argc, char **argv) {
+ }
}
fclose(pidfd);
+ } else {
--- /dev/null
+diff -up dhcp-4.3.1b1/client/Makefile.am.brGmwh dhcp-4.3.1b1/client/Makefile.am
+--- dhcp-4.3.1b1/client/Makefile.am.brGmwh 2014-07-02 19:58:38.000000000 +0200
++++ dhcp-4.3.1b1/client/Makefile.am 2014-07-10 17:36:30.484250976 +0200
+@@ -10,8 +10,8 @@ dhclient_SOURCES = clparse.c dhclient.c
+ scripts/bsdos scripts/freebsd scripts/linux scripts/macos \
+ scripts/netbsd scripts/nextstep scripts/openbsd \
+ scripts/solaris scripts/openwrt
+-dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a ../bind/lib/libirs.a \
+- ../bind/lib/libdns.a ../bind/lib/libisccfg.a ../bind/lib/libisc.a
++dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
++ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+ man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5
+ EXTRA_DIST = $(man_MANS)
+
+diff -up dhcp-4.3.1b1/common/tests/Makefile.am.brGmwh dhcp-4.3.1b1/common/tests/Makefile.am
+--- dhcp-4.3.1b1/common/tests/Makefile.am.brGmwh 2014-07-10 17:36:30.485250962 +0200
++++ dhcp-4.3.1b1/common/tests/Makefile.am 2014-07-10 17:38:04.010924566 +0200
+@@ -13,21 +13,20 @@ ATF_TESTS += alloc_unittest dns_unittest
+ alloc_unittest_SOURCES = test_alloc.c $(top_srcdir)/tests/t_api_dhcp.c
+ alloc_unittest_LDADD = $(ATF_LDFLAGS)
+ alloc_unittest_LDADD += ../libdhcp.a \
+- ../../omapip/libomapi.a ../../bind/lib/libirs.a \
+- ../../bind/lib/libdns.a ../../bind/lib/libisccfg.a ../../bind/lib/libisc.a
++ ../../omapip/libomapi.a \
++ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+
+ dns_unittest_SOURCES = dns_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
+ dns_unittest_LDADD = $(ATF_LDFLAGS)
+ dns_unittest_LDADD += ../libdhcp.a \
+- ../../omapip/libomapi.a ../../bind/lib/libirs.a \
+- ../../bind/lib/libdns.a ../../bind/lib/libisccfg.a ../../bind/lib/libisc.a
++ ../../omapip/libomapi.a \
++ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+
+ misc_unittest_SOURCES = misc_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
+ misc_unittest_LDADD = $(ATF_LDFLAGS)
+ misc_unittest_LDADD += ../libdhcp.a \
+- ../../omapip/libomapi.a ../../bind/lib/libirs.a \
+- ../../bind/lib/libdns.a ../../bind/lib/libisccfg.a ../../bind/lib/libisc.a
+-
++ ../../omapip/libomapi.a \
++ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+ check: $(ATF_TESTS)
+ atf-run | atf-report
+
+diff -up dhcp-4.3.1b1/configure.ac.brGmwh dhcp-4.3.1b1/configure.ac
+--- dhcp-4.3.1b1/configure.ac.brGmwh 2014-07-02 20:01:26.000000000 +0200
++++ dhcp-4.3.1b1/configure.ac 2014-07-10 17:36:30.485250962 +0200
+@@ -562,20 +562,37 @@ AC_CHECK_MEMBER(struct msghdr.msg_contro
+
+ libbind=
+ AC_ARG_WITH(libbind,
+- AS_HELP_STRING([--with-libbind=PATH],[bind includes and libraries are in PATH
+- (default is ./bind)]),
++ AS_HELP_STRING([--with-libbind=PATH],[bind includes are in PATH
++ (default is ./bind/includes)]),
+ use_libbind="$withval", use_libbind="no")
+ case "$use_libbind" in
++yes|no)
++ libbind="\${top_srcdir}/bind/include"
++ ;;
++*)
++ libbind="$use_libbind"
++ ;;
++esac
++
++BIND9_LIBDIR='-L$(top_builddir)/bind/lib'
++AC_ARG_WITH(libbind-libs,
++ AC_HELP_STRING([--with-libbind-libs=PATH],
++ [bind9 export libraries are in PATH]),
++ [libbind_libs="$withval"], [libbind_libs='no'])
++case "$libbind_libs" in
+ yes)
+- libbind="\${top_srcdir}/bind"
++ AC_MSG_ERROR([Specify path to bind9 libraries])
+ ;;
+ no)
+- libbind="\${top_srcdir}/bind"
++ BUNDLED_BIND=yes
+ ;;
+ *)
+- libbind="$use_libbind"
++ BIND9_LIBDIR="-L$libbind_libs"
++ BUNDLED_BIND=no
+ ;;
+ esac
++AM_CONDITIONAL([BUNDLED_BIND], [test "$BUNDLED_BIND" = yes])
++AC_SUBST([BIND9_LIBDIR])
+
+ # OpenLDAP support.
+ AC_ARG_WITH(ldap,
+@@ -610,7 +627,7 @@ fi
+ CFLAGS="$CFLAGS $STD_CWARNINGS"
+
+ # Try to add the bind include directory
+-CFLAGS="$CFLAGS -I$libbind/include"
++CFLAGS="$CFLAGS -I$libbind"
+
+ case "$host" in
+ *-darwin*)
+diff -up dhcp-4.3.1b1/dhcpctl/Makefile.am.brGmwh dhcp-4.3.1b1/dhcpctl/Makefile.am
+--- dhcp-4.3.1b1/dhcpctl/Makefile.am.brGmwh 2014-07-02 19:58:38.000000000 +0200
++++ dhcp-4.3.1b1/dhcpctl/Makefile.am 2014-07-10 17:36:30.485250962 +0200
+@@ -6,12 +6,9 @@ EXTRA_DIST = $(man_MANS)
+
+ omshell_SOURCES = omshell.c
+ omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
+- ../bind/lib/libirs.a ../bind/lib/libdns.a \
+- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
+-
++ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+ libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c
+
+ cltest_SOURCES = cltest.c
+ cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
+- ../bind/lib/libirs.a ../bind/lib/libdns.a \
+- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
++ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+diff -up dhcp-4.3.1b1/Makefile.am.brGmwh dhcp-4.3.1b1/Makefile.am
+--- dhcp-4.3.1b1/Makefile.am.brGmwh 2014-07-02 19:58:38.000000000 +0200
++++ dhcp-4.3.1b1/Makefile.am 2014-07-10 17:36:30.484250976 +0200
+@@ -25,7 +25,13 @@ EXTRA_DIST = RELNOTES LICENSE \
+ bind/Makefile bind/bind.tar.gz bind/version.tmp \
+ common/tests/Atffile server/tests/Atffile
+
+-SUBDIRS = bind includes tests common dst omapip client dhcpctl relay server
++if BUNDLED_BIND
++SUBDIRS = bind
++else
++SUBDIRS =
++endif
++
++SUBDIRS += includes tests common dst omapip client dhcpctl relay server
+
+ nobase_include_HEADERS = dhcpctl/dhcpctl.h
+
+diff -up dhcp-4.3.1b1/omapip/Makefile.am.brGmwh dhcp-4.3.1b1/omapip/Makefile.am
+--- dhcp-4.3.1b1/omapip/Makefile.am.brGmwh 2014-07-02 19:58:39.000000000 +0200
++++ dhcp-4.3.1b1/omapip/Makefile.am 2014-07-10 17:36:30.486250948 +0200
+@@ -10,6 +10,5 @@ man_MANS = omapi.3
+ EXTRA_DIST = $(man_MANS)
+
+ svtest_SOURCES = test.c
+-svtest_LDADD = libomapi.a ../bind/lib/libirs.a ../bind/lib/libdns.a \
+- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
+-
++svtest_LDADD = libomapi.a \
++ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+diff -up dhcp-4.3.1b1/relay/Makefile.am.brGmwh dhcp-4.3.1b1/relay/Makefile.am
+--- dhcp-4.3.1b1/relay/Makefile.am.brGmwh 2014-07-02 19:58:39.000000000 +0200
++++ dhcp-4.3.1b1/relay/Makefile.am 2014-07-10 17:36:30.486250948 +0200
+@@ -3,8 +3,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localst
+ sbin_PROGRAMS = dhcrelay
+ dhcrelay_SOURCES = dhcrelay.c
+ dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
+- ../bind/lib/libirs.a ../bind/lib/libdns.a \
+- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
++ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+ man_MANS = dhcrelay.8
+ EXTRA_DIST = $(man_MANS)
+
+diff -up dhcp-4.3.1b1/server/Makefile.am.brGmwh dhcp-4.3.1b1/server/Makefile.am
+--- dhcp-4.3.1b1/server/Makefile.am.brGmwh 2014-07-02 19:58:39.000000000 +0200
++++ dhcp-4.3.1b1/server/Makefile.am 2014-07-10 17:36:30.486250948 +0200
+@@ -13,10 +13,8 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c c
+ dhcpv6.c mdb6.c ldap.c ldap_casa.c
+
+ dhcpd_CFLAGS = $(LDAP_CFLAGS)
+-dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
+- ../dhcpctl/libdhcpctl.a ../bind/lib/libirs.a \
+- ../bind/lib/libdns.a ../bind/lib/libisccfg.a ../bind/lib/libisc.a
+-
++dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a ../dhcpctl/libdhcpctl.a \
++ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+ man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
+ EXTRA_DIST = $(man_MANS)
+
+diff -up dhcp-4.3.1b1/server/tests/Makefile.am.brGmwh dhcp-4.3.1b1/server/tests/Makefile.am
+--- dhcp-4.3.1b1/server/tests/Makefile.am.brGmwh 2014-07-02 19:58:40.000000000 +0200
++++ dhcp-4.3.1b1/server/tests/Makefile.am 2014-07-10 17:36:30.486250948 +0200
+@@ -18,9 +18,8 @@ DHCPSRC = ../dhcp.c ../bootp.c ../confpa
+ ../ldap.c ../ldap_casa.c ../dhcpd.c
+
+ DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.a \
+- $(top_builddir)/dhcpctl/libdhcpctl.a $(top_builddir)/bind/lib/libirs.a \
+- $(top_builddir)/bind/lib/libdns.a $(top_builddir)/bind/lib/libisccfg.a \
+- $(top_builddir)/bind/lib/libisc.a
++ $(top_builddir)/dhcpctl/libdhcpctl.a \
++ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+
+ ATF_TESTS =
+ TESTS =
-diff -up dhcp-4.2.2b1/client/clparse.c.rfc3442 dhcp-4.2.2b1/client/clparse.c
---- dhcp-4.2.2b1/client/clparse.c.rfc3442 2011-07-01 14:22:38.031534508 +0200
-+++ dhcp-4.2.2b1/client/clparse.c 2011-07-01 14:22:38.128532940 +0200
-@@ -37,7 +37,7 @@
+diff -up dhcp-4.3.0rc1/client/clparse.c.rfc3442 dhcp-4.3.0rc1/client/clparse.c
+--- dhcp-4.3.0rc1/client/clparse.c.rfc3442 2014-01-29 10:05:48.474400352 +0100
++++ dhcp-4.3.0rc1/client/clparse.c 2014-01-29 10:05:48.517399955 +0100
+@@ -31,7 +31,7 @@
struct client_config top_level_config;
struct option *default_requested_options[NUM_DEFAULT_REQUESTED_OPTS + 1];
static void parse_client_default_duid(struct parse *cfile);
-@@ -82,7 +82,11 @@ isc_result_t read_client_conf ()
+@@ -84,7 +84,11 @@ isc_result_t read_client_conf ()
dhcp_universe.code_hash, &code, 0, MDL);
/* 4 */
option_code_hash_lookup(&default_requested_options[3],
dhcp_universe.code_hash, &code, 0, MDL);
-@@ -136,6 +140,11 @@ isc_result_t read_client_conf ()
+@@ -138,6 +142,11 @@ isc_result_t read_client_conf ()
option_code_hash_lookup(&default_requested_options[13],
dhcp_universe.code_hash, &code, 0, MDL);
for (code = 0 ; code < NUM_DEFAULT_REQUESTED_OPTS ; code++) {
if (default_requested_options[code] == NULL)
log_fatal("Unable to find option definition for "
-diff -up dhcp-4.2.2b1/common/dhcp-options.5.rfc3442 dhcp-4.2.2b1/common/dhcp-options.5
---- dhcp-4.2.2b1/common/dhcp-options.5.rfc3442 2011-07-01 14:22:38.020534686 +0200
-+++ dhcp-4.2.2b1/common/dhcp-options.5 2011-07-01 14:22:38.129532924 +0200
-@@ -115,6 +115,26 @@ hexadecimal, separated by colons. For
+diff -up dhcp-4.3.0rc1/common/dhcp-options.5.rfc3442 dhcp-4.3.0rc1/common/dhcp-options.5
+--- dhcp-4.3.0rc1/common/dhcp-options.5.rfc3442 2014-01-29 10:05:48.466400426 +0100
++++ dhcp-4.3.0rc1/common/dhcp-options.5 2014-01-29 10:05:48.518399945 +0100
+@@ -111,6 +111,26 @@ hexadecimal, separated by colons. For e
or
option dhcp-client-identifier 43:4c:49:45:54:2d:46:4f:4f;
.fi
+.fi
.SH SETTING OPTION VALUES USING EXPRESSIONS
Sometimes it's helpful to be able to set the value of a DHCP option
- based on some value that the client has sent. To do this, you can
-@@ -931,6 +951,29 @@ dhclient-script will create routes:
+ based on some value that the client has sent. To do this, you can
+@@ -972,6 +992,29 @@ dhclient-script will create routes:
.RE
.PP
.nf
.B option \fBstreettalk-directory-assistance-server\fR \fIip-address\fR
[\fB,\fR \fIip-address\fR...]\fB;\fR
.fi
-diff -up dhcp-4.2.2b1/common/inet.c.rfc3442 dhcp-4.2.2b1/common/inet.c
---- dhcp-4.2.2b1/common/inet.c.rfc3442 2011-05-11 02:47:22.000000000 +0200
-+++ dhcp-4.2.2b1/common/inet.c 2011-07-01 14:22:38.130532908 +0200
-@@ -528,6 +528,60 @@ free_iaddrcidrnetlist(struct iaddrcidrne
+diff -up dhcp-4.3.0rc1/common/inet.c.rfc3442 dhcp-4.3.0rc1/common/inet.c
+--- dhcp-4.3.0rc1/common/inet.c.rfc3442 2014-01-26 19:40:44.000000000 +0100
++++ dhcp-4.3.0rc1/common/inet.c 2014-01-29 10:05:48.519399936 +0100
+@@ -521,6 +521,60 @@ free_iaddrcidrnetlist(struct iaddrcidrne
return ISC_R_SUCCESS;
}
/* piaddr() turns an iaddr structure into a printable address. */
/* XXX: should use a const pointer rather than passing the structure */
const char *
-diff -up dhcp-4.2.2b1/common/options.c.rfc3442 dhcp-4.2.2b1/common/options.c
---- dhcp-4.2.2b1/common/options.c.rfc3442 2011-03-24 22:57:13.000000000 +0100
-+++ dhcp-4.2.2b1/common/options.c 2011-07-01 14:22:38.132532876 +0200
-@@ -706,7 +706,11 @@ cons_options(struct packet *inpacket, st
+diff -up dhcp-4.3.0rc1/common/options.c.rfc3442 dhcp-4.3.0rc1/common/options.c
+--- dhcp-4.3.0rc1/common/options.c.rfc3442 2014-01-26 19:40:44.000000000 +0100
++++ dhcp-4.3.0rc1/common/options.c 2014-01-29 10:05:48.520399927 +0100
+@@ -707,7 +707,11 @@ cons_options(struct packet *inpacket, st
* packet.
*/
priority_list[priority_len++] = DHO_SUBNET_MASK;
priority_list[priority_len++] = DHO_DOMAIN_NAME_SERVERS;
priority_list[priority_len++] = DHO_HOST_NAME;
priority_list[priority_len++] = DHO_FQDN;
-@@ -1683,6 +1687,7 @@ const char *pretty_print_option (option,
- const unsigned char *dp = data;
- char comma;
+@@ -1688,6 +1692,7 @@ const char *pretty_print_option (option,
unsigned long tval;
-+ unsigned int octets = 0;
+ isc_boolean_t a_array = ISC_FALSE;
+ int len_used;
++ unsigned int octets = 0;
if (emit_commas)
comma = ',';
-@@ -1691,6 +1696,7 @@ const char *pretty_print_option (option,
+@@ -1696,6 +1701,7 @@ const char *pretty_print_option (option,
memset (enumbuf, 0, sizeof enumbuf);
/* Figure out the size of the data. */
for (l = i = 0; option -> format [i]; i++, l++) {
if (l >= sizeof(fmtbuf) - 1)
-@@ -1840,6 +1846,33 @@ const char *pretty_print_option (option,
+@@ -1870,6 +1876,33 @@ const char *pretty_print_option (option,
if (numhunk < 0)
numhunk = 1;
+
/* Cycle through the array (or hunk) printing the data. */
for (i = 0; i < numhunk; i++) {
- for (j = 0; j < numelem; j++) {
-@@ -1978,6 +2011,20 @@ const char *pretty_print_option (option,
+ if ((a_array == ISC_TRUE) && (i != 0) && (numelem > 0)) {
+@@ -2025,6 +2058,20 @@ const char *pretty_print_option (option,
strcpy(op, piaddr(iaddr));
dp += 4;
break;
case '6':
iaddr.len = 16;
memcpy(iaddr.iabuf, dp, 16);
-diff -up dhcp-4.2.2b1/common/parse.c.rfc3442 dhcp-4.2.2b1/common/parse.c
---- dhcp-4.2.2b1/common/parse.c.rfc3442 2011-07-01 14:22:38.097533441 +0200
-+++ dhcp-4.2.2b1/common/parse.c 2011-07-01 14:22:38.135532828 +0200
-@@ -341,6 +341,39 @@ int parse_ip_addr (cfile, addr)
+diff -up dhcp-4.3.0rc1/common/parse.c.rfc3442 dhcp-4.3.0rc1/common/parse.c
+--- dhcp-4.3.0rc1/common/parse.c.rfc3442 2014-01-29 10:05:48.491400195 +0100
++++ dhcp-4.3.0rc1/common/parse.c 2014-01-29 10:05:48.522399908 +0100
+@@ -335,6 +335,39 @@ int parse_ip_addr (cfile, addr)
}
/*
* Return true if every character in the string is hexadecimal.
*/
static int
-@@ -700,8 +733,10 @@ unsigned char *parse_numeric_aggregate (
+@@ -713,8 +746,10 @@ unsigned char *parse_numeric_aggregate (
if (count) {
token = peek_token (&val, (unsigned *)0, cfile);
if (token != separator) {
if (token != RBRACE && token != LBRACE)
token = next_token (&val,
(unsigned *)0,
-@@ -1624,6 +1659,9 @@ int parse_option_code_definition (cfile,
+@@ -1654,6 +1689,9 @@ int parse_option_code_definition (cfile,
case IP_ADDRESS:
type = 'I';
break;
case IP6_ADDRESS:
type = '6';
break;
-@@ -5288,6 +5326,15 @@ int parse_option_token (rv, cfile, fmt,
+@@ -5071,6 +5109,15 @@ int parse_option_token (rv, cfile, fmt,
}
break;
case '6': /* IPv6 address. */
if (!parse_ip6_addr(cfile, &addr)) {
return 0;
-@@ -5548,6 +5595,13 @@ int parse_option_decl (oc, cfile)
+@@ -5348,6 +5395,13 @@ int parse_option_decl (oc, cfile)
goto exit;
len = ip_addr.len;
dp = ip_addr.iabuf;
alloc:
if (hunkix + len > sizeof hunkbuf) {
-diff -up dhcp-4.2.2b1/common/tables.c.rfc3442 dhcp-4.2.2b1/common/tables.c
---- dhcp-4.2.2b1/common/tables.c.rfc3442 2011-07-01 14:22:38.087533601 +0200
-+++ dhcp-4.2.2b1/common/tables.c 2011-07-01 14:22:38.137532796 +0200
-@@ -51,6 +51,7 @@ HASH_FUNCTIONS (option_code, const unsig
+diff -up dhcp-4.3.0rc1/common/tables.c.rfc3442 dhcp-4.3.0rc1/common/tables.c
+--- dhcp-4.3.0rc1/common/tables.c.rfc3442 2014-01-29 10:05:48.485400250 +0100
++++ dhcp-4.3.0rc1/common/tables.c 2014-01-29 10:06:25.724038563 +0100
+@@ -46,6 +46,7 @@ HASH_FUNCTIONS (option_code, const unsig
Format codes:
I - IPv4 address
6 - IPv6 address
l - 32-bit signed integer
L - 32-bit unsigned integer
-@@ -208,6 +209,7 @@ static struct option dhcp_options[] = {
- { "default-url", "t", &dhcp_universe, 114, 1 },
+@@ -214,6 +215,7 @@ static struct option dhcp_options[] = {
+ #endif
{ "subnet-selection", "I", &dhcp_universe, 118, 1 },
- { "domain-search", "D", &dhcp_universe, 119, 1 },
+ { "domain-search", "D", &dhcp_universe, 119, 1 },
+ { "classless-static-routes", "RIA", &dhcp_universe, 121, 1 },
{ "vivco", "Evendor-class.", &dhcp_universe, 124, 1 },
{ "vivso", "Evendor.", &dhcp_universe, 125, 1 },
#if 0
-diff -up dhcp-4.2.2b1/includes/dhcpd.h.rfc3442 dhcp-4.2.2b1/includes/dhcpd.h
---- dhcp-4.2.2b1/includes/dhcpd.h.rfc3442 2011-07-01 14:22:38.000000000 +0200
-+++ dhcp-4.2.2b1/includes/dhcpd.h 2011-07-01 14:24:19.999810333 +0200
-@@ -2662,6 +2662,7 @@ isc_result_t range2cidr(struct iaddrcidr
+diff -up dhcp-4.3.0rc1/includes/dhcpd.h.rfc3442 dhcp-4.3.0rc1/includes/dhcpd.h
+--- dhcp-4.3.0rc1/includes/dhcpd.h.rfc3442 2014-01-29 10:05:48.470400389 +0100
++++ dhcp-4.3.0rc1/includes/dhcpd.h 2014-01-29 10:05:48.525399881 +0100
+@@ -2725,6 +2725,7 @@ isc_result_t range2cidr(struct iaddrcidr
const struct iaddr *lo, const struct iaddr *hi);
isc_result_t free_iaddrcidrnetlist(struct iaddrcidrnetlist **result);
const char *piaddr (struct iaddr);
char *piaddrmask(struct iaddr *, struct iaddr *);
char *piaddrcidr(const struct iaddr *, unsigned int);
u_int16_t validate_port(char *);
-@@ -2869,6 +2870,7 @@ void parse_client_lease_declaration (str
+@@ -2934,6 +2935,7 @@ void parse_client_lease_declaration (str
int parse_option_decl (struct option_cache **, struct parse *);
void parse_string_list (struct parse *, struct string_list **, int);
int parse_ip_addr (struct parse *, struct iaddr *);
int parse_ip_addr_with_subnet(struct parse *, struct iaddrmatch *);
void parse_reject_statement (struct parse *, struct client_config *);
-diff -up dhcp-4.2.2b1/includes/dhcp.h.rfc3442 dhcp-4.2.2b1/includes/dhcp.h
---- dhcp-4.2.2b1/includes/dhcp.h.rfc3442 2009-11-20 02:49:01.000000000 +0100
-+++ dhcp-4.2.2b1/includes/dhcp.h 2011-07-01 14:22:38.145532665 +0200
-@@ -158,6 +158,7 @@ struct dhcp_packet {
+diff -up dhcp-4.3.0rc1/includes/dhcp.h.rfc3442 dhcp-4.3.0rc1/includes/dhcp.h
+--- dhcp-4.3.0rc1/includes/dhcp.h.rfc3442 2014-01-26 19:40:44.000000000 +0100
++++ dhcp-4.3.0rc1/includes/dhcp.h 2014-01-29 10:05:48.524399890 +0100
+@@ -159,6 +159,7 @@ struct dhcp_packet {
#define DHO_ASSOCIATED_IP 92
#define DHO_SUBNET_SELECTION 118 /* RFC3011! */
#define DHO_DOMAIN_SEARCH 119 /* RFC3397 */
#define DHO_VIVCO_SUBOPTIONS 124
#define DHO_VIVSO_SUBOPTIONS 125
-diff -up dhcp-4.2.2b1/includes/dhctoken.h.rfc3442 dhcp-4.2.2b1/includes/dhctoken.h
---- dhcp-4.2.2b1/includes/dhctoken.h.rfc3442 2011-07-01 14:22:37.000000000 +0200
-+++ dhcp-4.2.2b1/includes/dhctoken.h 2011-07-01 14:25:12.541867623 +0200
-@@ -362,7 +362,8 @@ enum dhcp_token {
- REWIND = 663,
- INITIAL_DELAY = 664,
- GETHOSTBYNAME = 665,
-- BOOTP_BROADCAST_ALWAYS = 666
-+ BOOTP_BROADCAST_ALWAYS = 666,
-+ DESTINATION_DESCRIPTOR = 667
+diff -up dhcp-4.3.0rc1/includes/dhctoken.h.rfc3442 dhcp-4.3.0rc1/includes/dhctoken.h
+--- dhcp-4.3.0rc1/includes/dhctoken.h.rfc3442 2014-01-29 10:05:48.435400713 +0100
++++ dhcp-4.3.0rc1/includes/dhctoken.h 2014-01-29 10:05:48.526399871 +0100
+@@ -368,7 +368,8 @@ enum dhcp_token {
+ POOL6 = 669,
+ V6RELAY = 670,
+ V6RELOPT = 671,
+- BOOTP_BROADCAST_ALWAYS = 672
++ BOOTP_BROADCAST_ALWAYS = 672,
++ DESTINATION_DESCRIPTOR = 673
};
#define is_identifier(x) ((x) >= FIRST_TOKEN && \
-diff -up dhcp-4.2.1-P1/client/dhc6.c.sendDecline dhcp-4.2.1-P1/client/dhc6.c
---- dhcp-4.2.1-P1/client/dhc6.c.sendDecline 2010-09-10 22:27:11.000000000 +0200
-+++ dhcp-4.2.1-P1/client/dhc6.c 2011-06-17 14:19:48.992099868 +0200
-@@ -95,6 +95,8 @@ void do_select6(void *input);
+diff -up dhcp-4.3.0a1/client/dhc6.c.sendDecline dhcp-4.3.0a1/client/dhc6.c
+--- dhcp-4.3.0a1/client/dhc6.c.sendDecline 2013-12-11 01:25:12.000000000 +0100
++++ dhcp-4.3.0a1/client/dhc6.c 2013-12-19 15:56:18.297660118 +0100
+@@ -96,6 +96,8 @@ void do_select6(void *input);
void do_refresh6(void *input);
static void do_release6(void *input);
static void start_bound(struct client_state *client);
static void start_informed(struct client_state *client);
void informed_handler(struct packet *packet, struct client_state *client);
void bound_handler(struct packet *packet, struct client_state *client);
-@@ -2075,6 +2077,7 @@ start_release6(struct client_state *clie
+@@ -2017,6 +2019,7 @@ start_release6(struct client_state *clie
cancel_timeout(do_select6, client);
cancel_timeout(do_refresh6, client);
cancel_timeout(do_release6, client);
client->state = S_STOPPED;
/*
-@@ -2708,6 +2711,7 @@ dhc6_check_reply(struct client_state *cl
+@@ -2650,6 +2653,7 @@ dhc6_check_reply(struct client_state *cl
break;
case S_STOPPED:
action = dhc6_stop_action;
break;
-@@ -2809,6 +2813,7 @@ dhc6_check_reply(struct client_state *cl
+@@ -2751,6 +2755,7 @@ dhc6_check_reply(struct client_state *cl
break;
case S_STOPPED:
/* Nothing critical to do at this stage. */
break;
-@@ -3799,17 +3804,23 @@ reply_handler(struct packet *packet, str
+@@ -3741,17 +3746,23 @@ reply_handler(struct packet *packet, str
cancel_timeout(do_select6, client);
cancel_timeout(do_refresh6, client);
cancel_timeout(do_release6, client);
return;
}
-@@ -4336,7 +4347,11 @@ start_bound(struct client_state *client)
- oldia, oldaddr);
+@@ -4279,7 +4290,11 @@ start_bound(struct client_state *client)
dhc6_marshall_values("new_", client, lease, ia, addr);
+ script_write_requested6(client);
- script_go(client);
+ // when script returns 3, DAD failed
}
/* XXX: maybe we should loop on the old values instead? */
-@@ -4382,6 +4397,149 @@ start_bound(struct client_state *client)
+@@ -4327,6 +4342,149 @@ start_bound(struct client_state *client)
dhc6_check_times(client);
}
--- /dev/null
+diff -up dhcp-4.3.1b1/common/tests/Makefile.am.uCWMBl dhcp-4.3.1b1/common/tests/Makefile.am
+--- dhcp-4.3.1b1/common/tests/Makefile.am.uCWMBl 2014-07-10 17:38:10.779828569 +0200
++++ dhcp-4.3.1b1/common/tests/Makefile.am 2014-07-10 17:38:21.355678580 +0200
+@@ -13,19 +13,19 @@ ATF_TESTS += alloc_unittest dns_unittest
+ alloc_unittest_SOURCES = test_alloc.c $(top_srcdir)/tests/t_api_dhcp.c
+ alloc_unittest_LDADD = $(ATF_LDFLAGS)
+ alloc_unittest_LDADD += ../libdhcp.a \
+- ../../omapip/libomapi.a \
++ ../../omapip/libomapi.la \
+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+
+ dns_unittest_SOURCES = dns_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
+ dns_unittest_LDADD = $(ATF_LDFLAGS)
+-dns_unittest_LDADD += ../libdhcp.a \
++dns_unittest_LDADD += ../libdhcp.la \
+ ../../omapip/libomapi.a \
+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+
+ misc_unittest_SOURCES = misc_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
+ misc_unittest_LDADD = $(ATF_LDFLAGS)
+ misc_unittest_LDADD += ../libdhcp.a \
+- ../../omapip/libomapi.a \
++ ../../omapip/libomapi.la \
+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+ check: $(ATF_TESTS)
+ atf-run | atf-report
+diff -up dhcp-4.3.1b1/configure.ac.uCWMBl dhcp-4.3.1b1/configure.ac
+--- dhcp-4.3.1b1/configure.ac.uCWMBl 2014-07-10 17:38:10.766828753 +0200
++++ dhcp-4.3.1b1/configure.ac 2014-07-10 17:38:10.779828569 +0200
+@@ -39,7 +39,8 @@ fi
+ # Use this to define _GNU_SOURCE to pull in the IPv6 Advanced Socket API.
+ AC_USE_SYSTEM_EXTENSIONS
+
+-AC_PROG_RANLIB
++# Use libtool to simplify building of shared libraries
++AC_PROG_LIBTOOL
+ AC_CONFIG_HEADERS([includes/config.h])
+
+ # we sometimes need to know byte order for building packets
+diff -up dhcp-4.3.1b1/dhcpctl/Makefile.am.uCWMBl dhcp-4.3.1b1/dhcpctl/Makefile.am
+--- dhcp-4.3.1b1/dhcpctl/Makefile.am.uCWMBl 2014-07-10 17:36:30.485250962 +0200
++++ dhcp-4.3.1b1/dhcpctl/Makefile.am 2014-07-10 17:38:10.780828554 +0200
+@@ -1,14 +1,14 @@
+ bin_PROGRAMS = omshell
+-lib_LIBRARIES = libdhcpctl.a
++lib_LTLIBRARIES = libdhcpctl.la
+ noinst_PROGRAMS = cltest
+ man_MANS = omshell.1 dhcpctl.3
+ EXTRA_DIST = $(man_MANS)
+
+ omshell_SOURCES = omshell.c
+-omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
++omshell_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \
+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+-libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c
++libdhcpctl_la_SOURCES = dhcpctl.c callback.c remote.c
+
+ cltest_SOURCES = cltest.c
+-cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
++cltest_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \
+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+diff -up dhcp-4.3.1b1/omapip/Makefile.am.uCWMBl dhcp-4.3.1b1/omapip/Makefile.am
+--- dhcp-4.3.1b1/omapip/Makefile.am.uCWMBl 2014-07-10 17:36:30.486250948 +0200
++++ dhcp-4.3.1b1/omapip/Makefile.am 2014-07-10 17:38:10.780828554 +0200
+@@ -1,7 +1,7 @@
+-lib_LIBRARIES = libomapi.a
++lib_LTLIBRARIES = libomapi.la
+ noinst_PROGRAMS = svtest
+
+-libomapi_a_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \
++libomapi_la_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \
+ errwarn.c listener.c dispatch.c generic.c support.c \
+ handle.c message.c convert.c hash.c auth.c inet_addr.c \
+ array.c trace.c toisc.c iscprint.c isclib.c
+@@ -10,5 +10,5 @@ man_MANS = omapi.3
+ EXTRA_DIST = $(man_MANS)
+
+ svtest_SOURCES = test.c
+-svtest_LDADD = libomapi.a \
++svtest_LDADD = libomapi.la \
+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+diff -up dhcp-4.3.1b1/server/Makefile.am.uCWMBl dhcp-4.3.1b1/server/Makefile.am
+--- dhcp-4.3.1b1/server/Makefile.am.uCWMBl 2014-07-10 17:36:30.486250948 +0200
++++ dhcp-4.3.1b1/server/Makefile.am 2014-07-10 17:38:10.780828554 +0200
+@@ -13,7 +13,7 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c c
+ dhcpv6.c mdb6.c ldap.c ldap_casa.c
+
+ dhcpd_CFLAGS = $(LDAP_CFLAGS)
+-dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a ../dhcpctl/libdhcpctl.a \
++dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.la ../dhcpctl/libdhcpctl.la \
+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+ man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
+ EXTRA_DIST = $(man_MANS)
+diff -up dhcp-4.3.1b1/server/tests/Makefile.am.uCWMBl dhcp-4.3.1b1/server/tests/Makefile.am
+--- dhcp-4.3.1b1/server/tests/Makefile.am.uCWMBl 2014-07-10 17:36:30.486250948 +0200
++++ dhcp-4.3.1b1/server/tests/Makefile.am 2014-07-10 17:38:10.780828554 +0200
+@@ -17,8 +17,8 @@ DHCPSRC = ../dhcp.c ../bootp.c ../confpa
+ ../ddns.c ../dhcpleasequery.c ../dhcpv6.c ../mdb6.c \
+ ../ldap.c ../ldap_casa.c ../dhcpd.c
+
+-DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.a \
+- $(top_builddir)/dhcpctl/libdhcpctl.a \
++DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.la \
++ $(top_builddir)/dhcpctl/libdhcpctl.la \
+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
+
+ ATF_TESTS =
--- /dev/null
+From 61fa3dd9e789997f66e848c7e3fb2f554ee374e2 Mon Sep 17 00:00:00 2001
+From: Jiri Popelka <jpopelka@redhat.com>
+Date: Thu, 18 Dec 2014 11:53:26 +0100
+Subject: [PATCH] Write DUID_LLT even in stateless mode.
+
+By default, DHCPv6 dhclient creates DUID-LL
+if it is running in stateless mode (-6 -S) and
+doesn't write it into leases file, most likely
+because the DUID-LL is always generated the same.
+
+It's however possible to specify DUID to be of type LLT instead of LL
+with '-D LLT'. Rfc 3315 says that:
+'Clients and servers using this type of DUID MUST
+store the DUID-LLT in stable storage.'
+That's not fulfiled in this case (-6 -S -D LLT),
+because it's generated each time again.
+
+It's not a big deal because the server doesn't store any
+info about 'stateless' clients, so it doesn't matter
+that the DUID-LLT is different each time.
+But there's a TAHI test which tests this, i.e. that
+DUID-LLT is still the same even in stateless mode.
+It's a test DHCP_CONF.7.1.9, part B.
+https://www.ipv6ready.org/docs/Phase2_DHCPv6_Conformance_Latest.pdf
+
+Signed-off-by: Jiri Popelka <jpopelka@redhat.com>
+---
+ client/dhclient.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/client/dhclient.c b/client/dhclient.c
+index 5ef59cd..026e3fe 100644
+--- a/client/dhclient.c
++++ b/client/dhclient.c
+@@ -788,7 +788,9 @@ void run_stateless(int exit_mode)
+ if (default_duid.buffer != NULL)
+ data_string_forget(&default_duid, MDL);
+
+- form_duid(&default_duid, MDL);
++ if (form_duid(&default_duid, MDL) == ISC_R_SUCCESS &&
++ duid_type == DUID_LLT)
++ write_duid(&default_duid);
+ }
+
+ /* Start a configuration state machine. */
+--
+2.1.0
+
-diff -up dhcp-4.2.0/server/bootp.c.unicast dhcp-4.2.0/server/bootp.c
---- dhcp-4.2.0/server/bootp.c.unicast 2009-11-20 02:49:03.000000000 +0100
-+++ dhcp-4.2.0/server/bootp.c 2010-07-21 13:40:25.000000000 +0200
-@@ -58,6 +58,7 @@ void bootp (packet)
+diff -up dhcp-4.3.0a1/server/bootp.c.unicast dhcp-4.3.0a1/server/bootp.c
+--- dhcp-4.3.0a1/server/bootp.c.unicast 2013-12-11 01:25:12.000000000 +0100
++++ dhcp-4.3.0a1/server/bootp.c 2013-12-19 15:12:12.974671154 +0100
+@@ -59,6 +59,7 @@ void bootp (packet)
char msgbuf [1024];
int ignorep;
int peer_has_leases = 0;
if (packet -> raw -> op != BOOTREQUEST)
return;
-@@ -73,7 +74,7 @@ void bootp (packet)
+@@ -74,7 +75,7 @@ void bootp (packet)
? inet_ntoa (packet -> raw -> giaddr)
: packet -> interface -> name);
log_info ("%s: network unknown", msgbuf);
return;
}
-@@ -390,6 +391,13 @@ void bootp (packet)
- from, &to, &hto);
+@@ -396,6 +397,15 @@ void bootp (packet)
+
goto out;
}
+ } else if (norelay == 2) {
+ to.sin_addr = raw.ciaddr;
+ to.sin_port = remote_port;
+ if (fallback_interface) {
-+ result = send_packet (fallback_interface, (struct packet *)0, &raw, outgoing.packet_length, from, &to, &hto);
++ result = send_packet (fallback_interface, NULL, &raw,
++ outgoing.packet_length, from,
++ &to, &hto);
+ goto out;
+ }
/* If it comes from a client that already knows its address
and is not requesting a broadcast response, and we can
-diff -up dhcp-4.2.0/server/dhcp.c.unicast dhcp-4.2.0/server/dhcp.c
---- dhcp-4.2.0/server/dhcp.c.unicast 2010-06-01 19:29:59.000000000 +0200
-+++ dhcp-4.2.0/server/dhcp.c 2010-07-21 13:40:25.000000000 +0200
-@@ -4185,6 +4185,7 @@ int locate_network (packet)
+diff -up dhcp-4.3.0a1/server/dhcp.c.unicast dhcp-4.3.0a1/server/dhcp.c
+--- dhcp-4.3.0a1/server/dhcp.c.unicast 2013-12-13 21:50:38.000000000 +0100
++++ dhcp-4.3.0a1/server/dhcp.c 2013-12-19 15:12:12.975671140 +0100
+@@ -4627,6 +4627,7 @@ int locate_network (packet)
struct data_string data;
struct subnet *subnet = (struct subnet *)0;
struct option_cache *oc;
/* See if there's a Relay Agent Link Selection Option, or a
* Subnet Selection Option. The Link-Select and Subnet-Select
-@@ -4200,12 +4201,24 @@ int locate_network (packet)
+@@ -4642,12 +4643,24 @@ int locate_network (packet)
from the interface, if there is one. If not, fail. */
if (!oc && !packet -> raw -> giaddr.s_addr) {
if (packet -> interface -> shared_network) {
}
/* If there's an option indicating link connection, and it's valid,
-@@ -4228,7 +4241,10 @@ int locate_network (packet)
+@@ -4670,7 +4683,10 @@ int locate_network (packet)
data_string_forget (&data, MDL);
} else {
ia.len = 4;
}
/* If we know the subnet on which the IP address lives, use it. */
-@@ -4236,7 +4252,10 @@ int locate_network (packet)
+@@ -4678,7 +4694,10 @@ int locate_network (packet)
shared_network_reference (&packet -> shared_network,
subnet -> shared_network, MDL);
subnet_dereference (&subnet, MDL);
-diff -up dhcp-4.2.2b1/common/bpf.c.xen dhcp-4.2.2b1/common/bpf.c
---- dhcp-4.2.2b1/common/bpf.c.xen 2009-11-20 02:48:59.000000000 +0100
-+++ dhcp-4.2.2b1/common/bpf.c 2011-07-01 14:00:16.936959001 +0200
-@@ -485,7 +485,7 @@ ssize_t receive_packet (interface, buf,
- offset = decode_udp_ip_header (interface,
- interface -> rbuf,
- interface -> rbuf_offset,
+diff -up dhcp-4.3.0rc1/common/bpf.c.xen dhcp-4.3.0rc1/common/bpf.c
+--- dhcp-4.3.0rc1/common/bpf.c.xen 2014-01-29 10:03:27.503941664 +0100
++++ dhcp-4.3.0rc1/common/bpf.c 2014-01-29 10:03:37.564812175 +0100
+@@ -481,7 +481,7 @@ ssize_t receive_packet (interface, buf,
+ /* Decode the IP and UDP headers... */
+ offset = decode_udp_ip_header(interface, interface->rbuf,
+ interface->rbuf_offset,
- from, hdr.bh_caplen, &paylen);
+ from, hdr.bh_caplen, &paylen, 0);
/* If the IP or UDP checksum was bad, skip the packet... */
if (offset < 0) {
-diff -up dhcp-4.2.2b1/common/dlpi.c.xen dhcp-4.2.2b1/common/dlpi.c
---- dhcp-4.2.2b1/common/dlpi.c.xen 2011-05-11 16:20:59.000000000 +0200
-+++ dhcp-4.2.2b1/common/dlpi.c 2011-07-01 14:00:16.937958997 +0200
-@@ -693,7 +693,7 @@ ssize_t receive_packet (interface, buf,
+diff -up dhcp-4.3.0rc1/common/dlpi.c.xen dhcp-4.3.0rc1/common/dlpi.c
+--- dhcp-4.3.0rc1/common/dlpi.c.xen 2014-01-25 05:18:03.000000000 +0100
++++ dhcp-4.3.0rc1/common/dlpi.c 2014-01-29 10:03:27.503941664 +0100
+@@ -691,7 +691,7 @@ ssize_t receive_packet (interface, buf,
length -= offset;
#endif
offset = decode_udp_ip_header (interface, dbuf, bufix,
/*
* If the IP or UDP checksum was bad, skip the packet...
-diff -up dhcp-4.2.2b1/common/lpf.c.xen dhcp-4.2.2b1/common/lpf.c
---- dhcp-4.2.2b1/common/lpf.c.xen 2011-05-10 16:38:58.000000000 +0200
-+++ dhcp-4.2.2b1/common/lpf.c 2011-07-01 14:11:24.725748028 +0200
-@@ -29,19 +29,33 @@
+diff -up dhcp-4.3.0rc1/common/lpf.c.xen dhcp-4.3.0rc1/common/lpf.c
+--- dhcp-4.3.0rc1/common/lpf.c.xen 2014-01-25 05:18:03.000000000 +0100
++++ dhcp-4.3.0rc1/common/lpf.c 2014-01-29 10:03:27.504941651 +0100
+@@ -29,14 +29,15 @@
+
#include "dhcpd.h"
#if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE)
- #include <sys/ioctl.h>
+#include <sys/socket.h>
#include <sys/uio.h>
#include <errno.h>
#include "includes/netinet/ip.h"
#include "includes/netinet/udp.h"
#include "includes/netinet/if_ether.h"
- #include <net/if.h>
+@@ -51,6 +52,19 @@
+ /* Reinitializes the specified interface after an address change. This
+ is not required for packet-filter APIs. */
+#ifndef PACKET_AUXDATA
+#define PACKET_AUXDATA 8
+};
+#endif
+
- /* Reinitializes the specified interface after an address change. This
- is not required for packet-filter APIs. */
-
-@@ -67,10 +81,14 @@ int if_register_lpf (info)
+ #ifdef USE_LPF_SEND
+ void if_reinitialize_send (info)
+ struct interface_info *info;
+@@ -73,10 +87,14 @@ int if_register_lpf (info)
struct interface_info *info;
{
int sock;
htons((short)ETH_P_ALL))) < 0) {
if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
-@@ -85,11 +103,17 @@ int if_register_lpf (info)
+@@ -91,11 +109,17 @@ int if_register_lpf (info)
log_fatal ("Open a socket for LPF: %m");
}
if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
errno == EAFNOSUPPORT || errno == EINVAL) {
-@@ -171,9 +195,18 @@ static void lpf_gen_filter_setup (struct
+@@ -177,9 +201,18 @@ static void lpf_gen_filter_setup (struct
void if_register_receive (info)
struct interface_info *info;
{
#if defined (HAVE_TR_SUPPORT)
if (info -> hw_address.hbuf [0] == HTYPE_IEEE802)
lpf_tr_filter_setup (info);
-@@ -295,7 +328,6 @@ ssize_t send_packet (interface, packet,
+@@ -301,7 +334,6 @@ ssize_t send_packet (interface, packet,
double hh [16];
double ih [1536 / sizeof (double)];
unsigned char *buf = (unsigned char *)ih;
int result;
int fudge;
-@@ -316,17 +348,7 @@ ssize_t send_packet (interface, packet,
+@@ -322,17 +354,7 @@ ssize_t send_packet (interface, packet,
(unsigned char *)raw, len);
memcpy (buf + ibufp, raw, len);
if (result < 0)
log_error ("send_packet: %m");
return result;
-@@ -343,14 +365,35 @@ ssize_t receive_packet (interface, buf,
+@@ -349,14 +371,35 @@ ssize_t receive_packet (interface, buf,
{
int length = 0;
int offset = 0;
bufix = 0;
/* Decode the physical header... */
offset = decode_hw_header (interface, ibuf, bufix, hfrom);
-@@ -367,7 +410,7 @@ ssize_t receive_packet (interface, buf,
+@@ -373,7 +416,7 @@ ssize_t receive_packet (interface, buf,
/* Decode the IP and UDP headers... */
offset = decode_udp_ip_header (interface, ibuf, bufix, from,
/* If the IP or UDP checksum was bad, skip the packet... */
if (offset < 0)
-diff -up dhcp-4.2.2b1/common/nit.c.xen dhcp-4.2.2b1/common/nit.c
---- dhcp-4.2.2b1/common/nit.c.xen 2009-11-20 02:49:01.000000000 +0100
-+++ dhcp-4.2.2b1/common/nit.c 2011-07-01 14:00:16.939958989 +0200
-@@ -369,7 +369,7 @@ ssize_t receive_packet (interface, buf,
+diff -up dhcp-4.3.0rc1/common/nit.c.xen dhcp-4.3.0rc1/common/nit.c
+--- dhcp-4.3.0rc1/common/nit.c.xen 2014-01-26 19:40:44.000000000 +0100
++++ dhcp-4.3.0rc1/common/nit.c 2014-01-29 10:03:27.504941651 +0100
+@@ -363,7 +363,7 @@ ssize_t receive_packet (interface, buf,
/* Decode the IP and UDP headers... */
offset = decode_udp_ip_header (interface, ibuf, bufix,
/* If the IP or UDP checksum was bad, skip the packet... */
if (offset < 0)
-diff -up dhcp-4.2.2b1/common/packet.c.xen dhcp-4.2.2b1/common/packet.c
---- dhcp-4.2.2b1/common/packet.c.xen 2009-07-23 20:52:20.000000000 +0200
-+++ dhcp-4.2.2b1/common/packet.c 2011-07-01 14:00:16.939958989 +0200
-@@ -211,7 +211,7 @@ ssize_t
+diff -up dhcp-4.3.0rc1/common/packet.c.xen dhcp-4.3.0rc1/common/packet.c
+--- dhcp-4.3.0rc1/common/packet.c.xen 2013-12-11 01:01:02.000000000 +0100
++++ dhcp-4.3.0rc1/common/packet.c 2014-01-29 10:03:27.504941651 +0100
+@@ -226,7 +226,7 @@ ssize_t
decode_udp_ip_header(struct interface_info *interface,
unsigned char *buf, unsigned bufix,
struct sockaddr_in *from, unsigned buflen,
{
unsigned char *data;
struct ip ip;
-@@ -322,7 +322,7 @@ decode_udp_ip_header(struct interface_in
+@@ -337,7 +337,7 @@ decode_udp_ip_header(struct interface_in
8, IPPROTO_UDP + ulen))));
udp_packets_seen++;
udp_packets_bad_checksum++;
if (udp_packets_seen > 4 &&
(udp_packets_seen / udp_packets_bad_checksum) < 2) {
-diff -up dhcp-4.2.2b1/common/upf.c.xen dhcp-4.2.2b1/common/upf.c
---- dhcp-4.2.2b1/common/upf.c.xen 2009-11-20 02:49:01.000000000 +0100
-+++ dhcp-4.2.2b1/common/upf.c 2011-07-01 14:00:16.940958986 +0200
-@@ -320,7 +320,7 @@ ssize_t receive_packet (interface, buf,
+diff -up dhcp-4.3.0rc1/common/upf.c.xen dhcp-4.3.0rc1/common/upf.c
+--- dhcp-4.3.0rc1/common/upf.c.xen 2014-01-26 19:40:44.000000000 +0100
++++ dhcp-4.3.0rc1/common/upf.c 2014-01-29 10:03:27.505941638 +0100
+@@ -314,7 +314,7 @@ ssize_t receive_packet (interface, buf,
/* Decode the IP and UDP headers... */
offset = decode_udp_ip_header (interface, ibuf, bufix,
/* If the IP or UDP checksum was bad, skip the packet... */
if (offset < 0)
-diff -up dhcp-4.2.2b1/includes/dhcpd.h.xen dhcp-4.2.2b1/includes/dhcpd.h
---- dhcp-4.2.2b1/includes/dhcpd.h.xen 2011-07-01 14:00:16.000000000 +0200
-+++ dhcp-4.2.2b1/includes/dhcpd.h 2011-07-01 14:12:18.069642470 +0200
-@@ -2796,7 +2796,7 @@ ssize_t decode_hw_header (struct interfa
+diff -up dhcp-4.3.0rc1/includes/dhcpd.h.xen dhcp-4.3.0rc1/includes/dhcpd.h
+--- dhcp-4.3.0rc1/includes/dhcpd.h.xen 2014-01-29 10:03:27.489941844 +0100
++++ dhcp-4.3.0rc1/includes/dhcpd.h 2014-01-29 10:03:27.506941626 +0100
+@@ -2861,7 +2861,7 @@ ssize_t decode_hw_header (struct interfa
unsigned, struct hardware *);
ssize_t decode_udp_ip_header (struct interface_info *, unsigned char *,
unsigned, struct sockaddr_in *,
--- /dev/null
+From f2658275b25ebfe691cdcb9fede85a3088cca168 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Thu, 25 Sep 2014 21:51:25 +0100
+Subject: [PATCH 01/55] Add newline at the end of example config file.
+
+---
+ dnsmasq.conf.example | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/dnsmasq.conf.example b/dnsmasq.conf.example
+index 83924fc4a9b4..6b00bd34fbb5 100644
+--- a/dnsmasq.conf.example
++++ b/dnsmasq.conf.example
+@@ -645,4 +645,4 @@
+ #conf-dir=/etc/dnsmasq.d,.bak
+
+ # Include all files in a directory which end in .conf
+-#conf-dir=/etc/dnsmasq.d/*.conf
+\ No newline at end of file
++#conf-dir=/etc/dnsmasq.d/*.conf
+--
+2.1.0
+
--- /dev/null
+From 00cd9d551998307225312fd21f761cfa8868bd2c Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Thu, 2 Oct 2014 21:44:21 +0100
+Subject: [PATCH 02/55] crash at startup when an empty suffix is supplied to
+ --conf-dir
+
+---
+ CHANGELOG | 6 ++++++
+ src/option.c | 38 +++++++++++++++++++++++---------------
+ 2 files changed, 29 insertions(+), 15 deletions(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index 768e2aaca42a..13ab41c05fc3 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -1,3 +1,9 @@
++version 2.73
++ Fix crash at startup when an empty suffix is supplied to
++ --conf-dir, also trivial memory leak. Thanks to
++ Tomas Hozza for spotting this.
++
++
+ version 2.72
+ Add ra-advrouter mode, for RFC-3775 mobile IPv6 support.
+
+diff --git a/src/option.c b/src/option.c
+index 45d8875fb7f9..b08e98e16f84 100644
+--- a/src/option.c
++++ b/src/option.c
+@@ -1474,22 +1474,25 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
+ for (arg = comma; arg; arg = comma)
+ {
+ comma = split(arg);
+- li = opt_malloc(sizeof(struct list));
+- if (*arg == '*')
++ if (strlen(arg) != 0)
+ {
+- li->next = match_suffix;
+- match_suffix = li;
+- /* Have to copy: buffer is overwritten */
+- li->suffix = opt_string_alloc(arg+1);
+- }
+- else
+- {
+- li->next = ignore_suffix;
+- ignore_suffix = li;
+- /* Have to copy: buffer is overwritten */
+- li->suffix = opt_string_alloc(arg);
++ li = opt_malloc(sizeof(struct list));
++ if (*arg == '*')
++ {
++ li->next = match_suffix;
++ match_suffix = li;
++ /* Have to copy: buffer is overwritten */
++ li->suffix = opt_string_alloc(arg+1);
++ }
++ else
++ {
++ li->next = ignore_suffix;
++ ignore_suffix = li;
++ /* Have to copy: buffer is overwritten */
++ li->suffix = opt_string_alloc(arg);
++ }
+ }
+- };
++ }
+
+ if (!(dir_stream = opendir(directory)))
+ die(_("cannot access directory %s: %s"), directory, EC_FILE);
+@@ -1555,7 +1558,12 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
+ free(ignore_suffix->suffix);
+ free(ignore_suffix);
+ }
+-
++ for(; match_suffix; match_suffix = li)
++ {
++ li = match_suffix->next;
++ free(match_suffix->suffix);
++ free(match_suffix);
++ }
+ break;
+ }
+
+--
+2.1.0
+
--- /dev/null
+From 6ac3bc0452a74e16e3d620a0757b0f8caab182ec Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Fri, 3 Oct 2014 08:48:11 +0100
+Subject: [PATCH 03/55] Debian build fixes for kFreeBSD
+
+---
+ src/tables.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/src/tables.c b/src/tables.c
+index 834f11944cd0..dcdef794c4d2 100644
+--- a/src/tables.c
++++ b/src/tables.c
+@@ -20,6 +20,10 @@
+
+ #if defined(HAVE_IPSET) && defined(HAVE_BSD_NETWORK)
+
++#ifndef __FreeBSD__
++#include <bsd/string.h>
++#endif
++
+ #include <sys/types.h>
+ #include <sys/ioctl.h>
+
+@@ -136,7 +140,7 @@ int add_to_ipset(const char *setname, const struct all_addr *ipaddr,
+ return -1;
+ }
+
+- if (rc = pfr_add_tables(&table, 1, &n, 0))
++ if ((rc = pfr_add_tables(&table, 1, &n, 0)))
+ {
+ my_syslog(LOG_WARNING, _("warning: pfr_add_tables: %s(%d)"),
+ pfr_strerror(errno),rc);
+--
+2.1.0
+
--- /dev/null
+From e9828b6f66b22ce8873f8d30a773137d1aef1b92 Mon Sep 17 00:00:00 2001
+From: Karl Vogel <karl.vogel@gmail.com>
+Date: Fri, 3 Oct 2014 21:45:15 +0100
+Subject: [PATCH 04/55] Set conntrack mark before connect() call.
+
+SO_MARK has to be done before issuing the connect() call on the
+TCP socket.
+---
+ src/forward.c | 36 ++++++++++++++++++------------------
+ 1 file changed, 18 insertions(+), 18 deletions(-)
+
+diff --git a/src/forward.c b/src/forward.c
+index 4895efeba89a..2cf29eba6e26 100644
+--- a/src/forward.c
++++ b/src/forward.c
+@@ -1796,6 +1796,24 @@ unsigned char *tcp_request(int confd, time_t now,
+ if ((last_server->tcpfd = socket(last_server->addr.sa.sa_family, SOCK_STREAM, 0)) == -1)
+ continue;
+
++#ifdef HAVE_CONNTRACK
++ /* Copy connection mark of incoming query to outgoing connection. */
++ if (option_bool(OPT_CONNTRACK))
++ {
++ unsigned int mark;
++ struct all_addr local;
++#ifdef HAVE_IPV6
++ if (local_addr->sa.sa_family == AF_INET6)
++ local.addr.addr6 = local_addr->in6.sin6_addr;
++ else
++#endif
++ local.addr.addr4 = local_addr->in.sin_addr;
++
++ if (get_incoming_mark(&peer_addr, &local, 1, &mark))
++ setsockopt(last_server->tcpfd, SOL_SOCKET, SO_MARK, &mark, sizeof(unsigned int));
++ }
++#endif
++
+ if ((!local_bind(last_server->tcpfd, &last_server->source_addr, last_server->interface, 1) ||
+ connect(last_server->tcpfd, &last_server->addr.sa, sa_len(&last_server->addr)) == -1))
+ {
+@@ -1820,24 +1838,6 @@ unsigned char *tcp_request(int confd, time_t now,
+ size = new_size;
+ }
+ #endif
+-
+-#ifdef HAVE_CONNTRACK
+- /* Copy connection mark of incoming query to outgoing connection. */
+- if (option_bool(OPT_CONNTRACK))
+- {
+- unsigned int mark;
+- struct all_addr local;
+-#ifdef HAVE_IPV6
+- if (local_addr->sa.sa_family == AF_INET6)
+- local.addr.addr6 = local_addr->in6.sin6_addr;
+- else
+-#endif
+- local.addr.addr4 = local_addr->in.sin_addr;
+-
+- if (get_incoming_mark(&peer_addr, &local, 1, &mark))
+- setsockopt(last_server->tcpfd, SOL_SOCKET, SO_MARK, &mark, sizeof(unsigned int));
+- }
+-#endif
+ }
+
+ *length = htons(size);
+--
+2.1.0
+
--- /dev/null
+From 17b475912f6a4e72797a543dad59d4d5dde6bb1b Mon Sep 17 00:00:00 2001
+From: Daniel Collins <daniel.collins@smoothwall.net>
+Date: Fri, 3 Oct 2014 21:58:43 +0100
+Subject: [PATCH 05/55] Fix typo in new Dbus code.
+
+Simon's fault.
+---
+ src/dbus.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/dbus.c b/src/dbus.c
+index 15fed906bd90..a2a94dc85dac 100644
+--- a/src/dbus.c
++++ b/src/dbus.c
+@@ -426,7 +426,7 @@ static DBusMessage *dbus_set_bool(DBusMessage *message, int flag, char *name)
+ }
+ else
+ {
+- my_syslog(LOG_INFO, "Disabling --$s option from D-Bus", name);
++ my_syslog(LOG_INFO, "Disabling --%s option from D-Bus", name);
+ reset_option_bool(flag);
+ }
+
+--
+2.1.0
+
--- /dev/null
+From 3d9d2dd0018603a2ae4b9cd65ac6ff959f4fd8c7 Mon Sep 17 00:00:00 2001
+From: Tomas Hozza <thozza@redhat.com>
+Date: Mon, 6 Oct 2014 10:46:48 +0100
+Subject: [PATCH 06/55] Fit example conf file typo.
+
+---
+ dnsmasq.conf.example | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/dnsmasq.conf.example b/dnsmasq.conf.example
+index 6b00bd34fbb5..1bd305dbdbad 100644
+--- a/dnsmasq.conf.example
++++ b/dnsmasq.conf.example
+@@ -645,4 +645,4 @@
+ #conf-dir=/etc/dnsmasq.d,.bak
+
+ # Include all files in a directory which end in .conf
+-#conf-dir=/etc/dnsmasq.d/*.conf
++#conf-dir=/etc/dnsmasq.d/,*.conf
+--
+2.1.0
+
--- /dev/null
+From b9ff5c8f435173cfa616e3c398bdc089ef690a07 Mon Sep 17 00:00:00 2001
+From: Vladislav Grishenko <themiron@mail.ru>
+Date: Mon, 6 Oct 2014 14:34:24 +0100
+Subject: [PATCH 07/55] Improve RFC-compliance when unable to supply addresses
+ in DHCPv6
+
+While testing https://github.com/sbyx/odhcp6c client I have noticed it
+permanently crashes after startup.
+
+The reason was it (odhcp6c) doesn't expect empty IA options in ADVERTISE
+message without any suboptions.
+
+Despite this validation bug of odhcp6c, dnsmasq should not generate
+ADVERTISE messages with IA if there's nothing to advert per RFC 3315
+17.2.2:
+
+ If the server will not assign any addresses to any IAs in a
+
+ subsequent Request from the client, the server MUST send an Advertise
+
+ message to the client that includes only a Status Code option with
+
+ code NoAddrsAvail and a status message for the user, a Server
+
+ Identifier option with the server's DUID, and a Client Identifier
+
+ option with the client's DUID.
+
+Meanwhile it's need to add status code for every IA in REPLY message per
+RFC3315 18.2.1:
+
+ If the server cannot assign any addresses to an IA in the message
+ from the client, the server MUST include the IA in the Reply message
+ with no addresses in the IA and a Status Code option in the IA
+ containing status code NoAddrsAvail.
+
+So, I've changed the logic to skip IA completely from ADVERTISE messages and
+to add NoAddrsAvail subcode into IA of REPLY messages.
+
+As for overhead, yes, I believe it's ok to return NoAddrsAvail twice in IA
+and in global section for compatibility with all old and new clients.
+---
+ src/rfc3315.c | 27 +++++++++++++++++++++++++--
+ 1 file changed, 25 insertions(+), 2 deletions(-)
+
+diff --git a/src/rfc3315.c b/src/rfc3315.c
+index 5ebf09d50ac1..ddb390bf1136 100644
+--- a/src/rfc3315.c
++++ b/src/rfc3315.c
+@@ -691,6 +691,8 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
+ #endif
+
+ o = build_ia(state, &t1cntr);
++ if (address_assigned)
++ address_assigned = 2;
+
+ for (ia_counter = 0; ia_option; ia_counter++, ia_option = opt6_find(opt6_next(ia_option, ia_end), ia_end, OPTION6_IAADDR, 24))
+ {
+@@ -781,6 +783,27 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
+ address_assigned = 1;
+ }
+
++ if (address_assigned != 1)
++ {
++ /* If the server will not assign any addresses to any IAs in a
++ subsequent Request from the client, the server MUST send an Advertise
++ message to the client that doesn't include any IA options. */
++ if (!state->lease_allocate)
++ {
++ save_counter(o);
++ continue;
++ }
++
++ /* If the server cannot assign any addresses to an IA in the message
++ from the client, the server MUST include the IA in the Reply message
++ with no addresses in the IA and a Status Code option in the IA
++ containing status code NoAddrsAvail. */
++ o1 = new_opt6(OPTION6_STATUS_CODE);
++ put_opt6_short(DHCP6NOADDRS);
++ put_opt6_string(_("address unavailable"));
++ end_opt6(o1);
++ }
++
+ end_ia(t1cntr, min_time, 0);
+ end_opt6(o);
+ }
+@@ -806,7 +829,7 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
+ put_opt6_short(DHCP6NOADDRS);
+ put_opt6_string(_("no addresses available"));
+ end_opt6(o1);
+- log6_packet(state, "DHCPADVERTISE", NULL, _("no addresses available"));
++ log6_packet(state, state->lease_allocate ? "DHCPREPLY" : "DHCPADVERTISE", NULL, _("no addresses available"));
+ }
+
+ break;
+@@ -862,7 +885,7 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
+ {
+ /* Static range, not configured. */
+ o1 = new_opt6(OPTION6_STATUS_CODE);
+- put_opt6_short(DHCP6UNSPEC);
++ put_opt6_short(DHCP6NOADDRS);
+ put_opt6_string(_("address unavailable"));
+ end_opt6(o1);
+ }
+--
+2.1.0
+
--- /dev/null
+From 98906275a02ae260fe3f82133bd79054f8315f06 Mon Sep 17 00:00:00 2001
+From: Hans Dedecker <dedeckeh@gmail.com>
+Date: Tue, 9 Dec 2014 22:22:53 +0000
+Subject: [PATCH 08/55] Fix conntrack with --bind-interfaces
+
+Make sure dst_addr is assigned the correct address in receive_query when OPTNOWILD is
+enabled so the assigned mark can be correctly retrieved and set in forward_query when
+conntrack is enabled.
+
+Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
+---
+ src/forward.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/forward.c b/src/forward.c
+index 2cf29eba6e26..408a179a20f4 100644
+--- a/src/forward.c
++++ b/src/forward.c
+@@ -1048,7 +1048,7 @@ void receive_query(struct listener *listen, time_t now)
+ /* packet buffer overwritten */
+ daemon->srv_save = NULL;
+
+- dst_addr_4.s_addr = 0;
++ dst_addr_4.s_addr = dst_addr.addr.addr4.s_addr = 0;
+ netmask.s_addr = 0;
+
+ if (option_bool(OPT_NOWILD) && listen->iface)
+@@ -1057,7 +1057,7 @@ void receive_query(struct listener *listen, time_t now)
+
+ if (listen->family == AF_INET)
+ {
+- dst_addr_4 = listen->iface->addr.in.sin_addr;
++ dst_addr_4 = dst_addr.addr.addr4 = listen->iface->addr.in.sin_addr;
+ netmask = listen->iface->netmask;
+ }
+ }
+--
+2.1.0
+
--- /dev/null
+From 193de4abf59e49c6b70d54cfe9720fcb95ca2f71 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Wed, 10 Dec 2014 17:32:16 +0000
+Subject: [PATCH 09/55] Use inotify instead of polling on Linux.
+
+This should solve problems people are seeing when a file changes
+twice within a second and thus is missed for polling.
+---
+ Makefile | 2 +-
+ bld/Android.mk | 2 +-
+ src/dnsmasq.c | 25 ++++++++++++--
+ src/dnsmasq.h | 11 ++++++-
+ src/inotify.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 137 insertions(+), 5 deletions(-)
+ create mode 100644 src/inotify.c
+
+diff --git a/Makefile b/Makefile
+index 58a7975f60b5..c340f1c7b59a 100644
+--- a/Makefile
++++ b/Makefile
+@@ -69,7 +69,7 @@ objs = cache.o rfc1035.o util.o option.o forward.o network.o \
+ dnsmasq.o dhcp.o lease.o rfc2131.o netlink.o dbus.o bpf.o \
+ helper.o tftp.o log.o conntrack.o dhcp6.o rfc3315.o \
+ dhcp-common.o outpacket.o radv.o slaac.o auth.o ipset.o \
+- domain.o dnssec.o blockdata.o tables.o loop.o
++ domain.o dnssec.o blockdata.o tables.o loop.o inotify.o
+
+ hdrs = dnsmasq.h config.h dhcp-protocol.h dhcp6-protocol.h \
+ dns-protocol.h radv-protocol.h ip6addr.h
+diff --git a/bld/Android.mk b/bld/Android.mk
+index d855094eb264..d627796e8edc 100644
+--- a/bld/Android.mk
++++ b/bld/Android.mk
+@@ -10,7 +10,7 @@ LOCAL_SRC_FILES := bpf.c cache.c dbus.c dhcp.c dnsmasq.c \
+ dhcp6.c rfc3315.c dhcp-common.c outpacket.c \
+ radv.c slaac.c auth.c ipset.c domain.c \
+ dnssec.c dnssec-openssl.c blockdata.c tables.c \
+- loop.c
++ loop.c inotify.c
+
+ LOCAL_MODULE := dnsmasq
+
+diff --git a/src/dnsmasq.c b/src/dnsmasq.c
+index f4a89fc38183..bf2e25a55780 100644
+--- a/src/dnsmasq.c
++++ b/src/dnsmasq.c
+@@ -315,9 +315,15 @@ int main (int argc, char **argv)
+ if (daemon->port != 0)
+ {
+ cache_init();
++
+ #ifdef HAVE_DNSSEC
+ blockdata_init();
+ #endif
++
++#ifdef HAVE_LINUX_NETWORK
++ if (!option_bool(OPT_NO_POLL))
++ inotify_dnsmasq_init();
++#endif
+ }
+
+ if (option_bool(OPT_DBUS))
+@@ -793,6 +799,11 @@ int main (int argc, char **argv)
+
+ pid = getpid();
+
++#ifdef HAVE_LINUX_NETWORK
++ /* Using inotify, have to select a resolv file at startup */
++ poll_resolv(1, 0, now);
++#endif
++
+ while (1)
+ {
+ int maxfd = -1;
+@@ -862,11 +873,16 @@ int main (int argc, char **argv)
+ #if defined(HAVE_LINUX_NETWORK)
+ FD_SET(daemon->netlinkfd, &rset);
+ bump_maxfd(daemon->netlinkfd, &maxfd);
++ if (daemon->port != 0 && !option_bool(OPT_NO_POLL))
++ {
++ FD_SET(daemon->inotifyfd, &rset);
++ bump_maxfd(daemon->inotifyfd, &maxfd);
++ }
+ #elif defined(HAVE_BSD_NETWORK)
+ FD_SET(daemon->routefd, &rset);
+ bump_maxfd(daemon->routefd, &maxfd);
+ #endif
+-
++
+ FD_SET(piperead, &rset);
+ bump_maxfd(piperead, &maxfd);
+
+@@ -929,6 +945,10 @@ int main (int argc, char **argv)
+ route_sock();
+ #endif
+
++#ifdef HAVE_LINUX_NETWORK
++ if (daemon->port != 0 && !option_bool(OPT_NO_POLL) && FD_ISSET(daemon->inotifyfd, &rset) && inotify_check())
++ poll_resolv(1, 1, now);
++#else
+ /* Check for changes to resolv files once per second max. */
+ /* Don't go silent for long periods if the clock goes backwards. */
+ if (daemon->last_resolv == 0 ||
+@@ -941,7 +961,8 @@ int main (int argc, char **argv)
+ poll_resolv(0, daemon->last_resolv != 0, now);
+ daemon->last_resolv = now;
+ }
+-
++#endif
++
+ if (FD_ISSET(piperead, &rset))
+ async_event(piperead, now);
+
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index e74b15a5459a..ebb6b957812f 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -541,6 +541,10 @@ struct resolvc {
+ int is_default, logged;
+ time_t mtime;
+ char *name;
++#ifdef HAVE_LINUX_NETWORK
++ int wd; /* inotify watch descriptor */
++ char *file; /* pointer to file part if path */
++#endif
+ };
+
+ /* adn-hosts parms from command-line (also dhcp-hostsfile and dhcp-optsfile */
+@@ -998,7 +1002,7 @@ extern struct daemon {
+ /* DHCP state */
+ int dhcpfd, helperfd, pxefd;
+ #if defined(HAVE_LINUX_NETWORK)
+- int netlinkfd;
++ int netlinkfd, inotifyfd;
+ #elif defined(HAVE_BSD_NETWORK)
+ int dhcp_raw_fd, dhcp_icmp_fd, routefd;
+ #endif
+@@ -1469,3 +1473,8 @@ void loop_send_probes();
+ int detect_loop(char *query, int type);
+ #endif
+
++/* inotify.c */
++#ifdef HAVE_LINUX_NETWORK
++void inotify_dnsmasq_init();
++int inotify_check(void);
++#endif
+diff --git a/src/inotify.c b/src/inotify.c
+new file mode 100644
+index 000000000000..a0223443d6b6
+--- /dev/null
++++ b/src/inotify.c
+@@ -0,0 +1,102 @@
++/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; version 2 dated June, 1991, or
++ (at your option) version 3 dated 29 June, 2007.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program. If not, see <http://www.gnu.org/licenses/>.
++*/
++
++#include "dnsmasq.h"
++#include <sys/inotify.h>
++
++#ifdef HAVE_LINUX_NETWORK
++
++/* the strategy is to set a inotify on the directories containing
++ resolv files, for any files in the directory which are close-write
++ or moved into the directory.
++
++ When either of those happen, we look to see if the file involved
++ is actually a resolv-file, and if so, call poll-resolv with
++ the "force" argument, to ensure it's read.
++
++ This adds one new error condition: the directories containing
++ all specified resolv-files must exist at start-up, even if the actual
++ files don't.
++*/
++
++static char *inotify_buffer;
++#define INOTIFY_SZ (sizeof(struct inotify_event) + NAME_MAX + 1)
++
++void inotify_dnsmasq_init()
++{
++ struct resolvc *res;
++
++ inotify_buffer = safe_malloc(INOTIFY_SZ);
++
++ daemon->inotifyfd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC);
++
++ if (daemon->inotifyfd == -1)
++ die(_("failed to create inotify: %s"), NULL, EC_MISC);
++
++ for (res = daemon->resolv_files; res; res = res->next)
++ {
++ char *d = strrchr(res->name, '/');
++
++ if (!d)
++ die(_("resolv-file %s not an absolute path"), res->name, EC_MISC);
++
++ *d = 0; /* make ->name just directory */
++ res->wd = inotify_add_watch(daemon->inotifyfd, res->name, IN_CLOSE_WRITE | IN_MOVED_TO);
++ res->file = d+1; /* pointer to filename */
++
++ if (res->wd == -1 && errno == ENOENT)
++ die(_("directory %s for resolv-file is missing, cannot poll"), res->name, EC_MISC);
++
++ *d = '/'; /* restore name */
++
++ if (res->wd == -1)
++ die(_("failed to create inotify for %s: %s"), res->name, EC_MISC);
++ }
++}
++
++int inotify_check(void)
++{
++ int hit = 0;
++
++ while (1)
++ {
++ int rc;
++ char *p;
++ struct resolvc *res;
++ struct inotify_event *in;
++
++ while ((rc = read(daemon->inotifyfd, inotify_buffer, INOTIFY_SZ)) == -1 && errno == EINTR);
++
++ if (rc <= 0)
++ break;
++
++ for (p = inotify_buffer; rc - (p - inotify_buffer) >= (int)sizeof(struct inotify_event); p += sizeof(struct inotify_event) + in->len)
++ {
++ in = (struct inotify_event*)p;
++
++ for (res = daemon->resolv_files; res; res = res->next)
++ if (res->wd == in->wd && in->len != 0 && strcmp(res->file, in->name) == 0)
++ hit = 1;
++ }
++ }
++
++ return hit;
++}
++
++#endif
++
++
++
+--
+2.1.0
+
--- /dev/null
+From 857973e6f7e0a3d03535a9df7f9373fd7a0b65cc Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Mon, 15 Dec 2014 15:58:13 +0000
+Subject: [PATCH 10/55] Teach the new inotify code about symlinks.
+
+---
+ src/inotify.c | 43 +++++++++++++++++++++++++++----------------
+ 1 file changed, 27 insertions(+), 16 deletions(-)
+
+diff --git a/src/inotify.c b/src/inotify.c
+index a0223443d6b6..960bf5efb41f 100644
+--- a/src/inotify.c
++++ b/src/inotify.c
+@@ -41,29 +41,40 @@ void inotify_dnsmasq_init()
+
+ inotify_buffer = safe_malloc(INOTIFY_SZ);
+
+- daemon->inotifyfd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC);
+
++ daemon->inotifyfd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC);
++
+ if (daemon->inotifyfd == -1)
+ die(_("failed to create inotify: %s"), NULL, EC_MISC);
+-
++
+ for (res = daemon->resolv_files; res; res = res->next)
+ {
+- char *d = strrchr(res->name, '/');
+-
+- if (!d)
+- die(_("resolv-file %s not an absolute path"), res->name, EC_MISC);
+-
+- *d = 0; /* make ->name just directory */
+- res->wd = inotify_add_watch(daemon->inotifyfd, res->name, IN_CLOSE_WRITE | IN_MOVED_TO);
+- res->file = d+1; /* pointer to filename */
+-
+- if (res->wd == -1 && errno == ENOENT)
+- die(_("directory %s for resolv-file is missing, cannot poll"), res->name, EC_MISC);
++ char *d = NULL, *path;
+
+- *d = '/'; /* restore name */
++ if (!(path = realpath(res->name, NULL)))
++ {
++ /* realpath will fail if the file doesn't exist, but
++ dnsmasq copes with missing files, so fall back
++ and assume that symlinks are not in use in that case. */
++ if (errno == ENOENT)
++ path = res->name;
++ else
++ die(_("cannot cannonicalise resolv-file %s: %s"), res->name, EC_MISC);
++ }
+
+- if (res->wd == -1)
+- die(_("failed to create inotify for %s: %s"), res->name, EC_MISC);
++ if ((d = strrchr(path, '/')))
++ {
++ *d = 0; /* make path just directory */
++ res->wd = inotify_add_watch(daemon->inotifyfd, path, IN_CLOSE_WRITE | IN_MOVED_TO);
++ res->file = d+1; /* pointer to filename */
++ *d = '/';
++
++ if (res->wd == -1 && errno == ENOENT)
++ die(_("directory %s for resolv-file is missing, cannot poll"), res->name, EC_MISC);
++
++ if (res->wd == -1)
++ die(_("failed to create inotify for %s: %s"), res->name, EC_MISC);
++ }
+ }
+ }
+
+--
+2.1.0
+
--- /dev/null
+From 800c5cc1e7438818fd80f08c2d472df249a6942d Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Mon, 15 Dec 2014 17:50:15 +0000
+Subject: [PATCH 11/55] Remove floor on EDNS0 packet size with DNSSEC.
+
+---
+ CHANGELOG | 6 +++++-
+ src/dnsmasq.c | 5 -----
+ 2 files changed, 5 insertions(+), 6 deletions(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index 13ab41c05fc3..68252924e743 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -2,7 +2,11 @@ version 2.73
+ Fix crash at startup when an empty suffix is supplied to
+ --conf-dir, also trivial memory leak. Thanks to
+ Tomas Hozza for spotting this.
+-
++
++ Remove floor of 4096 on advertised EDNS0 packet size when
++ DNSSEC in use, the original rationale for this has long gone.
++ Thanks to Anders Kaseorg for spotting this.
++
+
+ version 2.72
+ Add ra-advrouter mode, for RFC-3775 mobile IPv6 support.
+diff --git a/src/dnsmasq.c b/src/dnsmasq.c
+index bf2e25a55780..5c7750d365fa 100644
+--- a/src/dnsmasq.c
++++ b/src/dnsmasq.c
+@@ -87,11 +87,6 @@ int main (int argc, char **argv)
+
+ if (daemon->edns_pktsz < PACKETSZ)
+ daemon->edns_pktsz = PACKETSZ;
+-#ifdef HAVE_DNSSEC
+- /* Enforce min packet big enough for DNSSEC */
+- if (option_bool(OPT_DNSSEC_VALID) && daemon->edns_pktsz < EDNS_PKTSZ)
+- daemon->edns_pktsz = EDNS_PKTSZ;
+-#endif
+
+ daemon->packet_buff_sz = daemon->edns_pktsz > DNSMASQ_PACKETSZ ?
+ daemon->edns_pktsz : DNSMASQ_PACKETSZ;
+--
+2.1.0
+
--- /dev/null
+From ad946d555dce44eb690c7699933b6ff40ab85bb6 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Mon, 15 Dec 2014 17:52:22 +0000
+Subject: [PATCH 12/55] CHANGELOG re. inotify.
+
+---
+ CHANGELOG | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index 68252924e743..9174b0bd75dc 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -7,6 +7,10 @@ version 2.73
+ DNSSEC in use, the original rationale for this has long gone.
+ Thanks to Anders Kaseorg for spotting this.
+
++ Use inotify for checking on updates to /etc/resolv.conf and
++ friends under Linux. This fixes race conditions when the files are
++ updated rapidly and saves CPU by noy polling.
++
+
+ version 2.72
+ Add ra-advrouter mode, for RFC-3775 mobile IPv6 support.
+--
+2.1.0
+
--- /dev/null
+From 3ad3f3bbd4ee716a7d2fb1e115cf89bd1b1a5de9 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Tue, 16 Dec 2014 18:25:17 +0000
+Subject: [PATCH 13/55] Fix breakage of --domain=<domain>,<subnet>,local
+
+---
+ CHANGELOG | 4 ++++
+ src/option.c | 18 ++++++++++++++++--
+ 2 files changed, 20 insertions(+), 2 deletions(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index 9174b0bd75dc..9e6c7aa4fd68 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -10,6 +10,10 @@ version 2.73
+ Use inotify for checking on updates to /etc/resolv.conf and
+ friends under Linux. This fixes race conditions when the files are
+ updated rapidly and saves CPU by noy polling.
++
++ Fix breakage of --domain=<domain>,<subnet>,local - only reverse
++ queries were intercepted. THis appears to have been broken
++ since 2.69. Thanks to Josh Stone for finding the bug.
+
+
+ version 2.72
+diff --git a/src/option.c b/src/option.c
+index b08e98e16f84..209fa6976609 100644
+--- a/src/option.c
++++ b/src/option.c
+@@ -1941,10 +1941,17 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
+ else
+ {
+ /* generate the equivalent of
+- local=/<domain>/
+ local=/xxx.yyy.zzz.in-addr.arpa/ */
+ struct server *serv = add_rev4(new->start, msize);
+ serv->flags |= SERV_NO_ADDR;
++
++ /* local=/<domain>/ */
++ serv = opt_malloc(sizeof(struct server));
++ memset(serv, 0, sizeof(struct server));
++ serv->domain = d;
++ serv->flags = SERV_HAS_DOMAIN | SERV_NO_ADDR;
++ serv->next = daemon->servers;
++ daemon->servers = serv;
+ }
+ }
+ }
+@@ -1978,10 +1985,17 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
+ else
+ {
+ /* generate the equivalent of
+- local=/<domain>/
+ local=/xxx.yyy.zzz.ip6.arpa/ */
+ struct server *serv = add_rev6(&new->start6, msize);
+ serv->flags |= SERV_NO_ADDR;
++
++ /* local=/<domain>/ */
++ serv = opt_malloc(sizeof(struct server));
++ memset(serv, 0, sizeof(struct server));
++ serv->domain = d;
++ serv->flags = SERV_HAS_DOMAIN | SERV_NO_ADDR;
++ serv->next = daemon->servers;
++ daemon->servers = serv;
+ }
+ }
+ }
+--
+2.1.0
+
--- /dev/null
+From bd9520b7ade7098ee423acc38965376aa57feb07 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Tue, 16 Dec 2014 20:41:29 +0000
+Subject: [PATCH 14/55] Remove redundant IN6_IS_ADDR_ULA(a) macro defn.
+
+---
+ src/network.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/src/network.c b/src/network.c
+index 5067007c5cbc..99419f57951e 100644
+--- a/src/network.c
++++ b/src/network.c
+@@ -16,10 +16,6 @@
+
+ #include "dnsmasq.h"
+
+-#ifndef IN6_IS_ADDR_ULA
+-#define IN6_IS_ADDR_ULA(a) ((((__const uint32_t *) (a))[0] & htonl (0xfe00000)) == htonl (0xfc000000))
+-#endif
+-
+ #ifdef HAVE_LINUX_NETWORK
+
+ int indextoname(int fd, int index, char *name)
+--
+2.1.0
+
--- /dev/null
+From 476693678e778886b64d0b56e27eb7695cbcca99 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Wed, 17 Dec 2014 12:41:56 +0000
+Subject: [PATCH 15/55] Eliminate IPv6 privacy addresses from --interface-name
+ answers.
+
+---
+ CHANGELOG | 5 +++++
+ src/auth.c | 4 ++++
+ src/dnsmasq.h | 1 +
+ src/network.c | 12 ++++++++----
+ src/rfc1035.c | 17 ++++++++++-------
+ 5 files changed, 28 insertions(+), 11 deletions(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index 9e6c7aa4fd68..01f5208ec006 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -14,6 +14,11 @@ version 2.73
+ Fix breakage of --domain=<domain>,<subnet>,local - only reverse
+ queries were intercepted. THis appears to have been broken
+ since 2.69. Thanks to Josh Stone for finding the bug.
++
++ Eliminate IPv6 privacy addresses and deprecated addresses from
++ the answers given by --interface-name. Note that reverse queries
++ (ie looking for names, given addresses) are not affected.
++ Thanks to Michael Gorbach for the suggestion.
+
+
+ version 2.72
+diff --git a/src/auth.c b/src/auth.c
+index dd46566ec2cc..a327f16d8c0b 100644
+--- a/src/auth.c
++++ b/src/auth.c
+@@ -363,6 +363,10 @@ size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t n
+ if (((addrlist->flags & ADDRLIST_IPV6) ? T_AAAA : T_A) == qtype &&
+ (local_query || filter_zone(zone, flag, &addrlist->addr)))
+ {
++#ifdef HAVE_IPV6
++ if (addrlist->flags & ADDRLIST_REVONLY)
++ continue;
++#endif
+ found = 1;
+ log_query(F_FORWARD | F_CONFIG | flag, name, &addrlist->addr, NULL);
+ if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index ebb6b957812f..1dd61c5edba3 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -318,6 +318,7 @@ struct ds_config {
+
+ #define ADDRLIST_LITERAL 1
+ #define ADDRLIST_IPV6 2
++#define ADDRLIST_REVONLY 4
+
+ struct addrlist {
+ struct all_addr addr;
+diff --git a/src/network.c b/src/network.c
+index 99419f57951e..14d2af2ce313 100644
+--- a/src/network.c
++++ b/src/network.c
+@@ -236,7 +236,7 @@ struct iface_param {
+ };
+
+ static int iface_allowed(struct iface_param *param, int if_index, char *label,
+- union mysockaddr *addr, struct in_addr netmask, int prefixlen, int dad)
++ union mysockaddr *addr, struct in_addr netmask, int prefixlen, int iface_flags)
+ {
+ struct irec *iface;
+ int mtu = 0, loopback;
+@@ -388,6 +388,10 @@ static int iface_allowed(struct iface_param *param, int if_index, char *label,
+ {
+ al->addr.addr.addr6 = addr->in6.sin6_addr;
+ al->flags = ADDRLIST_IPV6;
++ /* Privacy addresses and addresses still undergoing DAD and deprecated addresses
++ don't appear in forward queries, but will in reverse ones. */
++ if (!(iface_flags & IFACE_PERMANENT) || (iface_flags & (IFACE_DEPRECATED | IFACE_TENTATIVE)))
++ al->flags |= ADDRLIST_REVONLY;
+ }
+ #endif
+ }
+@@ -399,7 +403,7 @@ static int iface_allowed(struct iface_param *param, int if_index, char *label,
+ for (iface = daemon->interfaces; iface; iface = iface->next)
+ if (sockaddr_isequal(&iface->addr, addr))
+ {
+- iface->dad = dad;
++ iface->dad = !!(iface_flags & IFACE_TENTATIVE);
+ iface->found = 1; /* for garbage collection */
+ return 1;
+ }
+@@ -474,7 +478,7 @@ static int iface_allowed(struct iface_param *param, int if_index, char *label,
+ iface->dhcp_ok = dhcp_ok;
+ iface->dns_auth = auth_dns;
+ iface->mtu = mtu;
+- iface->dad = dad;
++ iface->dad = !!(iface_flags & IFACE_TENTATIVE);
+ iface->found = 1;
+ iface->done = iface->multicast_done = iface->warned = 0;
+ iface->index = if_index;
+@@ -519,7 +523,7 @@ static int iface_allowed_v6(struct in6_addr *local, int prefix,
+ else
+ addr.in6.sin6_scope_id = 0;
+
+- return iface_allowed((struct iface_param *)vparam, if_index, NULL, &addr, netmask, prefix, !!(flags & IFACE_TENTATIVE));
++ return iface_allowed((struct iface_param *)vparam, if_index, NULL, &addr, netmask, prefix, flags);
+ }
+ #endif
+
+diff --git a/src/rfc1035.c b/src/rfc1035.c
+index 8a7d2608dac5..bdeb3fb10e68 100644
+--- a/src/rfc1035.c
++++ b/src/rfc1035.c
+@@ -1923,14 +1923,17 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
+ for (intr = daemon->int_names; intr; intr = intr->next)
+ if (hostname_isequal(name, intr->name))
+ {
+- ans = 1;
+- if (!dryrun)
+- {
+-
+- for (addrlist = intr->addr; addrlist; addrlist = addrlist->next)
++ for (addrlist = intr->addr; addrlist; addrlist = addrlist->next)
+ #ifdef HAVE_IPV6
+- if (((addrlist->flags & ADDRLIST_IPV6) ? T_AAAA : T_A) == type)
++ if (((addrlist->flags & ADDRLIST_IPV6) ? T_AAAA : T_A) == type)
+ #endif
++ {
++#ifdef HAVE_IPV6
++ if (addrlist->flags & ADDRLIST_REVONLY)
++ continue;
++#endif
++ ans = 1;
++ if (!dryrun)
+ {
+ gotit = 1;
+ log_query(F_FORWARD | F_CONFIG | flag, name, &addrlist->addr, NULL);
+@@ -1939,7 +1942,7 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
+ type == T_A ? "4" : "6", &addrlist->addr))
+ anscount++;
+ }
+- }
++ }
+ }
+
+ if (!dryrun && !gotit)
+--
+2.1.0
+
--- /dev/null
+From 3267804598047bd1781cab91508d1bc516e5ddbb Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Wed, 17 Dec 2014 20:38:20 +0000
+Subject: [PATCH 16/55] Tweak field width in cache dump to avoid truncating
+ IPv6 addresses.
+
+---
+ src/cache.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/cache.c b/src/cache.c
+index 2c3a49887053..f9e1d31e8c99 100644
+--- a/src/cache.c
++++ b/src/cache.c
+@@ -1411,7 +1411,7 @@ void dump_cache(time_t now)
+ *a = 0;
+ if (strlen(n) == 0 && !(cache->flags & F_REVERSE))
+ n = "<Root>";
+- p += sprintf(p, "%-40.40s ", n);
++ p += sprintf(p, "%-30.30s ", n);
+ if ((cache->flags & F_CNAME) && !is_outdated_cname_pointer(cache))
+ a = cache_get_cname_target(cache);
+ #ifdef HAVE_DNSSEC
+@@ -1454,7 +1454,7 @@ void dump_cache(time_t now)
+ else if (cache->flags & F_DNSKEY)
+ t = "K";
+ #endif
+- p += sprintf(p, "%-30.30s %s%s%s%s%s%s%s%s%s ", a, t,
++ p += sprintf(p, "%-40.40s %s%s%s%s%s%s%s%s%s ", a, t,
+ cache->flags & F_FORWARD ? "F" : " ",
+ cache->flags & F_REVERSE ? "R" : " ",
+ cache->flags & F_IMMORTAL ? "I" : " ",
+--
+2.1.0
+
--- /dev/null
+From 094b5c3d904bae9aeb3206d9f3b8348926b84975 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sun, 21 Dec 2014 16:11:52 +0000
+Subject: [PATCH 17/55] Fix crash in DNSSEC code when attempting to verify
+ large RRs.
+
+---
+ CHANGELOG | 3 +++
+ src/dnssec.c | 27 +++++++++++++++++++--------
+ 2 files changed, 22 insertions(+), 8 deletions(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index 01f5208ec006..956b71a151db 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -19,6 +19,9 @@ version 2.73
+ the answers given by --interface-name. Note that reverse queries
+ (ie looking for names, given addresses) are not affected.
+ Thanks to Michael Gorbach for the suggestion.
++
++ Fix crash in DNSSEC code with long RRs. Thanks to Marco Davids
++ for the bug report.
+
+
+ version 2.72
+diff --git a/src/dnssec.c b/src/dnssec.c
+index 69bfc29e355f..3208ac701149 100644
+--- a/src/dnssec.c
++++ b/src/dnssec.c
+@@ -456,16 +456,27 @@ static u16 *get_desc(int type)
+
+ /* Return bytes of canonicalised rdata, when the return value is zero, the remaining
+ data, pointed to by *p, should be used raw. */
+-static int get_rdata(struct dns_header *header, size_t plen, unsigned char *end, char *buff,
++static int get_rdata(struct dns_header *header, size_t plen, unsigned char *end, char *buff, int bufflen,
+ unsigned char **p, u16 **desc)
+ {
+ int d = **desc;
+
+- (*desc)++;
+-
+ /* No more data needs mangling */
+ if (d == (u16)-1)
+- return 0;
++ {
++ /* If there's more data than we have space for, just return what fits,
++ we'll get called again for more chunks */
++ if (end - *p > bufflen)
++ {
++ memcpy(buff, *p, bufflen);
++ *p += bufflen;
++ return bufflen;
++ }
++
++ return 0;
++ }
++
++ (*desc)++;
+
+ if (d == 0 && extract_name(header, plen, p, buff, 1, 0))
+ /* domain-name, canonicalise */
+@@ -560,7 +571,7 @@ static void sort_rrset(struct dns_header *header, size_t plen, u16 *rr_desc, int
+ if (left1 != 0)
+ memmove(buff1, buff1 + len1 - left1, left1);
+
+- if ((len1 = get_rdata(header, plen, end1, buff1 + left1, &p1, &dp1)) == 0)
++ if ((len1 = get_rdata(header, plen, end1, buff1 + left1, MAXDNAME - left1, &p1, &dp1)) == 0)
+ {
+ quit = 1;
+ len1 = end1 - p1;
+@@ -571,7 +582,7 @@ static void sort_rrset(struct dns_header *header, size_t plen, u16 *rr_desc, int
+ if (left2 != 0)
+ memmove(buff2, buff2 + len2 - left2, left2);
+
+- if ((len2 = get_rdata(header, plen, end2, buff2 + left2, &p2, &dp2)) == 0)
++ if ((len2 = get_rdata(header, plen, end2, buff2 + left2, MAXDNAME - left2, &p2, &dp2)) == 0)
+ {
+ quit = 1;
+ len2 = end2 - p2;
+@@ -808,7 +819,7 @@ static int validate_rrset(time_t now, struct dns_header *header, size_t plen, in
+ /* canonicalise rdata and calculate length of same, use name buffer as workspace */
+ cp = p;
+ dp = rr_desc;
+- for (len = 0; (seg = get_rdata(header, plen, end, name, &cp, &dp)) != 0; len += seg);
++ for (len = 0; (seg = get_rdata(header, plen, end, name, MAXDNAME, &cp, &dp)) != 0; len += seg);
+ len += end - cp;
+ len = htons(len);
+ hash->update(ctx, 2, (unsigned char *)&len);
+@@ -816,7 +827,7 @@ static int validate_rrset(time_t now, struct dns_header *header, size_t plen, in
+ /* Now canonicalise again and digest. */
+ cp = p;
+ dp = rr_desc;
+- while ((seg = get_rdata(header, plen, end, name, &cp, &dp)))
++ while ((seg = get_rdata(header, plen, end, name, MAXDNAME, &cp, &dp)))
+ hash->update(ctx, seg, (unsigned char *)name);
+ if (cp != end)
+ hash->update(ctx, end - cp, cp);
+--
+2.1.0
+
--- /dev/null
+From cbc652423403e3cef00e00240f6beef713142246 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sun, 21 Dec 2014 21:21:53 +0000
+Subject: [PATCH 18/55] Make caching work for CNAMEs pointing to A/AAAA records
+ shadowed in /etc/hosts
+
+If the answer to an upstream query is a CNAME which points to an
+A/AAAA record which also exists in /etc/hosts and friends, then
+caching is suppressed, to avoid inconsistent answers. This is
+now modified to allow caching when the upstream and local A/AAAA
+records have the same value.
+---
+ src/cache.c | 34 +++++++++++++++++++++++++---------
+ 1 file changed, 25 insertions(+), 9 deletions(-)
+
+diff --git a/src/cache.c b/src/cache.c
+index f9e1d31e8c99..ff1ca6f1c352 100644
+--- a/src/cache.c
++++ b/src/cache.c
+@@ -322,7 +322,7 @@ static int is_expired(time_t now, struct crec *crecp)
+ return 1;
+ }
+
+-static int cache_scan_free(char *name, struct all_addr *addr, time_t now, unsigned short flags)
++static struct crec *cache_scan_free(char *name, struct all_addr *addr, time_t now, unsigned short flags)
+ {
+ /* Scan and remove old entries.
+ If (flags & F_FORWARD) then remove any forward entries for name and any expired
+@@ -331,8 +331,8 @@ static int cache_scan_free(char *name, struct all_addr *addr, time_t now, unsign
+ entries in the whole cache.
+ If (flags == 0) remove any expired entries in the whole cache.
+
+- In the flags & F_FORWARD case, the return code is valid, and returns zero if the
+- name exists in the cache as a HOSTS or DHCP entry (these are never deleted)
++ In the flags & F_FORWARD case, the return code is valid, and returns a non-NULL pointer
++ to a cache entry if the name exists in the cache as a HOSTS or DHCP entry (these are never deleted)
+
+ We take advantage of the fact that hash chains have stuff in the order <reverse>,<other>,<immortal>
+ so that when we hit an entry which isn't reverse and is immortal, we're done. */
+@@ -361,7 +361,7 @@ static int cache_scan_free(char *name, struct all_addr *addr, time_t now, unsign
+ (((crecp->flags | flags) & F_CNAME) && !(crecp->flags & (F_DNSKEY | F_DS))))
+ {
+ if (crecp->flags & (F_HOSTS | F_DHCP | F_CONFIG))
+- return 0;
++ return crecp;
+ *up = crecp->hash_next;
+ cache_unlink(crecp);
+ cache_free(crecp);
+@@ -378,7 +378,7 @@ static int cache_scan_free(char *name, struct all_addr *addr, time_t now, unsign
+ crecp->addr.sig.type_covered == addr->addr.dnssec.type))
+ {
+ if (crecp->flags & F_CONFIG)
+- return 0;
++ return crecp;
+ *up = crecp->hash_next;
+ cache_unlink(crecp);
+ cache_free(crecp);
+@@ -423,7 +423,7 @@ static int cache_scan_free(char *name, struct all_addr *addr, time_t now, unsign
+ up = &crecp->hash_next;
+ }
+
+- return 1;
++ return NULL;
+ }
+
+ /* Note: The normal calling sequence is
+@@ -471,10 +471,26 @@ struct crec *cache_insert(char *name, struct all_addr *addr,
+ return NULL;
+
+ /* First remove any expired entries and entries for the name/address we
+- are currently inserting. Fail if we attempt to delete a name from
+- /etc/hosts or DHCP. */
+- if (!cache_scan_free(name, addr, now, flags))
++ are currently inserting. */
++ if ((new = cache_scan_free(name, addr, now, flags)))
+ {
++ /* We're trying to insert a record over one from
++ /etc/hosts or DHCP, or other config. If the
++ existing record is for an A or AAAA and
++ the record we're trying to insert is the same,
++ just drop the insert, but don't error the whole process. */
++ if ((flags & (F_IPV4 | F_IPV6)) && (flags & F_FORWARD))
++ {
++ if ((flags & F_IPV4) && (new->flags & F_IPV4) &&
++ new->addr.addr.addr.addr4.s_addr == addr->addr.addr4.s_addr)
++ return new;
++#ifdef HAVE_IPV6
++ else if ((flags & F_IPV6) && (new->flags & F_IPV6) &&
++ IN6_ARE_ADDR_EQUAL(&new->addr.addr.addr.addr6, &addr->addr.addr6))
++ return new;
++#endif
++ }
++
+ insert_error = 1;
+ return NULL;
+ }
+--
+2.1.0
+
--- /dev/null
+From fbc5205702c7f6f431d9f1043c553d7fb62ddfdb Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Tue, 23 Dec 2014 15:46:08 +0000
+Subject: [PATCH 19/55] Fix problems validating NSEC3 and wildcards.
+
+---
+ src/dnssec.c | 253 ++++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 128 insertions(+), 125 deletions(-)
+
+diff --git a/src/dnssec.c b/src/dnssec.c
+index 3208ac701149..9350d3e8c963 100644
+--- a/src/dnssec.c
++++ b/src/dnssec.c
+@@ -615,6 +615,7 @@ static void sort_rrset(struct dns_header *header, size_t plen, u16 *rr_desc, int
+ Return code:
+ STAT_SECURE if it validates.
+ STAT_SECURE_WILDCARD if it validates and is the result of wildcard expansion.
++ (In this case *wildcard_out points to the "body" of the wildcard within name.)
+ STAT_NO_SIG no RRsigs found.
+ STAT_INSECURE RRset empty.
+ STAT_BOGUS signature is wrong, bad packet.
+@@ -625,8 +626,8 @@ static void sort_rrset(struct dns_header *header, size_t plen, u16 *rr_desc, int
+
+ name is unchanged on exit. keyname is used as workspace and trashed.
+ */
+-static int validate_rrset(time_t now, struct dns_header *header, size_t plen, int class,
+- int type, char *name, char *keyname, struct blockdata *key, int keylen, int algo_in, int keytag_in)
++static int validate_rrset(time_t now, struct dns_header *header, size_t plen, int class, int type,
++ char *name, char *keyname, char **wildcard_out, struct blockdata *key, int keylen, int algo_in, int keytag_in)
+ {
+ static unsigned char **rrset = NULL, **sigs = NULL;
+ static int rrset_sz = 0, sig_sz = 0;
+@@ -798,8 +799,16 @@ static int validate_rrset(time_t now, struct dns_header *header, size_t plen, in
+ {
+ int k;
+ for (k = name_labels - labels; k != 0; k--)
+- while (*name_start != '.' && *name_start != 0)
+- name_start++;
++ {
++ while (*name_start != '.' && *name_start != 0)
++ name_start++;
++ if (k != 1)
++ name_start++;
++ }
++
++ if (wildcard_out)
++ *wildcard_out = name_start+1;
++
+ name_start--;
+ *name_start = '*';
+ }
+@@ -974,7 +983,7 @@ int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, ch
+ if (recp1->addr.ds.keylen == (int)hash->digest_size &&
+ (ds_digest = blockdata_retrieve(recp1->addr.key.keydata, recp1->addr.ds.keylen, NULL)) &&
+ memcmp(ds_digest, digest, recp1->addr.ds.keylen) == 0 &&
+- validate_rrset(now, header, plen, class, T_DNSKEY, name, keyname, key, rdlen - 4, algo, keytag) == STAT_SECURE)
++ validate_rrset(now, header, plen, class, T_DNSKEY, name, keyname, NULL, key, rdlen - 4, algo, keytag) == STAT_SECURE)
+ {
+ valid = 1;
+ break;
+@@ -1443,11 +1452,88 @@ static int base32_decode(char *in, unsigned char *out)
+ return p - out;
+ }
+
++static int check_nsec3_coverage(struct dns_header *header, size_t plen, int digest_len, unsigned char *digest, int type,
++ char *workspace1, char *workspace2, unsigned char **nsecs, int nsec_count)
++{
++ int i, hash_len, salt_len, base32_len, rdlen;
++ unsigned char *p, *psave;
++
++ for (i = 0; i < nsec_count; i++)
++ if ((p = nsecs[i]))
++ {
++ if (!extract_name(header, plen, &p, workspace1, 1, 0) ||
++ !(base32_len = base32_decode(workspace1, (unsigned char *)workspace2)))
++ return 0;
++
++ p += 8; /* class, type, TTL */
++ GETSHORT(rdlen, p);
++ psave = p;
++ p += 4; /* algo, flags, iterations */
++ salt_len = *p++; /* salt_len */
++ p += salt_len; /* salt */
++ hash_len = *p++; /* p now points to next hashed name */
++
++ if (!CHECK_LEN(header, p, plen, hash_len))
++ return 0;
++
++ if (digest_len == base32_len && hash_len == base32_len)
++ {
++ int rc = memcmp(workspace2, digest, digest_len);
++
++ if (rc == 0)
++ {
++ /* We found an NSEC3 whose hashed name exactly matches the query, so
++ we just need to check the type map. p points to the RR data for the record. */
++
++ int offset = (type & 0xff) >> 3;
++ int mask = 0x80 >> (type & 0x07);
++
++ p += hash_len; /* skip next-domain hash */
++ rdlen -= p - psave;
++
++ if (!CHECK_LEN(header, p, plen, rdlen))
++ return 0;
++
++ while (rdlen >= 2)
++ {
++ if (p[0] == type >> 8)
++ {
++ /* Does the NSEC3 say our type exists? */
++ if (offset < p[1] && (p[offset+2] & mask) != 0)
++ return STAT_BOGUS;
++
++ break; /* finshed checking */
++ }
++
++ rdlen -= p[1];
++ p += p[1];
++ }
++
++ return 1;
++ }
++ else if (rc <= 0)
++ {
++ /* Normal case, hash falls between NSEC3 name-hash and next domain name-hash,
++ wrap around case, name-hash falls between NSEC3 name-hash and end */
++ if (memcmp(p, digest, digest_len) > 0 || memcmp(workspace2, p, digest_len) > 0)
++ return 1;
++ }
++ else
++ {
++ /* wrap around case, name falls between start and next domain name */
++ if (memcmp(workspace2, p, digest_len) > 0 && memcmp(p, digest, digest_len) > 0)
++ return 1;
++ }
++ }
++ }
++ return 0;
++}
++
+ static int prove_non_existence_nsec3(struct dns_header *header, size_t plen, unsigned char **nsecs, int nsec_count,
+- char *workspace1, char *workspace2, char *name, int type)
++ char *workspace1, char *workspace2, char *name, int type, char *wildname)
+ {
+ unsigned char *salt, *p, *digest;
+- int digest_len, i, iterations, salt_len, hash_len, base32_len, algo = 0;
++ int digest_len, i, iterations, salt_len, base32_len, algo = 0;
+ struct nettle_hash const *hash;
+ char *closest_encloser, *next_closest, *wildcard;
+
+@@ -1520,7 +1606,14 @@ static int prove_non_existence_nsec3(struct dns_header *header, size_t plen, uns
+ if (!(hash = hash_find("sha1")))
+ return STAT_BOGUS;
+
+- /* Now, we need the "closest encloser NSEC3" */
++ if ((digest_len = hash_name(name, &digest, hash, salt, salt_len, iterations)) == 0)
++ return STAT_BOGUS;
++
++ if (check_nsec3_coverage(header, plen, digest_len, digest, type, workspace1, workspace2, nsecs, nsec_count))
++ return STAT_SECURE;
++
++ /* Can't find an NSEC3 which covers the name directly, we need the "closest encloser NSEC3"
++ or an answer inferred from a wildcard record. */
+ closest_encloser = name;
+ next_closest = NULL;
+
+@@ -1529,6 +1622,9 @@ static int prove_non_existence_nsec3(struct dns_header *header, size_t plen, uns
+ if (*closest_encloser == '.')
+ closest_encloser++;
+
++ if (wildname && hostname_isequal(closest_encloser, wildname))
++ break;
++
+ if ((digest_len = hash_name(closest_encloser, &digest, hash, salt, salt_len, iterations)) == 0)
+ return STAT_BOGUS;
+
+@@ -1551,127 +1647,33 @@ static int prove_non_existence_nsec3(struct dns_header *header, size_t plen, uns
+ }
+ while ((closest_encloser = strchr(closest_encloser, '.')));
+
+- /* No usable NSEC3s */
+- if (i == nsec_count)
++ if (!closest_encloser)
+ return STAT_BOGUS;
+
+- if (!next_closest)
+- {
+- /* We found an NSEC3 whose hashed name exactly matches the query, so
+- Now we just need to check the type map. p points to the RR data for the record. */
+- int rdlen;
+- unsigned char *psave;
+- int offset = (type & 0xff) >> 3;
+- int mask = 0x80 >> (type & 0x07);
+-
+- p += 8; /* class, type, TTL */
+- GETSHORT(rdlen, p);
+- psave = p;
+- p += 5 + salt_len; /* algo, flags, iterations, salt_len, salt */
+- hash_len = *p++;
+- if (!CHECK_LEN(header, p, plen, hash_len))
+- return STAT_BOGUS; /* bad packet */
+- p += hash_len;
+- rdlen -= p - psave;
+-
+- while (rdlen >= 2)
+- {
+- if (!CHECK_LEN(header, p, plen, rdlen))
+- return STAT_BOGUS;
+-
+- if (p[0] == type >> 8)
+- {
+- /* Does the NSEC3 say our type exists? */
+- if (offset < p[1] && (p[offset+2] & mask) != 0)
+- return STAT_BOGUS;
+-
+- break; /* finshed checking */
+- }
+-
+- rdlen -= p[1];
+- p += p[1];
+- }
+-
+- return STAT_SECURE;
+- }
+-
+ /* Look for NSEC3 that proves the non-existence of the next-closest encloser */
+ if ((digest_len = hash_name(next_closest, &digest, hash, salt, salt_len, iterations)) == 0)
+ return STAT_BOGUS;
+
+- for (i = 0; i < nsec_count; i++)
+- if ((p = nsecs[i]))
+- {
+- if (!extract_name(header, plen, &p, workspace1, 1, 0) ||
+- !(base32_len = base32_decode(workspace1, (unsigned char *)workspace2)))
+- return STAT_BOGUS;
+-
+- p += 15 + salt_len; /* class, type, TTL, rdlen, algo, flags, iterations, salt_len, salt */
+- hash_len = *p++; /* p now points to next hashed name */
+-
+- if (!CHECK_LEN(header, p, plen, hash_len))
+- return STAT_BOGUS;
+-
+- if (digest_len == base32_len && hash_len == base32_len)
+- {
+- if (memcmp(workspace2, digest, digest_len) <= 0)
+- {
+- /* Normal case, hash falls between NSEC3 name-hash and next domain name-hash,
+- wrap around case, name-hash falls between NSEC3 name-hash and end */
+- if (memcmp(p, digest, digest_len) > 0 || memcmp(workspace2, p, digest_len) > 0)
+- return STAT_SECURE;
+- }
+- else
+- {
+- /* wrap around case, name falls between start and next domain name */
+- if (memcmp(workspace2, p, digest_len) > 0 && memcmp(p, digest, digest_len) > 0)
+- return STAT_SECURE;
+- }
+- }
+- }
+-
+- /* Finally, check that there's no seat of wildcard synthesis */
+- if (!(wildcard = strchr(next_closest, '.')) || wildcard == next_closest)
+- return STAT_BOGUS;
+-
+- wildcard--;
+- *wildcard = '*';
+-
+- if ((digest_len = hash_name(wildcard, &digest, hash, salt, salt_len, iterations)) == 0)
++ if (!check_nsec3_coverage(header, plen, digest_len, digest, type, workspace1, workspace2, nsecs, nsec_count))
+ return STAT_BOGUS;
+
+- for (i = 0; i < nsec_count; i++)
+- if ((p = nsecs[i]))
+- {
+- if (!extract_name(header, plen, &p, workspace1, 1, 0) ||
+- !(base32_len = base32_decode(workspace1, (unsigned char *)workspace2)))
+- return STAT_BOGUS;
+-
+- p += 15 + salt_len; /* class, type, TTL, rdlen, algo, flags, iterations, salt_len, salt */
+- hash_len = *p++; /* p now points to next hashed name */
+-
+- if (!CHECK_LEN(header, p, plen, hash_len))
+- return STAT_BOGUS;
+-
+- if (digest_len == base32_len && hash_len == base32_len)
+- {
+- if (memcmp(workspace2, digest, digest_len) <= 0)
+- {
+- /* Normal case, hash falls between NSEC3 name-hash and next domain name-hash,
+- wrap around case, name-hash falls between NSEC3 name-hash and end */
+- if (memcmp(p, digest, digest_len) > 0 || memcmp(workspace2, p, digest_len) > 0)
+- return STAT_SECURE;
+- }
+- else
+- {
+- /* wrap around case, name falls between start and next domain name */
+- if (memcmp(workspace2, p, digest_len) > 0 && memcmp(p, digest, digest_len) > 0)
+- return STAT_SECURE;
+- }
+- }
+- }
++ /* Finally, check that there's no seat of wildcard synthesis */
++ if (!wildname)
++ {
++ if (!(wildcard = strchr(next_closest, '.')) || wildcard == next_closest)
++ return STAT_BOGUS;
++
++ wildcard--;
++ *wildcard = '*';
++
++ if ((digest_len = hash_name(wildcard, &digest, hash, salt, salt_len, iterations)) == 0)
++ return STAT_BOGUS;
++
++ if (!check_nsec3_coverage(header, plen, digest_len, digest, type, workspace1, workspace2, nsecs, nsec_count))
++ return STAT_BOGUS;
++ }
+
+- return STAT_BOGUS;
++ return STAT_SECURE;
+ }
+
+ /* Validate all the RRsets in the answer and authority sections of the reply (4035:3.2.3) */
+@@ -1792,8 +1794,9 @@ int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, ch
+ struct all_addr a;
+ struct blockdata *key;
+ struct crec *crecp;
+-
+- rc = validate_rrset(now, header, plen, class1, type1, name, keyname, NULL, 0, 0, 0);
++ char *wildname;
++
++ rc = validate_rrset(now, header, plen, class1, type1, name, keyname, &wildname, NULL, 0, 0, 0);
+
+ if (rc == STAT_SECURE_WILDCARD)
+ {
+@@ -1807,7 +1810,7 @@ int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, ch
+ if (nsec_type == T_NSEC)
+ rc = prove_non_existence_nsec(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, type1);
+ else
+- rc = prove_non_existence_nsec3(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, type1);
++ rc = prove_non_existence_nsec3(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, type1, wildname);
+
+ if (rc != STAT_SECURE)
+ return rc;
+@@ -1933,7 +1936,7 @@ int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, ch
+ if (nsec_type == T_NSEC)
+ return prove_non_existence_nsec(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, qtype);
+ else
+- return prove_non_existence_nsec3(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, qtype);
++ return prove_non_existence_nsec3(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, qtype, NULL);
+ }
+
+ /* Chase the CNAME chain in the packet until the first record which _doesn't validate.
+@@ -1980,7 +1983,7 @@ int dnssec_chase_cname(time_t now, struct dns_header *header, size_t plen, char
+ return STAT_INSECURE;
+
+ /* validate CNAME chain, return if insecure or need more data */
+- rc = validate_rrset(now, header, plen, class, type, name, keyname, NULL, 0, 0, 0);
++ rc = validate_rrset(now, header, plen, class, type, name, keyname, NULL, NULL, 0, 0, 0);
+ if (rc != STAT_SECURE)
+ {
+ if (rc == STAT_NO_SIG)
+--
+2.1.0
+
--- /dev/null
+From 83d2ed09fc0216b567d7fb2197e4ff3eae150b0d Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Tue, 23 Dec 2014 18:42:38 +0000
+Subject: [PATCH 20/55] Initialise return value.
+
+---
+ src/dnssec.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/src/dnssec.c b/src/dnssec.c
+index 9350d3e8c963..ed8cf893bad2 100644
+--- a/src/dnssec.c
++++ b/src/dnssec.c
+@@ -637,10 +637,13 @@ static int validate_rrset(time_t now, struct dns_header *header, size_t plen, in
+ struct crec *crecp = NULL;
+ int type_covered, algo, labels, orig_ttl, sig_expiration, sig_inception, key_tag;
+ u16 *rr_desc = get_desc(type);
+-
++
++ if (wildcard_out)
++ *wildcard_out = NULL;
++
+ if (!(p = skip_questions(header, plen)))
+ return STAT_BOGUS;
+-
++
+ name_labels = count_labels(name); /* For 4035 5.3.2 check */
+
+ /* look for RRSIGs for this RRset and get pointers to each RR in the set. */
+--
+2.1.0
+
--- /dev/null
+From 32fc6dbe03569d70dd394420ceb73532cf303c33 Mon Sep 17 00:00:00 2001
+From: Glen Huang <curvedmark@gmail.com>
+Date: Sat, 27 Dec 2014 15:28:12 +0000
+Subject: [PATCH 21/55] Add --ignore-address option.
+
+---
+ CHANGELOG | 8 ++++++++
+ man/dnsmasq.8 | 6 ++++++
+ src/dnsmasq.h | 3 ++-
+ src/forward.c | 4 ++++
+ src/option.c | 18 +++++++++++++++---
+ src/rfc1035.c | 37 +++++++++++++++++++++++++++++++++++++
+ 6 files changed, 72 insertions(+), 4 deletions(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index 956b71a151db..2b6356bcfb02 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -22,6 +22,14 @@ version 2.73
+
+ Fix crash in DNSSEC code with long RRs. Thanks to Marco Davids
+ for the bug report.
++
++ Add --ignore-address option. Ignore replies to A-record
++ queries which include the specified address. No error is
++ generated, dnsmasq simply continues to listen for another
++ reply. This is useful to defeat blocking strategies which
++ rely on quickly supplying a forged answer to a DNS
++ request for certain domains, before the correct answer can
++ arrive. Thanks to Glen Huang for the patch.
+
+
+ version 2.72
+diff --git a/man/dnsmasq.8 b/man/dnsmasq.8
+index 0b8e04f0a897..4236ba307df3 100644
+--- a/man/dnsmasq.8
++++ b/man/dnsmasq.8
+@@ -293,6 +293,12 @@ an advertising web page in response to queries for unregistered names,
+ instead of the correct NXDOMAIN response. This option tells dnsmasq to
+ fake the correct response when it sees this behaviour. As at Sept 2003
+ the IP address being returned by Verisign is 64.94.110.11
++.TP
++.B \-B, --ignore-address=<ipaddr>
++Ignore replies to A-record queries which include the specified address.
++No error is generated, dnsmasq simply continues to listen for another reply.
++This is useful to defeat blocking strategies which rely on quickly supplying a
++forged answer to a DNS request for certain domain, before the correct answer can arrive.
+ .TP
+ .B \-f, --filterwin2k
+ Later versions of windows make periodic DNS requests which don't get sensible answers from
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index 1dd61c5edba3..7bc982ddf73c 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -930,7 +930,7 @@ extern struct daemon {
+ char *runfile;
+ char *lease_change_command;
+ struct iname *if_names, *if_addrs, *if_except, *dhcp_except, *auth_peers, *tftp_interfaces;
+- struct bogus_addr *bogus_addr;
++ struct bogus_addr *bogus_addr, *ignore_addr;
+ struct server *servers;
+ struct ipsets *ipsets;
+ int log_fac; /* log facility */
+@@ -1093,6 +1093,7 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
+ time_t now, int *ad_reqd, int *do_bit);
+ int check_for_bogus_wildcard(struct dns_header *header, size_t qlen, char *name,
+ struct bogus_addr *addr, time_t now);
++int check_for_ignored_address(struct dns_header *header, size_t qlen, struct bogus_addr *baddr);
+ unsigned char *find_pseudoheader(struct dns_header *header, size_t plen,
+ size_t *len, unsigned char **p, int *is_sign);
+ int check_for_local_domain(char *name, time_t now);
+diff --git a/src/forward.c b/src/forward.c
+index 408a179a20f4..f28c7d51f708 100644
+--- a/src/forward.c
++++ b/src/forward.c
+@@ -724,6 +724,10 @@ void reply_query(int fd, int family, time_t now)
+ if (!(forward = lookup_frec(ntohs(header->id), hash)))
+ return;
+
++ if (daemon->ignore_addr && RCODE(header) == NOERROR &&
++ check_for_ignored_address(header, n, daemon->ignore_addr))
++ return;
++
+ if ((RCODE(header) == SERVFAIL || RCODE(header) == REFUSED) &&
+ !option_bool(OPT_ORDER) &&
+ forward->forwardall == 0)
+diff --git a/src/option.c b/src/option.c
+index 209fa6976609..907d0cf88de9 100644
+--- a/src/option.c
++++ b/src/option.c
+@@ -147,6 +147,7 @@ struct myoption {
+ #define LOPT_LOCAL_SERVICE 335
+ #define LOPT_DNSSEC_TIME 336
+ #define LOPT_LOOP_DETECT 337
++#define LOPT_IGNORE_ADDR 338
+
+ #ifdef HAVE_GETOPT_LONG
+ static const struct option opts[] =
+@@ -181,6 +182,7 @@ static const struct myoption opts[] =
+ { "local-service", 0, 0, LOPT_LOCAL_SERVICE },
+ { "bogus-priv", 0, 0, 'b' },
+ { "bogus-nxdomain", 1, 0, 'B' },
++ { "ignore-address", 1, 0, LOPT_IGNORE_ADDR },
+ { "selfmx", 0, 0, 'e' },
+ { "filterwin2k", 0, 0, 'f' },
+ { "pid-file", 2, 0, 'x' },
+@@ -457,6 +459,7 @@ static struct {
+ { LOPT_QUIET_RA, OPT_QUIET_RA, NULL, gettext_noop("Do not log RA."), NULL },
+ { LOPT_LOCAL_SERVICE, OPT_LOCAL_SERVICE, NULL, gettext_noop("Accept queries only from directly-connected networks"), NULL },
+ { LOPT_LOOP_DETECT, OPT_LOOP_DETECT, NULL, gettext_noop("Detect and remove DNS forwarding loops"), NULL },
++ { LOPT_IGNORE_ADDR, ARG_DUP, "<ipaddr>", gettext_noop("Ignore DNS responses containing ipaddr."), NULL },
+ { 0, 0, NULL, NULL, NULL }
+ };
+
+@@ -2119,14 +2122,23 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
+ break;
+
+ case 'B': /* --bogus-nxdomain */
+- {
++ case LOPT_IGNORE_ADDR: /* --ignore-address */
++ {
+ struct in_addr addr;
+ unhide_metas(arg);
+ if (arg && (inet_pton(AF_INET, arg, &addr) > 0))
+ {
+ struct bogus_addr *baddr = opt_malloc(sizeof(struct bogus_addr));
+- baddr->next = daemon->bogus_addr;
+- daemon->bogus_addr = baddr;
++ if (option == 'B')
++ {
++ baddr->next = daemon->bogus_addr;
++ daemon->bogus_addr = baddr;
++ }
++ else
++ {
++ baddr->next = daemon->ignore_addr;
++ daemon->ignore_addr = baddr;
++ }
+ baddr->addr = addr;
+ }
+ else
+diff --git a/src/rfc1035.c b/src/rfc1035.c
+index bdeb3fb10e68..75c4266b47dd 100644
+--- a/src/rfc1035.c
++++ b/src/rfc1035.c
+@@ -1328,6 +1328,43 @@ int check_for_bogus_wildcard(struct dns_header *header, size_t qlen, char *name,
+ return 0;
+ }
+
++int check_for_ignored_address(struct dns_header *header, size_t qlen, struct bogus_addr *baddr)
++{
++ unsigned char *p;
++ int i, qtype, qclass, rdlen;
++ struct bogus_addr *baddrp;
++
++ /* skip over questions */
++ if (!(p = skip_questions(header, qlen)))
++ return 0; /* bad packet */
++
++ for (i = ntohs(header->ancount); i != 0; i--)
++ {
++ if (!(p = skip_name(p, header, qlen, 10)))
++ return 0; /* bad packet */
++
++ GETSHORT(qtype, p);
++ GETSHORT(qclass, p);
++ p += 4; /* TTL */
++ GETSHORT(rdlen, p);
++
++ if (qclass == C_IN && qtype == T_A)
++ {
++ if (!CHECK_LEN(header, p, qlen, INADDRSZ))
++ return 0;
++
++ for (baddrp = baddr; baddrp; baddrp = baddrp->next)
++ if (memcmp(&baddrp->addr, p, INADDRSZ) == 0)
++ return 1;
++ }
++
++ if (!ADD_RDLEN(header, p, qlen, rdlen))
++ return 0;
++ }
++
++ return 0;
++}
++
+ int add_resource_record(struct dns_header *header, char *limit, int *truncp, int nameoffset, unsigned char **pp,
+ unsigned long ttl, int *offset, unsigned short type, unsigned short class, char *format, ...)
+ {
+--
+2.1.0
+
--- /dev/null
+From 0b1008d367d44e77352134a4c5178f896f0db3e7 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sat, 27 Dec 2014 15:33:32 +0000
+Subject: [PATCH 22/55] Bad packet protection.
+
+---
+ src/dnssec.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/dnssec.c b/src/dnssec.c
+index ed8cf893bad2..026794b077e5 100644
+--- a/src/dnssec.c
++++ b/src/dnssec.c
+@@ -805,7 +805,7 @@ static int validate_rrset(time_t now, struct dns_header *header, size_t plen, in
+ {
+ while (*name_start != '.' && *name_start != 0)
+ name_start++;
+- if (k != 1)
++ if (k != 1 && *name_start == '.')
+ name_start++;
+ }
+
+--
+2.1.0
+
--- /dev/null
+From d310ab7ecbffce79d3d90debba621e0222f9bced Mon Sep 17 00:00:00 2001
+From: Matthias Andree <matthias.andree@gmx.de>
+Date: Sat, 27 Dec 2014 15:36:38 +0000
+Subject: [PATCH 23/55] Fix build failure in new inotify code on BSD.
+
+---
+ src/inotify.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/inotify.c b/src/inotify.c
+index 960bf5efb41f..83730008c11b 100644
+--- a/src/inotify.c
++++ b/src/inotify.c
+@@ -15,10 +15,10 @@
+ */
+
+ #include "dnsmasq.h"
+-#include <sys/inotify.h>
+-
+ #ifdef HAVE_LINUX_NETWORK
+
++#include <sys/inotify.h>
++
+ /* the strategy is to set a inotify on the directories containing
+ resolv files, for any files in the directory which are close-write
+ or moved into the directory.
+--
+2.1.0
+
--- /dev/null
+From 81c538efcebfce2ce4a1d3a420b6c885b8f08df9 Mon Sep 17 00:00:00 2001
+From: Yousong Zhou <yszhou4tech@gmail.com>
+Date: Sat, 3 Jan 2015 16:36:14 +0000
+Subject: [PATCH 24/55] Implement makefile dependencies on COPTS variable.
+
+---
+ .gitignore | 2 +-
+ Makefile | 10 ++++++----
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/.gitignore b/.gitignore
+index fcdbcbd135ae..23f11488ab4c 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -3,7 +3,7 @@ src/*.mo
+ src/dnsmasq.pot
+ src/dnsmasq
+ src/dnsmasq_baseline
+-src/.configured
++src/.copts_*
+ contrib/wrt/dhcp_lease_time
+ contrib/wrt/dhcp_release
+ debian/base/
+diff --git a/Makefile b/Makefile
+index c340f1c7b59a..5675f60c2036 100644
+--- a/Makefile
++++ b/Makefile
+@@ -64,6 +64,8 @@ nettle_libs = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_DNSSEC $(PKG_CONFIG
+ gmp_libs = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_DNSSEC NO_GMP --copy -lgmp`
+ sunos_libs = `if uname | grep SunOS >/dev/null 2>&1; then echo -lsocket -lnsl -lposix4; fi`
+ version = -DVERSION='\"`$(top)/bld/get-version $(top)`\"'
++copts_conf = .copts_$(shell $(CC) -DDNSMASQ_COMPILE_OPTS $(COPTS) -E $(top)/$(SRC)/dnsmasq.h | \
++ ( md5sum 2>/dev/null || md5 ) | cut -f 1 -d ' ')
+
+ objs = cache.o rfc1035.o util.o option.o forward.o network.o \
+ dnsmasq.o dhcp.o lease.o rfc2131.o netlink.o dbus.o bpf.o \
+@@ -83,7 +85,7 @@ all : $(BUILDDIR)
+
+ mostly_clean :
+ rm -f $(BUILDDIR)/*.mo $(BUILDDIR)/*.pot
+- rm -f $(BUILDDIR)/.configured $(BUILDDIR)/*.o $(BUILDDIR)/dnsmasq.a $(BUILDDIR)/dnsmasq
++ rm -f $(BUILDDIR)/.copts_* $(BUILDDIR)/*.o $(BUILDDIR)/dnsmasq.a $(BUILDDIR)/dnsmasq
+
+ clean : mostly_clean
+ rm -f $(BUILDDIR)/dnsmasq_baseline
+@@ -139,8 +141,8 @@ bloatcheck : $(BUILDDIR)/dnsmasq_baseline mostly_clean all
+
+ # rules below are targets in recusive makes with cwd=$(BUILDDIR)
+
+-.configured: $(hdrs)
+- @rm -f *.o
++$(copts_conf): $(hdrs)
++ @rm -f *.o .copts_*
+ @touch $@
+
+ $(objs:.o=.c) $(hdrs):
+@@ -149,7 +151,7 @@ $(objs:.o=.c) $(hdrs):
+ .c.o:
+ $(CC) $(CFLAGS) $(COPTS) $(i18n) $(build_cflags) $(RPM_OPT_FLAGS) -c $<
+
+-dnsmasq : .configured $(hdrs) $(objs)
++dnsmasq : $(copts_conf) $(hdrs) $(objs)
+ $(CC) $(LDFLAGS) -o $@ $(objs) $(build_libs) $(LIBS)
+
+ dnsmasq.pot : $(objs:.o=.c) $(hdrs)
+--
+2.1.0
+
--- /dev/null
+From d8dbd903d024f84a149dac2f8a674a68dfed47a3 Mon Sep 17 00:00:00 2001
+From: Yousong Zhou <yszhou4tech@gmail.com>
+Date: Mon, 5 Jan 2015 17:03:35 +0000
+Subject: [PATCH 25/55] Fix race condition issue in makefile.
+
+---
+ Makefile | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index 5675f60c2036..bcbd5571671d 100644
+--- a/Makefile
++++ b/Makefile
+@@ -148,10 +148,12 @@ $(copts_conf): $(hdrs)
+ $(objs:.o=.c) $(hdrs):
+ ln -s $(top)/$(SRC)/$@ .
+
++$(objs): $(copts_conf) $(hdrs)
++
+ .c.o:
+ $(CC) $(CFLAGS) $(COPTS) $(i18n) $(build_cflags) $(RPM_OPT_FLAGS) -c $<
+
+-dnsmasq : $(copts_conf) $(hdrs) $(objs)
++dnsmasq : $(objs)
+ $(CC) $(LDFLAGS) -o $@ $(objs) $(build_libs) $(LIBS)
+
+ dnsmasq.pot : $(objs:.o=.c) $(hdrs)
+--
+2.1.0
+
--- /dev/null
+From 97e618a0e3f29465acc689d87288596b006f197e Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Wed, 7 Jan 2015 21:55:43 +0000
+Subject: [PATCH 26/55] DNSSEC: do top-down search for limit of secure
+ delegation.
+
+---
+ CHANGELOG | 9 ++
+ src/dnsmasq.h | 11 +-
+ src/dnssec.c | 91 +++++++++-------
+ src/forward.c | 327 +++++++++++++++++++++++++++++++++-------------------------
+ 4 files changed, 260 insertions(+), 178 deletions(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index 2b6356bcfb02..e8bf80f81baa 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -31,7 +31,16 @@ version 2.73
+ request for certain domains, before the correct answer can
+ arrive. Thanks to Glen Huang for the patch.
+
++ Revisit the part of DNSSEC validation which determines if an
++ unsigned answer is legit, or is in some part of the DNS
++ tree which should be signed. Dnsmasq now works from the
++ DNS root downward looking for the limit of signed
++ delegations, rather than working bottom up. This is
++ both more correct, and less likely to trip over broken
++ nameservers in the unsigned parts of the DNS tree
++ which don't respond well to DNSSEC queries.
+
++
+ version 2.72
+ Add ra-advrouter mode, for RFC-3775 mobile IPv6 support.
+
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index 7bc982ddf73c..2f4597294a56 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -569,8 +569,9 @@ struct hostsfile {
+ #define STAT_SECURE_WILDCARD 7
+ #define STAT_NO_SIG 8
+ #define STAT_NO_DS 9
+-#define STAT_NEED_DS_NEG 10
+-#define STAT_CHASE_CNAME 11
++#define STAT_NO_NS 10
++#define STAT_NEED_DS_NEG 11
++#define STAT_CHASE_CNAME 12
+
+ #define FREC_NOREBIND 1
+ #define FREC_CHECKING_DISABLED 2
+@@ -604,7 +605,9 @@ struct frec {
+ #ifdef HAVE_DNSSEC
+ int class, work_counter;
+ struct blockdata *stash; /* Saved reply, whilst we validate */
+- size_t stash_len;
++ struct blockdata *orig_domain; /* domain of original query, whilst
++ we're seeing is if in unsigned domain */
++ size_t stash_len, name_start, name_len;
+ struct frec *dependent; /* Query awaiting internally-generated DNSKEY or DS query */
+ struct frec *blocking_query; /* Query which is blocking us. */
+ #endif
+@@ -1126,7 +1129,7 @@ int in_zone(struct auth_zone *zone, char *name, char **cut);
+ size_t dnssec_generate_query(struct dns_header *header, char *end, char *name, int class, int type, union mysockaddr *addr);
+ int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t n, char *name, char *keyname, int class);
+ int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class);
+-int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int *class, int *neganswer);
++int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int *class, int *neganswer, int *nons);
+ int dnssec_chase_cname(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname);
+ int dnskey_keytag(int alg, int flags, unsigned char *rdata, int rdlen);
+ size_t filter_rrsigs(struct dns_header *header, size_t plen);
+diff --git a/src/dnssec.c b/src/dnssec.c
+index 026794b077e5..8f27677628b2 100644
+--- a/src/dnssec.c
++++ b/src/dnssec.c
+@@ -875,8 +875,7 @@ static int validate_rrset(time_t now, struct dns_header *header, size_t plen, in
+ /* The DNS packet is expected to contain the answer to a DNSKEY query.
+ Put all DNSKEYs in the answer which are valid into the cache.
+ return codes:
+- STAT_INSECURE No DNSKEYs in reply.
+- STAT_SECURE At least one valid DNSKEY found and in cache.
++ STAT_SECURE At least one valid DNSKEY found and in cache.
+ STAT_BOGUS No DNSKEYs found, which can be validated with DS,
+ or self-sign for DNSKEY RRset is not valid, bad packet.
+ STAT_NEED_DS DS records to validate a key not found, name in keyname
+@@ -896,11 +895,8 @@ int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, ch
+ GETSHORT(qtype, p);
+ GETSHORT(qclass, p);
+
+- if (qtype != T_DNSKEY || qclass != class)
++ if (qtype != T_DNSKEY || qclass != class || ntohs(header->ancount) == 0)
+ return STAT_BOGUS;
+-
+- if (ntohs(header->ancount) == 0)
+- return STAT_INSECURE;
+
+ /* See if we have cached a DS record which validates this key */
+ if (!(crecp = cache_find_by_name(NULL, name, now, F_DS)))
+@@ -1103,17 +1099,17 @@ int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, ch
+ /* The DNS packet is expected to contain the answer to a DS query
+ Put all DSs in the answer which are valid into the cache.
+ return codes:
+- STAT_INSECURE no DS in reply or not signed.
+ STAT_SECURE At least one valid DS found and in cache.
+ STAT_NO_DS It's proved there's no DS here.
+- STAT_BOGUS At least one DS found, which fails validation, bad packet.
++ STAT_NO_NS It's proved there's no DS _or_ NS here.
++ STAT_BOGUS no DS in reply or not signed, fails validation, bad packet.
+ STAT_NEED_DNSKEY DNSKEY records to validate a DS not found, name in keyname
+ */
+
+ int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class)
+ {
+ unsigned char *p = (unsigned char *)(header+1);
+- int qtype, qclass, val, i, neganswer;
++ int qtype, qclass, val, i, neganswer, nons;
+
+ if (ntohs(header->qdcount) != 1 ||
+ !(p = skip_name(p, header, plen, 4)))
+@@ -1125,32 +1121,39 @@ int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char
+ if (qtype != T_DS || qclass != class)
+ val = STAT_BOGUS;
+ else
+- val = dnssec_validate_reply(now, header, plen, name, keyname, NULL, &neganswer);
+-
+- if (val == STAT_NO_SIG)
+- val = STAT_INSECURE;
++ val = dnssec_validate_reply(now, header, plen, name, keyname, NULL, &neganswer, &nons);
++ /* Note dnssec_validate_reply() will have cached positive answers */
++
++ if (val == STAT_NO_SIG || val == STAT_INSECURE)
++ val = STAT_BOGUS;
+
+ p = (unsigned char *)(header+1);
+ extract_name(header, plen, &p, name, 1, 4);
+ p += 4; /* qtype, qclass */
+
+ if (!(p = skip_section(p, ntohs(header->ancount), header, plen)))
+- return STAT_BOGUS;
++ val = STAT_BOGUS;
+
+ if (val == STAT_BOGUS)
+- log_query(F_UPSTREAM, name, NULL, "BOGUS DS");
+-
+- if ((val == STAT_SECURE || val == STAT_INSECURE) && neganswer)
+ {
+- int rdlen, flags = F_FORWARD | F_DS | F_NEG;
++ log_query(F_UPSTREAM, name, NULL, "BOGUS DS");
++ return STAT_BOGUS;
++ }
++
++ /* By here, the answer is proved secure, and a positive answer has been cached. */
++ if (val == STAT_SECURE && neganswer)
++ {
++ int rdlen, flags = F_FORWARD | F_DS | F_NEG | F_DNSSECOK;
+ unsigned long ttl, minttl = ULONG_MAX;
+ struct all_addr a;
+
+ if (RCODE(header) == NXDOMAIN)
+ flags |= F_NXDOMAIN;
+
+- if (val == STAT_SECURE)
+- flags |= F_DNSSECOK;
++ /* We only cache validated DS records, DNSSECOK flag hijacked
++ to store presence/absence of NS. */
++ if (nons)
++ flags &= ~F_DNSSECOK;
+
+ for (i = ntohs(header->nscount); i != 0; i--)
+ {
+@@ -1196,10 +1199,12 @@ int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char
+ a.addr.dnssec.class = class;
+ cache_insert(name, &a, now, ttl, flags);
+
+- cache_end_insert();
++ cache_end_insert();
++
++ log_query(F_UPSTREAM, name, NULL, nons ? "no delegation" : "no DS");
+ }
+
+- return (val == STAT_SECURE) ? STAT_NO_DS : STAT_INSECURE;
++ return nons ? STAT_NO_NS : STAT_NO_DS;
+ }
+
+ return val;
+@@ -1323,12 +1328,15 @@ static int find_nsec_records(struct dns_header *header, size_t plen, unsigned ch
+ }
+
+ static int prove_non_existence_nsec(struct dns_header *header, size_t plen, unsigned char **nsecs, int nsec_count,
+- char *workspace1, char *workspace2, char *name, int type)
++ char *workspace1, char *workspace2, char *name, int type, int *nons)
+ {
+ int i, rc, rdlen;
+ unsigned char *p, *psave;
+ int offset = (type & 0xff) >> 3;
+ int mask = 0x80 >> (type & 0x07);
++
++ if (nons)
++ *nons = 0;
+
+ /* Find NSEC record that proves name doesn't exist */
+ for (i = 0; i < nsec_count; i++)
+@@ -1355,6 +1363,10 @@ static int prove_non_existence_nsec(struct dns_header *header, size_t plen, unsi
+ rdlen -= p - psave;
+ /* rdlen is now length of type map, and p points to it */
+
++ /* If we can prove that there's no NS record, return that information. */
++ if (nons && rdlen >= 2 && p[0] == 0 && (p[2] & (0x80 >> T_NS)) == 0)
++ *nons = 1;
++
+ while (rdlen >= 2)
+ {
+ if (!CHECK_LEN(header, p, plen, rdlen))
+@@ -1456,7 +1468,7 @@ static int base32_decode(char *in, unsigned char *out)
+ }
+
+ static int check_nsec3_coverage(struct dns_header *header, size_t plen, int digest_len, unsigned char *digest, int type,
+- char *workspace1, char *workspace2, unsigned char **nsecs, int nsec_count)
++ char *workspace1, char *workspace2, unsigned char **nsecs, int nsec_count, int *nons)
+ {
+ int i, hash_len, salt_len, base32_len, rdlen;
+ unsigned char *p, *psave;
+@@ -1497,6 +1509,10 @@ static int check_nsec3_coverage(struct dns_header *header, size_t plen, int dige
+ if (!CHECK_LEN(header, p, plen, rdlen))
+ return 0;
+
++ /* If we can prove that there's no NS record, return that information. */
++ if (nons && rdlen >= 2 && p[0] == 0 && (p[2] & (0x80 >> T_NS)) == 0)
++ *nons = 1;
++
+ while (rdlen >= 2)
+ {
+ if (p[0] == type >> 8)
+@@ -1533,13 +1549,16 @@ static int check_nsec3_coverage(struct dns_header *header, size_t plen, int dige
+ }
+
+ static int prove_non_existence_nsec3(struct dns_header *header, size_t plen, unsigned char **nsecs, int nsec_count,
+- char *workspace1, char *workspace2, char *name, int type, char *wildname)
++ char *workspace1, char *workspace2, char *name, int type, char *wildname, int *nons)
+ {
+ unsigned char *salt, *p, *digest;
+ int digest_len, i, iterations, salt_len, base32_len, algo = 0;
+ struct nettle_hash const *hash;
+ char *closest_encloser, *next_closest, *wildcard;
+-
++
++ if (nons)
++ *nons = 0;
++
+ /* Look though the NSEC3 records to find the first one with
+ an algorithm we support (currently only algo == 1).
+
+@@ -1612,7 +1631,7 @@ static int prove_non_existence_nsec3(struct dns_header *header, size_t plen, uns
+ if ((digest_len = hash_name(name, &digest, hash, salt, salt_len, iterations)) == 0)
+ return STAT_BOGUS;
+
+- if (check_nsec3_coverage(header, plen, digest_len, digest, type, workspace1, workspace2, nsecs, nsec_count))
++ if (check_nsec3_coverage(header, plen, digest_len, digest, type, workspace1, workspace2, nsecs, nsec_count, nons))
+ return STAT_SECURE;
+
+ /* Can't find an NSEC3 which covers the name directly, we need the "closest encloser NSEC3"
+@@ -1657,7 +1676,7 @@ static int prove_non_existence_nsec3(struct dns_header *header, size_t plen, uns
+ if ((digest_len = hash_name(next_closest, &digest, hash, salt, salt_len, iterations)) == 0)
+ return STAT_BOGUS;
+
+- if (!check_nsec3_coverage(header, plen, digest_len, digest, type, workspace1, workspace2, nsecs, nsec_count))
++ if (!check_nsec3_coverage(header, plen, digest_len, digest, type, workspace1, workspace2, nsecs, nsec_count, NULL))
+ return STAT_BOGUS;
+
+ /* Finally, check that there's no seat of wildcard synthesis */
+@@ -1672,7 +1691,7 @@ static int prove_non_existence_nsec3(struct dns_header *header, size_t plen, uns
+ if ((digest_len = hash_name(wildcard, &digest, hash, salt, salt_len, iterations)) == 0)
+ return STAT_BOGUS;
+
+- if (!check_nsec3_coverage(header, plen, digest_len, digest, type, workspace1, workspace2, nsecs, nsec_count))
++ if (!check_nsec3_coverage(header, plen, digest_len, digest, type, workspace1, workspace2, nsecs, nsec_count, NULL))
+ return STAT_BOGUS;
+ }
+
+@@ -1681,7 +1700,8 @@ static int prove_non_existence_nsec3(struct dns_header *header, size_t plen, uns
+
+ /* Validate all the RRsets in the answer and authority sections of the reply (4035:3.2.3) */
+ /* Returns are the same as validate_rrset, plus the class if the missing key is in *class */
+-int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int *class, int *neganswer)
++int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname,
++ int *class, int *neganswer, int *nons)
+ {
+ unsigned char *ans_start, *qname, *p1, *p2, **nsecs;
+ int type1, class1, rdlen1, type2, class2, rdlen2, qclass, qtype;
+@@ -1811,10 +1831,11 @@ int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, ch
+ return STAT_BOGUS; /* No NSECs or bad packet */
+
+ if (nsec_type == T_NSEC)
+- rc = prove_non_existence_nsec(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, type1);
++ rc = prove_non_existence_nsec(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, type1, NULL);
+ else
+- rc = prove_non_existence_nsec3(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, type1, wildname);
+-
++ rc = prove_non_existence_nsec3(header, plen, nsecs, nsec_count, daemon->workspacename,
++ keyname, name, type1, wildname, NULL);
++
+ if (rc != STAT_SECURE)
+ return rc;
+ }
+@@ -1937,9 +1958,9 @@ int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, ch
+ return STAT_BOGUS;
+
+ if (nsec_type == T_NSEC)
+- return prove_non_existence_nsec(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, qtype);
++ return prove_non_existence_nsec(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, qtype, nons);
+ else
+- return prove_non_existence_nsec3(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, qtype, NULL);
++ return prove_non_existence_nsec3(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, qtype, NULL, nons);
+ }
+
+ /* Chase the CNAME chain in the packet until the first record which _doesn't validate.
+diff --git a/src/forward.c b/src/forward.c
+index f28c7d51f708..ee8d7b52d5e5 100644
+--- a/src/forward.c
++++ b/src/forward.c
+@@ -26,8 +26,9 @@ static void free_frec(struct frec *f);
+ #ifdef HAVE_DNSSEC
+ static int tcp_key_recurse(time_t now, int status, struct dns_header *header, size_t n,
+ int class, char *name, char *keyname, struct server *server, int *keycount);
+-static int do_check_sign(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class);
+-static int send_check_sign(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname);
++static int do_check_sign(struct frec *forward, int status, time_t now, char *name, char *keyname);
++static int send_check_sign(struct frec *forward, time_t now, struct dns_header *header, size_t plen,
++ char *name, char *keyname);
+ #endif
+
+
+@@ -815,18 +816,22 @@ void reply_query(int fd, int family, time_t now)
+ else if (forward->flags & FREC_DS_QUERY)
+ {
+ status = dnssec_validate_ds(now, header, n, daemon->namebuff, daemon->keyname, forward->class);
+- if (status == STAT_NO_DS)
+- status = STAT_INSECURE;
++ if (status == STAT_NO_DS || status == STAT_NO_NS)
++ status = STAT_BOGUS;
+ }
+ else if (forward->flags & FREC_CHECK_NOSIGN)
+- status = do_check_sign(now, header, n, daemon->namebuff, daemon->keyname, forward->class);
++ {
++ status = dnssec_validate_ds(now, header, n, daemon->namebuff, daemon->keyname, forward->class);
++ if (status != STAT_NEED_KEY)
++ status = do_check_sign(forward, status, now, daemon->namebuff, daemon->keyname);
++ }
+ else
+ {
+- status = dnssec_validate_reply(now, header, n, daemon->namebuff, daemon->keyname, &forward->class, NULL);
++ status = dnssec_validate_reply(now, header, n, daemon->namebuff, daemon->keyname, &forward->class, NULL, NULL);
+ if (status == STAT_NO_SIG)
+ {
+ if (option_bool(OPT_DNSSEC_NO_SIGN))
+- status = send_check_sign(now, header, n, daemon->namebuff, daemon->keyname);
++ status = send_check_sign(forward, now, header, n, daemon->namebuff, daemon->keyname);
+ else
+ status = STAT_INSECURE;
+ }
+@@ -861,6 +866,7 @@ void reply_query(int fd, int family, time_t now)
+ new->blocking_query = NULL;
+ new->sentto = server;
+ new->rfd4 = NULL;
++ new->orig_domain = NULL;
+ #ifdef HAVE_IPV6
+ new->rfd6 = NULL;
+ #endif
+@@ -889,7 +895,9 @@ void reply_query(int fd, int family, time_t now)
+ new->new_id = get_id();
+ header->id = htons(new->new_id);
+ /* Save query for retransmission */
+- new->stash = blockdata_alloc((char *)header, nn);
++ if (!(new->stash = blockdata_alloc((char *)header, nn)))
++ return;
++
+ new->stash_len = nn;
+
+ /* Don't resend this. */
+@@ -946,18 +954,22 @@ void reply_query(int fd, int family, time_t now)
+ else if (forward->flags & FREC_DS_QUERY)
+ {
+ status = dnssec_validate_ds(now, header, n, daemon->namebuff, daemon->keyname, forward->class);
+- if (status == STAT_NO_DS)
+- status = STAT_INSECURE;
++ if (status == STAT_NO_DS || status == STAT_NO_NS)
++ status = STAT_BOGUS;
+ }
+ else if (forward->flags & FREC_CHECK_NOSIGN)
+- status = do_check_sign(now, header, n, daemon->namebuff, daemon->keyname, forward->class);
++ {
++ status = dnssec_validate_ds(now, header, n, daemon->namebuff, daemon->keyname, forward->class);
++ if (status != STAT_NEED_KEY)
++ status = do_check_sign(forward, status, now, daemon->namebuff, daemon->keyname);
++ }
+ else
+ {
+- status = dnssec_validate_reply(now, header, n, daemon->namebuff, daemon->keyname, &forward->class, NULL);
++ status = dnssec_validate_reply(now, header, n, daemon->namebuff, daemon->keyname, &forward->class, NULL, NULL);
+ if (status == STAT_NO_SIG)
+ {
+ if (option_bool(OPT_DNSSEC_NO_SIGN))
+- status = send_check_sign(now, header, n, daemon->namebuff, daemon->keyname);
++ status = send_check_sign(forward, now, header, n, daemon->namebuff, daemon->keyname);
+ else
+ status = STAT_INSECURE;
+ }
+@@ -1319,70 +1331,80 @@ void receive_query(struct listener *listen, time_t now)
+ /* UDP: we've got an unsigned answer, return STAT_INSECURE if we can prove there's no DS
+ and therefore the answer shouldn't be signed, or STAT_BOGUS if it should be, or
+ STAT_NEED_DS_NEG and keyname if we need to do the query. */
+-static int send_check_sign(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname)
++static int send_check_sign(struct frec *forward, time_t now, struct dns_header *header, size_t plen,
++ char *name, char *keyname)
+ {
+- struct crec *crecp;
+- char *name_start = name;
+ int status = dnssec_chase_cname(now, header, plen, name, keyname);
+
+ if (status != STAT_INSECURE)
+ return status;
+
++ /* Store the domain we're trying to check. */
++ forward->name_start = strlen(name);
++ forward->name_len = forward->name_start + 1;
++ if (!(forward->orig_domain = blockdata_alloc(name, forward->name_len)))
++ return STAT_BOGUS;
++
++ return do_check_sign(forward, 0, now, name, keyname);
++}
++
++/* We either have a a reply (header non-NULL, or we need to start by looking in the cache */
++static int do_check_sign(struct frec *forward, int status, time_t now, char *name, char *keyname)
++{
++ /* get domain we're checking back from blockdata store, it's stored on the original query. */
++ while (forward->dependent)
++ forward = forward->dependent;
++
++ blockdata_retrieve(forward->orig_domain, forward->name_len, name);
++
+ while (1)
+ {
+- crecp = cache_find_by_name(NULL, name_start, now, F_DS);
+-
+- if (crecp && (crecp->flags & F_DNSSECOK))
+- return (crecp->flags & F_NEG) ? STAT_INSECURE : STAT_BOGUS;
+-
+- if (crecp && (crecp->flags & F_NEG) && (name_start = strchr(name_start, '.')))
++ char *p;
++
++ if (status == 0)
+ {
+- name_start++; /* chop a label off and try again */
+- continue;
++ struct crec *crecp;
++
++ /* Haven't received answer, see if in cache */
++ if (!(crecp = cache_find_by_name(NULL, &name[forward->name_start], now, F_DS)))
++ {
++ /* put name of DS record we're missing into keyname */
++ strcpy(keyname, &name[forward->name_start]);
++ /* and wait for reply to arrive */
++ return STAT_NEED_DS_NEG;
++ }
++
++ /* F_DNSSECOK misused in DS cache records to non-existance of NS record */
++ if (!(crecp->flags & F_NEG))
++ status = STAT_SECURE;
++ else if (crecp->flags & F_DNSSECOK)
++ status = STAT_NO_DS;
++ else
++ status = STAT_NO_NS;
+ }
++
++ /* Have entered non-signed part of DNS tree. */
++ if (status == STAT_NO_DS)
++ return STAT_INSECURE;
+
+- /* Reached the root */
+- if (!name_start)
++ if (status == STAT_BOGUS)
+ return STAT_BOGUS;
+
+- strcpy(keyname, name_start);
+- return STAT_NEED_DS_NEG;
+- }
+-}
+-
+-/* Got answer to DS query from send_check_sign, check for proven non-existence, or make the next DS query to try. */
+-static int do_check_sign(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class)
+-
+-{
+- char *name_start;
+- unsigned char *p;
+- int status;
++ /* There's a proven DS record, or we're within a zone, where there doesn't need
++ to be a DS record. Add a name and try again.
++ If we've already tried the whole name, then fail */
+
+- /* In this case only, a SERVFAIL reply allows us to continue up the tree, looking for a
+- suitable NSEC reply to DS queries. */
+- if (RCODE(header) != SERVFAIL)
+- {
+- status = dnssec_validate_ds(now, header, plen, name, keyname, class);
++ if (forward->name_start == 0)
++ return STAT_BOGUS;
+
+- if (status != STAT_INSECURE)
+- {
+- if (status == STAT_NO_DS)
+- status = STAT_INSECURE;
+- return status;
+- }
+- }
+-
+- p = (unsigned char *)(header+1);
+-
+- if (extract_name(header, plen, &p, name, 1, 4) &&
+- (name_start = strchr(name, '.')))
+- {
+- name_start++; /* chop a label off and try again */
+- strcpy(keyname, name_start);
+- return STAT_NEED_DS_NEG;
++ for (p = &name[forward->name_start-2]; (*p != '.') && (p != name); p--);
++
++ if (p != name)
++ p++;
++
++ forward->name_start = p - name;
++ status = 0; /* force to cache when we iterate. */
+ }
+-
+- return STAT_BOGUS;
+ }
+
+ /* Move toward the root, until we find a signed non-existance of a DS, in which case
+@@ -1395,8 +1417,10 @@ static int tcp_check_for_unsigned_zone(time_t now, struct dns_header *header, s
+ unsigned char *packet, *payload;
+ u16 *length;
+ unsigned char *p = (unsigned char *)(header+1);
+- int status;
+- char *name_start = name;
++ int status, name_len;
++ struct blockdata *block;
++
++ char *name_start;
+
+ /* Get first insecure entry in CNAME chain */
+ status = tcp_key_recurse(now, STAT_CHASE_CNAME, header, plen, class, name, keyname, server, keycount);
+@@ -1409,95 +1433,113 @@ static int tcp_check_for_unsigned_zone(time_t now, struct dns_header *header, s
+ payload = &packet[2];
+ header = (struct dns_header *)payload;
+ length = (u16 *)packet;
++
++ /* Stash the name away, since the buffer will be trashed when we recurse */
++ name_len = strlen(name) + 1;
++ name_start = name + name_len - 1;
+
++ if (!(block = blockdata_alloc(name, name_len)))
++ {
++ free(packet);
++ return STAT_BOGUS;
++ }
++
+ while (1)
+ {
+- unsigned char *newhash, hash[HASH_SIZE];
+ unsigned char c1, c2;
+- struct crec *crecp = cache_find_by_name(NULL, name_start, now, F_DS);
+-
++ struct crec *crecp;
++
+ if (--(*keycount) == 0)
+ {
+ free(packet);
++ blockdata_free(block);
+ return STAT_BOGUS;
+ }
+-
+- if (crecp && (crecp->flags & F_DNSSECOK))
+- {
+- free(packet);
+- return (crecp->flags & F_NEG) ? STAT_INSECURE : STAT_BOGUS;
+- }
+
+- /* If we have cached insecurely that a DS doesn't exist,
+- ise that is a hit for where to start looking for the secure one */
+- if (crecp && (crecp->flags & F_NEG) && (name_start = strchr(name_start, '.')))
+- {
+- name_start++; /* chop a label off and try again */
+- continue;
+- }
+-
+- /* reached the root */
+- if (!name_start)
+- {
+- free(packet);
+- return STAT_BOGUS;
++ while (crecp = cache_find_by_name(NULL, name_start, now, F_DS))
++ {
++ if ((crecp->flags & F_NEG) && (crecp->flags & F_DNSSECOK))
++ {
++ /* Found a secure denial of DS - delegation is indeed insecure */
++ free(packet);
++ blockdata_free(block);
++ return STAT_INSECURE;
++ }
++
++ /* Here, either there's a secure DS, or no NS and no DS, and therefore no delegation.
++ Add another label and continue. */
++
++ if (name_start == name)
++ {
++ free(packet);
++ blockdata_free(block);
++ return STAT_BOGUS; /* run out of labels */
++ }
++
++ name_start -= 2;
++ while (*name_start != '.' && name_start != name)
++ name_start--;
++ if (name_start != name)
++ name_start++;
+ }
++
++ /* Can't find it in the cache, have to send a query */
+
+ m = dnssec_generate_query(header, ((char *) header) + 65536, name_start, class, T_DS, &server->addr);
+
+- /* We rely on the question section coming back unchanged, ensure it is with the hash. */
+- if ((newhash = hash_questions(header, (unsigned int)m, name)))
+- {
+- memcpy(hash, newhash, HASH_SIZE);
++ *length = htons(m);
+
+- *length = htons(m);
++ if (read_write(server->tcpfd, packet, m + sizeof(u16), 0) &&
++ read_write(server->tcpfd, &c1, 1, 1) &&
++ read_write(server->tcpfd, &c2, 1, 1) &&
++ read_write(server->tcpfd, payload, (c1 << 8) | c2, 1))
++ {
++ m = (c1 << 8) | c2;
++
++ /* Note this trashes all three name workspaces */
++ status = tcp_key_recurse(now, STAT_NEED_DS_NEG, header, m, class, name, keyname, server, keycount);
+
+- if (read_write(server->tcpfd, packet, m + sizeof(u16), 0) &&
+- read_write(server->tcpfd, &c1, 1, 1) &&
+- read_write(server->tcpfd, &c2, 1, 1) &&
+- read_write(server->tcpfd, payload, (c1 << 8) | c2, 1))
++ if (status == STAT_NO_DS)
+ {
+- m = (c1 << 8) | c2;
+-
+- newhash = hash_questions(header, (unsigned int)m, name);
+- if (newhash && memcmp(hash, newhash, HASH_SIZE) == 0)
+- {
+- /* In this case only, a SERVFAIL reply allows us to continue up the tree, looking for a
+- suitable NSEC reply to DS queries. */
+- if (RCODE(header) == SERVFAIL)
+- status = STAT_INSECURE;
+- else
+- /* Note this trashes all three name workspaces */
+- status = tcp_key_recurse(now, STAT_NEED_DS_NEG, header, m, class, name, keyname, server, keycount);
+-
+- /* We've found a DS which proves the bit of the DNS where the
+- original query is, is unsigned, so the answer is OK,
+- if unvalidated. */
+- if (status == STAT_NO_DS)
+- {
+- free(packet);
+- return STAT_INSECURE;
+- }
+-
+- /* No DS, not got to DNSSEC-land yet, go up. */
+- if (status == STAT_INSECURE)
+- {
+- p = (unsigned char *)(header+1);
+-
+- if (extract_name(header, plen, &p, name, 1, 4) &&
+- (name_start = strchr(name, '.')))
+- {
+- name_start++; /* chop a label off and try again */
+- continue;
+- }
+- }
+- }
++ /* Found a secure denial of DS - delegation is indeed insecure */
++ free(packet);
++ blockdata_free(block);
++ return STAT_INSECURE;
++ }
++
++ if (status == STAT_BOGUS)
++ {
++ free(packet);
++ blockdata_free(block);
++ return STAT_BOGUS;
++ }
++
++ /* Here, either there's a secure DS, or no NS and no DS, and therefore no delegation.
++ Add another label and continue. */
++
++ /* Get name we're checking back. */
++ blockdata_retrieve(block, name_len, name);
++
++ if (name_start == name)
++ {
++ free(packet);
++ blockdata_free(block);
++ return STAT_BOGUS; /* run out of labels */
+ }
++
++ name_start -= 2;
++ while (*name_start != '.' && name_start != name)
++ name_start--;
++ if (name_start != name)
++ name_start++;
++ }
++ else
++ {
++ /* IO failure */
++ free(packet);
++ blockdata_free(block);
++ return STAT_BOGUS; /* run out of labels */
+ }
+-
+- free(packet);
+-
+- return STAT_BOGUS;
+ }
+ }
+
+@@ -1516,14 +1558,14 @@ static int tcp_key_recurse(time_t now, int status, struct dns_header *header, si
+ else if (status == STAT_NEED_DS || status == STAT_NEED_DS_NEG)
+ {
+ new_status = dnssec_validate_ds(now, header, n, name, keyname, class);
+- if (status == STAT_NEED_DS && new_status == STAT_NO_DS)
+- new_status = STAT_INSECURE;
++ if (status == STAT_NEED_DS && (new_status == STAT_NO_DS || new_status == STAT_NO_NS))
++ new_status = STAT_BOGUS;
+ }
+ else if (status == STAT_CHASE_CNAME)
+ new_status = dnssec_chase_cname(now, header, n, name, keyname);
+ else
+ {
+- new_status = dnssec_validate_reply(now, header, n, name, keyname, &class, NULL);
++ new_status = dnssec_validate_reply(now, header, n, name, keyname, &class, NULL, NULL);
+
+ if (new_status == STAT_NO_SIG)
+ {
+@@ -1576,14 +1618,14 @@ static int tcp_key_recurse(time_t now, int status, struct dns_header *header, si
+ else if (status == STAT_NEED_DS || status == STAT_NEED_DS_NEG)
+ {
+ new_status = dnssec_validate_ds(now, header, n, name, keyname, class);
+- if (status == STAT_NEED_DS && new_status == STAT_NO_DS)
+- new_status = STAT_INSECURE; /* Validated no DS */
++ if (status == STAT_NEED_DS && (new_status == STAT_NO_DS || new_status == STAT_NO_NS))
++ new_status = STAT_BOGUS; /* Validated no DS */
+ }
+ else if (status == STAT_CHASE_CNAME)
+ new_status = dnssec_chase_cname(now, header, n, name, keyname);
+ else
+ {
+- new_status = dnssec_validate_reply(now, header, n, name, keyname, &class, NULL);
++ new_status = dnssec_validate_reply(now, header, n, name, keyname, &class, NULL, NULL);
+
+ if (new_status == STAT_NO_SIG)
+ {
+@@ -1961,6 +2003,7 @@ static struct frec *allocate_frec(time_t now)
+ f->dependent = NULL;
+ f->blocking_query = NULL;
+ f->stash = NULL;
++ f->orig_domain = NULL;
+ #endif
+ daemon->frec_list = f;
+ }
+@@ -2029,6 +2072,12 @@ static void free_frec(struct frec *f)
+ f->stash = NULL;
+ }
+
++ if (f->orig_domain)
++ {
++ blockdata_free(f->orig_domain);
++ f->orig_domain = NULL;
++ }
++
+ /* Anything we're waiting on is pointless now, too */
+ if (f->blocking_query)
+ free_frec(f->blocking_query);
+--
+2.1.0
+
--- /dev/null
+From 25cf5e373eb41c088d4ee5e625209c4cf6a5659e Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Fri, 9 Jan 2015 15:53:03 +0000
+Subject: [PATCH 27/55] Add --log-queries=extra option for more complete
+ logging.
+
+---
+ CHANGELOG | 3 +++
+ man/dnsmasq.8 | 5 ++++-
+ src/cache.c | 11 ++++++++++-
+ src/config.h | 1 +
+ src/dnsmasq.c | 5 +++++
+ src/dnsmasq.h | 9 +++++++--
+ src/dnssec.c | 14 +++++++-------
+ src/forward.c | 30 ++++++++++++++++++++++++++----
+ src/option.c | 11 +++++++++--
+ 9 files changed, 72 insertions(+), 17 deletions(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index e8bf80f81baa..0bbb7835df4f 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -40,6 +40,9 @@ version 2.73
+ nameservers in the unsigned parts of the DNS tree
+ which don't respond well to DNSSEC queries.
+
++ Add --log-queries=extra option, which makes logs easier
++ to search automatically.
++
+
+ version 2.72
+ Add ra-advrouter mode, for RFC-3775 mobile IPv6 support.
+diff --git a/man/dnsmasq.8 b/man/dnsmasq.8
+index 4236ba307df3..227d74bd80e7 100644
+--- a/man/dnsmasq.8
++++ b/man/dnsmasq.8
+@@ -98,7 +98,10 @@ only, to stop dnsmasq daemonising in production, use
+ .B -k.
+ .TP
+ .B \-q, --log-queries
+-Log the results of DNS queries handled by dnsmasq. Enable a full cache dump on receipt of SIGUSR1.
++Log the results of DNS queries handled by dnsmasq. Enable a full cache dump on receipt of SIGUSR1. If the argument "extra" is supplied, ie
++.B --log-queries=extra
++then the log has extra information at the start of each line.
++This consists of a serial number which ties together the log lines associated with an individual query, and the IP address of the requestor.
+ .TP
+ .B \-8, --log-facility=<facility>
+ Set the facility to which dnsmasq will send syslog entries, this
+diff --git a/src/cache.c b/src/cache.c
+index ff1ca6f1c352..960bb7938778 100644
+--- a/src/cache.c
++++ b/src/cache.c
+@@ -1638,7 +1638,16 @@ void log_query(unsigned int flags, char *name, struct all_addr *addr, char *arg)
+ if (strlen(name) == 0)
+ name = ".";
+
+- my_syslog(LOG_INFO, "%s %s %s %s", source, name, verb, dest);
++ if (option_bool(OPT_EXTRALOG))
++ {
++ prettyprint_addr(daemon->log_source_addr, daemon->addrbuff2);
++ if (flags & F_NOEXTRA)
++ my_syslog(LOG_INFO, "* %s %s %s %s %s", daemon->addrbuff2, source, name, verb, dest);
++ else
++ my_syslog(LOG_INFO, "%u %s %s %s %s %s", daemon->log_display_id, daemon->addrbuff2, source, name, verb, dest);
++ }
++ else
++ my_syslog(LOG_INFO, "%s %s %s %s", source, name, verb, dest);
+ }
+
+
+diff --git a/src/config.h b/src/config.h
+index 145820ad2510..3b88d8193dca 100644
+--- a/src/config.h
++++ b/src/config.h
+@@ -17,6 +17,7 @@
+ #define FTABSIZ 150 /* max number of outstanding requests (default) */
+ #define MAX_PROCS 20 /* max no children for TCP requests */
+ #define CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */
++#define TCP_MAX_QUERIES 100 /* Maximum number of queries per incoming TCP connection */
+ #define EDNS_PKTSZ 4096 /* default max EDNS.0 UDP packet from RFC5625 */
+ #define KEYBLOCK_LEN 40 /* choose to mininise fragmentation when storing DNSSEC keys */
+ #define DNSSEC_WORK 50 /* Max number of queries to validate one question */
+diff --git a/src/dnsmasq.c b/src/dnsmasq.c
+index 5c7750d365fa..c0c0589d4ce1 100644
+--- a/src/dnsmasq.c
++++ b/src/dnsmasq.c
+@@ -93,6 +93,8 @@ int main (int argc, char **argv)
+ daemon->packet = safe_malloc(daemon->packet_buff_sz);
+
+ daemon->addrbuff = safe_malloc(ADDRSTRLEN);
++ if (option_bool(OPT_EXTRALOG))
++ daemon->addrbuff2 = safe_malloc(ADDRSTRLEN);
+
+ #ifdef HAVE_DNSSEC
+ if (option_bool(OPT_DNSSEC_VALID))
+@@ -1587,6 +1589,9 @@ static void check_dns_listeners(fd_set *set, time_t now)
+ }
+ }
+ close(confd);
++
++ /* The child can use up to TCP_MAX_QUERIES ids, so skip that many. */
++ daemon->log_id += TCP_MAX_QUERIES;
+ }
+ #endif
+ else
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index 2f4597294a56..4e9aea401b75 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -238,7 +238,8 @@ struct event_desc {
+ #define OPT_DNSSEC_NO_SIGN 48
+ #define OPT_LOCAL_SERVICE 49
+ #define OPT_LOOP_DETECT 50
+-#define OPT_LAST 51
++#define OPT_EXTRALOG 51
++#define OPT_LAST 52
+
+ /* extra flags for my_syslog, we use a couple of facilities since they are known
+ not to occupy the same bits as priorities, no matter how syslog.h is set up. */
+@@ -442,6 +443,7 @@ struct crec {
+ #define F_NO_RR (1u<<25)
+ #define F_IPSET (1u<<26)
+ #define F_NSIGMATCH (1u<<27)
++#define F_NOEXTRA (1u<<28)
+
+ /* Values of uid in crecs with F_CONFIG bit set. */
+ #define SRC_INTERFACE 0
+@@ -599,7 +601,7 @@ struct frec {
+ #endif
+ unsigned int iface;
+ unsigned short orig_id, new_id;
+- int fd, forwardall, flags;
++ int log_id, fd, forwardall, flags;
+ time_t time;
+ unsigned char *hash[HASH_SIZE];
+ #ifdef HAVE_DNSSEC
+@@ -1002,6 +1004,8 @@ extern struct daemon {
+ struct randfd randomsocks[RANDOM_SOCKS];
+ int v6pktinfo;
+ struct addrlist *interface_addrs; /* list of all addresses/prefix lengths associated with all local interfaces */
++ int log_id, log_display_id; /* ids of transactions for logging */
++ union mysockaddr *log_source_addr;
+
+ /* DHCP state */
+ int dhcpfd, helperfd, pxefd;
+@@ -1033,6 +1037,7 @@ extern struct daemon {
+
+ /* utility string buffer, hold max sized IP address as string */
+ char *addrbuff;
++ char *addrbuff2; /* only allocated when OPT_EXTRALOG */
+
+ } *daemon;
+
+diff --git a/src/dnssec.c b/src/dnssec.c
+index 8f27677628b2..afb3dca38cb1 100644
+--- a/src/dnssec.c
++++ b/src/dnssec.c
+@@ -1038,7 +1038,7 @@ int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, ch
+ else
+ {
+ a.addr.keytag = keytag;
+- log_query(F_KEYTAG | F_UPSTREAM, name, &a, "DNSKEY keytag %u");
++ log_query(F_NOEXTRA | F_KEYTAG | F_UPSTREAM, name, &a, "DNSKEY keytag %u");
+
+ recp1->addr.key.keylen = rdlen - 4;
+ recp1->addr.key.keydata = key;
+@@ -1092,7 +1092,7 @@ int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, ch
+ return STAT_SECURE;
+ }
+
+- log_query(F_UPSTREAM, name, NULL, "BOGUS DNSKEY");
++ log_query(F_NOEXTRA | F_UPSTREAM, name, NULL, "BOGUS DNSKEY");
+ return STAT_BOGUS;
+ }
+
+@@ -1136,7 +1136,7 @@ int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char
+
+ if (val == STAT_BOGUS)
+ {
+- log_query(F_UPSTREAM, name, NULL, "BOGUS DS");
++ log_query(F_NOEXTRA | F_UPSTREAM, name, NULL, "BOGUS DS");
+ return STAT_BOGUS;
+ }
+
+@@ -1201,7 +1201,7 @@ int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char
+
+ cache_end_insert();
+
+- log_query(F_UPSTREAM, name, NULL, nons ? "no delegation" : "no DS");
++ log_query(F_NOEXTRA | F_UPSTREAM, name, NULL, nons ? "no delegation" : "no DS");
+ }
+
+ return nons ? STAT_NO_NS : STAT_NO_DS;
+@@ -1885,7 +1885,7 @@ int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, ch
+ else
+ {
+ a.addr.keytag = keytag;
+- log_query(F_KEYTAG | F_UPSTREAM, name, &a, "DS keytag %u");
++ log_query(F_NOEXTRA | F_KEYTAG | F_UPSTREAM, name, &a, "DS keytag %u");
+ crecp->addr.ds.digest = digest;
+ crecp->addr.ds.keydata = key;
+ crecp->addr.ds.algo = algo;
+@@ -2058,10 +2058,10 @@ size_t dnssec_generate_query(struct dns_header *header, char *end, char *name, i
+ char *types = querystr("dnssec-query", type);
+
+ if (addr->sa.sa_family == AF_INET)
+- log_query(F_DNSSEC | F_IPV4, name, (struct all_addr *)&addr->in.sin_addr, types);
++ log_query(F_NOEXTRA | F_DNSSEC | F_IPV4, name, (struct all_addr *)&addr->in.sin_addr, types);
+ #ifdef HAVE_IPV6
+ else
+- log_query(F_DNSSEC | F_IPV6, name, (struct all_addr *)&addr->in6.sin6_addr, types);
++ log_query(F_NOEXTRA | F_DNSSEC | F_IPV6, name, (struct all_addr *)&addr->in6.sin6_addr, types);
+ #endif
+
+ header->qdcount = htons(1);
+diff --git a/src/forward.c b/src/forward.c
+index 55f583383bc6..713a64c0fa58 100644
+--- a/src/forward.c
++++ b/src/forward.c
+@@ -279,10 +279,10 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
+ plen = forward->stash_len;
+
+ if (forward->sentto->addr.sa.sa_family == AF_INET)
+- log_query(F_DNSSEC | F_IPV4, "retry", (struct all_addr *)&forward->sentto->addr.in.sin_addr, "dnssec");
++ log_query(F_NOEXTRA | F_DNSSEC | F_IPV4, "retry", (struct all_addr *)&forward->sentto->addr.in.sin_addr, "dnssec");
+ #ifdef HAVE_IPV6
+ else
+- log_query(F_DNSSEC | F_IPV6, "retry", (struct all_addr *)&forward->sentto->addr.in6.sin6_addr, "dnssec");
++ log_query(F_NOEXTRA | F_DNSSEC | F_IPV6, "retry", (struct all_addr *)&forward->sentto->addr.in6.sin6_addr, "dnssec");
+ #endif
+
+ if (forward->sentto->sfd)
+@@ -389,6 +389,9 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
+ struct server *firstsentto = start;
+ int forwarded = 0;
+
++ /* If a query is retried, use the log_id for the retry when logging the answer. */
++ forward->log_id = daemon->log_id;
++
+ if (option_bool(OPT_ADD_MAC))
+ plen = add_mac(header, plen, ((char *) header) + daemon->packet_buff_sz, &forward->source);
+
+@@ -725,6 +728,11 @@ void reply_query(int fd, int family, time_t now)
+ if (!(forward = lookup_frec(ntohs(header->id), hash)))
+ return;
+
++ /* log_query gets called indirectly all over the place, so
++ pass these in global variables - sorry. */
++ daemon->log_display_id = forward->log_id;
++ daemon->log_source_addr = &forward->source;
++
+ if (daemon->ignore_addr && RCODE(header) == NOERROR &&
+ check_for_ignored_address(header, n, daemon->ignore_addr))
+ return;
+@@ -1258,6 +1266,11 @@ void receive_query(struct listener *listen, time_t now)
+ dst_addr_4.s_addr = 0;
+ }
+ }
++
++ /* log_query gets called indirectly all over the place, so
++ pass these in global variables - sorry. */
++ daemon->log_display_id = ++daemon->log_id;
++ daemon->log_source_addr = &source_addr;
+
+ if (extract_request(header, (size_t)n, daemon->namebuff, &type))
+ {
+@@ -1675,7 +1688,8 @@ unsigned char *tcp_request(int confd, time_t now,
+ struct in_addr dst_addr_4;
+ union mysockaddr peer_addr;
+ socklen_t peer_len = sizeof(union mysockaddr);
+-
++ int query_count = 0;
++
+ if (getpeername(confd, (struct sockaddr *)&peer_addr, &peer_len) == -1)
+ return packet;
+
+@@ -1712,7 +1726,8 @@ unsigned char *tcp_request(int confd, time_t now,
+
+ while (1)
+ {
+- if (!packet ||
++ if (query_count == TCP_MAX_QUERIES ||
++ !packet ||
+ !read_write(confd, &c1, 1, 1) || !read_write(confd, &c2, 1, 1) ||
+ !(size = c1 << 8 | c2) ||
+ !read_write(confd, payload, size, 1))
+@@ -1721,6 +1736,13 @@ unsigned char *tcp_request(int confd, time_t now,
+ if (size < (int)sizeof(struct dns_header))
+ continue;
+
++ query_count++;
++
++ /* log_query gets called indirectly all over the place, so
++ pass these in global variables - sorry. */
++ daemon->log_display_id = ++daemon->log_id;
++ daemon->log_source_addr = &peer_addr;
++
+ check_subnet = 0;
+
+ /* save state of "cd" flag in query */
+diff --git a/src/option.c b/src/option.c
+index 907d0cf88de9..b7372be0a090 100644
+--- a/src/option.c
++++ b/src/option.c
+@@ -149,6 +149,7 @@ struct myoption {
+ #define LOPT_LOOP_DETECT 337
+ #define LOPT_IGNORE_ADDR 338
+
++
+ #ifdef HAVE_GETOPT_LONG
+ static const struct option opts[] =
+ #else
+@@ -160,7 +161,7 @@ static const struct myoption opts[] =
+ { "no-poll", 0, 0, 'n' },
+ { "help", 0, 0, 'w' },
+ { "no-daemon", 0, 0, 'd' },
+- { "log-queries", 0, 0, 'q' },
++ { "log-queries", 2, 0, 'q' },
+ { "user", 2, 0, 'u' },
+ { "group", 2, 0, 'g' },
+ { "resolv-file", 2, 0, 'r' },
+@@ -357,7 +358,7 @@ static struct {
+ { LOPT_FORCE, ARG_DUP, "<optspec>", gettext_noop("DHCP option sent even if the client does not request it."), NULL},
+ { 'p', ARG_ONE, "<integer>", gettext_noop("Specify port to listen for DNS requests on (defaults to 53)."), NULL },
+ { 'P', ARG_ONE, "<integer>", gettext_noop("Maximum supported UDP packet size for EDNS.0 (defaults to %s)."), "*" },
+- { 'q', OPT_LOG, NULL, gettext_noop("Log DNS queries."), NULL },
++ { 'q', ARG_DUP, NULL, gettext_noop("Log DNS queries."), NULL },
+ { 'Q', ARG_ONE, "<integer>", gettext_noop("Force the originating port for upstream DNS queries."), NULL },
+ { 'R', OPT_NO_RESOLV, NULL, gettext_noop("Do NOT read resolv.conf."), NULL },
+ { 'r', ARG_DUP, "<path>", gettext_noop("Specify path to resolv.conf (defaults to %s)."), RESOLVFILE },
+@@ -2421,6 +2422,12 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
+ ret_err(gen_err);
+ break;
+
++ case 'q': /* --log-queries */
++ set_option_bool(OPT_LOG);
++ if (arg && strcmp(arg, "extra") == 0)
++ set_option_bool(OPT_EXTRALOG);
++ break;
++
+ case LOPT_MAX_LOGS: /* --log-async */
+ daemon->max_logs = LOG_MAX; /* default */
+ if (arg && !atoi_check(arg, &daemon->max_logs))
+--
+2.1.0
+
--- /dev/null
+From 28de38768e2c7d763b9aa5b7a4d251d5e56bab0b Mon Sep 17 00:00:00 2001
+From: RinSatsuki <aa65535@live.com>
+Date: Sat, 10 Jan 2015 15:22:21 +0000
+Subject: [PATCH 28/55] Add --min-cache-ttl option.
+
+---
+ CHANGELOG | 7 +++++++
+ man/dnsmasq.8 | 6 ++++++
+ src/cache.c | 4 +++-
+ src/config.h | 1 +
+ src/dnsmasq.h | 2 +-
+ src/option.c | 11 +++++++++++
+ 6 files changed, 29 insertions(+), 2 deletions(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index 0bbb7835df4f..23fc6d0530cf 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -43,6 +43,13 @@ version 2.73
+ Add --log-queries=extra option, which makes logs easier
+ to search automatically.
+
++ Add --min-cache-ttl option. I've resisted this for a long
++ time, on the grounds that disbelieving TTLs is never a
++ good idea, but I've been persuaded that there are
++ sometimes reasons to do it. (Step forward, GFW).
++ To avoid misuse, there's a hard limit on the TTL
++ floor of one hour. Thansk to RinSatsuki for the patch.
++
+
+ version 2.72
+ Add ra-advrouter mode, for RFC-3775 mobile IPv6 support.
+diff --git a/man/dnsmasq.8 b/man/dnsmasq.8
+index 227d74bd80e7..5cfa355dea4a 100644
+--- a/man/dnsmasq.8
++++ b/man/dnsmasq.8
+@@ -81,6 +81,12 @@ the upstream DNS servers.
+ .B --max-cache-ttl=<time>
+ Set a maximum TTL value for entries in the cache.
+ .TP
++.B --min-cache-ttl=<time>
++Extend short TTL values to the time given when caching them. Note that
++artificially extending TTL values is in general a bad idea, do not do it
++unless you have a good reason, and understand what you are doing.
++Dnsmasq limits the value of this option to one hour, unless recompiled.
++.TP
+ .B --auth-ttl=<time>
+ Set the TTL value returned in answers from the authoritative server.
+ .TP
+diff --git a/src/cache.c b/src/cache.c
+index 960bb7938778..945be071a0b6 100644
+--- a/src/cache.c
++++ b/src/cache.c
+@@ -461,9 +461,11 @@ struct crec *cache_insert(char *name, struct all_addr *addr,
+ if (flags & (F_IPV4 | F_IPV6 | F_CNAME))
+ {
+ log_query(flags | F_UPSTREAM, name, addr, NULL);
+- /* Don;t mess with TTL for DNSSEC records. */
++ /* Don't mess with TTL for DNSSEC records. */
+ if (daemon->max_cache_ttl != 0 && daemon->max_cache_ttl < ttl)
+ ttl = daemon->max_cache_ttl;
++ if (daemon->min_cache_ttl != 0 && daemon->min_cache_ttl > ttl)
++ ttl = daemon->min_cache_ttl;
+ }
+
+ /* if previous insertion failed give up now. */
+diff --git a/src/config.h b/src/config.h
+index 3b88d8193dca..cdca231b4079 100644
+--- a/src/config.h
++++ b/src/config.h
+@@ -27,6 +27,7 @@
+ #define RANDOM_SOCKS 64 /* max simultaneous random ports */
+ #define LEASE_RETRY 60 /* on error, retry writing leasefile after LEASE_RETRY seconds */
+ #define CACHESIZ 150 /* default cache size */
++#define TTL_FLOOR_LIMIT 3600 /* don't allow --min-cache-ttl to raise TTL above this under any circumstances */
+ #define MAXLEASES 1000 /* maximum number of DHCP leases */
+ #define PING_WAIT 3 /* wait for ping address-in-use test */
+ #define PING_CACHE_TIME 30 /* Ping test assumed to be valid this long. */
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index 4e9aea401b75..f8275e3ac479 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -943,7 +943,7 @@ extern struct daemon {
+ int max_logs; /* queue limit */
+ int cachesize, ftabsize;
+ int port, query_port, min_port;
+- unsigned long local_ttl, neg_ttl, max_ttl, max_cache_ttl, auth_ttl;
++ unsigned long local_ttl, neg_ttl, max_ttl, min_cache_ttl, max_cache_ttl, auth_ttl;
+ struct hostsfile *addn_hosts;
+ struct dhcp_context *dhcp, *dhcp6;
+ struct ra_interface *ra_interfaces;
+diff --git a/src/option.c b/src/option.c
+index b7372be0a090..8b994098cc9f 100644
+--- a/src/option.c
++++ b/src/option.c
+@@ -148,6 +148,7 @@ struct myoption {
+ #define LOPT_DNSSEC_TIME 336
+ #define LOPT_LOOP_DETECT 337
+ #define LOPT_IGNORE_ADDR 338
++#define LOPT_MINCTTL 339
+
+
+ #ifdef HAVE_GETOPT_LONG
+@@ -256,6 +257,7 @@ static const struct myoption opts[] =
+ { "dhcp-broadcast", 2, 0, LOPT_BROADCAST },
+ { "neg-ttl", 1, 0, LOPT_NEGTTL },
+ { "max-ttl", 1, 0, LOPT_MAXTTL },
++ { "min-cache-ttl", 1, 0, LOPT_MINCTTL },
+ { "max-cache-ttl", 1, 0, LOPT_MAXCTTL },
+ { "dhcp-alternate-port", 2, 0, LOPT_ALTPORT },
+ { "dhcp-scriptuser", 1, 0, LOPT_SCRIPTUSR },
+@@ -371,6 +373,8 @@ static struct {
+ { 'T', ARG_ONE, "<integer>", gettext_noop("Specify time-to-live in seconds for replies from /etc/hosts."), NULL },
+ { LOPT_NEGTTL, ARG_ONE, "<integer>", gettext_noop("Specify time-to-live in seconds for negative caching."), NULL },
+ { LOPT_MAXTTL, ARG_ONE, "<integer>", gettext_noop("Specify time-to-live in seconds for maximum TTL to send to clients."), NULL },
++ { LOPT_MAXCTTL, ARG_ONE, "<integer>", gettext_noop("Specify time-to-live ceiling for cache."), NULL },
++ { LOPT_MINCTTL, ARG_ONE, "<integer>", gettext_noop("Specify time-to-live floor for cache."), NULL },
+ { 'u', ARG_ONE, "<username>", gettext_noop("Change to this user after startup. (defaults to %s)."), CHUSER },
+ { 'U', ARG_DUP, "set:<tag>,<class>", gettext_noop("Map DHCP vendor class to tag."), NULL },
+ { 'v', 0, NULL, gettext_noop("Display dnsmasq version and copyright information."), NULL },
+@@ -2457,6 +2461,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
+ case 'T': /* --local-ttl */
+ case LOPT_NEGTTL: /* --neg-ttl */
+ case LOPT_MAXTTL: /* --max-ttl */
++ case LOPT_MINCTTL: /* --min-cache-ttl */
+ case LOPT_MAXCTTL: /* --max-cache-ttl */
+ case LOPT_AUTHTTL: /* --auth-ttl */
+ {
+@@ -2467,6 +2472,12 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
+ daemon->neg_ttl = (unsigned long)ttl;
+ else if (option == LOPT_MAXTTL)
+ daemon->max_ttl = (unsigned long)ttl;
++ else if (option == LOPT_MINCTTL)
++ {
++ if (ttl > TTL_FLOOR_LIMIT)
++ ttl = TTL_FLOOR_LIMIT;
++ daemon->min_cache_ttl = (unsigned long)ttl;
++ }
+ else if (option == LOPT_MAXCTTL)
+ daemon->max_cache_ttl = (unsigned long)ttl;
+ else if (option == LOPT_AUTHTTL)
+--
+2.1.0
+
--- /dev/null
+From 9f79ee4ae34886c0319f06d8f162b81ef79d62fb Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Mon, 12 Jan 2015 20:18:18 +0000
+Subject: [PATCH 29/55] Log port of requestor when doing extra logging.
+
+---
+ src/cache.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/cache.c b/src/cache.c
+index 945be071a0b6..09b6dbf8087a 100644
+--- a/src/cache.c
++++ b/src/cache.c
+@@ -1642,11 +1642,11 @@ void log_query(unsigned int flags, char *name, struct all_addr *addr, char *arg)
+
+ if (option_bool(OPT_EXTRALOG))
+ {
+- prettyprint_addr(daemon->log_source_addr, daemon->addrbuff2);
++ int port = prettyprint_addr(daemon->log_source_addr, daemon->addrbuff2);
+ if (flags & F_NOEXTRA)
+- my_syslog(LOG_INFO, "* %s %s %s %s %s", daemon->addrbuff2, source, name, verb, dest);
++ my_syslog(LOG_INFO, "* %s/%u %s %s %s %s", daemon->addrbuff2, port, source, name, verb, dest);
+ else
+- my_syslog(LOG_INFO, "%u %s %s %s %s %s", daemon->log_display_id, daemon->addrbuff2, source, name, verb, dest);
++ my_syslog(LOG_INFO, "%u %s/%u %s %s %s %s", daemon->log_display_id, daemon->addrbuff2, port, source, name, verb, dest);
+ }
+ else
+ my_syslog(LOG_INFO, "%s %s %s %s", source, name, verb, dest);
+--
+2.1.0
+
--- /dev/null
+From 5e321739db381a1d7b5964d76e9c81471d2564c9 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Mon, 12 Jan 2015 23:16:56 +0000
+Subject: [PATCH 30/55] Don't answer from cache RRsets from wildcards, as we
+ don't have NSECs.
+
+---
+ src/dnssec.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/src/dnssec.c b/src/dnssec.c
+index afb3dca38cb1..d39ab85ed966 100644
+--- a/src/dnssec.c
++++ b/src/dnssec.c
+@@ -1818,11 +1818,14 @@ int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, ch
+ struct blockdata *key;
+ struct crec *crecp;
+ char *wildname;
++ int have_wildcard = 0;
+
+ rc = validate_rrset(now, header, plen, class1, type1, name, keyname, &wildname, NULL, 0, 0, 0);
+
+ if (rc == STAT_SECURE_WILDCARD)
+ {
++ have_wildcard = 1;
++
+ /* An attacker replay a wildcard answer with a different
+ answer and overlay a genuine RR. To prove this
+ hasn't happened, the answer must prove that
+@@ -1913,7 +1916,11 @@ int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, ch
+ p2 += 13; /* labels, orig_ttl, expiration, inception */
+ GETSHORT(keytag, p2);
+
+- if ((key = blockdata_alloc((char*)psave, rdlen2)))
++ /* We don't cache sigs for wildcard answers, because to reproduce the
++ answer from the cache will require one or more NSEC/NSEC3 records
++ which we don't cache. The lack of the RRSIG ensures that a query for
++ this RRset asking for a secure answer will always be forwarded. */
++ if (!have_wildcard && (key = blockdata_alloc((char*)psave, rdlen2)))
+ {
+ if (!(crecp = cache_insert(name, &a, now, ttl, F_FORWARD | F_DNSKEY | F_DS)))
+ blockdata_free(key);
+--
+2.1.0
+
--- /dev/null
+From ae4624bf46b5e37ff1a9a2ba3c927e0dede95adb Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Mon, 12 Jan 2015 23:22:08 +0000
+Subject: [PATCH 31/55] Logs for DS records consistent.
+
+---
+ src/rfc1035.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/rfc1035.c b/src/rfc1035.c
+index 75c4266b47dd..262274fc5b80 100644
+--- a/src/rfc1035.c
++++ b/src/rfc1035.c
+@@ -1643,7 +1643,7 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
+ {
+ if (crecp->flags & F_NXDOMAIN)
+ nxdomain = 1;
+- log_query(F_UPSTREAM, name, NULL, "secure no DS");
++ log_query(F_UPSTREAM, name, NULL, "no DS");
+ }
+ else if ((keydata = blockdata_retrieve(crecp->addr.ds.keydata, crecp->addr.ds.keylen, NULL)))
+ {
+--
+2.1.0
+
--- /dev/null
+From 393415597c8b5b09558b789ab9ac238dbe3db65d Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sun, 18 Jan 2015 22:11:10 +0000
+Subject: [PATCH 32/55] Cope with multiple interfaces with the same LL address.
+
+---
+ CHANGELOG | 4 ++++
+ src/auth.c | 5 ++++-
+ src/util.c | 1 +
+ 3 files changed, 9 insertions(+), 1 deletion(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index 23fc6d0530cf..bbd7e6619689 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -49,6 +49,10 @@ version 2.73
+ sometimes reasons to do it. (Step forward, GFW).
+ To avoid misuse, there's a hard limit on the TTL
+ floor of one hour. Thansk to RinSatsuki for the patch.
++
++ Cope with multiple interfaces with the same link-local
++ address. (IPv6 addresses are scoped, so this is allowed.)
++ Thanks to Cory Benfield for help with this.
+
+
+ version 2.72
+diff --git a/src/auth.c b/src/auth.c
+index a327f16d8c0b..59e05d3da38e 100644
+--- a/src/auth.c
++++ b/src/auth.c
+@@ -413,7 +413,10 @@ size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t n
+ peer_addr->in.sin_port = 0;
+ #ifdef HAVE_IPV6
+ else
+- peer_addr->in6.sin6_port = 0;
++ {
++ peer_addr->in6.sin6_port = 0;
++ peer_addr->in6.sin6_scope_id = 0;
++ }
+ #endif
+
+ for (peers = daemon->auth_peers; peers; peers = peers->next)
+diff --git a/src/util.c b/src/util.c
+index a729f339e219..d532444da207 100644
+--- a/src/util.c
++++ b/src/util.c
+@@ -274,6 +274,7 @@ int sockaddr_isequal(union mysockaddr *s1, union mysockaddr *s2)
+ #ifdef HAVE_IPV6
+ if (s1->sa.sa_family == AF_INET6 &&
+ s1->in6.sin6_port == s2->in6.sin6_port &&
++ s1->in6.sin6_scope_id == s2->in6.sin6_scope_id &&
+ IN6_ARE_ADDR_EQUAL(&s1->in6.sin6_addr, &s2->in6.sin6_addr))
+ return 1;
+ #endif
+--
+2.1.0
+
--- /dev/null
+From 2ae195f5a71f7c5a75717845de1bd72fc7dd67f3 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sun, 18 Jan 2015 22:20:48 +0000
+Subject: [PATCH 33/55] Don't treat SERVFAIL as a recoverable error.....
+
+---
+ src/forward.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/forward.c b/src/forward.c
+index 713a64c0fa58..b17bc34f865f 100644
+--- a/src/forward.c
++++ b/src/forward.c
+@@ -737,7 +737,7 @@ void reply_query(int fd, int family, time_t now)
+ check_for_ignored_address(header, n, daemon->ignore_addr))
+ return;
+
+- if ((RCODE(header) == SERVFAIL || RCODE(header) == REFUSED) &&
++ if (RCODE(header) == REFUSED &&
+ !option_bool(OPT_ORDER) &&
+ forward->forwardall == 0)
+ /* for broken servers, attempt to send to another one. */
+--
+2.1.0
+
--- /dev/null
+From 5f4dc5c6ca50655ab14f572c7e30815ed74cd51a Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Tue, 20 Jan 2015 20:51:02 +0000
+Subject: [PATCH 34/55] Add --dhcp-hostsdir config option.
+
+---
+ CHANGELOG | 5 +++
+ man/dnsmasq.8 | 9 +++++
+ src/dnsmasq.c | 28 ++++++++++----
+ src/dnsmasq.h | 15 ++++++--
+ src/inotify.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
+ src/option.c | 22 +++++++++--
+ 6 files changed, 177 insertions(+), 21 deletions(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index bbd7e6619689..0076b557e95e 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -53,6 +53,11 @@ version 2.73
+ Cope with multiple interfaces with the same link-local
+ address. (IPv6 addresses are scoped, so this is allowed.)
+ Thanks to Cory Benfield for help with this.
++
++ Add --dhcp-hostsdir. This allows addition of new host
++ configurations to a running dnsmasq instance much more
++ cheaply than having dnsmasq re-read all its existing
++ configuration each time.
+
+
+ version 2.72
+diff --git a/man/dnsmasq.8 b/man/dnsmasq.8
+index 5cfa355dea4a..005b5cca8d1f 100644
+--- a/man/dnsmasq.8
++++ b/man/dnsmasq.8
+@@ -977,6 +977,15 @@ is given, then read all the files contained in that directory. The advantage of
+ using this option is the same as for --dhcp-hostsfile: the
+ dhcp-optsfile will be re-read when dnsmasq receives SIGHUP. Note that
+ it is possible to encode the information in a
++.TP
++.B --dhcp-hostsdir=<path>
++This is exactly equivalent to dhcp-hostfile, except for the following. The path MUST be a
++directory, and not an individual file. Changed or new files within
++the directory are read automatically, without the need to send SIGHUP.
++If a file is deleted for changed after it has been read by dnsmasq, then the
++host record it contained will remain until dnsmasq recieves a SIGHUP, or
++is restarted; ie host records are only added dynamically.
++.TP
+ .B --dhcp-boot
+ flag as DHCP options, using the options names bootfile-name,
+ server-ip-address and tftp-server. This allows these to be included
+diff --git a/src/dnsmasq.c b/src/dnsmasq.c
+index c0c0589d4ce1..04cc98278f62 100644
+--- a/src/dnsmasq.c
++++ b/src/dnsmasq.c
+@@ -142,6 +142,9 @@ int main (int argc, char **argv)
+ set_option_bool(OPT_NOWILD);
+ reset_option_bool(OPT_CLEVERBIND);
+ }
++
++ if (daemon->inotify_hosts)
++ die(_("dhcp-hostsdir not supported on this platform"), NULL, EC_BADCONF);
+ #endif
+
+ if (option_bool(OPT_DNSSEC_VALID))
+@@ -316,13 +319,16 @@ int main (int argc, char **argv)
+ #ifdef HAVE_DNSSEC
+ blockdata_init();
+ #endif
++ }
+
+ #ifdef HAVE_LINUX_NETWORK
+- if (!option_bool(OPT_NO_POLL))
+- inotify_dnsmasq_init();
++ if ((!option_bool(OPT_NO_POLL) && daemon->port != 0) ||
++ daemon->dhcp || daemon->doing_dhcp6)
++ inotify_dnsmasq_init();
++ else
++ daemon->inotifyfd = -1;
+ #endif
+- }
+-
++
+ if (option_bool(OPT_DBUS))
+ #ifdef HAVE_DBUS
+ {
+@@ -745,7 +751,7 @@ int main (int argc, char **argv)
+ #endif
+
+ #ifdef HAVE_TFTP
+- if (option_bool(OPT_TFTP))
++ if (option_bool(OPT_TFTP))
+ {
+ #ifdef FD_SETSIZE
+ if (FD_SETSIZE < (unsigned)max_fd)
+@@ -870,7 +876,7 @@ int main (int argc, char **argv)
+ #if defined(HAVE_LINUX_NETWORK)
+ FD_SET(daemon->netlinkfd, &rset);
+ bump_maxfd(daemon->netlinkfd, &maxfd);
+- if (daemon->port != 0 && !option_bool(OPT_NO_POLL))
++ if (daemon->inotifyfd != -1)
+ {
+ FD_SET(daemon->inotifyfd, &rset);
+ bump_maxfd(daemon->inotifyfd, &maxfd);
+@@ -943,8 +949,11 @@ int main (int argc, char **argv)
+ #endif
+
+ #ifdef HAVE_LINUX_NETWORK
+- if (daemon->port != 0 && !option_bool(OPT_NO_POLL) && FD_ISSET(daemon->inotifyfd, &rset) && inotify_check())
+- poll_resolv(1, 1, now);
++ if (daemon->inotifyfd != -1 && FD_ISSET(daemon->inotifyfd, &rset) && inotify_check(now))
++ {
++ if (daemon->port != 0 && !option_bool(OPT_NO_POLL))
++ poll_resolv(1, 1, now);
++ }
+ #else
+ /* Check for changes to resolv files once per second max. */
+ /* Don't go silent for long periods if the clock goes backwards. */
+@@ -1385,6 +1394,9 @@ void clear_cache_and_reload(time_t now)
+ if (option_bool(OPT_ETHERS))
+ dhcp_read_ethers();
+ reread_dhcp();
++#ifdef HAVE_LINUX_NETWORK
++ set_dhcp_inotify();
++#endif
+ dhcp_update_configs(daemon->dhcp_conf);
+ lease_update_from_configs();
+ lease_update_file(now);
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index f8275e3ac479..d841fdc064ad 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -550,13 +550,17 @@ struct resolvc {
+ #endif
+ };
+
+-/* adn-hosts parms from command-line (also dhcp-hostsfile and dhcp-optsfile */
++/* adn-hosts parms from command-line (also dhcp-hostsfile and dhcp-optsfile and dhcp-hostsdir*/
+ #define AH_DIR 1
+ #define AH_INACTIVE 2
++#define AH_WD_DONE 4
+ struct hostsfile {
+ struct hostsfile *next;
+ int flags;
+ char *fname;
++#ifdef HAVE_LINUX_NETWORK
++ int wd; /* inotify watch descriptor */
++#endif
+ unsigned int index; /* matches to cache entries for logging */
+ };
+
+@@ -961,7 +965,7 @@ extern struct daemon {
+ int doing_ra, doing_dhcp6;
+ struct dhcp_netid_list *dhcp_ignore, *dhcp_ignore_names, *dhcp_gen_names;
+ struct dhcp_netid_list *force_broadcast, *bootp_dynamic;
+- struct hostsfile *dhcp_hosts_file, *dhcp_opts_file;
++ struct hostsfile *dhcp_hosts_file, *dhcp_opts_file, *inotify_hosts;
+ int dhcp_max, tftp_max;
+ int dhcp_server_port, dhcp_client_port;
+ int start_tftp_port, end_tftp_port;
+@@ -1197,7 +1201,7 @@ void reset_option_bool(unsigned int opt);
+ struct hostsfile *expand_filelist(struct hostsfile *list);
+ char *parse_server(char *arg, union mysockaddr *addr,
+ union mysockaddr *source_addr, char *interface, int *flags);
+-
++int option_read_hostsfile(char *file);
+ /* forward.c */
+ void reply_query(int fd, int family, time_t now);
+ void receive_query(struct listener *listen, time_t now);
+@@ -1486,5 +1490,8 @@ int detect_loop(char *query, int type);
+ /* inotify.c */
+ #ifdef HAVE_LINUX_NETWORK
+ void inotify_dnsmasq_init();
+-int inotify_check(void);
++int inotify_check(time_t now);
++# ifdef HAVE_DHCP
++void set_dhcp_inotify(void);
++# endif
+ #endif
+diff --git a/src/inotify.c b/src/inotify.c
+index 83730008c11b..52a30d7f44db 100644
+--- a/src/inotify.c
++++ b/src/inotify.c
+@@ -19,6 +19,11 @@
+
+ #include <sys/inotify.h>
+
++#ifdef HAVE_DHCP
++static void check_for_dhcp_inotify(struct inotify_event *in, time_t now);
++#endif
++
++
+ /* the strategy is to set a inotify on the directories containing
+ resolv files, for any files in the directory which are close-write
+ or moved into the directory.
+@@ -40,8 +45,6 @@ void inotify_dnsmasq_init()
+ struct resolvc *res;
+
+ inotify_buffer = safe_malloc(INOTIFY_SZ);
+-
+-
+ daemon->inotifyfd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC);
+
+ if (daemon->inotifyfd == -1)
+@@ -66,6 +69,7 @@ void inotify_dnsmasq_init()
+ {
+ *d = 0; /* make path just directory */
+ res->wd = inotify_add_watch(daemon->inotifyfd, path, IN_CLOSE_WRITE | IN_MOVED_TO);
++
+ res->file = d+1; /* pointer to filename */
+ *d = '/';
+
+@@ -78,7 +82,7 @@ void inotify_dnsmasq_init()
+ }
+ }
+
+-int inotify_check(void)
++int inotify_check(time_t now)
+ {
+ int hit = 0;
+
+@@ -101,13 +105,116 @@ int inotify_check(void)
+ for (res = daemon->resolv_files; res; res = res->next)
+ if (res->wd == in->wd && in->len != 0 && strcmp(res->file, in->name) == 0)
+ hit = 1;
++
++#ifdef HAVE_DHCP
++ if (daemon->dhcp || daemon->doing_dhcp6)
++ check_for_dhcp_inotify(in, now);
++#endif
+ }
+ }
+-
+ return hit;
+ }
+
+-#endif
++#ifdef HAVE_DHCP
++/* initialisation for dhcp-hostdir. Set inotify watch for each directory, and read pre-existing files */
++void set_dhcp_inotify(void)
++{
++ struct hostsfile *ah;
+
+-
++ for (ah = daemon->inotify_hosts; ah; ah = ah->next)
++ {
++ DIR *dir_stream = NULL;
++ struct dirent *ent;
++ struct stat buf;
++
++ if (stat(ah->fname, &buf) == -1 || !(S_ISDIR(buf.st_mode)))
++ {
++ my_syslog(LOG_ERR, _("bad directory in dhcp-hostsdir %s"), ah->fname);
++ continue;
++ }
++
++ if (!(ah->flags & AH_WD_DONE))
++ {
++ ah->wd = inotify_add_watch(daemon->inotifyfd, ah->fname, IN_CLOSE_WRITE | IN_MOVED_TO);
++ ah->flags |= AH_WD_DONE;
++ }
++ /* Read contents of dir _after_ calling add_watch, in the ho[e of avoiding
++ a race which misses files being added as we start */
++ if (ah->wd == -1 || !(dir_stream = opendir(ah->fname)))
++ {
++ my_syslog(LOG_ERR, _("failed to create inotify for %s"), ah->fname);
++ continue;
++ }
++
++ while ((ent = readdir(dir_stream)))
++ {
++ size_t lendir = strlen(ah->fname);
++ size_t lenfile = strlen(ent->d_name);
++ char *path;
++
++ /* ignore emacs backups and dotfiles */
++ if (lenfile == 0 ||
++ ent->d_name[lenfile - 1] == '~' ||
++ (ent->d_name[0] == '#' && ent->d_name[lenfile - 1] == '#') ||
++ ent->d_name[0] == '.')
++ continue;
++
++ if ((path = whine_malloc(lendir + lenfile + 2)))
++ {
++ strcpy(path, ah->fname);
++ strcat(path, "/");
++ strcat(path, ent->d_name);
++
++ /* ignore non-regular files */
++ if (stat(path, &buf) != -1 && S_ISREG(buf.st_mode))
++ option_read_hostsfile(path);
++
++ free(path);
++ }
++ }
++ }
++}
++
++static void check_for_dhcp_inotify(struct inotify_event *in, time_t now)
++{
++ struct hostsfile *ah;
++
++ /* ignore emacs backups and dotfiles */
++ if (in->len == 0 ||
++ in->name[in->len - 1] == '~' ||
++ (in->name[0] == '#' && in->name[in->len - 1] == '#') ||
++ in->name[0] == '.')
++ return;
++
++ for (ah = daemon->inotify_hosts; ah; ah = ah->next)
++ if (ah->wd == in->wd)
++ {
++ size_t lendir = strlen(ah->fname);
++ char *path;
++
++ if ((path = whine_malloc(lendir + in->len + 2)))
++ {
++ strcpy(path, ah->fname);
++ strcat(path, "/");
++ strcat(path, in->name);
++
++ if (option_read_hostsfile(path))
++ {
++ /* Propogate the consequences of loading a new dhcp-host */
++ dhcp_update_configs(daemon->dhcp_conf);
++ lease_update_from_configs();
++ lease_update_file(now);
++ lease_update_dns(1);
++ }
++
++ free(path);
++ }
++
++ return;
++ }
++}
++
++#endif /* DHCP */
++
++#endif /* LINUX_NETWORK */
+
+diff --git a/src/option.c b/src/option.c
+index 8b994098cc9f..22e11c37d374 100644
+--- a/src/option.c
++++ b/src/option.c
+@@ -149,7 +149,7 @@ struct myoption {
+ #define LOPT_LOOP_DETECT 337
+ #define LOPT_IGNORE_ADDR 338
+ #define LOPT_MINCTTL 339
+-
++#define LOPT_DHCP_INOTIFY 340
+
+ #ifdef HAVE_GETOPT_LONG
+ static const struct option opts[] =
+@@ -248,6 +248,7 @@ static const struct myoption opts[] =
+ { "interface-name", 1, 0, LOPT_INTNAME },
+ { "dhcp-hostsfile", 1, 0, LOPT_DHCP_HOST },
+ { "dhcp-optsfile", 1, 0, LOPT_DHCP_OPTS },
++ { "dhcp-hostsdir", 1, 0, LOPT_DHCP_INOTIFY },
+ { "dhcp-no-override", 0, 0, LOPT_OVERRIDE },
+ { "tftp-port-range", 1, 0, LOPT_TFTPPORTS },
+ { "stop-dns-rebind", 0, 0, LOPT_REBIND },
+@@ -336,6 +337,7 @@ static struct {
+ { 'G', ARG_DUP, "<hostspec>", gettext_noop("Set address or hostname for a specified machine."), NULL },
+ { LOPT_DHCP_HOST, ARG_DUP, "<path>", gettext_noop("Read DHCP host specs from file."), NULL },
+ { LOPT_DHCP_OPTS, ARG_DUP, "<path>", gettext_noop("Read DHCP option specs from file."), NULL },
++ { LOPT_DHCP_INOTIFY, ARG_DUP, "<path>", gettext_noop("Read DHCP host specs from a directory."), NULL },
+ { LOPT_TAG_IF, ARG_DUP, "tag-expression", gettext_noop("Evaluate conditional tag expression."), NULL },
+ { 'h', OPT_NO_HOSTS, NULL, gettext_noop("Do NOT load %s file."), HOSTSFILE },
+ { 'H', ARG_DUP, "<path>", gettext_noop("Specify a hosts file to be read in addition to %s."), HOSTSFILE },
+@@ -1710,8 +1712,9 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
+ break;
+ #endif /* HAVE_DHCP */
+
+- case LOPT_DHCP_HOST: /* --dhcp-hostfile */
++ case LOPT_DHCP_HOST: /* --dhcp-hostsfile */
+ case LOPT_DHCP_OPTS: /* --dhcp-optsfile */
++ case LOPT_DHCP_INOTIFY: /* dhcp-hostsdir */
+ case 'H': /* --addn-hosts */
+ {
+ struct hostsfile *new = opt_malloc(sizeof(struct hostsfile));
+@@ -1734,6 +1737,12 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
+ new->next = daemon->dhcp_opts_file;
+ daemon->dhcp_opts_file = new;
+ }
++ else if (option == LOPT_DHCP_INOTIFY)
++ {
++ new->next = daemon->inotify_hosts;
++ daemon->inotify_hosts = new;
++ }
++
+ break;
+ }
+
+@@ -4042,6 +4051,13 @@ static void read_file(char *file, FILE *f, int hard_opt)
+ fclose(f);
+ }
+
++#ifdef HAVE_DHCP
++int option_read_hostsfile(char *file)
++{
++ return one_file(file, LOPT_BANK);
++}
++#endif
++
+ static int one_file(char *file, int hard_opt)
+ {
+ FILE *f;
+@@ -4139,7 +4155,7 @@ struct hostsfile *expand_filelist(struct hostsfile *list)
+
+ /* don't read this as a file */
+ ah->flags |= AH_INACTIVE;
+-
++
+ if (!(dir_stream = opendir(ah->fname)))
+ my_syslog(LOG_ERR, _("cannot access directory %s: %s"),
+ ah->fname, strerror(errno));
+--
+2.1.0
+
--- /dev/null
+From fbf01f7046e75f9aa73fd4aab2a94e43386d9052 Mon Sep 17 00:00:00 2001
+From: Conrad Kostecki <ck@conrad-kostecki.de>
+Date: Tue, 20 Jan 2015 21:07:56 +0000
+Subject: [PATCH 35/55] Update German translation.
+
+---
+ po/de.po | 101 +++++++++++++++++++++++++++++----------------------------------
+ 1 file changed, 47 insertions(+), 54 deletions(-)
+
+diff --git a/po/de.po b/po/de.po
+index e2317376d8a9..4c93c5b28ef2 100644
+--- a/po/de.po
++++ b/po/de.po
+@@ -9,10 +9,10 @@
+ # Simon Kelley <simon@thekelleys.org.uk>, 2005.
+ msgid ""
+ msgstr ""
+-"Project-Id-Version: dnsmasq 2.70\n"
++"Project-Id-Version: dnsmasq 2.73\n"
+ "Report-Msgid-Bugs-To: \n"
+ "POT-Creation-Date: 2009-06-18 12:24+0100\n"
+-"PO-Revision-Date: 2014-05-01 22:51+0100\n"
++"PO-Revision-Date: 2015-01-19 15:43+0100\n"
+ "Last-Translator: Conrad Kostecki <ck@conrad-kostecki.de>\n"
+ "Language-Team: German <de@li.org>\n"
+ "Language: de\n"
+@@ -20,12 +20,12 @@ msgstr ""
+ "Content-Type: text/plain; charset=UTF-8\n"
+ "Content-Transfer-Encoding: 8bit\n"
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+-"X-Generator: Poedit 1.6.5\n"
++"X-Generator: Poedit 1.7.3\n"
+ "X-Poedit-SourceCharset: UTF-8\n"
+
+ #: cache.c:505
+ msgid "Internal error in cache."
+-msgstr ""
++msgstr "Interner Fehler im Cache."
+
+ #: cache.c:908
+ #, c-format
+@@ -126,7 +126,7 @@ msgstr "Lokale abzuhörende Adresse(n) angeben."
+
+ #: option.c:319
+ msgid "Return ipaddr for all hosts in specified domains."
+-msgstr "IP-Adresse für alle Hosts in angebenen Domänen festlegen."
++msgstr "IP-Adresse für alle Hosts in angegebenen Domänen festlegen."
+
+ # FIXME: the English test is not to the point. Just use a shortened description
+ # from the manpage instead. -- MA
+@@ -310,18 +310,16 @@ msgid "Specify path to resolv.conf (defaults to %s)."
+ msgstr "Pfad zu resolv.conf festlegen (%s voreingestellt)."
+
+ #: option.c:362
+-#, fuzzy
+ msgid "Specify path to file with server= options"
+-msgstr "Dateipfad für Prozesskennung (PID) festlegen (Voreinstellung: %s)."
++msgstr " Dateipfad mit der Option server= angeben"
+
+ #: option.c:363
+ msgid "Specify address(es) of upstream servers with optional domains."
+ msgstr "Adresse(n) vorgelagerter Server festlegen, optional mit Domänen."
+
+ #: option.c:364
+-#, fuzzy
+ msgid "Specify address of upstream servers for reverse address queries"
+-msgstr "Adresse(n) vorgelagerter Server festlegen, optional mit Domänen."
++msgstr "Adresse(n) vorgelagerter Server festlegen, für reverse Adressanfragen"
+
+ #: option.c:365
+ msgid "Never forward queries to specified domains."
+@@ -657,23 +655,23 @@ msgstr "Spezifiziere eine Domain und Adressbereich für synthetisierte Namen"
+
+ #: option.c:446
+ msgid "Activate DNSSEC validation"
+-msgstr ""
++msgstr "Aktiviere DNSSEC-Validierung"
+
+ #: option.c:447
+ msgid "Specify trust anchor key digest."
+-msgstr ""
++msgstr "Spezifiziere Vertrauensursprung (Trust Anchor) der Schlüssel-Prüfdaten (Key Digest)."
+
+ #: option.c:448
+ msgid "Disable upstream checking for DNSSEC debugging."
+-msgstr ""
++msgstr "Deaktiviere die Überprüfung vorgelagerter Server für DNSSEC-Debugging"
+
+ #: option.c:449
+ msgid "Ensure answers without DNSSEC are in unsigned zones."
+-msgstr ""
++msgstr "Stellt sicher, dass Antworten ohne DNSSEC sich in einer unsignierten Zone befinden."
+
+ #: option.c:450
+ msgid "Don't check DNSSEC signature timestamps until first cache-reload"
+-msgstr ""
++msgstr "DNSSEC Signatur-Zeitstempel nicht prüfen, bis erstmalig der Cache neugeladen wird"
+
+ #: option.c:452
+ msgid "Specify DHCPv6 prefix class"
+@@ -697,11 +695,11 @@ msgstr "RA nicht protokollieren."
+
+ #: option.c:458
+ msgid "Accept queries only from directly-connected networks"
+-msgstr ""
++msgstr "Akzeptiere nur Anfragen von direkt verbundenen Netzwerken"
+
+ #: option.c:459
+ msgid "Detect and remove DNS forwarding loops"
+-msgstr ""
++msgstr "Erkennen und Entfernen von DNS-Weiterleitungsschleifen"
+
+ #: option.c:661
+ #, c-format
+@@ -958,18 +956,16 @@ msgid "Bad name in host-record"
+ msgstr "Unzulässiger Name in host-record"
+
+ #: option.c:3826
+-#, fuzzy
+ msgid "bad trust anchor"
+-msgstr "unzulässiger Portbereich"
++msgstr "unzulässiger Vertrauensursprung (Trust Anchor)"
+
+ #: option.c:3840
+ msgid "bad HEX in trust anchor"
+-msgstr ""
++msgstr "unzulässiger Hexwert in Vertrauensursprung (Trust Anchor)"
+
+ #: option.c:3850
+-#, fuzzy
+ msgid "unsupported option (check that dnsmasq was compiled with DHCP/TFTP/DNSSEC/DBus support)"
+-msgstr "unzulässige Option (prüfen Sie, ob dnsmasq mit DHCP/TFTP/DBus-Unterstützt übersetzt wurde)"
++msgstr "Nicht unterstützte Option (prüfen Sie, ob DNSMasq mit DHCP/TFTP/DNSSEC/DBus-Unterstützung übersetzt wurde)"
+
+ #: option.c:3909
+ msgid "missing \""
+@@ -988,7 +984,6 @@ msgid "missing parameter"
+ msgstr "fehler Parameter"
+
+ #: option.c:3972
+-#, fuzzy
+ msgid "illegal option"
+ msgstr "unzulässige Option"
+
+@@ -1110,7 +1105,7 @@ msgstr "möglichen DNS-Rebind-Angriff entdeckt: %s"
+
+ #: forward.c:1132 forward.c:1663
+ msgid "Ignoring query from non-local network"
+-msgstr ""
++msgstr "Ignoriere Anfragen vom nicht lokalen Netzwerk"
+
+ #: forward.c:2101
+ #, c-format
+@@ -1189,9 +1184,9 @@ msgid "using nameserver %s#%d for %s %s"
+ msgstr "Benutze Namensserver %s#%d für %s %s"
+
+ #: network.c:1483
+-#, fuzzy, c-format
++#, c-format
+ msgid "NOT using nameserver %s#%d - query loop detected"
+-msgstr "Benutze Namensserver %s#%d für %s %s"
++msgstr "Benutze Namensserver %s#%d NICHT - Anfragenschleife festgetellt"
+
+ #: network.c:1486
+ #, c-format
+@@ -1205,16 +1200,15 @@ msgstr "Benutze Namensserver %s#%d"
+
+ #: dnsmasq.c:154
+ msgid "No trust anchors provided for DNSSEC"
+-msgstr ""
++msgstr "Keine Vertrauensursprünge (Trust Anchor) für DNSSEC verfügbar"
+
+ #: dnsmasq.c:157
+ msgid "Cannot reduce cache size from default when DNSSEC enabled"
+-msgstr ""
++msgstr "Kann die Standard Cachegröße nicht verkleinern, wenn DNSSEC aktiviert ist"
+
+ #: dnsmasq.c:159
+-#, fuzzy
+ msgid "DNSSEC not available: set HAVE_DNSSEC in src/config.h"
+-msgstr "DBus nicht verfügbar: setzen Sie HAVE_DBUS in src/config.h"
++msgstr "DNSSEC nicht verfügbar: setzen Sie HAVE_DNSSEC in src/config.h"
+
+ #: dnsmasq.c:165
+ msgid "TFTP server not available: set HAVE_TFTP in src/config.h"
+@@ -1241,9 +1235,8 @@ msgid "authoritative DNS not available: set HAVE_AUTH in src/config.h"
+ msgstr "Authoritatives DNS nicht verfügbar: Es muss HAVE_AUTH in src/config.h gesetzt sein"
+
+ #: dnsmasq.c:193
+-#, fuzzy
+ msgid "Loop detection not available: set HAVE_LOOP in src/config.h"
+-msgstr "TFTP-Server nicht verfügbar, setzen Sie HAVE_TFTP in src/config.h"
++msgstr "Loop-Erkennung nicht verfügbar, setzen Sie HAVE_LOOP in src/config.h"
+
+ #: dnsmasq.c:201
+ msgid "zone serial must be configured in --auth-soa"
+@@ -1317,15 +1310,15 @@ msgstr "DBus-Unterstützung eingeschaltet: warte auf Systembus-Verbindung"
+
+ #: dnsmasq.c:672
+ msgid "DNS service limited to local subnets"
+-msgstr ""
++msgstr "DNS-Dienst auf lokale Subnetze eingeschränkt"
+
+ #: dnsmasq.c:677
+ msgid "DNSSEC validation enabled"
+-msgstr ""
++msgstr "DNSSEC-Validierung aktiviert"
+
+ #: dnsmasq.c:679
+ msgid "DNSSEC signature timestamps not checked until first cache reload"
+-msgstr ""
++msgstr "DNSSEC Signatur-Zeitstempel werden erst ab dem ersten Neuladen des Caches überprüft"
+
+ #: dnsmasq.c:684
+ #, c-format
+@@ -1366,7 +1359,7 @@ msgstr "DHCP, Sockets exklusiv an das Interface %s gebunden"
+ # FIXME: this and the next few must be full strings to be translatable - do not assemble in code"
+ #: dnsmasq.c:753
+ msgid "root is "
+-msgstr "Wurzel ist"
++msgstr "Wurzel ist "
+
+ #: dnsmasq.c:753
+ msgid "enabled"
+@@ -1432,7 +1425,7 @@ msgstr "Das TFTP-Verzeichnis %s ist nicht zugreifbar: %s"
+
+ #: dnsmasq.c:1151
+ msgid "now checking DNSSEC signature timestamps"
+-msgstr ""
++msgstr "Prüfe jetzt DNSSEC Signatur-Zeitstempel"
+
+ #: dnsmasq.c:1218
+ #, c-format
+@@ -1506,7 +1499,7 @@ msgstr "DHCP-Paket ohne Adresse an Schnittstelle %s empfangen"
+ #: dhcp.c:408
+ #, c-format
+ msgid "ARP-cache injection failed: %s"
+-msgstr ""
++msgstr "APR-Cache Injektion fehlgeschlagen: %s"
+
+ #: dhcp.c:506
+ #, c-format
+@@ -1763,13 +1756,13 @@ msgid "DHCP request for unsupported hardware type (%d) received on %s"
+ msgstr "DHCP-Anfrage für nicht unterstützen Hardwaretyp (%d) auf %s empfangen"
+
+ #: bpf.c:376
+-#, fuzzy, c-format
++#, c-format
+ msgid "cannot create PF_ROUTE socket: %s"
+-msgstr "kann DHCP-Socket nicht erzeugen: %s"
++msgstr "Kann PF_ROUTE socket nicht erzeugen: %s"
+
+ #: bpf.c:397
+ msgid "Unknown protocol version from route socket"
+-msgstr ""
++msgstr "Unbekannte Protokollversion vom Route Socket"
+
+ #: helper.c:153
+ msgid "lease() function missing in Lua script"
+@@ -2020,50 +2013,50 @@ msgstr "konnte IPset-Kontroll-Socket nicht erzeugen: %s"
+ #: blockdata.c:58
+ #, c-format
+ msgid "DNSSEC memory in use %u, max %u, allocated %u"
+-msgstr ""
++msgstr "DNSSEC Speicher in Benutzung %u, Max %u, zugewiesen %u"
+
+ #: tables.c:76
+ msgid "error: fill_addr missused"
+-msgstr ""
++msgstr "Fehler: fill_addr falsch verwendet"
+
+ #: tables.c:105
+-#, fuzzy, c-format
++#, c-format
+ msgid "failed to access pf devices: %s"
+-msgstr "konnte auf %s nicht zugreifen: %s"
++msgstr "konnte auf pf Geräte nicht zugreifen: %s"
+
+ #: tables.c:119
+-#, fuzzy, c-format
++#, c-format
+ msgid "warning: no opened pf devices %s"
+-msgstr "Warnung: Keine Adresse für die Schnittstelle %s gefunden"
++msgstr "Warnung: Keine geöffneten pf Geräte %s"
+
+ #: tables.c:127
+-#, fuzzy, c-format
++#, c-format
+ msgid "error: cannot use table name %s"
+-msgstr "kann Hostnamen nicht ermitteln: %s"
++msgstr "Fehler: Kann Tabellenname %s nicht benutzen"
+
+ #: tables.c:135
+ #, c-format
+ msgid "error: cannot strlcpy table name %s"
+-msgstr ""
++msgstr "Fehler: Kann den Tabellennamen %s nicht strlcpy"
+
+ #: tables.c:141
+ #, c-format
+ msgid "warning: pfr_add_tables: %s(%d)"
+-msgstr ""
++msgstr "Warnung: pfr_add_tables: %s(%d)"
+
+ #: tables.c:147
+ msgid "info: table created"
+-msgstr ""
++msgstr "Info: Tabelle erstellt"
+
+ #: tables.c:158
+ #, c-format
+ msgid "warning: DIOCR%sADDRS: %s"
+-msgstr ""
++msgstr "Warnung: DIOCR%sADDRS: %s"
+
+ #: tables.c:162
+-#, fuzzy, c-format
++#, c-format
+ msgid "%d addresses %s"
+-msgstr "Fehlerhafte Adresse"
++msgstr "%d Adressen %s"
+
+ #~ msgid "no interface with address %s"
+ #~ msgstr "keine Schnittstelle mit Adresse %s"
+--
+2.1.0
+
--- /dev/null
+From 61b838dd574c51d96fef100285a0d225824534f9 Mon Sep 17 00:00:00 2001
+From: Win King Wan <pinwing+dnsmasq@gmail.com>
+Date: Wed, 21 Jan 2015 20:41:48 +0000
+Subject: [PATCH 36/55] Don't reply to DHCPv6 SOLICIT messages when not
+ configured for statefull DHCPv6.
+
+---
+ CHANGELOG | 4 ++++
+ src/rfc3315.c | 13 +++++++++++++
+ 2 files changed, 17 insertions(+)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index 0076b557e95e..a4cb901e83ae 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -59,6 +59,10 @@ version 2.73
+ cheaply than having dnsmasq re-read all its existing
+ configuration each time.
+
++ Don't reply to DHCPv6 SOLICIT messages if we're not
++ configured to do stateful DHCPv6. Thanks to Win King Wan
++ for the patch.
++
+
+ version 2.72
+ Add ra-advrouter mode, for RFC-3775 mobile IPv6 support.
+diff --git a/src/rfc3315.c b/src/rfc3315.c
+index ddb390bf1136..e593ec9c362c 100644
+--- a/src/rfc3315.c
++++ b/src/rfc3315.c
+@@ -824,6 +824,19 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
+ }
+ else
+ {
++ /* Windows 8 always requests an address even if the Managed bit
++ in RA is 0 and it keeps retrying if it receives a reply
++ stating that no addresses are available. We solve this
++ by not replying at all if we're not configured to give any
++ addresses by DHCPv6. RFC 3315 17.2.1. appears to allow this. */
++
++ for (c = state->context; c; c = c->current)
++ if (!(c->flags & CONTEXT_RA_STATELESS))
++ break;
++
++ if (!c)
++ return 0;
++
+ /* no address, return error */
+ o1 = new_opt6(OPTION6_STATUS_CODE);
+ put_opt6_short(DHCP6NOADDRS);
+--
+2.1.0
+
--- /dev/null
+From 0491805d2ff6e7727f0272c94fd97d9897d1e22c Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Mon, 26 Jan 2015 11:23:43 +0000
+Subject: [PATCH 37/55] Allow inotify to be disabled at compile time on Linux.
+
+---
+ CHANGELOG | 4 +++-
+ src/config.h | 13 ++++++++++++-
+ src/dnsmasq.c | 21 +++++++++++++--------
+ src/dnsmasq.h | 11 +++++++----
+ src/inotify.c | 4 ++--
+ 5 files changed, 37 insertions(+), 16 deletions(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index a4cb901e83ae..c05dec63c587 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -9,7 +9,9 @@ version 2.73
+
+ Use inotify for checking on updates to /etc/resolv.conf and
+ friends under Linux. This fixes race conditions when the files are
+- updated rapidly and saves CPU by noy polling.
++ updated rapidly and saves CPU by noy polling. To build
++ a binary that runs on old Linux kernels without inotify,
++ use make COPTS=-DNO_INOTIFY
+
+ Fix breakage of --domain=<domain>,<subnet>,local - only reverse
+ queries were intercepted. THis appears to have been broken
+diff --git a/src/config.h b/src/config.h
+index cdca231b4079..5e5009271eba 100644
+--- a/src/config.h
++++ b/src/config.h
+@@ -115,6 +115,8 @@ HAVE_DNSSEC
+ HAVE_LOOP
+ include functionality to probe for and remove DNS forwarding loops.
+
++HAVE_INOTIFY
++ use the Linux inotify facility to efficiently re-read configuration files.
+
+ NO_IPV6
+ NO_TFTP
+@@ -123,6 +125,7 @@ NO_DHCP6
+ NO_SCRIPT
+ NO_LARGEFILE
+ NO_AUTH
++NO_INOTIFY
+ these are avilable to explictly disable compile time options which would
+ otherwise be enabled automatically (HAVE_IPV6, >2Gb file sizes) or
+ which are enabled by default in the distributed source tree. Building dnsmasq
+@@ -355,6 +358,10 @@ HAVE_SOCKADDR_SA_LEN
+ #undef HAVE_LOOP
+ #endif
+
++#if defined (HAVE_LINUX_NETWORK) && !defined(NO_INOTIFY)
++#define HAVE_INOTIFY
++#endif
++
+ /* Define a string indicating which options are in use.
+ DNSMASQP_COMPILE_OPTS is only defined in dnsmasq.c */
+
+@@ -428,7 +435,11 @@ static char *compile_opts =
+ #ifndef HAVE_LOOP
+ "no-"
+ #endif
+-"loop-detect";
++"loop-detect "
++#ifndef HAVE_INOTIFY
++"no-"
++#endif
++"inotify";
+
+
+ #endif
+diff --git a/src/dnsmasq.c b/src/dnsmasq.c
+index 04cc98278f62..bc4f47170705 100644
+--- a/src/dnsmasq.c
++++ b/src/dnsmasq.c
+@@ -142,7 +142,9 @@ int main (int argc, char **argv)
+ set_option_bool(OPT_NOWILD);
+ reset_option_bool(OPT_CLEVERBIND);
+ }
++#endif
+
++#ifndef HAVE_INOTIFY
+ if (daemon->inotify_hosts)
+ die(_("dhcp-hostsdir not supported on this platform"), NULL, EC_BADCONF);
+ #endif
+@@ -321,7 +323,7 @@ int main (int argc, char **argv)
+ #endif
+ }
+
+-#ifdef HAVE_LINUX_NETWORK
++#ifdef HAVE_INOTIFY
+ if ((!option_bool(OPT_NO_POLL) && daemon->port != 0) ||
+ daemon->dhcp || daemon->doing_dhcp6)
+ inotify_dnsmasq_init();
+@@ -802,7 +804,7 @@ int main (int argc, char **argv)
+
+ pid = getpid();
+
+-#ifdef HAVE_LINUX_NETWORK
++#ifdef HAVE_INOTIFY
+ /* Using inotify, have to select a resolv file at startup */
+ poll_resolv(1, 0, now);
+ #endif
+@@ -872,15 +874,18 @@ int main (int argc, char **argv)
+ bump_maxfd(daemon->icmp6fd, &maxfd);
+ }
+ #endif
+-
+-#if defined(HAVE_LINUX_NETWORK)
+- FD_SET(daemon->netlinkfd, &rset);
+- bump_maxfd(daemon->netlinkfd, &maxfd);
++
++#ifdef HAVE_INOTIFY
+ if (daemon->inotifyfd != -1)
+ {
+ FD_SET(daemon->inotifyfd, &rset);
+ bump_maxfd(daemon->inotifyfd, &maxfd);
+ }
++#endif
++
++#if defined(HAVE_LINUX_NETWORK)
++ FD_SET(daemon->netlinkfd, &rset);
++ bump_maxfd(daemon->netlinkfd, &maxfd);
+ #elif defined(HAVE_BSD_NETWORK)
+ FD_SET(daemon->routefd, &rset);
+ bump_maxfd(daemon->routefd, &maxfd);
+@@ -948,7 +953,7 @@ int main (int argc, char **argv)
+ route_sock();
+ #endif
+
+-#ifdef HAVE_LINUX_NETWORK
++#ifdef HAVE_INOTIFY
+ if (daemon->inotifyfd != -1 && FD_ISSET(daemon->inotifyfd, &rset) && inotify_check(now))
+ {
+ if (daemon->port != 0 && !option_bool(OPT_NO_POLL))
+@@ -1394,7 +1399,7 @@ void clear_cache_and_reload(time_t now)
+ if (option_bool(OPT_ETHERS))
+ dhcp_read_ethers();
+ reread_dhcp();
+-#ifdef HAVE_LINUX_NETWORK
++#ifdef HAVE_INOTIFY
+ set_dhcp_inotify();
+ #endif
+ dhcp_update_configs(daemon->dhcp_conf);
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index d841fdc064ad..8091634f69db 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -544,7 +544,7 @@ struct resolvc {
+ int is_default, logged;
+ time_t mtime;
+ char *name;
+-#ifdef HAVE_LINUX_NETWORK
++#ifdef HAVE_INOTIFY
+ int wd; /* inotify watch descriptor */
+ char *file; /* pointer to file part if path */
+ #endif
+@@ -558,7 +558,7 @@ struct hostsfile {
+ struct hostsfile *next;
+ int flags;
+ char *fname;
+-#ifdef HAVE_LINUX_NETWORK
++#ifdef HAVE_INOTIFY
+ int wd; /* inotify watch descriptor */
+ #endif
+ unsigned int index; /* matches to cache entries for logging */
+@@ -1013,8 +1013,11 @@ extern struct daemon {
+
+ /* DHCP state */
+ int dhcpfd, helperfd, pxefd;
++#ifdef HAVE_INOTIFY
++ int inotifyfd;
++#endif
+ #if defined(HAVE_LINUX_NETWORK)
+- int netlinkfd, inotifyfd;
++ int netlinkfd;
+ #elif defined(HAVE_BSD_NETWORK)
+ int dhcp_raw_fd, dhcp_icmp_fd, routefd;
+ #endif
+@@ -1488,7 +1491,7 @@ int detect_loop(char *query, int type);
+ #endif
+
+ /* inotify.c */
+-#ifdef HAVE_LINUX_NETWORK
++#ifdef HAVE_INOTIFY
+ void inotify_dnsmasq_init();
+ int inotify_check(time_t now);
+ # ifdef HAVE_DHCP
+diff --git a/src/inotify.c b/src/inotify.c
+index 52a30d7f44db..818fe8eddda4 100644
+--- a/src/inotify.c
++++ b/src/inotify.c
+@@ -15,7 +15,7 @@
+ */
+
+ #include "dnsmasq.h"
+-#ifdef HAVE_LINUX_NETWORK
++#ifdef HAVE_INOTIFY
+
+ #include <sys/inotify.h>
+
+@@ -216,5 +216,5 @@ static void check_for_dhcp_inotify(struct inotify_event *in, time_t now)
+
+ #endif /* DHCP */
+
+-#endif /* LINUX_NETWORK */
++#endif /* INOTIFY */
+
+--
+2.1.0
+
--- /dev/null
+From 70d1873dd9e70041ed4bb88c69d5b886b7cc634c Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sat, 31 Jan 2015 19:59:29 +0000
+Subject: [PATCH 38/55] Expand inotify code to dhcp-hostsdir, dhcp-optsdir and
+ hostsdir.
+
+---
+ src/cache.c | 81 +++++++++++++++++---------
+ src/dnsmasq.c | 9 ++-
+ src/dnsmasq.h | 14 +++--
+ src/inotify.c | 179 +++++++++++++++++++++++++++++-----------------------------
+ src/option.c | 37 +++++++++---
+ 5 files changed, 187 insertions(+), 133 deletions(-)
+
+diff --git a/src/cache.c b/src/cache.c
+index 09b6dbf8087a..abaf25ec0f18 100644
+--- a/src/cache.c
++++ b/src/cache.c
+@@ -835,27 +835,42 @@ static void add_hosts_entry(struct crec *cache, struct all_addr *addr, int addrl
+ Only insert each unique address once into this hashing structure.
+
+ This complexity avoids O(n^2) divergent CPU use whilst reading
+- large (10000 entry) hosts files. */
+-
+- /* hash address */
+- for (j = 0, i = 0; i < addrlen; i++)
+- j = (j*2 +((unsigned char *)addr)[i]) % hashsz;
+-
+- for (lookup = rhash[j]; lookup; lookup = lookup->next)
+- if ((lookup->flags & cache->flags & (F_IPV4 | F_IPV6)) &&
+- memcmp(&lookup->addr.addr, addr, addrlen) == 0)
+- {
+- cache->flags &= ~F_REVERSE;
+- break;
+- }
++ large (10000 entry) hosts files.
++
++ Note that we only do this process when bulk-reading hosts files,
++ for incremental reads, rhash is NULL, and we use cache lookups
++ instead.
++ */
+
+- /* maintain address hash chain, insert new unique address */
+- if (!lookup)
++ if (rhash)
+ {
+- cache->next = rhash[j];
+- rhash[j] = cache;
++ /* hash address */
++ for (j = 0, i = 0; i < addrlen; i++)
++ j = (j*2 +((unsigned char *)addr)[i]) % hashsz;
++
++ for (lookup = rhash[j]; lookup; lookup = lookup->next)
++ if ((lookup->flags & cache->flags & (F_IPV4 | F_IPV6)) &&
++ memcmp(&lookup->addr.addr, addr, addrlen) == 0)
++ {
++ cache->flags &= ~F_REVERSE;
++ break;
++ }
++
++ /* maintain address hash chain, insert new unique address */
++ if (!lookup)
++ {
++ cache->next = rhash[j];
++ rhash[j] = cache;
++ }
+ }
+-
++ else
++ {
++ /* incremental read, lookup in cache */
++ lookup = cache_find_by_addr(NULL, addr, 0, cache->flags & (F_IPV4 | F_IPV6));
++ if (lookup && lookup->flags & F_HOSTS)
++ cache->flags &= ~F_REVERSE;
++ }
++
+ cache->uid = index;
+ memcpy(&cache->addr.addr, addr, addrlen);
+ cache_hash(cache);
+@@ -912,7 +927,7 @@ static int gettok(FILE *f, char *token)
+ }
+ }
+
+-static int read_hostsfile(char *filename, unsigned int index, int cache_size, struct crec **rhash, int hashsz)
++int read_hostsfile(char *filename, unsigned int index, int cache_size, struct crec **rhash, int hashsz)
+ {
+ FILE *f = fopen(filename, "r");
+ char *token = daemon->namebuff, *domain_suffix = NULL;
+@@ -958,7 +973,7 @@ static int read_hostsfile(char *filename, unsigned int index, int cache_size, st
+ addr_count++;
+
+ /* rehash every 1000 names. */
+- if ((name_count - cache_size) > 1000)
++ if (rhash && ((name_count - cache_size) > 1000))
+ {
+ rehash(name_count);
+ cache_size = name_count;
+@@ -1005,10 +1020,13 @@ static int read_hostsfile(char *filename, unsigned int index, int cache_size, st
+ }
+
+ fclose(f);
+- rehash(name_count);
+-
+- my_syslog(LOG_INFO, _("read %s - %d addresses"), filename, addr_count);
+
++ if (rhash)
++ {
++ rehash(name_count);
++ my_syslog(LOG_INFO, _("read %s - %d addresses"), filename, addr_count);
++ }
++
+ return name_count;
+ }
+
+@@ -1118,14 +1136,19 @@ void cache_reload(void)
+ my_syslog(LOG_INFO, _("cleared cache"));
+ return;
+ }
+-
++
+ if (!option_bool(OPT_NO_HOSTS))
+ total_size = read_hostsfile(HOSTSFILE, SRC_HOSTS, total_size, (struct crec **)daemon->packet, revhashsz);
+-
++
+ daemon->addn_hosts = expand_filelist(daemon->addn_hosts);
+ for (ah = daemon->addn_hosts; ah; ah = ah->next)
+ if (!(ah->flags & AH_INACTIVE))
+ total_size = read_hostsfile(ah->fname, ah->index, total_size, (struct crec **)daemon->packet, revhashsz);
++
++#ifdef HAVE_INOTIFY
++ set_dynamic_inotify(AH_HOSTS, total_size, (struct crec **)daemon->packet, revhashsz);
++#endif
++
+ }
+
+ #ifdef HAVE_DHCP
+@@ -1505,7 +1528,13 @@ char *record_source(unsigned int index)
+ for (ah = daemon->addn_hosts; ah; ah = ah->next)
+ if (ah->index == index)
+ return ah->fname;
+-
++
++#ifdef HAVE_INOTIFY
++ for (ah = daemon->dynamic_dirs; ah; ah = ah->next)
++ if (ah->index == index)
++ return ah->fname;
++#endif
++
+ return "<unknown>";
+ }
+
+diff --git a/src/dnsmasq.c b/src/dnsmasq.c
+index bc4f47170705..2c629fe422aa 100644
+--- a/src/dnsmasq.c
++++ b/src/dnsmasq.c
+@@ -145,8 +145,8 @@ int main (int argc, char **argv)
+ #endif
+
+ #ifndef HAVE_INOTIFY
+- if (daemon->inotify_hosts)
+- die(_("dhcp-hostsdir not supported on this platform"), NULL, EC_BADCONF);
++ if (daemon->dynamic_dirs)
++ die(_("dhcp-hostsdir, dhcp-optsdir and hostsdir are not supported on this platform"), NULL, EC_BADCONF);
+ #endif
+
+ if (option_bool(OPT_DNSSEC_VALID))
+@@ -324,8 +324,7 @@ int main (int argc, char **argv)
+ }
+
+ #ifdef HAVE_INOTIFY
+- if ((!option_bool(OPT_NO_POLL) && daemon->port != 0) ||
+- daemon->dhcp || daemon->doing_dhcp6)
++ if (daemon->port != 0 || daemon->dhcp || daemon->doing_dhcp6)
+ inotify_dnsmasq_init();
+ else
+ daemon->inotifyfd = -1;
+@@ -1400,7 +1399,7 @@ void clear_cache_and_reload(time_t now)
+ dhcp_read_ethers();
+ reread_dhcp();
+ #ifdef HAVE_INOTIFY
+- set_dhcp_inotify();
++ set_dynamic_inotify(AH_DHCP_HST | AH_DHCP_OPT, 0, NULL, 0);
+ #endif
+ dhcp_update_configs(daemon->dhcp_conf);
+ lease_update_from_configs();
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index 8091634f69db..0c322a93993e 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -554,6 +554,9 @@ struct resolvc {
+ #define AH_DIR 1
+ #define AH_INACTIVE 2
+ #define AH_WD_DONE 4
++#define AH_HOSTS 8
++#define AH_DHCP_HST 16
++#define AH_DHCP_OPT 32
+ struct hostsfile {
+ struct hostsfile *next;
+ int flags;
+@@ -965,7 +968,7 @@ extern struct daemon {
+ int doing_ra, doing_dhcp6;
+ struct dhcp_netid_list *dhcp_ignore, *dhcp_ignore_names, *dhcp_gen_names;
+ struct dhcp_netid_list *force_broadcast, *bootp_dynamic;
+- struct hostsfile *dhcp_hosts_file, *dhcp_opts_file, *inotify_hosts;
++ struct hostsfile *dhcp_hosts_file, *dhcp_opts_file, *dynamic_dirs;
+ int dhcp_max, tftp_max;
+ int dhcp_server_port, dhcp_client_port;
+ int start_tftp_port, end_tftp_port;
+@@ -1071,6 +1074,8 @@ int cache_make_stat(struct txt_record *t);
+ char *cache_get_name(struct crec *crecp);
+ char *cache_get_cname_target(struct crec *crecp);
+ struct crec *cache_enumerate(int init);
++int read_hostsfile(char *filename, unsigned int index, int cache_size,
++ struct crec **rhash, int hashsz);
+
+ /* blockdata.c */
+ #ifdef HAVE_DNSSEC
+@@ -1204,7 +1209,8 @@ void reset_option_bool(unsigned int opt);
+ struct hostsfile *expand_filelist(struct hostsfile *list);
+ char *parse_server(char *arg, union mysockaddr *addr,
+ union mysockaddr *source_addr, char *interface, int *flags);
+-int option_read_hostsfile(char *file);
++int option_read_dynfile(char *file, int flags);
++
+ /* forward.c */
+ void reply_query(int fd, int family, time_t now);
+ void receive_query(struct listener *listen, time_t now);
+@@ -1494,7 +1500,5 @@ int detect_loop(char *query, int type);
+ #ifdef HAVE_INOTIFY
+ void inotify_dnsmasq_init();
+ int inotify_check(time_t now);
+-# ifdef HAVE_DHCP
+-void set_dhcp_inotify(void);
+-# endif
++void set_dynamic_inotify(int flag, int total_size, struct crec **rhash, int revhashsz);
+ #endif
+diff --git a/src/inotify.c b/src/inotify.c
+index 818fe8eddda4..c537f4c1562a 100644
+--- a/src/inotify.c
++++ b/src/inotify.c
+@@ -19,11 +19,6 @@
+
+ #include <sys/inotify.h>
+
+-#ifdef HAVE_DHCP
+-static void check_for_dhcp_inotify(struct inotify_event *in, time_t now);
+-#endif
+-
+-
+ /* the strategy is to set a inotify on the directories containing
+ resolv files, for any files in the directory which are close-write
+ or moved into the directory.
+@@ -82,57 +77,28 @@ void inotify_dnsmasq_init()
+ }
+ }
+
+-int inotify_check(time_t now)
++
++/* initialisation for dynamic-dir. Set inotify watch for each directory, and read pre-existing files */
++void set_dynamic_inotify(int flag, int total_size, struct crec **rhash, int revhashsz)
+ {
+- int hit = 0;
++ struct hostsfile *ah;
+
+- while (1)
++ for (ah = daemon->dynamic_dirs; ah; ah = ah->next)
+ {
+- int rc;
+- char *p;
+- struct resolvc *res;
+- struct inotify_event *in;
+-
+- while ((rc = read(daemon->inotifyfd, inotify_buffer, INOTIFY_SZ)) == -1 && errno == EINTR);
+-
+- if (rc <= 0)
+- break;
+-
+- for (p = inotify_buffer; rc - (p - inotify_buffer) >= (int)sizeof(struct inotify_event); p += sizeof(struct inotify_event) + in->len)
++ DIR *dir_stream = NULL;
++ struct dirent *ent;
++ struct stat buf;
++
++ if (!(ah->flags & flag))
++ continue;
++
++ if (stat(ah->fname, &buf) == -1 || !(S_ISDIR(buf.st_mode)))
+ {
+- in = (struct inotify_event*)p;
+-
+- for (res = daemon->resolv_files; res; res = res->next)
+- if (res->wd == in->wd && in->len != 0 && strcmp(res->file, in->name) == 0)
+- hit = 1;
+-
+-#ifdef HAVE_DHCP
+- if (daemon->dhcp || daemon->doing_dhcp6)
+- check_for_dhcp_inotify(in, now);
+-#endif
++ my_syslog(LOG_ERR, _("bad dynamic directory %s: %s"),
++ ah->fname, strerror(errno));
++ continue;
+ }
+- }
+- return hit;
+-}
+-
+-#ifdef HAVE_DHCP
+-/* initialisation for dhcp-hostdir. Set inotify watch for each directory, and read pre-existing files */
+-void set_dhcp_inotify(void)
+-{
+- struct hostsfile *ah;
+-
+- for (ah = daemon->inotify_hosts; ah; ah = ah->next)
+- {
+- DIR *dir_stream = NULL;
+- struct dirent *ent;
+- struct stat buf;
+-
+- if (stat(ah->fname, &buf) == -1 || !(S_ISDIR(buf.st_mode)))
+- {
+- my_syslog(LOG_ERR, _("bad directory in dhcp-hostsdir %s"), ah->fname);
+- continue;
+- }
+-
++
+ if (!(ah->flags & AH_WD_DONE))
+ {
+ ah->wd = inotify_add_watch(daemon->inotifyfd, ah->fname, IN_CLOSE_WRITE | IN_MOVED_TO);
+@@ -142,7 +108,8 @@ void set_dhcp_inotify(void)
+ a race which misses files being added as we start */
+ if (ah->wd == -1 || !(dir_stream = opendir(ah->fname)))
+ {
+- my_syslog(LOG_ERR, _("failed to create inotify for %s"), ah->fname);
++ my_syslog(LOG_ERR, _("failed to create inotify for %s: %s"),
++ ah->fname, strerror(errno));
+ continue;
+ }
+
+@@ -167,54 +134,90 @@ void set_dhcp_inotify(void)
+
+ /* ignore non-regular files */
+ if (stat(path, &buf) != -1 && S_ISREG(buf.st_mode))
+- option_read_hostsfile(path);
+-
++ {
++ if (ah->flags & AH_HOSTS)
++ total_size = read_hostsfile(path, ah->index, total_size, rhash, revhashsz);
++#ifdef HAVE_DHCP
++ else if (ah->flags & (AH_DHCP_HST | AH_DHCP_OPT))
++ option_read_dynfile(path, ah->flags);
++#endif
++ }
++
+ free(path);
+ }
+ }
+ }
+ }
+
+-static void check_for_dhcp_inotify(struct inotify_event *in, time_t now)
++int inotify_check(time_t now)
+ {
++ int hit = 0;
+ struct hostsfile *ah;
+
+- /* ignore emacs backups and dotfiles */
+- if (in->len == 0 ||
+- in->name[in->len - 1] == '~' ||
+- (in->name[0] == '#' && in->name[in->len - 1] == '#') ||
+- in->name[0] == '.')
+- return;
+-
+- for (ah = daemon->inotify_hosts; ah; ah = ah->next)
+- if (ah->wd == in->wd)
+- {
+- size_t lendir = strlen(ah->fname);
+- char *path;
+-
+- if ((path = whine_malloc(lendir + in->len + 2)))
+- {
+- strcpy(path, ah->fname);
+- strcat(path, "/");
+- strcat(path, in->name);
+-
+- if (option_read_hostsfile(path))
++ while (1)
++ {
++ int rc;
++ char *p;
++ struct resolvc *res;
++ struct inotify_event *in;
++
++ while ((rc = read(daemon->inotifyfd, inotify_buffer, INOTIFY_SZ)) == -1 && errno == EINTR);
++
++ if (rc <= 0)
++ break;
++
++ for (p = inotify_buffer; rc - (p - inotify_buffer) >= (int)sizeof(struct inotify_event); p += sizeof(struct inotify_event) + in->len)
++ {
++ in = (struct inotify_event*)p;
++
++ for (res = daemon->resolv_files; res; res = res->next)
++ if (res->wd == in->wd && in->len != 0 && strcmp(res->file, in->name) == 0)
++ hit = 1;
++
++ /* ignore emacs backups and dotfiles */
++ if (in->len == 0 ||
++ in->name[in->len - 1] == '~' ||
++ (in->name[0] == '#' && in->name[in->len - 1] == '#') ||
++ in->name[0] == '.')
++ continue;
++
++ for (ah = daemon->dynamic_dirs; ah; ah = ah->next)
++ if (ah->wd == in->wd)
+ {
+- /* Propogate the consequences of loading a new dhcp-host */
+- dhcp_update_configs(daemon->dhcp_conf);
+- lease_update_from_configs();
+- lease_update_file(now);
+- lease_update_dns(1);
++ size_t lendir = strlen(ah->fname);
++ char *path;
++
++ if ((path = whine_malloc(lendir + in->len + 2)))
++ {
++ strcpy(path, ah->fname);
++ strcat(path, "/");
++ strcat(path, in->name);
++
++ if (ah->flags & AH_HOSTS)
++ read_hostsfile(path, ah->index, 0, NULL, 0);
++#ifdef HAVE_DHCP
++ else if (ah->flags & AH_DHCP_HST)
++ {
++ if (option_read_dynfile(path, AH_DHCP_HST))
++ {
++ /* Propogate the consequences of loading a new dhcp-host */
++ dhcp_update_configs(daemon->dhcp_conf);
++ lease_update_from_configs();
++ lease_update_file(now);
++ lease_update_dns(1);
++ }
++ }
++ else if (ah->flags & AH_DHCP_OPT)
++ option_read_dynfile(path, AH_DHCP_OPT);
++#endif
++
++ free(path);
++ }
+ }
+-
+- free(path);
+- }
+-
+- return;
+- }
++ }
++ }
++ return hit;
+ }
+
+-#endif /* DHCP */
+-
+ #endif /* INOTIFY */
+
+diff --git a/src/option.c b/src/option.c
+index 22e11c37d374..6ef80117cc8c 100644
+--- a/src/option.c
++++ b/src/option.c
+@@ -150,6 +150,8 @@ struct myoption {
+ #define LOPT_IGNORE_ADDR 338
+ #define LOPT_MINCTTL 339
+ #define LOPT_DHCP_INOTIFY 340
++#define LOPT_DHOPT_INOTIFY 341
++#define LOPT_HOST_INOTIFY 342
+
+ #ifdef HAVE_GETOPT_LONG
+ static const struct option opts[] =
+@@ -200,6 +202,7 @@ static const struct myoption opts[] =
+ { "local-ttl", 1, 0, 'T' },
+ { "no-negcache", 0, 0, 'N' },
+ { "addn-hosts", 1, 0, 'H' },
++ { "hostsdir", 1, 0, LOPT_HOST_INOTIFY },
+ { "query-port", 1, 0, 'Q' },
+ { "except-interface", 1, 0, 'I' },
+ { "no-dhcp-interface", 1, 0, '2' },
+@@ -249,6 +252,7 @@ static const struct myoption opts[] =
+ { "dhcp-hostsfile", 1, 0, LOPT_DHCP_HOST },
+ { "dhcp-optsfile", 1, 0, LOPT_DHCP_OPTS },
+ { "dhcp-hostsdir", 1, 0, LOPT_DHCP_INOTIFY },
++ { "dhcp-optsdir", 1, 0, LOPT_DHOPT_INOTIFY },
+ { "dhcp-no-override", 0, 0, LOPT_OVERRIDE },
+ { "tftp-port-range", 1, 0, LOPT_TFTPPORTS },
+ { "stop-dns-rebind", 0, 0, LOPT_REBIND },
+@@ -338,9 +342,11 @@ static struct {
+ { LOPT_DHCP_HOST, ARG_DUP, "<path>", gettext_noop("Read DHCP host specs from file."), NULL },
+ { LOPT_DHCP_OPTS, ARG_DUP, "<path>", gettext_noop("Read DHCP option specs from file."), NULL },
+ { LOPT_DHCP_INOTIFY, ARG_DUP, "<path>", gettext_noop("Read DHCP host specs from a directory."), NULL },
++ { LOPT_DHOPT_INOTIFY, ARG_DUP, "<path>", gettext_noop("Read DHCP options from a directory."), NULL },
+ { LOPT_TAG_IF, ARG_DUP, "tag-expression", gettext_noop("Evaluate conditional tag expression."), NULL },
+ { 'h', OPT_NO_HOSTS, NULL, gettext_noop("Do NOT load %s file."), HOSTSFILE },
+ { 'H', ARG_DUP, "<path>", gettext_noop("Specify a hosts file to be read in addition to %s."), HOSTSFILE },
++ { LOPT_HOST_INOTIFY, ARG_DUP, "<path>", gettext_noop("Read hosts files from a directory."), NULL },
+ { 'i', ARG_DUP, "<interface>", gettext_noop("Specify interface(s) to listen on."), NULL },
+ { 'I', ARG_DUP, "<interface>", gettext_noop("Specify interface(s) NOT to listen on.") , NULL },
+ { 'j', ARG_DUP, "set:<tag>,<class>", gettext_noop("Map DHCP user class to tag."), NULL },
+@@ -1712,10 +1718,12 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
+ break;
+ #endif /* HAVE_DHCP */
+
+- case LOPT_DHCP_HOST: /* --dhcp-hostsfile */
+- case LOPT_DHCP_OPTS: /* --dhcp-optsfile */
+- case LOPT_DHCP_INOTIFY: /* dhcp-hostsdir */
+- case 'H': /* --addn-hosts */
++ case LOPT_DHCP_HOST: /* --dhcp-hostsfile */
++ case LOPT_DHCP_OPTS: /* --dhcp-optsfile */
++ case LOPT_DHCP_INOTIFY: /* --dhcp-hostsdir */
++ case LOPT_DHOPT_INOTIFY: /* --dhcp-optsdir */
++ case LOPT_HOST_INOTIFY: /* --hostsdir */
++ case 'H': /* --addn-hosts */
+ {
+ struct hostsfile *new = opt_malloc(sizeof(struct hostsfile));
+ static unsigned int hosts_index = SRC_AH;
+@@ -1737,10 +1745,16 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
+ new->next = daemon->dhcp_opts_file;
+ daemon->dhcp_opts_file = new;
+ }
+- else if (option == LOPT_DHCP_INOTIFY)
++ else
+ {
+- new->next = daemon->inotify_hosts;
+- daemon->inotify_hosts = new;
++ new->next = daemon->dynamic_dirs;
++ daemon->dynamic_dirs = new;
++ if (option == LOPT_DHCP_INOTIFY)
++ new->flags |= AH_DHCP_HST;
++ else if (option == LOPT_DHOPT_INOTIFY)
++ new->flags |= AH_DHCP_OPT;
++ else if (option == LOPT_HOST_INOTIFY)
++ new->flags |= AH_HOSTS;
+ }
+
+ break;
+@@ -4052,9 +4066,14 @@ static void read_file(char *file, FILE *f, int hard_opt)
+ }
+
+ #ifdef HAVE_DHCP
+-int option_read_hostsfile(char *file)
++int option_read_dynfile(char *file, int flags)
+ {
+- return one_file(file, LOPT_BANK);
++ if (flags & AH_DHCP_HST)
++ return one_file(file, LOPT_BANK);
++ else if (flags & AH_DHCP_OPT)
++ return one_file(file, LOPT_OPTS);
++
++ return 0;
+ }
+ #endif
+
+--
+2.1.0
+
--- /dev/null
+From aff3396280e944833f0e23d834aa6acd5fe2605a Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sat, 31 Jan 2015 20:13:40 +0000
+Subject: [PATCH 39/55] Update copyrights for dawn of 2015.
+
+---
+ Makefile | 2 +-
+ src/auth.c | 2 +-
+ src/blockdata.c | 2 +-
+ src/bpf.c | 2 +-
+ src/cache.c | 2 +-
+ src/config.h | 2 +-
+ src/conntrack.c | 2 +-
+ src/dbus.c | 2 +-
+ src/dhcp-common.c | 2 +-
+ src/dhcp-protocol.h | 2 +-
+ src/dhcp.c | 2 +-
+ src/dhcp6-protocol.h | 2 +-
+ src/dhcp6.c | 2 +-
+ src/dns-protocol.h | 2 +-
+ src/dnsmasq.c | 2 +-
+ src/dnsmasq.h | 4 ++--
+ src/dnssec.c | 2 +-
+ src/domain.c | 2 +-
+ src/forward.c | 2 +-
+ src/helper.c | 2 +-
+ src/inotify.c | 2 +-
+ src/ip6addr.h | 2 +-
+ src/lease.c | 2 +-
+ src/log.c | 2 +-
+ src/loop.c | 2 +-
+ src/netlink.c | 2 +-
+ src/network.c | 2 +-
+ src/option.c | 2 +-
+ src/outpacket.c | 2 +-
+ src/radv-protocol.h | 2 +-
+ src/radv.c | 2 +-
+ src/rfc1035.c | 2 +-
+ src/rfc2131.c | 2 +-
+ src/rfc3315.c | 2 +-
+ src/slaac.c | 2 +-
+ src/tftp.c | 2 +-
+ src/util.c | 2 +-
+ 37 files changed, 38 insertions(+), 38 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index bcbd5571671d..21e4a5c4101c 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,4 +1,4 @@
+-# dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++# dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+ #
+ # This program is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+diff --git a/src/auth.c b/src/auth.c
+index 59e05d3da38e..15721e52793f 100644
+--- a/src/auth.c
++++ b/src/auth.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/blockdata.c b/src/blockdata.c
+index 5a70a7967fa3..c8f5eae811eb 100644
+--- a/src/blockdata.c
++++ b/src/blockdata.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/bpf.c b/src/bpf.c
+index 4416b1c07287..997d87421bed 100644
+--- a/src/bpf.c
++++ b/src/bpf.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/cache.c b/src/cache.c
+index abaf25ec0f18..117ae279fd4e 100644
+--- a/src/cache.c
++++ b/src/cache.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/config.h b/src/config.h
+index 5e5009271eba..8def6f200461 100644
+--- a/src/config.h
++++ b/src/config.h
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/conntrack.c b/src/conntrack.c
+index 6a5133ab93af..0fa2da903b03 100644
+--- a/src/conntrack.c
++++ b/src/conntrack.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/dbus.c b/src/dbus.c
+index a2a94dc85dac..5b69de518beb 100644
+--- a/src/dbus.c
++++ b/src/dbus.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/dhcp-common.c b/src/dhcp-common.c
+index 9d13ac8df6f1..ce115202a646 100644
+--- a/src/dhcp-common.c
++++ b/src/dhcp-common.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/dhcp-protocol.h b/src/dhcp-protocol.h
+index 4c0961472482..701b6cb3346e 100644
+--- a/src/dhcp-protocol.h
++++ b/src/dhcp-protocol.h
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/dhcp.c b/src/dhcp.c
+index 7acf2c4311a9..f29be9b489a7 100644
+--- a/src/dhcp.c
++++ b/src/dhcp.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/dhcp6-protocol.h b/src/dhcp6-protocol.h
+index 5927dc32f6af..928a2fa162ed 100644
+--- a/src/dhcp6-protocol.h
++++ b/src/dhcp6-protocol.h
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/dhcp6.c b/src/dhcp6.c
+index bc48fdddd3de..3c56e77c6085 100644
+--- a/src/dhcp6.c
++++ b/src/dhcp6.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/dns-protocol.h b/src/dns-protocol.h
+index 0aced3ce6952..16fade33d98c 100644
+--- a/src/dns-protocol.h
++++ b/src/dns-protocol.h
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/dnsmasq.c b/src/dnsmasq.c
+index 2c629fe422aa..e903a24c8105 100644
+--- a/src/dnsmasq.c
++++ b/src/dnsmasq.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index 0c322a93993e..89e758b56a0a 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+@@ -14,7 +14,7 @@
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+-#define COPYRIGHT "Copyright (c) 2000-2014 Simon Kelley"
++#define COPYRIGHT "Copyright (c) 2000-2015 Simon Kelley"
+
+ #ifndef NO_LARGEFILE
+ /* Ensure we can use files >2GB (log files may grow this big) */
+diff --git a/src/dnssec.c b/src/dnssec.c
+index d39ab85ed966..a8dfe3871c85 100644
+--- a/src/dnssec.c
++++ b/src/dnssec.c
+@@ -1,5 +1,5 @@
+ /* dnssec.c is Copyright (c) 2012 Giovanni Bajo <rasky@develer.com>
+- and Copyright (c) 2012-2014 Simon Kelley
++ and Copyright (c) 2012-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/domain.c b/src/domain.c
+index fdd5e4f0838f..278698ca04b3 100644
+--- a/src/domain.c
++++ b/src/domain.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/forward.c b/src/forward.c
+index b17bc34f865f..438e9fa490b8 100644
+--- a/src/forward.c
++++ b/src/forward.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/helper.c b/src/helper.c
+index 4be53c361ee1..1fee72dead8c 100644
+--- a/src/helper.c
++++ b/src/helper.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/inotify.c b/src/inotify.c
+index c537f4c1562a..470d6ed99213 100644
+--- a/src/inotify.c
++++ b/src/inotify.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/ip6addr.h b/src/ip6addr.h
+index c7dcb39c33fa..f0b7e820e227 100644
+--- a/src/ip6addr.h
++++ b/src/ip6addr.h
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/lease.c b/src/lease.c
+index 5d56b1b9147e..545bbb7fd09c 100644
+--- a/src/lease.c
++++ b/src/lease.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/log.c b/src/log.c
+index 8083a8697323..a5ac605c7c5d 100644
+--- a/src/log.c
++++ b/src/log.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/loop.c b/src/loop.c
+index bb377ad12644..565f7d8e58e0 100644
+--- a/src/loop.c
++++ b/src/loop.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/netlink.c b/src/netlink.c
+index b39328376389..10f94db25a14 100644
+--- a/src/netlink.c
++++ b/src/netlink.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/network.c b/src/network.c
+index 14d2af2ce313..7045253d467b 100644
+--- a/src/network.c
++++ b/src/network.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/option.c b/src/option.c
+index 6ef80117cc8c..cb4e76ba0aa2 100644
+--- a/src/option.c
++++ b/src/option.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/outpacket.c b/src/outpacket.c
+index dce68f7cb09f..5b1ff9318bbd 100644
+--- a/src/outpacket.c
++++ b/src/outpacket.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/radv-protocol.h b/src/radv-protocol.h
+index 72ccda49d7fe..4cc1ea426e69 100644
+--- a/src/radv-protocol.h
++++ b/src/radv-protocol.h
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/radv.c b/src/radv.c
+index 3c8b162dbd8e..6da125b864ae 100644
+--- a/src/radv.c
++++ b/src/radv.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/rfc1035.c b/src/rfc1035.c
+index 262274fc5b80..5ef5ddb7485e 100644
+--- a/src/rfc1035.c
++++ b/src/rfc1035.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/rfc2131.c b/src/rfc2131.c
+index 5c9040892f1d..55526443dc84 100644
+--- a/src/rfc2131.c
++++ b/src/rfc2131.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/rfc3315.c b/src/rfc3315.c
+index e593ec9c362c..c1ddc805988d 100644
+--- a/src/rfc3315.c
++++ b/src/rfc3315.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/slaac.c b/src/slaac.c
+index 351d6802f85e..abaad537e25a 100644
+--- a/src/slaac.c
++++ b/src/slaac.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/tftp.c b/src/tftp.c
+index a527911fc0df..a57a31514f44 100644
+--- a/src/tftp.c
++++ b/src/tftp.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+diff --git a/src/util.c b/src/util.c
+index d532444da207..91d02410b13f 100644
+--- a/src/util.c
++++ b/src/util.c
+@@ -1,4 +1,4 @@
+-/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley
++/* dnsmasq is Copyright (c) 2000-2015 Simon Kelley
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+--
+2.1.0
+
--- /dev/null
+From 3d04f46334d0e345f589eda1372e638b946fe637 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sat, 31 Jan 2015 21:59:13 +0000
+Subject: [PATCH 40/55] inotify documentation updates.
+
+---
+ man/dnsmasq.8 | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/man/dnsmasq.8 b/man/dnsmasq.8
+index 005b5cca8d1f..c858323d78bd 100644
+--- a/man/dnsmasq.8
++++ b/man/dnsmasq.8
+@@ -50,6 +50,10 @@ Additional hosts file. Read the specified file as well as /etc/hosts. If -h is g
+ only the specified file. This option may be repeated for more than one
+ additional hosts file. If a directory is given, then read all the files contained in that directory.
+ .TP
++.B --hostsdir=<path>
++Read all the hosts files contained in the directory. New or changed files
++are read automatically. See --dhcp-hostsdir for details.
++.TP
+ .B \-E, --expand-hosts
+ Add the domain to simple names (without a period) in /etc/hosts
+ in the same way as for DHCP-derived names. Note that this does not
+@@ -979,12 +983,14 @@ dhcp-optsfile will be re-read when dnsmasq receives SIGHUP. Note that
+ it is possible to encode the information in a
+ .TP
+ .B --dhcp-hostsdir=<path>
+-This is exactly equivalent to dhcp-hostfile, except for the following. The path MUST be a
++This is equivalent to dhcp-hostsfile, except for the following. The path MUST be a
+ directory, and not an individual file. Changed or new files within
+ the directory are read automatically, without the need to send SIGHUP.
+ If a file is deleted for changed after it has been read by dnsmasq, then the
+ host record it contained will remain until dnsmasq recieves a SIGHUP, or
+ is restarted; ie host records are only added dynamically.
++.B --dhcp-optsdir=<path>
++This is equivalent to dhcp-optsfile, with the differences noted for --dhcp-hostsdir.
+ .TP
+ .B --dhcp-boot
+ flag as DHCP options, using the options names bootfile-name,
+@@ -1791,7 +1797,8 @@ clears its cache and then re-loads
+ .I /etc/hosts
+ and
+ .I /etc/ethers
+-and any file given by --dhcp-hostsfile, --dhcp-optsfile or --addn-hosts.
++and any file given by --dhcp-hostsfile, --dhcp-hostsdir, --dhcp-optsfile,
++--dhcp-optsdir, --addn-hosts or --hostsdir.
+ The dhcp lease change script is called for all
+ existing DHCP leases. If
+ .B
+--
+2.1.0
+
--- /dev/null
+From 6ef15b34ca83c62a939f69356d5c3f7a6bfef3d0 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sat, 31 Jan 2015 22:44:26 +0000
+Subject: [PATCH 41/55] Fix broken ECDSA DNSSEC signatures.
+
+---
+ CHANGELOG | 2 ++
+ src/dnssec.c | 2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index c05dec63c587..c80dc0fdbe9e 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -65,6 +65,8 @@ version 2.73
+ configured to do stateful DHCPv6. Thanks to Win King Wan
+ for the patch.
+
++ Fix broken DNSSEC validation of ECDSA signatures.
++
+
+ version 2.72
+ Add ra-advrouter mode, for RFC-3775 mobile IPv6 support.
+diff --git a/src/dnssec.c b/src/dnssec.c
+index a8dfe3871c85..26932373cd3e 100644
+--- a/src/dnssec.c
++++ b/src/dnssec.c
+@@ -275,7 +275,7 @@ static int dnsmasq_ecdsa_verify(struct blockdata *key_data, unsigned int key_len
+ }
+
+ if (sig_len != 2*t || key_len != 2*t ||
+- (p = blockdata_retrieve(key_data, key_len, NULL)))
++ !(p = blockdata_retrieve(key_data, key_len, NULL)))
+ return 0;
+
+ mpz_import(x, t , 1, 1, 0, 0, p);
+--
+2.1.0
+
--- /dev/null
+From 106266761828a0acb006346ae47bf031dee46a5d Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sun, 1 Feb 2015 00:15:16 +0000
+Subject: [PATCH 42/55] BSD make support
+
+---
+ Makefile | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 21e4a5c4101c..2910320b6452 100644
+--- a/Makefile
++++ b/Makefile
+@@ -64,8 +64,10 @@ nettle_libs = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_DNSSEC $(PKG_CONFIG
+ gmp_libs = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_DNSSEC NO_GMP --copy -lgmp`
+ sunos_libs = `if uname | grep SunOS >/dev/null 2>&1; then echo -lsocket -lnsl -lposix4; fi`
+ version = -DVERSION='\"`$(top)/bld/get-version $(top)`\"'
+-copts_conf = .copts_$(shell $(CC) -DDNSMASQ_COMPILE_OPTS $(COPTS) -E $(top)/$(SRC)/dnsmasq.h | \
+- ( md5sum 2>/dev/null || md5 ) | cut -f 1 -d ' ')
++
++sum?=$(shell $(CC) -DDNSMASQ_COMPILE_OPTS $(COPTS) -E $(top)/$(SRC)/dnsmasq.h | ( md5sum 2>/dev/null || md5 ) | cut -f 1 -d ' ')
++sum!=$(CC) -DDNSMASQ_COMPILE_OPTS $(COPTS) -E $(top)/$(SRC)/dnsmasq.h | ( md5sum 2>/dev/null || md5 ) | cut -f 1 -d ' '
++copts_conf = .copts_$(sum)
+
+ objs = cache.o rfc1035.o util.o option.o forward.o network.o \
+ dnsmasq.o dhcp.o lease.o rfc2131.o netlink.o dbus.o bpf.o \
+--
+2.1.0
+
--- /dev/null
+From 8d8a54ec79d9f96979fabbd97b1dd2ddebc7d78f Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sun, 1 Feb 2015 21:48:46 +0000
+Subject: [PATCH 43/55] Fix build failure on openBSD.
+
+---
+ src/tables.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/tables.c b/src/tables.c
+index dcdef794c4d2..aae1252708db 100644
+--- a/src/tables.c
++++ b/src/tables.c
+@@ -21,7 +21,7 @@
+ #if defined(HAVE_IPSET) && defined(HAVE_BSD_NETWORK)
+
+ #ifndef __FreeBSD__
+-#include <bsd/string.h>
++#include <string.h>
+ #endif
+
+ #include <sys/types.h>
+--
+2.1.0
+
--- /dev/null
+From d36b732c4cfa91ea09af64b5dc0f3a85a075e5bc Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Thi=C3=A9baud=20Weksteen?= <thiebaud@weksteen.fr>
+Date: Mon, 2 Feb 2015 21:37:27 +0000
+Subject: [PATCH 44/55] Manpage typo fix.
+
+---
+ man/dnsmasq.8 | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/man/dnsmasq.8 b/man/dnsmasq.8
+index c858323d78bd..27f85d40fbbb 100644
+--- a/man/dnsmasq.8
++++ b/man/dnsmasq.8
+@@ -516,7 +516,7 @@ zone files: the port, weight and priority numbers are in a different
+ order. More than one SRV record for a given service/domain is allowed,
+ all that match are returned.
+ .TP
+-.B --host-record=<name>[,<name>....][<IPv4-address>],[<IPv6-address>]
++.B --host-record=<name>[,<name>....],[<IPv4-address>],[<IPv6-address>]
+ Add A, AAAA and PTR records to the DNS. This adds one or more names to
+ the DNS with associated IPv4 (A) and IPv6 (AAAA) records. A name may
+ appear in more than one
+--
+2.1.0
+
--- /dev/null
+From 2941d3ac898cf84b544e47c9735c5e4111711db1 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Mon, 2 Feb 2015 22:36:42 +0000
+Subject: [PATCH 45/55] Fixup dhcp-configs after reading extra hostfiles with
+ inotify.
+
+---
+ src/inotify.c | 14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
+
+diff --git a/src/inotify.c b/src/inotify.c
+index 470d6ed99213..6f4cd79e0030 100644
+--- a/src/inotify.c
++++ b/src/inotify.c
+@@ -194,7 +194,19 @@ int inotify_check(time_t now)
+ strcat(path, in->name);
+
+ if (ah->flags & AH_HOSTS)
+- read_hostsfile(path, ah->index, 0, NULL, 0);
++ {
++ read_hostsfile(path, ah->index, 0, NULL, 0);
++#ifdef HAVE_DHCP
++ if (daemon->dhcp || daemon->doing_dhcp6)
++ {
++ /* Propogate the consequences of loading a new dhcp-host */
++ dhcp_update_configs(daemon->dhcp_conf);
++ lease_update_from_configs();
++ lease_update_file(now);
++ lease_update_dns(1);
++ }
++#endif
++ }
+ #ifdef HAVE_DHCP
+ else if (ah->flags & AH_DHCP_HST)
+ {
+--
+2.1.0
+
--- /dev/null
+From f9c863708c6b0aea31ff7a466647685dc739de50 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Tue, 3 Feb 2015 21:52:48 +0000
+Subject: [PATCH 46/55] Extra logging for inotify code.
+
+---
+ src/cache.c | 9 ++++-----
+ src/inotify.c | 4 +++-
+ src/option.c | 4 +++-
+ 3 files changed, 10 insertions(+), 7 deletions(-)
+
+diff --git a/src/cache.c b/src/cache.c
+index 117ae279fd4e..43245b771b53 100644
+--- a/src/cache.c
++++ b/src/cache.c
+@@ -1022,11 +1022,10 @@ int read_hostsfile(char *filename, unsigned int index, int cache_size, struct cr
+ fclose(f);
+
+ if (rhash)
+- {
+- rehash(name_count);
+- my_syslog(LOG_INFO, _("read %s - %d addresses"), filename, addr_count);
+- }
+-
++ rehash(name_count);
++
++ my_syslog(LOG_INFO, _("read %s - %d addresses"), filename, addr_count);
++
+ return name_count;
+ }
+
+diff --git a/src/inotify.c b/src/inotify.c
+index 6f4cd79e0030..44ce0c9af051 100644
+--- a/src/inotify.c
++++ b/src/inotify.c
+@@ -192,7 +192,9 @@ int inotify_check(time_t now)
+ strcpy(path, ah->fname);
+ strcat(path, "/");
+ strcat(path, in->name);
+-
++
++ my_syslog(LOG_INFO, _("inotify, new or changed file %s"), path);
++
+ if (ah->flags & AH_HOSTS)
+ {
+ read_hostsfile(path, ah->index, 0, NULL, 0);
+diff --git a/src/option.c b/src/option.c
+index cb4e76ba0aa2..e4b4865d07a5 100644
+--- a/src/option.c
++++ b/src/option.c
+@@ -4068,11 +4068,13 @@ static void read_file(char *file, FILE *f, int hard_opt)
+ #ifdef HAVE_DHCP
+ int option_read_dynfile(char *file, int flags)
+ {
++ my_syslog(MS_DHCP | LOG_INFO, _("read %s"), file);
++
+ if (flags & AH_DHCP_HST)
+ return one_file(file, LOPT_BANK);
+ else if (flags & AH_DHCP_OPT)
+ return one_file(file, LOPT_OPTS);
+-
++
+ return 0;
+ }
+ #endif
+--
+2.1.0
+
--- /dev/null
+From efb8b5566aafc1f3ce18514a2df93af5a2e4998c Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sat, 7 Feb 2015 22:36:34 +0000
+Subject: [PATCH 47/55] man page typo.
+
+---
+ man/dnsmasq.8 | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/man/dnsmasq.8 b/man/dnsmasq.8
+index 27f85d40fbbb..5cdd186afaa0 100644
+--- a/man/dnsmasq.8
++++ b/man/dnsmasq.8
+@@ -989,6 +989,7 @@ the directory are read automatically, without the need to send SIGHUP.
+ If a file is deleted for changed after it has been read by dnsmasq, then the
+ host record it contained will remain until dnsmasq recieves a SIGHUP, or
+ is restarted; ie host records are only added dynamically.
++.TP
+ .B --dhcp-optsdir=<path>
+ This is equivalent to dhcp-optsfile, with the differences noted for --dhcp-hostsdir.
+ .TP
+--
+2.1.0
+
--- /dev/null
+From f4f400776b3c1aa303d1a0fcd500f0ab5bc970f2 Mon Sep 17 00:00:00 2001
+From: Shantanu Gadgil <shantanugadgil@yahoo.com>
+Date: Wed, 11 Feb 2015 20:16:59 +0000
+Subject: [PATCH 48/55] Fix get-version script which returned wrong tag in some
+ situations.
+
+---
+ bld/get-version | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/bld/get-version b/bld/get-version
+index c246a3cc6a47..7ab75db729ac 100755
+--- a/bld/get-version
++++ b/bld/get-version
+@@ -20,7 +20,7 @@ else
+ vers=`cat $1/VERSION | sed 's/[(), ]/,/ g' | tr ',' '\n' | grep ^v[0-9]`
+
+ if [ $? -eq 0 ]; then
+- echo "${vers}" | sort | head -n 1 | sed 's/^v//'
++ echo "${vers}" | sort -r | head -n 1 | sed 's/^v//'
+ else
+ cat $1/VERSION
+ fi
+--
+2.1.0
+
--- /dev/null
+From 8ff70de618eb7de9147dbfbd4deca4a2dd62f0cb Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sat, 14 Feb 2015 20:02:37 +0000
+Subject: [PATCH 49/55] Typos.
+
+---
+ src/inotify.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/inotify.c b/src/inotify.c
+index 44ce0c9af051..9422066257f5 100644
+--- a/src/inotify.c
++++ b/src/inotify.c
+@@ -104,7 +104,8 @@ void set_dynamic_inotify(int flag, int total_size, struct crec **rhash, int revh
+ ah->wd = inotify_add_watch(daemon->inotifyfd, ah->fname, IN_CLOSE_WRITE | IN_MOVED_TO);
+ ah->flags |= AH_WD_DONE;
+ }
+- /* Read contents of dir _after_ calling add_watch, in the ho[e of avoiding
++
++ /* Read contents of dir _after_ calling add_watch, in the hope of avoiding
+ a race which misses files being added as we start */
+ if (ah->wd == -1 || !(dir_stream = opendir(ah->fname)))
+ {
+--
+2.1.0
+
--- /dev/null
+From caeea190f12efd20139f694aac4942d1ac00019f Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sat, 14 Feb 2015 20:08:56 +0000
+Subject: [PATCH 50/55] Make dynamic hosts files work when --no-hosts set.
+
+---
+ src/cache.c | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+diff --git a/src/cache.c b/src/cache.c
+index 43245b771b53..c95624c42b1c 100644
+--- a/src/cache.c
++++ b/src/cache.c
+@@ -1133,17 +1133,18 @@ void cache_reload(void)
+ {
+ if (daemon->cachesize > 0)
+ my_syslog(LOG_INFO, _("cleared cache"));
+- return;
+ }
+-
+- if (!option_bool(OPT_NO_HOSTS))
+- total_size = read_hostsfile(HOSTSFILE, SRC_HOSTS, total_size, (struct crec **)daemon->packet, revhashsz);
+-
+- daemon->addn_hosts = expand_filelist(daemon->addn_hosts);
+- for (ah = daemon->addn_hosts; ah; ah = ah->next)
+- if (!(ah->flags & AH_INACTIVE))
+- total_size = read_hostsfile(ah->fname, ah->index, total_size, (struct crec **)daemon->packet, revhashsz);
+-
++ else
++ {
++ if (!option_bool(OPT_NO_HOSTS))
++ total_size = read_hostsfile(HOSTSFILE, SRC_HOSTS, total_size, (struct crec **)daemon->packet, revhashsz);
++
++ daemon->addn_hosts = expand_filelist(daemon->addn_hosts);
++ for (ah = daemon->addn_hosts; ah; ah = ah->next)
++ if (!(ah->flags & AH_INACTIVE))
++ total_size = read_hostsfile(ah->fname, ah->index, total_size, (struct crec **)daemon->packet, revhashsz);
++ }
++
+ #ifdef HAVE_INOTIFY
+ set_dynamic_inotify(AH_HOSTS, total_size, (struct crec **)daemon->packet, revhashsz);
+ #endif
+--
+2.1.0
+
--- /dev/null
+From 28b879ac47b872af6e8c5e86d76806c69338434d Mon Sep 17 00:00:00 2001
+From: Chen Wei <weichen302@icloud.com>
+Date: Tue, 17 Feb 2015 22:07:35 +0000
+Subject: [PATCH 51/55] Fix trivial memory leaks to quieten valgrind.
+
+---
+ src/dnsmasq.c | 2 ++
+ src/option.c | 11 +++++++++--
+ 2 files changed, 11 insertions(+), 2 deletions(-)
+
+diff --git a/src/dnsmasq.c b/src/dnsmasq.c
+index e903a24c8105..e6dabbf556f7 100644
+--- a/src/dnsmasq.c
++++ b/src/dnsmasq.c
+@@ -627,6 +627,8 @@ int main (int argc, char **argv)
+ }
+
+ #ifdef HAVE_LINUX_NETWORK
++ free(hdr);
++ free(data);
+ if (option_bool(OPT_DEBUG))
+ prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
+ #endif
+diff --git a/src/option.c b/src/option.c
+index e4b4865d07a5..ae0ad002d8b8 100644
+--- a/src/option.c
++++ b/src/option.c
+@@ -4361,7 +4361,7 @@ void read_opts(int argc, char **argv, char *compile_opts)
+ {
+ char *buff = opt_malloc(MAXDNAME);
+ int option, conffile_opt = '7', testmode = 0;
+- char *arg, *conffile = CONFFILE;
++ char *arg, *conffile = NULL;
+
+ opterr = 0;
+
+@@ -4476,7 +4476,14 @@ void read_opts(int argc, char **argv, char *compile_opts)
+ }
+
+ if (conffile)
+- one_file(conffile, conffile_opt);
++ {
++ one_file(conffile, conffile_opt);
++ free(conffile);
++ }
++ else
++ {
++ one_file(CONFFILE, conffile_opt);
++ }
+
+ /* port might not be known when the address is parsed - fill in here */
+ if (daemon->servers)
+--
+2.1.0
+
--- /dev/null
+From 0705a7e2d57654b27c7e14f35ca77241c1821f4d Mon Sep 17 00:00:00 2001
+From: Tomas Hozza <thozza@redhat.com>
+Date: Mon, 23 Feb 2015 21:26:26 +0000
+Subject: [PATCH 52/55] Fix uninitialized value used in get_client_mac()
+
+---
+ src/dhcp6.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/src/dhcp6.c b/src/dhcp6.c
+index 3c56e77c6085..c7144f5fee7c 100644
+--- a/src/dhcp6.c
++++ b/src/dhcp6.c
+@@ -246,7 +246,9 @@ void get_client_mac(struct in6_addr *client, int iface, unsigned char *mac, unsi
+ neigh.code = 0;
+ neigh.reserved = 0;
+ neigh.target = *client;
+-
++ /* RFC4443 section-2.3: checksum has to be zero to be calculated */
++ neigh.checksum = 0;
++
+ memset(&addr, 0, sizeof(addr));
+ #ifdef HAVE_SOCKADDR_SA_LEN
+ addr.sin6_len = sizeof(struct sockaddr_in6);
+--
+2.1.0
+
--- /dev/null
+From 47b9ac59c715827252ae6e6732903c3dabb697fb Mon Sep 17 00:00:00 2001
+From: Joachim Zobel <jz-2014@heute-morgen.de>
+Date: Mon, 23 Feb 2015 21:38:11 +0000
+Subject: [PATCH 53/55] Log parsing utils in contrib/reverse-dns
+
+---
+ contrib/reverse-dns/README | 18 ++++++++++++++++++
+ contrib/reverse-dns/reverse_dns.sh | 29 +++++++++++++++++++++++++++++
+ contrib/reverse-dns/reverse_replace.sh | 28 ++++++++++++++++++++++++++++
+ 3 files changed, 75 insertions(+)
+ create mode 100644 contrib/reverse-dns/README
+ create mode 100644 contrib/reverse-dns/reverse_dns.sh
+ create mode 100644 contrib/reverse-dns/reverse_replace.sh
+
+diff --git a/contrib/reverse-dns/README b/contrib/reverse-dns/README
+new file mode 100644
+index 000000000000..f87eb77c4c22
+--- /dev/null
++++ b/contrib/reverse-dns/README
+@@ -0,0 +1,18 @@
++Hi.\r
++\r
++To translate my routers netstat-nat output into names that actually talk\r
++to me I have started writing to simple shell scripts. They require \r
++\r
++log-queries\r
++log-facility=/var/log/dnsmasq.log\r
++\r
++to be set. With\r
++\r
++netstat-nat -n -4 | reverse_replace.sh \r
++\r
++I get retranslated output.\r
++\r
++Sincerely,\r
++Joachim\r
++\r
++\r
+diff --git a/contrib/reverse-dns/reverse_dns.sh b/contrib/reverse-dns/reverse_dns.sh
+new file mode 100644
+index 000000000000..c0fff300a947
+--- /dev/null
++++ b/contrib/reverse-dns/reverse_dns.sh
+@@ -0,0 +1,29 @@
++#!/bin/bash
++# $Id: reverse_dns.sh 4 2015-02-17 20:14:59Z jo $
++#
++# Usage: reverse_dns.sh IP
++# Uses the dnsmasq query log to lookup the name
++# that was last queried to return the given IP.
++#
++
++IP=$1
++qmIP=`echo $IP | sed 's#\.#\\.#g'`
++LOG=/var/log/dnsmasq.log
++
++IP_regex='^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'
++
++if ! [[ $IP =~ $IP_regex ]]; then
++ echo -n $IP
++ exit
++fi
++
++NAME=`tac $LOG | \
++ grep " is $IP" | head -1 | \
++ sed "s#.* \([^ ]*\) is $qmIP.*#\1#" `
++
++if [ -z "$NAME" ]; then
++ echo -n $IP
++else
++ echo -n $NAME
++fi
++
+diff --git a/contrib/reverse-dns/reverse_replace.sh b/contrib/reverse-dns/reverse_replace.sh
+new file mode 100644
+index 000000000000..a11c164b7f19
+--- /dev/null
++++ b/contrib/reverse-dns/reverse_replace.sh
+@@ -0,0 +1,28 @@
++#!/bin/bash
++# $Id: reverse_replace.sh 4 2015-02-17 20:14:59Z jo $
++#
++# Usage e.g.: netstat -n -4 | reverse_replace.sh
++# Parses stdin for IP4 addresses and replaces them
++# with names retrieved by reverse_dns.sh
++#
++
++DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
++DNS=$DIR/reverse_dns.sh
++
++# sed regex
++IP_regex='[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
++
++while read LINE; do
++ if grep --quiet $IP_regex <<< "$LINE"; then
++ IPs=`sed "s#.*\b\($IP_regex\)\b.*#\1 #g" <<< "$LINE"`
++ IPs=($IPs)
++ for IP in "${IPs[@]}"
++ do
++ NAME=`$DNS $IP`
++ # echo "$NAME is $IP";
++ LINE="${LINE/$IP/$NAME}"
++ done
++ fi
++ echo $LINE
++done < /dev/stdin
++
+--
+2.1.0
+
--- /dev/null
+From f6e62e2af96f5fa0d1e3d93167a93a8f09bf6e61 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sun, 1 Mar 2015 18:17:54 +0000
+Subject: [PATCH 54/55] Add --dnssec-timestamp option and facility.
+
+---
+ CHANGELOG | 6 +++++
+ man/dnsmasq.8 | 6 +++++
+ src/dnsmasq.c | 11 +++++++-
+ src/dnsmasq.h | 2 ++
+ src/dnssec.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----
+ src/option.c | 7 +++++
+ 6 files changed, 108 insertions(+), 6 deletions(-)
+
+diff --git a/CHANGELOG b/CHANGELOG
+index c80dc0fdbe9e..4f4fa305deaa 100644
+--- a/CHANGELOG
++++ b/CHANGELOG
+@@ -66,6 +66,12 @@ version 2.73
+ for the patch.
+
+ Fix broken DNSSEC validation of ECDSA signatures.
++
++ Add --dnssec-timestamp option, which provides an automatic
++ way to detect when the system time becomes valid after boot
++ on systems without an RTC, whilst allowing DNS queries before the
++ clock is valid so that NTP can run. Thanks to
++ Kevin Darbyshire-Bryant for developing this idea.
+
+
+ version 2.72
+diff --git a/man/dnsmasq.8 b/man/dnsmasq.8
+index 5cdd186afaa0..097e7d75145c 100644
+--- a/man/dnsmasq.8
++++ b/man/dnsmasq.8
+@@ -674,6 +674,12 @@ that dnsmasq should be started with this flag when the platform determines that
+ reliable time is established, a SIGHUP should be sent to dnsmasq, which enables time checking, and purges the cache of DNS records
+ which have not been throughly checked.
+ .TP
++.B --dnssec-timestamp=<path>
++Enables an alternative way of checking the validity of the system time for DNSSEC (see --dnssec-no-timecheck). In this case, the
++system time is considered to be valid once it becomes later than the timestamp on the specified file. The file is created and
++its timestamp set automatically by dnsmasq. The file must be stored on a persistent filesystem, so that it and its mtime are carried
++over system restarts.
++.TP
+ .B --proxy-dnssec
+ Copy the DNSSEC Authenticated Data bit from upstream servers to downstream clients and cache it. This is an
+ alternative to having dnsmasq validate DNSSEC, but it depends on the security of the network between
+diff --git a/src/dnsmasq.c b/src/dnsmasq.c
+index e6dabbf556f7..769a19afe6c5 100644
+--- a/src/dnsmasq.c
++++ b/src/dnsmasq.c
+@@ -58,6 +58,9 @@ int main (int argc, char **argv)
+ struct dhcp_context *context;
+ struct dhcp_relay *relay;
+ #endif
++#ifdef HAVE_DNSSEC
++ int badtime;
++#endif
+
+ #ifdef LOCALEDIR
+ setlocale(LC_ALL, "");
+@@ -369,7 +372,11 @@ int main (int argc, char **argv)
+
+ if (baduser)
+ die(_("unknown user or group: %s"), baduser, EC_BADCONF);
+-
++
++#ifdef HAVE_DNSSEC
++ badtime = setup_timestamp(ent_pw->pw_uid);
++#endif
++
+ /* implement group defaults, "dip" if available, or group associated with uid */
+ if (!daemon->group_set && !gp)
+ {
+@@ -689,6 +696,8 @@ int main (int argc, char **argv)
+ my_syslog(LOG_INFO, _("DNSSEC validation enabled"));
+ if (option_bool(OPT_DNSSEC_TIME))
+ my_syslog(LOG_INFO, _("DNSSEC signature timestamps not checked until first cache reload"));
++ if (badtime)
++ my_syslog(LOG_INFO, _("DNSSEC signature timestamps not checked until system time valid"));
+ }
+ #endif
+
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index 89e758b56a0a..b2f02dda63f0 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -986,6 +986,7 @@ extern struct daemon {
+ #endif
+ #ifdef HAVE_DNSSEC
+ struct ds_config *ds;
++ char *timestamp_file;
+ #endif
+
+ /* globally used stuff for DNS */
+@@ -1151,6 +1152,7 @@ int dnssec_chase_cname(time_t now, struct dns_header *header, size_t plen, char
+ int dnskey_keytag(int alg, int flags, unsigned char *rdata, int rdlen);
+ size_t filter_rrsigs(struct dns_header *header, size_t plen);
+ unsigned char* hash_questions(struct dns_header *header, size_t plen, char *name);
++int setup_timestamp(uid_t uid);
+
+ /* util.c */
+ void rand_init(void);
+diff --git a/src/dnssec.c b/src/dnssec.c
+index 26932373cd3e..bf4406469de0 100644
+--- a/src/dnssec.c
++++ b/src/dnssec.c
+@@ -34,6 +34,7 @@
+ #include <nettle/dsa-compat.h>
+ #endif
+
++#include <utime.h>
+
+ #define SERIAL_UNDEF -100
+ #define SERIAL_EQ 0
+@@ -394,17 +395,88 @@ static int serial_compare_32(unsigned long s1, unsigned long s2)
+ return SERIAL_UNDEF;
+ }
+
++/* Called at startup. If the timestamp file is configured and exists, put its mtime on
++ timestamp_time. If it doesn't exist, create it, and set the mtime to 1-1-2015.
++ Change the ownership to the user we'll be running as, so that we can update the mtime.
++*/
++static time_t timestamp_time;
++static int back_to_the_future;
++
++int setup_timestamp(uid_t uid)
++{
++ struct stat statbuf;
++
++ back_to_the_future = 0;
++
++ if (!option_bool(OPT_DNSSEC_VALID) || !daemon->timestamp_file)
++ return 0;
++
++ if (stat(daemon->timestamp_file, &statbuf) != -1)
++ {
++ timestamp_time = statbuf.st_mtime;
++ check_and_exit:
++ if (difftime(timestamp_time, time(0)) <= 0)
++ {
++ /* time already OK, update timestamp, and do key checking from the start. */
++ if (utime(daemon->timestamp_file, NULL) == -1)
++ my_syslog(LOG_ERR, _("failed to update mtime on %s: %s"), daemon->timestamp_file, strerror(errno));
++ back_to_the_future = 1;
++ return 0;
++ }
++ return 1;
++ }
++
++ if (errno == ENOENT)
++ {
++ int fd = open(daemon->timestamp_file, O_WRONLY | O_CREAT | O_NONBLOCK, 0666);
++ if (fd != -1)
++ {
++ struct utimbuf timbuf;
++
++ close(fd);
++
++ timestamp_time = timbuf.actime = timbuf.modtime = 1420070400; /* 1-1-2015 */
++ if (utime(daemon->timestamp_file, &timbuf) == 0 &&
++ (getuid() != 0 || chown(daemon->timestamp_file, uid, -1) == 0))
++ goto check_and_exit;
++ }
++ }
++
++ die(_("Cannot create timestamp file %s: %s" ), daemon->timestamp_file, EC_BADCONF);
++ return 0;
++}
++
+ /* Check whether today/now is between date_start and date_end */
+ static int check_date_range(unsigned long date_start, unsigned long date_end)
+ {
+- unsigned long curtime;
+-
++ unsigned long curtime = time(0);
++
+ /* Checking timestamps may be temporarily disabled */
+- if (option_bool(OPT_DNSSEC_TIME))
++
++ /* If the current time if _before_ the timestamp
++ on our persistent timestamp file, then assume the
++ time if not yet correct, and don't check the
++ key timestamps. As soon as the current time is
++ later then the timestamp, update the timestamp
++ and start checking keys */
++ if (daemon->timestamp_file)
++ {
++ if (back_to_the_future == 0 && difftime(timestamp_time, curtime) <= 0)
++ {
++ if (utime(daemon->timestamp_file, NULL) != 0)
++ my_syslog(LOG_ERR, _("failed to update mtime on %s: %s"), daemon->timestamp_file, strerror(errno));
++
++ back_to_the_future = 1;
++ set_option_bool(OPT_DNSSEC_TIME);
++ queue_event(EVENT_RELOAD); /* purge cache */
++ }
++
++ if (back_to_the_future == 0)
++ return 1;
++ }
++ else if (option_bool(OPT_DNSSEC_TIME))
+ return 1;
+
+- curtime = time(0);
+-
+ /* We must explicitly check against wanted values, because of SERIAL_UNDEF */
+ return serial_compare_32(curtime, date_start) == SERIAL_GT
+ && serial_compare_32(curtime, date_end) == SERIAL_LT;
+diff --git a/src/option.c b/src/option.c
+index ae0ad002d8b8..eace40bb566c 100644
+--- a/src/option.c
++++ b/src/option.c
+@@ -152,6 +152,7 @@ struct myoption {
+ #define LOPT_DHCP_INOTIFY 340
+ #define LOPT_DHOPT_INOTIFY 341
+ #define LOPT_HOST_INOTIFY 342
++#define LOPT_DNSSEC_STAMP 343
+
+ #ifdef HAVE_GETOPT_LONG
+ static const struct option opts[] =
+@@ -300,6 +301,7 @@ static const struct myoption opts[] =
+ { "dnssec-debug", 0, 0, LOPT_DNSSEC_DEBUG },
+ { "dnssec-check-unsigned", 0, 0, LOPT_DNSSEC_CHECK },
+ { "dnssec-no-timecheck", 0, 0, LOPT_DNSSEC_TIME },
++ { "dnssec-timestamp", 1, 0, LOPT_DNSSEC_STAMP },
+ #ifdef OPTION6_PREFIX_CLASS
+ { "dhcp-prefix-class", 1, 0, LOPT_PREF_CLSS },
+ #endif
+@@ -463,6 +465,7 @@ static struct {
+ { LOPT_DNSSEC_DEBUG, OPT_DNSSEC_DEBUG, NULL, gettext_noop("Disable upstream checking for DNSSEC debugging."), NULL },
+ { LOPT_DNSSEC_CHECK, OPT_DNSSEC_NO_SIGN, NULL, gettext_noop("Ensure answers without DNSSEC are in unsigned zones."), NULL },
+ { LOPT_DNSSEC_TIME, OPT_DNSSEC_TIME, NULL, gettext_noop("Don't check DNSSEC signature timestamps until first cache-reload"), NULL },
++ { LOPT_DNSSEC_STAMP, ARG_ONE, "<path>", gettext_noop("Timestamp file to verify system clock for DNSSEC"), NULL },
+ #ifdef OPTION6_PREFIX_CLASS
+ { LOPT_PREF_CLSS, ARG_DUP, "set:tag,<class>", gettext_noop("Specify DHCPv6 prefix class"), NULL },
+ #endif
+@@ -3867,6 +3870,10 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
+ }
+
+ #ifdef HAVE_DNSSEC
++ case LOPT_DNSSEC_STAMP:
++ daemon->timestamp_file = opt_string_alloc(arg);
++ break;
++
+ case LOPT_TRUST_ANCHOR:
+ {
+ struct ds_config *new = opt_malloc(sizeof(struct ds_config));
+--
+2.1.0
+
--- /dev/null
+From 9003b50b13da624ca45f3e0cf99abb623b8d026b Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Mon, 2 Mar 2015 22:47:23 +0000
+Subject: [PATCH 55/55] Fix last commit to not crash if uid changing not
+ configured.
+
+---
+ src/dnsmasq.c | 2 +-
+ src/dnsmasq.h | 2 +-
+ src/dnssec.c | 4 ++--
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/dnsmasq.c b/src/dnsmasq.c
+index 769a19afe6c5..9e05c0e31569 100644
+--- a/src/dnsmasq.c
++++ b/src/dnsmasq.c
+@@ -374,7 +374,7 @@ int main (int argc, char **argv)
+ die(_("unknown user or group: %s"), baduser, EC_BADCONF);
+
+ #ifdef HAVE_DNSSEC
+- badtime = setup_timestamp(ent_pw->pw_uid);
++ badtime = setup_timestamp(ent_pw);
+ #endif
+
+ /* implement group defaults, "dip" if available, or group associated with uid */
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index b2f02dda63f0..a451cb4dd03c 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -1152,7 +1152,7 @@ int dnssec_chase_cname(time_t now, struct dns_header *header, size_t plen, char
+ int dnskey_keytag(int alg, int flags, unsigned char *rdata, int rdlen);
+ size_t filter_rrsigs(struct dns_header *header, size_t plen);
+ unsigned char* hash_questions(struct dns_header *header, size_t plen, char *name);
+-int setup_timestamp(uid_t uid);
++int setup_timestamp(struct passwd *ent_pw);
+
+ /* util.c */
+ void rand_init(void);
+diff --git a/src/dnssec.c b/src/dnssec.c
+index bf4406469de0..c60eacf73c6b 100644
+--- a/src/dnssec.c
++++ b/src/dnssec.c
+@@ -402,7 +402,7 @@ static int serial_compare_32(unsigned long s1, unsigned long s2)
+ static time_t timestamp_time;
+ static int back_to_the_future;
+
+-int setup_timestamp(uid_t uid)
++int setup_timestamp(struct passwd *ent_pw)
+ {
+ struct stat statbuf;
+
+@@ -437,7 +437,7 @@ int setup_timestamp(uid_t uid)
+
+ timestamp_time = timbuf.actime = timbuf.modtime = 1420070400; /* 1-1-2015 */
+ if (utime(daemon->timestamp_file, &timbuf) == 0 &&
+- (getuid() != 0 || chown(daemon->timestamp_file, uid, -1) == 0))
++ (!ent_pw || getuid() != 0 || chown(daemon->timestamp_file, ent_pw->pw_uid, -1) == 0))
+ goto check_and_exit;
+ }
+ }
+--
+2.1.0
+
--- /dev/null
+From 4c960fa90a975d20f75a1ecabd217247f1922c8f Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Wed, 4 Mar 2015 20:32:26 +0000
+Subject: [PATCH 56/57] New version of contrib/reverse-dns
+
+---
+ contrib/reverse-dns/README | 22 +++---
+ contrib/reverse-dns/reverse_replace.sh | 131 ++++++++++++++++++++++++++++-----
+ 2 files changed, 125 insertions(+), 28 deletions(-)
+
+diff --git a/contrib/reverse-dns/README b/contrib/reverse-dns/README
+index f87eb77c4c22..2ec4df1f957e 100644
+--- a/contrib/reverse-dns/README
++++ b/contrib/reverse-dns/README
+@@ -1,18 +1,18 @@
+-Hi.\r
++The script reads stdin and replaces all IP addresses with names before\r
++outputting it again. IPs from private networks are reverse looked up\r
++via dns. Other IP adresses are searched for in the dnsmasq query log.\r
++This gives names (CNAMEs if I understand DNS correctly) that are closer\r
++to the name the client originally asked for then the names obtained by\r
++reverse lookup. Just run\r
+ \r
+-To translate my routers netstat-nat output into names that actually talk\r
+-to me I have started writing to simple shell scripts. They require \r
++netstat -n -4 | ./reverse_replace.sh \r
++\r
++to see what it does. It needs \r
+ \r
+ log-queries\r
+ log-facility=/var/log/dnsmasq.log\r
+ \r
+-to be set. With\r
+-\r
+-netstat-nat -n -4 | reverse_replace.sh \r
+-\r
+-I get retranslated output.\r
+-\r
+-Sincerely,\r
+-Joachim\r
++in the dnsmasq configuration.\r
+ \r
++The script runs on debian (with ash installed) and on busybox.\r
+ \r
+diff --git a/contrib/reverse-dns/reverse_replace.sh b/contrib/reverse-dns/reverse_replace.sh
+index a11c164b7f19..5b4aebd71456 100644
+--- a/contrib/reverse-dns/reverse_replace.sh
++++ b/contrib/reverse-dns/reverse_replace.sh
+@@ -1,28 +1,125 @@
+-#!/bin/bash
+-# $Id: reverse_replace.sh 4 2015-02-17 20:14:59Z jo $
++#!/bin/ash
++# $Id: reverse_replace.sh 18 2015-03-01 16:12:35Z jo $
+ #
+ # Usage e.g.: netstat -n -4 | reverse_replace.sh
+ # Parses stdin for IP4 addresses and replaces them
+-# with names retrieved by reverse_dns.sh
++# with names retrieved by parsing the dnsmasq log.
++# This currently only gives CNAMEs. But these
++# usually tell ou more than the mones from reverse
++# lookups.
++#
++# This has been tested on debian and asuswrt. Plese
++# report successful tests on other platforms.
++#
++# Author: Joachim Zobel <jz-2014@heute-morgen.de>
++# License: Consider this MIT style licensed. You can
++# do as you ike, but you must not remove my name.
+ #
+
+-DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+-DNS=$DIR/reverse_dns.sh
++LOG=/var/log/dnsmasq.log
++MAX_LINES=15000
+
+-# sed regex
++# sed regex do match IPs
+ IP_regex='[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
++# private IP ranges
++IP_private='\(^127\.\)\|\(^192\.168\.\)\|\(^10\.\)\|\(^172\.1[6-9]\.\)\|\(^172\.2[0-9]\.\)\|\(^172\.3[0-1]\.\)'
+
+-while read LINE; do
+- if grep --quiet $IP_regex <<< "$LINE"; then
+- IPs=`sed "s#.*\b\($IP_regex\)\b.*#\1 #g" <<< "$LINE"`
+- IPs=($IPs)
+- for IP in "${IPs[@]}"
+- do
+- NAME=`$DNS $IP`
+- # echo "$NAME is $IP";
+- LINE="${LINE/$IP/$NAME}"
+- done
++#######################################################################
++# Find Commands
++
++HOST=nslookup
++if type host > /dev/null 2>&1; then
++ # echo "No need for nslookup, host is there"
++ HOST=host
++fi
++
++#######################################################################
++# Functions
++
++# Use shell variables for an (IP) lookup table
++create_lookup_table()
++{
++ # Parse log into lookup table
++ local CMDS="$( tail -"$MAX_LINES" "$LOG" | \
++ grep " is $IP_regex" | \
++ sed "s#.* \([^ ]*\) is \($IP_regex\).*#set_val \2 \1;#" )"
++
++ local IFS='
++'
++ for CMD in $CMDS
++ do
++ eval $CMD
++ done
++}
++
++set_val()
++{
++ local _IP=$(echo $1 | tr . _)
++ local KEY="__IP__$_IP"
++ eval "$KEY"=$2
++}
++
++get_val()
++{
++ local _IP=$(echo $1 | tr . _)
++ local KEY="__IP__$_IP"
++ eval echo -n '${'"$KEY"'}'
++}
++
++dns_lookup()
++{
++ local IP=$1
++
++ local RTN="$($HOST $IP | \
++ sed 's#\s\+#\n#g' | \
++ grep -v '^$' | \
++ tail -1 | tr -d '\n' | \
++ sed 's#\.$##')"
++ if echo $RTN | grep -q NXDOMAIN; then
++ echo -n $IP
++ else
++ echo -n "$RTN"
++ fi
++}
++
++reverse_dns()
++{
++ local IP=$1
++
++ # Skip if it is not an IP
++ if ! echo $IP | grep -q "^$IP_regex$"; then
++ echo -n $IP
++ return
++ fi
++
++ # Do a dns lookup, if it is a local IP
++ if echo $IP | grep -q $IP_private; then
++ dns_lookup $IP
++ return
+ fi
++
++ local NAME="$(get_val $IP)"
++
++ if [ -z "$NAME" ]; then
++ echo -n $IP
++ else
++ echo -n $NAME
++ fi
++}
++
++#######################################################################
++# Main
++create_lookup_table
++
++while read LINE; do
++ for IP in $(echo "$LINE" | \
++ sed "s#\b\($IP_regex\)\b#\n\1\n#g" | \
++ grep $IP_regex)
++ do
++ NAME=`reverse_dns $IP `
++ # echo "$NAME $IP"
++ LINE=`echo "$LINE" | sed "s#$IP#$NAME#" `
++ done
+ echo $LINE
+-done < /dev/stdin
++done
+
+--
+2.1.0
+
--- /dev/null
+From 360f2513ab12a9bf1e262d388dd2ea8a566590a3 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Sat, 7 Mar 2015 18:28:06 +0000
+Subject: [PATCH 57/57] Tweak DNSSEC timestamp code to create file later,
+ removing need to chown it.
+
+---
+ man/dnsmasq.8 | 3 ++-
+ src/dnsmasq.c | 35 ++++++++++++++++++++++-------------
+ src/dnsmasq.h | 3 ++-
+ src/dnssec.c | 18 ++++++++++--------
+ 4 files changed, 36 insertions(+), 23 deletions(-)
+
+diff --git a/man/dnsmasq.8 b/man/dnsmasq.8
+index 097e7d75145c..2db780d90987 100644
+--- a/man/dnsmasq.8
++++ b/man/dnsmasq.8
+@@ -678,7 +678,8 @@ which have not been throughly checked.
+ Enables an alternative way of checking the validity of the system time for DNSSEC (see --dnssec-no-timecheck). In this case, the
+ system time is considered to be valid once it becomes later than the timestamp on the specified file. The file is created and
+ its timestamp set automatically by dnsmasq. The file must be stored on a persistent filesystem, so that it and its mtime are carried
+-over system restarts.
++over system restarts. The timestamp file is created after dnsmasq has dropped root, so it must be in a location writable by the
++unprivileged user that dnsmasq runs as.
+ .TP
+ .B --proxy-dnssec
+ Copy the DNSSEC Authenticated Data bit from upstream servers to downstream clients and cache it. This is an
+diff --git a/src/dnsmasq.c b/src/dnsmasq.c
+index 9e05c0e31569..f3e5bcffec4f 100644
+--- a/src/dnsmasq.c
++++ b/src/dnsmasq.c
+@@ -58,9 +58,6 @@ int main (int argc, char **argv)
+ struct dhcp_context *context;
+ struct dhcp_relay *relay;
+ #endif
+-#ifdef HAVE_DNSSEC
+- int badtime;
+-#endif
+
+ #ifdef LOCALEDIR
+ setlocale(LC_ALL, "");
+@@ -156,10 +153,10 @@ int main (int argc, char **argv)
+ {
+ #ifdef HAVE_DNSSEC
+ if (!daemon->ds)
+- die(_("No trust anchors provided for DNSSEC"), NULL, EC_BADCONF);
++ die(_("no trust anchors provided for DNSSEC"), NULL, EC_BADCONF);
+
+ if (daemon->cachesize < CACHESIZ)
+- die(_("Cannot reduce cache size from default when DNSSEC enabled"), NULL, EC_BADCONF);
++ die(_("cannot reduce cache size from default when DNSSEC enabled"), NULL, EC_BADCONF);
+ #else
+ die(_("DNSSEC not available: set HAVE_DNSSEC in src/config.h"), NULL, EC_BADCONF);
+ #endif
+@@ -172,10 +169,10 @@ int main (int argc, char **argv)
+
+ #ifdef HAVE_CONNTRACK
+ if (option_bool(OPT_CONNTRACK) && (daemon->query_port != 0 || daemon->osport))
+- die (_("Cannot use --conntrack AND --query-port"), NULL, EC_BADCONF);
++ die (_("cannot use --conntrack AND --query-port"), NULL, EC_BADCONF);
+ #else
+ if (option_bool(OPT_CONNTRACK))
+- die(_("Conntrack support not available: set HAVE_CONNTRACK in src/config.h"), NULL, EC_BADCONF);
++ die(_("conntrack support not available: set HAVE_CONNTRACK in src/config.h"), NULL, EC_BADCONF);
+ #endif
+
+ #ifdef HAVE_SOLARIS_NETWORK
+@@ -195,7 +192,7 @@ int main (int argc, char **argv)
+
+ #ifndef HAVE_LOOP
+ if (option_bool(OPT_LOOP_DETECT))
+- die(_("Loop detection not available: set HAVE_LOOP in src/config.h"), NULL, EC_BADCONF);
++ die(_("loop detection not available: set HAVE_LOOP in src/config.h"), NULL, EC_BADCONF);
+ #endif
+
+ now = dnsmasq_time();
+@@ -373,10 +370,6 @@ int main (int argc, char **argv)
+ if (baduser)
+ die(_("unknown user or group: %s"), baduser, EC_BADCONF);
+
+-#ifdef HAVE_DNSSEC
+- badtime = setup_timestamp(ent_pw);
+-#endif
+-
+ /* implement group defaults, "dip" if available, or group associated with uid */
+ if (!daemon->group_set && !gp)
+ {
+@@ -693,10 +686,23 @@ int main (int argc, char **argv)
+ #ifdef HAVE_DNSSEC
+ if (option_bool(OPT_DNSSEC_VALID))
+ {
++ int rc;
++
++ /* Delay creating the timestamp file until here, after we've changed user, so that
++ it has the correct owner to allow updating the mtime later.
++ This means we have to report fatal errors via the pipe. */
++ if ((rc = setup_timestamp()) == -1)
++ {
++ send_event(err_pipe[1], EVENT_TIME_ERR, errno, daemon->timestamp_file);
++ _exit(0);
++ }
++
+ my_syslog(LOG_INFO, _("DNSSEC validation enabled"));
++
+ if (option_bool(OPT_DNSSEC_TIME))
+ my_syslog(LOG_INFO, _("DNSSEC signature timestamps not checked until first cache reload"));
+- if (badtime)
++
++ if (rc == 1)
+ my_syslog(LOG_INFO, _("DNSSEC signature timestamps not checked until system time valid"));
+ }
+ #endif
+@@ -1170,6 +1176,9 @@ static void fatal_event(struct event_desc *ev, char *msg)
+
+ case EVENT_TFTP_ERR:
+ die(_("TFTP directory %s inaccessible: %s"), msg, EC_FILE);
++
++ case EVENT_TIME_ERR:
++ die(_("cannot create timestamp file %s: %s" ), msg, EC_BADCONF);
+ }
+ }
+
+diff --git a/src/dnsmasq.h b/src/dnsmasq.h
+index a451cb4dd03c..fc7259881358 100644
+--- a/src/dnsmasq.h
++++ b/src/dnsmasq.h
+@@ -167,6 +167,7 @@ struct event_desc {
+ #define EVENT_INIT 21
+ #define EVENT_NEWADDR 22
+ #define EVENT_NEWROUTE 23
++#define EVENT_TIME_ERR 24
+
+ /* Exit codes. */
+ #define EC_GOOD 0
+@@ -1152,7 +1153,7 @@ int dnssec_chase_cname(time_t now, struct dns_header *header, size_t plen, char
+ int dnskey_keytag(int alg, int flags, unsigned char *rdata, int rdlen);
+ size_t filter_rrsigs(struct dns_header *header, size_t plen);
+ unsigned char* hash_questions(struct dns_header *header, size_t plen, char *name);
+-int setup_timestamp(struct passwd *ent_pw);
++int setup_timestamp(void);
+
+ /* util.c */
+ void rand_init(void);
+diff --git a/src/dnssec.c b/src/dnssec.c
+index c60eacf73c6b..ad0d6f072ba2 100644
+--- a/src/dnssec.c
++++ b/src/dnssec.c
+@@ -397,18 +397,21 @@ static int serial_compare_32(unsigned long s1, unsigned long s2)
+
+ /* Called at startup. If the timestamp file is configured and exists, put its mtime on
+ timestamp_time. If it doesn't exist, create it, and set the mtime to 1-1-2015.
+- Change the ownership to the user we'll be running as, so that we can update the mtime.
++ return -1 -> Cannot create file.
++ 0 -> not using timestamp, or timestamp exists and is in past.
++ 1 -> timestamp exists and is in future.
+ */
++
+ static time_t timestamp_time;
+ static int back_to_the_future;
+
+-int setup_timestamp(struct passwd *ent_pw)
++int setup_timestamp(void)
+ {
+ struct stat statbuf;
+
+ back_to_the_future = 0;
+
+- if (!option_bool(OPT_DNSSEC_VALID) || !daemon->timestamp_file)
++ if (!daemon->timestamp_file)
+ return 0;
+
+ if (stat(daemon->timestamp_file, &statbuf) != -1)
+@@ -428,7 +431,8 @@ int setup_timestamp(struct passwd *ent_pw)
+
+ if (errno == ENOENT)
+ {
+- int fd = open(daemon->timestamp_file, O_WRONLY | O_CREAT | O_NONBLOCK, 0666);
++ /* NB. for explanation of O_EXCL flag, see comment on pidfile in dnsmasq.c */
++ int fd = open(daemon->timestamp_file, O_WRONLY | O_CREAT | O_NONBLOCK | O_EXCL, 0666);
+ if (fd != -1)
+ {
+ struct utimbuf timbuf;
+@@ -436,14 +440,12 @@ int setup_timestamp(struct passwd *ent_pw)
+ close(fd);
+
+ timestamp_time = timbuf.actime = timbuf.modtime = 1420070400; /* 1-1-2015 */
+- if (utime(daemon->timestamp_file, &timbuf) == 0 &&
+- (!ent_pw || getuid() != 0 || chown(daemon->timestamp_file, ent_pw->pw_uid, -1) == 0))
++ if (utime(daemon->timestamp_file, &timbuf) == 0)
+ goto check_and_exit;
+ }
+ }
+
+- die(_("Cannot create timestamp file %s: %s" ), daemon->timestamp_file, EC_BADCONF);
+- return 0;
++ return -1;
+ }
+
+ /* Check whether today/now is between date_start and date_end */
+--
+2.1.0
+
+++ /dev/null
-Add initial support for cm-fx6 module.
-
-cm-fx6 is a module based on mx6q SoC with the following features:
-- Up to 4GB of DDR3
-- 1 LCD/DVI output port
-- 1 HDMI output port
-- 2 LVDS LCD ports
-- Gigabit Ethernet
-- Analog Audio
-- CAN
-- SATA
-- NAND
-- PCIE
-
-This patch allows to boot up the module, configures the serial console,
-the Ethernet adapter and the heartbeat led.
-
-cm-fx6 is embedded inside the Utilite computer.
-
-Signed-off-by: Valentin Raevsky <valentin@compulab.co.il>
-Signed-off-by: Igor Grinberg <grinberg@compulab.co.il>
----
-
-Shawn, can this still be applied for 3.13 ?
-
-diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
-index f0895c5..7521a34 100644
---- a/arch/arm/boot/dts/Makefile
-+++ b/arch/arm/boot/dts/Makefile
-@@ -117,6 +117,7 @@ dtb-$(CONFIG_ARCH_MXC) += \
- imx6dl-sabresd.dtb \
- imx6dl-wandboard.dtb \
- imx6q-arm2.dtb \
-+ imx6q-cm-fx6.dtb \
- imx6q-sabreauto.dtb \
- imx6q-sabrelite.dtb \
- imx6q-sabresd.dtb \
-diff --git a/arch/arm/boot/dts/imx6q-cm-fx6.dts b/arch/arm/boot/dts/imx6q-cm-fx6.dts
-new file mode 100644
-index 0000000..2419751
---- /dev/null
-+++ b/arch/arm/boot/dts/imx6q-cm-fx6.dts
-@@ -0,0 +1,53 @@
-+/*
-+ * Copyright 2013 CompuLab Ltd.
-+ *
-+ * Author: Valentin Raevsky <valentin@compulab.co.il>
-+ *
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+/dts-v1/;
-+#include "imx6q.dtsi"
-+
-+/ {
-+ model = "CompuLab CM-FX6";
-+ compatible = "compulab,cm-fx6", "fsl,imx6q";
-+
-+ memory {
-+ reg = <0x10000000 0x80000000>;
-+ };
-+
-+ leds {
-+ compatible = "gpio-leds";
-+
-+ heartbeat-led {
-+ label = "Heartbeat";
-+ gpios = <&gpio2 31 0>;
-+ linux,default-trigger = "heartbeat";
-+ };
-+ };
-+};
-+
-+&fec {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_enet_1>;
-+ phy-mode = "rgmii";
-+ status = "okay";
-+};
-+
-+&gpmi {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_gpmi_nand_1>;
-+ status = "okay";
-+};
-+
-+&uart4 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&pinctrl_uart4_1>;
-+ status = "okay";
-+};
--- /dev/null
+From 7f558e6e8abee42cc966e2cb64be0de875797e07 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Fri, 20 Feb 2015 10:01:26 +0100
+Subject: [PATCH] sun7i: dts: lamobo-r1: fix sata pwr regulator pin.
+
+Lamobo-R1 use PB3 instead of PB8 for controlling the SATA power regulator.
+---
+ arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+diff --git a/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts b/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts
+index 1eb6c9b..d634d2f 100644
+--- a/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts
++++ b/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts
+@@ -166,6 +166,16 @@
+ reg = <1>;
+ };
+ };
++
++ pio: pinctrl@01c20800 {
++ ahci_pwr_pin_a: ahci_pwr_pin@0 {
++ allwinner,pins = "PB3";
++ allwinner,function = "gpio_out";
++ allwinner,drive = <0>;
++ allwinner,pull = <0>;
++ };
++ };
++
+ };
+
+ leds {
+@@ -181,6 +191,14 @@
+ };
+
+ reg_ahci_5v: ahci-5v {
++ compatible = "regulator-fixed";
++ pinctrl-names = "default";
++ pinctrl-0 = <&ahci_pwr_pin_a>;
++ regulator-name = "ahci-5v";
++ regulator-min-microvolt = <5000000>;
++ regulator-max-microvolt = <5000000>;
++ enable-active-high;
++ gpio = <&pio 1 3 0>;
+ status = "okay";
+ };
+
+--
+1.8.5.2
+
+++ /dev/null
-diff -Naur linux-3.14.30.org/arch/arm/boot/dts/Makefile linux-3.14.30/arch/arm/boot/dts/Makefile
---- linux-3.14.30.org/arch/arm/boot/dts/Makefile 2015-01-29 19:56:17.000000000 +0100
-+++ linux-3.14.30/arch/arm/boot/dts/Makefile 2015-01-29 20:41:06.598335182 +0100
-@@ -304,6 +304,7 @@
- sun5i-a13-olinuxino-micro.dtb \
- sun6i-a31-colombus.dtb \
- sun7i-a20-bananapi.dtb \
-+ sun7i-a20-bananapro.dtb \
- sun7i-a20-cubieboard2.dtb \
- sun7i-a20-cubietruck.dtb \
- sun7i-a20-lamobo-r1.dtb \
-diff -Naur linux-3.14.30.org/arch/arm/boot/dts/sun7i-a20-bananapi.dts linux-3.14.30/arch/arm/boot/dts/sun7i-a20-bananapi.dts
---- linux-3.14.30.org/arch/arm/boot/dts/sun7i-a20-bananapi.dts 2015-01-29 19:56:17.000000000 +0100
-+++ linux-3.14.30/arch/arm/boot/dts/sun7i-a20-bananapi.dts 2015-01-29 20:33:18.143334959 +0100
-@@ -199,7 +199,7 @@
- regulator-name = "gmac-3v3";
- regulator-min-microvolt = <3300000>;
- regulator-max-microvolt = <3300000>;
-- startup-delay-us = <50000>;
-+ startup-delay-us = <100000>;
- enable-active-high;
- gpio = <&pio 7 23 0>;
- status = "okay";
-diff -Naur linux-3.14.30.org/arch/arm/boot/dts/sun7i-a20-bananapro.dts linux-3.14.30/arch/arm/boot/dts/sun7i-a20-bananapro.dts
---- linux-3.14.30.org/arch/arm/boot/dts/sun7i-a20-bananapro.dts 1970-01-01 01:00:00.000000000 +0100
-+++ linux-3.14.30/arch/arm/boot/dts/sun7i-a20-bananapro.dts 2015-01-29 20:40:45.153335172 +0100
-@@ -0,0 +1,262 @@
-+/*
-+ * Copyright 2015 Arne Fitzenreiter
-+ * Arne Fitzenreiter <arne_f@ipfire.org>
-+ *
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+/dts-v1/;
-+/include/ "sun7i-a20.dtsi"
-+/include/ "sunxi-common-regulators.dtsi"
-+#include <dt-bindings/input/input.h>
-+
-+/ {
-+ model = "LeMaker Banana Pro";
-+ compatible = "lemaker,bananapro", "allwinner,sun7i-a20";
-+
-+ aliases {
-+ spi0 = &spi1;
-+ spi1 = &spi2;
-+ };
-+
-+ soc@01c00000 {
-+ spi1: spi@01c06000 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&spi1_pins_a>;
-+ status = "okay";
-+ };
-+
-+ spi2: spi@01c17000 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&spi2_pins_a>;
-+ status = "okay";
-+ };
-+
-+ mmc0: mmc@01c0f000 {
-+ pinctrl-names = "default", "default";
-+ pinctrl-0 = <&mmc0_pins_a>;
-+ pinctrl-1 = <&mmc0_cd_pin_bananapi>;
-+ cd-gpios = <&pio 7 10 0>; /* PH10 */
-+ status = "okay";
-+ };
-+
-+ mmc3: mmc@01c12000 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&mmc3_pins_a>;
-+ vmmc-supply = <®_vmmc3>;
-+ bus-width = <4>;
-+ non-removable;
-+ status = "okay";
-+ };
-+
-+ usbphy: phy@01c13400 {
-+ usb1_vbus-supply = <®_usb1_vbus>;
-+ usb2_vbus-supply = <®_usb2_vbus>;
-+ status = "okay";
-+ };
-+
-+ ehci0: usb@01c14000 {
-+ status = "okay";
-+ };
-+
-+ ohci0: usb@01c14400 {
-+ status = "okay";
-+ };
-+
-+ ahci: sata@01c18000 {
-+ target-supply = <®_ahci_5v>;
-+ status = "okay";
-+ };
-+
-+ ehci1: usb@01c1c000 {
-+ status = "okay";
-+ };
-+
-+ ohci1: usb@01c1c400 {
-+ status = "okay";
-+ };
-+
-+ pinctrl@01c20800 {
-+ usb1_vbus_pin_bananapro: usb1_vbus_pin@0 {
-+ allwinner,pins = "PH0";
-+ allwinner,function = "gpio_out";
-+ allwinner,drive = <0>;
-+ allwinner,pull = <0>;
-+ };
-+
-+ usb2_vbus_pin_bananapro: usb2_vbus_pin@0 {
-+ allwinner,pins = "PH1";
-+ allwinner,function = "gpio_out";
-+ allwinner,drive = <0>;
-+ allwinner,pull = <0>;
-+ };
-+
-+ led_pins_bananapi: led_pins@0 {
-+ allwinner,pins = "PH24", "PG2";
-+ allwinner,function = "gpio_out";
-+ allwinner,drive = <0>;
-+ allwinner,pull = <0>;
-+ };
-+
-+ mmc0_cd_pin_bananapi: mmc0_cd_pin@0 {
-+ allwinner,pins = "PH10";
-+ allwinner,function = "gpio_in";
-+ allwinner,drive = <0>;
-+ allwinner,pull = <1>;
-+ };
-+
-+ vmmc3_pin_bananapro: vmmc3_pin@0 {
-+ allwinner,pins = "PH22";
-+ allwinner,function = "gpio_out";
-+ allwinner,drive = <0>;
-+ allwinner,pull = <0>;
-+ };
-+
-+ gmac_power_pin_bananapi: gmac_power_pin@0 {
-+ allwinner,pins = "PH23";
-+ allwinner,function = "gpio_out";
-+ allwinner,drive = <0>;
-+ allwinner,pull = <0>;
-+ };
-+ };
-+
-+ lradc: lradc@01c22800 {
-+ allwinner,chan0-step = <200>;
-+ linux,chan0-keycodes = <KEY_VOLUMEUP KEY_VOLUMEDOWN
-+ KEY_MENU KEY_SEARCH KEY_HOME
-+ KEY_ESC KEY_ENTER>;
-+ status = "okay";
-+ };
-+
-+ ir0: ir@01c21800 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&ir0_pins_a>;
-+ status = "okay";
-+ };
-+
-+ uart0: serial@01c28000 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&uart0_pins_a>;
-+ status = "okay";
-+ };
-+
-+ uart2: serial@01c28800 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&uart2_pins_a>;
-+ status = "okay";
-+ };
-+
-+ uart6: serial@01c29800 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&uart6_pins_a>;
-+ status = "okay";
-+ };
-+
-+ uart7: serial@01c29c00 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&uart7_pins_a>;
-+ status = "okay";
-+ };
-+
-+ i2c0: i2c@01c2ac00 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&i2c0_pins_a>;
-+ status = "okay";
-+
-+ axp: axp20x@34 {
-+ reg = <0x34>;
-+ interrupt-parent = <&nmi_intc>;
-+ interrupts = <0 8>;
-+ axp,system-power-controller;
-+ /include/ "x-powers-axp209.dtsi"
-+ };
-+ };
-+
-+ i2c1: i2c@01c2b000 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&i2c1_pins_a>;
-+ status = "okay";
-+ };
-+
-+ i2c2: i2c@01c2b400 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&i2c2_pins_a>;
-+ status = "okay";
-+ };
-+
-+ gmac: ethernet@01c50000 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&gmac_pins_rgmii_a>;
-+ phy = <&phy1>;
-+ phy-mode = "rgmii";
-+ phy-supply = <®_gmac_3v3>;
-+ status = "okay";
-+
-+ phy1: ethernet-phy@1 {
-+ reg = <1>;
-+ };
-+ };
-+ };
-+
-+ leds {
-+ compatible = "gpio-leds";
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&led_pins_bananapi>;
-+
-+ green {
-+ label = "bananapi:green:usr";
-+ gpios = <&pio 7 24 0>;
-+ linux,default-trigger = "heartbeat";
-+ };
-+ blue {
-+ label = "bananapi:blue:usr";
-+ gpios = <&pio 6 2 0>;
-+ linux,default-trigger = "mmc0";
-+ };
-+ };
-+
-+ reg_ahci_5v: ahci-5v {
-+ status = "okay";
-+ };
-+
-+ reg_usb1_vbus: usb1-vbus {
-+ pinctrl-0 = <&usb1_vbus_pin_bananapro>;
-+ gpio = <&pio 7 0 0>; /* PH0 */
-+ status = "okay";
-+ };
-+
-+ reg_usb2_vbus: usb2-vbus {
-+ pinctrl-0 = <&usb2_vbus_pin_bananapro>;
-+ gpio = <&pio 7 1 0>; /* PH1 */
-+ status = "okay";
-+ };
-+
-+ reg_gmac_3v3: gmac-3v3 {
-+ compatible = "regulator-fixed";
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&gmac_power_pin_bananapi>;
-+ regulator-name = "gmac-3v3";
-+ regulator-min-microvolt = <3300000>;
-+ regulator-max-microvolt = <3300000>;
-+ startup-delay-us = <100000>;
-+ enable-active-high;
-+ gpio = <&pio 7 23 0>;
-+ status = "okay";
-+ };
-+
-+ reg_vmmc3: vmmc3 {
-+ compatible = "regulator-fixed";
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&vmmc3_pin_bananapro>;
-+ regulator-name = "vmmc3";
-+ regulator-min-microvolt = <3300000>;
-+ regulator-max-microvolt = <3300000>;
-+ enable-active-high;
-+ gpio = <&pio 7 22 0>;
-+ };
-+};
-diff -Naur linux-3.14.30.org/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts linux-3.14.30/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts
---- linux-3.14.30.org/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts 2015-01-29 19:56:17.000000000 +0100
-+++ linux-3.14.30/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts 2015-01-30 00:00:01.678340873 +0100
-@@ -199,7 +199,7 @@
- regulator-name = "gmac-3v3";
- regulator-min-microvolt = <3300000>;
- regulator-max-microvolt = <3300000>;
-- startup-delay-us = <50000>;
-+ startup-delay-us = <100000>;
- enable-active-high;
- gpio = <&pio 7 23 0>;
- status = "okay";
--- /dev/null
+commit 650a3ad5151958b99a95836fb8b84b8aa18da1be
+Author: Tobias Brunner <tobias@strongswan.org>
+Date: Wed Feb 25 08:09:11 2015 +0100
+
+ ike-sa-manager: Make sure the message ID of initial messages is 0
+
+ It is mandated by the RFCs and it is expected by the task managers.
+
+ Initial messages with invalid MID will be treated like regular messages,
+ so no IKE_SA will be created for them. Instead, if the responder SPI is 0
+ no SA will be found and the message is rejected with ALERT_INVALID_IKE_SPI.
+ If an SPI is set and we do find an SA, then we either ignore the message
+ because the MID is unexpected, or because we don't allow initial messages
+ on established connections.
+
+ There is one exception, though, if an attacker can slip in an IKE_SA_INIT
+ with both SPIs set before the client's IKE_AUTH is handled by the server,
+ it does get processed (see next commit).
+
+ References #816.
+
+diff --git a/src/libcharon/sa/ike_sa_manager.c b/src/libcharon/sa/ike_sa_manager.c
+index d0cbd47..5e2b925 100644
+--- a/src/libcharon/sa/ike_sa_manager.c
++++ b/src/libcharon/sa/ike_sa_manager.c
+@@ -1184,7 +1184,8 @@ METHOD(ike_sa_manager_t, checkout_by_message, ike_sa_t*,
+
+ DBG2(DBG_MGR, "checkout IKE_SA by message");
+
+- if (id->get_responder_spi(id) == 0)
++ if (id->get_responder_spi(id) == 0 &&
++ message->get_message_id(message) == 0)
+ {
+ if (message->get_major_version(message) == IKEV2_MAJOR_VERSION)
+ {
--- /dev/null
+commit dd0ebb54837298c869389d36a0b42eefdb893dd6
+Author: Tobias Brunner <tobias@strongswan.org>
+Date: Wed Feb 25 08:30:33 2015 +0100
+
+ ikev2: Only accept initial messages in specific states
+
+ The previous code allowed an attacker to slip in an IKE_SA_INIT with
+ both SPIs and MID 1 set when an IKE_AUTH would be expected instead.
+
+ References #816.
+
+diff --git a/src/libcharon/sa/ikev2/task_manager_v2.c b/src/libcharon/sa/ikev2/task_manager_v2.c
+index be84e71..540d4dc 100644
+--- a/src/libcharon/sa/ikev2/task_manager_v2.c
++++ b/src/libcharon/sa/ikev2/task_manager_v2.c
+@@ -1304,17 +1304,16 @@ METHOD(task_manager_t, process_message, status_t,
+ {
+ if (mid == this->responding.mid)
+ {
+- /* reject initial messages once established */
+- if (msg->get_exchange_type(msg) == IKE_SA_INIT ||
+- msg->get_exchange_type(msg) == IKE_AUTH)
++ /* reject initial messages if not received in specific states */
++ if ((msg->get_exchange_type(msg) == IKE_SA_INIT &&
++ this->ike_sa->get_state(this->ike_sa) != IKE_CREATED) ||
++ (msg->get_exchange_type(msg) == IKE_AUTH &&
++ this->ike_sa->get_state(this->ike_sa) != IKE_CONNECTING))
+ {
+- if (this->ike_sa->get_state(this->ike_sa) != IKE_CREATED &&
+- this->ike_sa->get_state(this->ike_sa) != IKE_CONNECTING)
+- {
+- DBG1(DBG_IKE, "ignoring %N in established IKE_SA state",
+- exchange_type_names, msg->get_exchange_type(msg));
+- return FAILED;
+- }
++ DBG1(DBG_IKE, "ignoring %N in IKE_SA state %N",
++ exchange_type_names, msg->get_exchange_type(msg),
++ ike_sa_state_names, this->ike_sa->get_state(this->ike_sa));
++ return FAILED;
+ }
+ if (!this->ike_sa->supports_extension(this->ike_sa, EXT_MOBIKE))
+ { /* with MOBIKE, we do no implicit updates */
--- /dev/null
+commit eb251906298b529fa53b8a99746a9a7a9f318dd5
+Author: Tobias Brunner <tobias@strongswan.org>
+Date: Wed Feb 25 08:18:58 2015 +0100
+
+ ikev2: Don't destroy the SA if an IKE_SA_INIT with unexpected MID is received
+
+ This reverts 8f727d800751 ("Clean up IKE_SA state if IKE_SA_INIT request
+ does not have message ID 0") because it allowed to close any IKE_SA by
+ sending an IKE_SA_INIT with an unexpected MID and both SPIs set to those
+ of that SA.
+
+ The next commit will prevent SAs from getting created for IKE_SA_INIT messages
+ with invalid MID.
+
+ Fixes #816.
+
+diff --git a/src/libcharon/sa/ikev2/task_manager_v2.c b/src/libcharon/sa/ikev2/task_manager_v2.c
+index 48266aa..be84e71 100644
+--- a/src/libcharon/sa/ikev2/task_manager_v2.c
++++ b/src/libcharon/sa/ikev2/task_manager_v2.c
+@@ -1355,10 +1355,6 @@ METHOD(task_manager_t, process_message, status_t,
+ {
+ DBG1(DBG_IKE, "received message ID %d, expected %d. Ignored",
+ mid, this->responding.mid);
+- if (msg->get_exchange_type(msg) == IKE_SA_INIT)
+- { /* clean up IKE_SA state if IKE_SA_INIT has invalid msg ID */
+- return DESTROY_ME;
+- }
+ }
+ }
+ else
+++ /dev/null
-diff --git a/src/libcharon/sa/ikev2/task_manager_v2.c b/src/libcharon/sa/ikev2/t
-index e9a677a655e4..69118abe78df 100644
---- a/src/libcharon/sa/ikev2/task_manager_v2.c
-+++ b/src/libcharon/sa/ikev2/task_manager_v2.c
-@@ -1339,7 +1339,7 @@ METHOD(task_manager_t, process_message, status_t,
- {
- DBG1(DBG_IKE, "received message ID %d, expected %d. Ignored",
- mid, this->responding.mid);
-- if (msg->get_exchange_type(msg) == IKE_SA_INIT)
-+ if (mid != 0 && msg->get_exchange_type(msg) == IKE_SA_INIT)
- { /* clean up IKE_SA state if IKE_SA_INIT has invalid msg ID */
- return DESTROY_ME;
- }
COREVER=$(cat /opt/pakfire/db/core/mine)
# FIXME: edit this lines before release
-URL="http://download.ipfire.org/releases/ipfire-2.x/2.15-core$COREVER/"
-ISO="ipfire-2.15.i586-full-core$COREVER.iso"
+URL="http://download.ipfire.org/releases/ipfire-2.x/2.17-core$COREVER/"
+ISO="ipfire-2.17.i586-full-core$COREVER.iso"
if [ -z $1 ]; then
echo usage: $0 backup-file
}
}
-int create_udev(void)
-{
- #define UDEV_NET_CONF "/etc/udev/rules.d/30-persistent-network.rules"
- FILE *fp;
- int i;
-
- if ( (fp = fopen(UDEV_NET_CONF, "w")) == NULL ) {
- fprintf(stderr,"Couldn't open" UDEV_NET_CONF);
- return 1;
- }
-
- for (i = 0 ; i < 4 ; i++)
- {
- if (strcmp(knics[i].macaddr, "")) {
- fprintf(fp,"\n# %s\nACTION==\"add\", SUBSYSTEM==\"net\", ATTR{type}==\"1\", ATTR{address}==\"%s\", NAME=\"%s0\"\n", knics[i].description, knics[i].macaddr, lcolourcard[i]);
- }
- }
- fclose(fp);
- return 0;
-}
-
int write_configs_netudev(int card , int colour)
{
char commandstring[STRING_SIZE];
} else {
rename_nics();
}
- create_udev();
return 1;
}
id
it
ja
-ja_JP
jv
km_KH
nl
pt_PT
ro_RO
ru
-ru_RU
rw
sk
sq
#
# Translators:
# irenee Munyaneza <muirenee@yahoo.fr>, 2014
+# nonux <nonux@free.fr>, 2015
+# Sebastien Labrie <fonkyy@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: IPFire Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-08-21 15:12+0000\n"
-"PO-Revision-Date: 2014-10-06 16:32+0000\n"
-"Last-Translator: irenee Munyaneza <muirenee@yahoo.fr>\n"
+"PO-Revision-Date: 2015-02-17 23:25+0000\n"
+"Last-Translator: nonux <nonux@free.fr>\n"
"Language-Team: French (http://www.transifex.com/projects/p/ipfire/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
#: dhcp.c:50
msgid "Start address:"
-msgstr ""
+msgstr "Adresse du début :"
#: dhcp.c:51
msgid "End address:"
-msgstr ""
+msgstr "Adresse de fin : "
#: dhcp.c:52 networking.c:717
msgid "Primary DNS:"
-msgstr ""
+msgstr "DNS primaire:"
#: dhcp.c:53 networking.c:723
msgid "Secondary DNS:"
-msgstr ""
+msgstr "DNS secondaire:"
#: dhcp.c:54
msgid "Default lease (mins):"
-msgstr ""
+msgstr "Bail par défaut (mins) :"
#: dhcp.c:55
msgid "Max lease (mins):"
-msgstr ""
+msgstr "Bail maximum (mins) :"
#: dhcp.c:56
msgid "Domain name suffix:"
-msgstr ""
+msgstr "Suffixe du nom de domaine : "
#: dhcp.c:86 dhcp.c:93 dhcp.c:101 domainname.c:34 hostname.c:37 keymap.c:70
#: misc.c:40 misc.c:52 netstuff.c:377 netstuff.c:566 netstuff.c:704
#: networking.c:442 networking.c:552 networking.c:603 networking.c:610
#: networking.c:713 timezone.c:63
msgid "Unable to open settings file"
-msgstr ""
+msgstr "Impossible d'ouvrir le fichier de paramètres"
#: dhcp.c:111
msgid "DHCP server configuration"
-msgstr ""
+msgstr "Configuration du serveur DHCP"
#: dhcp.c:116
msgid "Configure the DHCP server by entering the settings information."
#: dhcp.c:125
msgid "Enabled"
-msgstr ""
+msgstr "Activé"
#: dhcp.c:142 domainname.c:43 hostname.c:47 keymap.c:86 main.c:99 main.c:172
#: main.c:174 netstuff.c:157 netstuff.c:733 netstuff.c:756 networking.c:163
msgid ""
"The following fields are invalid:\n"
"\n"
-msgstr ""
+msgstr "Les champs suivants sont invalides:\n\n"
#: dhcp.c:159
msgid "Start address"
-msgstr ""
+msgstr "Adresse du début :"
#: dhcp.c:165
msgid "End address"
-msgstr ""
+msgstr "Adresse de fin : "
#: dhcp.c:173 networking.c:755
msgid "Primary DNS"
-msgstr ""
+msgstr "DNS primaire"
#: dhcp.c:182 networking.c:764
msgid "Secondary DNS"
-msgstr ""
+msgstr "DNS secondaire"
#: dhcp.c:189
msgid "Default lease time"
-msgstr ""
+msgstr "Bail par défaut"
#: dhcp.c:195
msgid "Max. lease time"
-msgstr ""
+msgstr "Bail maximum"
#: domainname.c:42 main.c:70
msgid "Domain name"
#: domainname.c:42
msgid "Enter Domain name"
-msgstr ""
+msgstr "Entrez le nom de domaine"
#: domainname.c:48
msgid "Domain name cannot be empty."
-msgstr ""
+msgstr "Le nom de domaine ne peut pas être vide."
#: domainname.c:50
msgid "Domain name cannot contain spaces."
-msgstr ""
+msgstr "Le nom de domaine ne peut pas contenir d'espace."
#: domainname.c:53
msgid "Domain name may only contain letters, numbers, hyphens and periods."
-msgstr ""
+msgstr "Le nom de domaine ne peut contenir que des lettres, nombres, traits d'union ou point."
#: hostname.c:46 main.c:69
msgid "Hostname"
-msgstr ""
+msgstr "Nom d'hôte"
#: hostname.c:46
msgid "Enter the machine's hostname."
-msgstr ""
+msgstr "Entrez le nom d'hôte de la machine."
#: hostname.c:53
msgid "Hostname cannot be empty."
-msgstr ""
+msgstr "Le nom de domaine ne peut pas être vide."
#: hostname.c:55
msgid "Hostname cannot contain spaces."
-msgstr ""
+msgstr "Le nom de domaine ne doit pas contenir d'espaces."
#: hostname.c:58
msgid "Hostname may only contain letters, numbers and hyphens."
#: main.c:68 timezone.c:77
msgid "Timezone"
-msgstr ""
+msgstr "Fuseau horaire"
#: main.c:71 networking.c:110 networking.c:115 networking.c:447
msgid "Networking"
-msgstr ""
+msgstr "Réseau"
#: main.c:72 misc.c:147
msgid "ISDN"
#: main.c:73
msgid "'root' password"
-msgstr ""
+msgstr "Mot de passe \"root\""
#: main.c:74
msgid "'admin' password"
-msgstr ""
+msgstr "Most de passe \"admin\""
#: main.c:90
msgid " <Tab>/<Alt-Tab> between elements | <Space> selects"
#: main.c:97
msgid "Section menu"
-msgstr ""
+msgstr "Menu de sélection"
#: main.c:98
msgid "Select the item you wish to configure."
#: main.c:99
msgid "Quit"
-msgstr ""
+msgstr "Quitter"
#: main.c:172
msgid "Setup is complete."
#: misc.c:76
msgid "Unable to write /etc/hosts."
-msgstr ""
+msgstr "Impossible d'écrire /etc/hosts."
#: misc.c:117
msgid "Unable to write /etc/hosts.deny."
-msgstr ""
+msgstr "Impossible d'écrire /etc/hosts.deny."
#: misc.c:125
msgid "Unable to write /etc/hosts.allow."
-msgstr ""
+msgstr "Impossible d'écrire /etc/hosts.allow."
#: misc.c:136
msgid "Unable to set hostname."
-msgstr ""
+msgstr "Impossible de définir le nom d'hôte"
#: misc.c:147
msgid "Scanning and configuring ISDN devices."
#: netstuff.c:86
#, c-format
msgid "Interface - %s"
-msgstr ""
+msgstr "Interface - %s"
#: netstuff.c:91
#, c-format
#: netstuff.c:103
msgid "Static"
-msgstr ""
+msgstr "Statique"
#: netstuff.c:104
msgid "DHCP"
-msgstr ""
+msgstr "DHCP"
#: netstuff.c:105
msgid "PPP DIALUP (PPPoE, modem, ATM ...)"
#: netstuff.c:113
msgid "DHCP Hostname:"
-msgstr ""
+msgstr "Nom d'hôte DHCP:"
#: netstuff.c:115
msgid "Force DHCP MTU:"
#: netstuff.c:146
msgid "Network mask:"
-msgstr ""
+msgstr "Masque de sous-réseau : "
#: netstuff.c:173 networking.c:749
msgid "The following fields are invalid:"
-msgstr ""
+msgstr "Les champs suivants sont invalides : "
#: netstuff.c:183
msgid "IP address"
#: netstuff.c:189
msgid "Network mask"
-msgstr ""
+msgstr "Masque de réseau"
#: netstuff.c:198
msgid "DHCP hostname"
-msgstr ""
+msgstr "Nom d'hôte DHCP"
#: netstuff.c:396 netstuff.c:709
msgid "Unset"
#: netstuff.c:673 networking.c:520
msgid "Select"
-msgstr ""
+msgstr "Sélectionner"
#: netstuff.c:673
msgid "Identify"
#: netstuff.c:678
msgid "Device Identification"
-msgstr ""
+msgstr "Identification du périphérique"
#: netstuff.c:678
msgid "The lights on the selected port should flash now for 10 seconds..."
#: netstuff.c:762
msgid "Loading module..."
-msgstr ""
+msgstr "Chargement du module..."
#: netstuff.c:777
msgid "Unable to load driver module."
#: networking.c:110
msgid "Stopping network..."
-msgstr ""
+msgstr "Arrêt du réseau..."
#: networking.c:115
msgid "Restarting network..."
-msgstr ""
+msgstr "Re-démarrage du réseau..."
#: networking.c:146
msgid "No GREEN interface assigned."
-msgstr ""
+msgstr "Pas d'interface VERTE assignée."
#: networking.c:152
msgid "Missing an IP address on GREEN."
#: networking.c:164
msgid "No RED interface assigned."
-msgstr ""
+msgstr "Pas d'interface ROUGE assignée."
#: networking.c:173
msgid "Missing an IP address on RED."
#: networking.c:183
msgid "No ORANGE interface assigned."
-msgstr ""
+msgstr "Pas d'interface ORANGE assignée."
#: networking.c:189
msgid "Missing an IP address on ORANGE."
#: networking.c:199
msgid "No BLUE interface assigned."
-msgstr ""
+msgstr "Pas d'interface BLEUE assignée."
#: networking.c:205
msgid "Missing an IP address on BLUE."
#: networking.c:269 networking.c:520 networking.c:642
msgid "Done"
-msgstr ""
+msgstr "Terminé"
#: networking.c:300
#, c-format
+++ /dev/null
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR The IPFire Project (www.ipfire.org)
-# This file is distributed under the same license as the PACKAGE package.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: IPFire Project\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-08-21 15:12+0000\n"
-"PO-Revision-Date: 2014-08-12 10:08+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/ipfire/language/ja_JP/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: ja_JP\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-#: dhcp.c:50
-msgid "Start address:"
-msgstr ""
-
-#: dhcp.c:51
-msgid "End address:"
-msgstr ""
-
-#: dhcp.c:52 networking.c:717
-msgid "Primary DNS:"
-msgstr ""
-
-#: dhcp.c:53 networking.c:723
-msgid "Secondary DNS:"
-msgstr ""
-
-#: dhcp.c:54
-msgid "Default lease (mins):"
-msgstr ""
-
-#: dhcp.c:55
-msgid "Max lease (mins):"
-msgstr ""
-
-#: dhcp.c:56
-msgid "Domain name suffix:"
-msgstr ""
-
-#: dhcp.c:86 dhcp.c:93 dhcp.c:101 domainname.c:34 hostname.c:37 keymap.c:70
-#: misc.c:40 misc.c:52 netstuff.c:377 netstuff.c:566 netstuff.c:704
-#: networking.c:134 networking.c:255 networking.c:291 networking.c:346
-#: networking.c:442 networking.c:552 networking.c:603 networking.c:610
-#: networking.c:713 timezone.c:63
-msgid "Unable to open settings file"
-msgstr ""
-
-#: dhcp.c:111
-msgid "DHCP server configuration"
-msgstr ""
-
-#: dhcp.c:116
-msgid "Configure the DHCP server by entering the settings information."
-msgstr ""
-
-#: dhcp.c:125
-msgid "Enabled"
-msgstr ""
-
-#: dhcp.c:142 domainname.c:43 hostname.c:47 keymap.c:86 main.c:99 main.c:172
-#: main.c:174 netstuff.c:157 netstuff.c:733 netstuff.c:756 networking.c:163
-#: networking.c:269 networking.c:305 networking.c:409 networking.c:560
-#: networking.c:642 networking.c:653 networking.c:746 passwords.c:89
-#: timezone.c:78
-msgid "OK"
-msgstr ""
-
-#: dhcp.c:143 domainname.c:43 hostname.c:47 keymap.c:86 netstuff.c:158
-#: netstuff.c:673 netstuff.c:733 netstuff.c:756 networking.c:305
-#: networking.c:410 networking.c:560 networking.c:653 networking.c:746
-#: passwords.c:89 timezone.c:78
-msgid "Cancel"
-msgstr ""
-
-#: dhcp.c:156
-msgid ""
-"The following fields are invalid:\n"
-"\n"
-msgstr ""
-
-#: dhcp.c:159
-msgid "Start address"
-msgstr ""
-
-#: dhcp.c:165
-msgid "End address"
-msgstr ""
-
-#: dhcp.c:173 networking.c:755
-msgid "Primary DNS"
-msgstr ""
-
-#: dhcp.c:182 networking.c:764
-msgid "Secondary DNS"
-msgstr ""
-
-#: dhcp.c:189
-msgid "Default lease time"
-msgstr ""
-
-#: dhcp.c:195
-msgid "Max. lease time"
-msgstr ""
-
-#: domainname.c:42 main.c:70
-msgid "Domain name"
-msgstr ""
-
-#: domainname.c:42
-msgid "Enter Domain name"
-msgstr ""
-
-#: domainname.c:48
-msgid "Domain name cannot be empty."
-msgstr ""
-
-#: domainname.c:50
-msgid "Domain name cannot contain spaces."
-msgstr ""
-
-#: domainname.c:53
-msgid "Domain name may only contain letters, numbers, hyphens and periods."
-msgstr ""
-
-#: hostname.c:46 main.c:69
-msgid "Hostname"
-msgstr ""
-
-#: hostname.c:46
-msgid "Enter the machine's hostname."
-msgstr ""
-
-#: hostname.c:53
-msgid "Hostname cannot be empty."
-msgstr ""
-
-#: hostname.c:55
-msgid "Hostname cannot contain spaces."
-msgstr ""
-
-#: hostname.c:58
-msgid "Hostname may only contain letters, numbers and hyphens."
-msgstr ""
-
-#: keymap.c:84 main.c:67
-msgid "Keyboard mapping"
-msgstr ""
-
-#: keymap.c:85
-msgid "Choose the type of keyboard you are using from the list below."
-msgstr ""
-
-#: main.c:68 timezone.c:77
-msgid "Timezone"
-msgstr ""
-
-#: main.c:71 networking.c:110 networking.c:115 networking.c:447
-msgid "Networking"
-msgstr ""
-
-#: main.c:72 misc.c:147
-msgid "ISDN"
-msgstr ""
-
-#: main.c:73
-msgid "'root' password"
-msgstr ""
-
-#: main.c:74
-msgid "'admin' password"
-msgstr ""
-
-#: main.c:90
-msgid " <Tab>/<Alt-Tab> between elements | <Space> selects"
-msgstr ""
-
-#: main.c:97
-msgid "Section menu"
-msgstr ""
-
-#: main.c:98
-msgid "Select the item you wish to configure."
-msgstr ""
-
-#: main.c:99
-msgid "Quit"
-msgstr ""
-
-#: main.c:172
-msgid "Setup is complete."
-msgstr ""
-
-#: main.c:174 netstuff.c:733 networking.c:560 networking.c:653
-msgid "Warning"
-msgstr ""
-
-#: main.c:175
-msgid ""
-"Initial setup was not entirely complete. You must ensure that Setup is "
-"properly finished by running setup again at the shell."
-msgstr ""
-
-#: misc.c:62
-#, c-format
-msgid "Unable to write %s/main/hostname.conf"
-msgstr ""
-
-#: misc.c:71
-msgid "Unable to open main hosts file."
-msgstr ""
-
-#: misc.c:76
-msgid "Unable to write /etc/hosts."
-msgstr ""
-
-#: misc.c:117
-msgid "Unable to write /etc/hosts.deny."
-msgstr ""
-
-#: misc.c:125
-msgid "Unable to write /etc/hosts.allow."
-msgstr ""
-
-#: misc.c:136
-msgid "Unable to set hostname."
-msgstr ""
-
-#: misc.c:147
-msgid "Scanning and configuring ISDN devices."
-msgstr ""
-
-#: misc.c:148
-msgid "Unable to scan for ISDN devices."
-msgstr ""
-
-#: netstuff.c:86
-#, c-format
-msgid "Interface - %s"
-msgstr ""
-
-#: netstuff.c:91
-#, c-format
-msgid "Enter the IP address information for the %s interface."
-msgstr ""
-
-#: netstuff.c:103
-msgid "Static"
-msgstr ""
-
-#: netstuff.c:104
-msgid "DHCP"
-msgstr ""
-
-#: netstuff.c:105
-msgid "PPP DIALUP (PPPoE, modem, ATM ...)"
-msgstr ""
-
-#: netstuff.c:113
-msgid "DHCP Hostname:"
-msgstr ""
-
-#: netstuff.c:115
-msgid "Force DHCP MTU:"
-msgstr ""
-
-#: netstuff.c:134
-msgid "IP address:"
-msgstr ""
-
-#: netstuff.c:146
-msgid "Network mask:"
-msgstr ""
-
-#: netstuff.c:173 networking.c:749
-msgid "The following fields are invalid:"
-msgstr ""
-
-#: netstuff.c:183
-msgid "IP address"
-msgstr ""
-
-#: netstuff.c:189
-msgid "Network mask"
-msgstr ""
-
-#: netstuff.c:198
-msgid "DHCP hostname"
-msgstr ""
-
-#: netstuff.c:396 netstuff.c:709
-msgid "Unset"
-msgstr ""
-
-#: netstuff.c:669
-#, c-format
-msgid "Please choose a networkcard for the following interface - %s."
-msgstr ""
-
-#: netstuff.c:672
-msgid "Extended Network Menu"
-msgstr ""
-
-#: netstuff.c:673 networking.c:520
-msgid "Select"
-msgstr ""
-
-#: netstuff.c:673
-msgid "Identify"
-msgstr ""
-
-#: netstuff.c:678
-msgid "Device Identification"
-msgstr ""
-
-#: netstuff.c:678
-msgid "The lights on the selected port should flash now for 10 seconds..."
-msgstr ""
-
-#: netstuff.c:679
-msgid "Identification is not supported by this interface."
-msgstr ""
-
-#: netstuff.c:691
-msgid "There are no unassigned interfaces on your system."
-msgstr ""
-
-#: netstuff.c:732
-#, c-format
-msgid "Do you really want to remove the assigned %s interface?"
-msgstr ""
-
-#: netstuff.c:755
-msgid "Select network driver"
-msgstr ""
-
-#: netstuff.c:755
-msgid "Set additional module parameters"
-msgstr ""
-
-#: netstuff.c:762
-msgid "Loading module..."
-msgstr ""
-
-#: netstuff.c:777
-msgid "Unable to load driver module."
-msgstr ""
-
-#: netstuff.c:780
-msgid "Module name cannot be blank."
-msgstr ""
-
-#: networking.c:110
-msgid "Stopping network..."
-msgstr ""
-
-#: networking.c:115
-msgid "Restarting network..."
-msgstr ""
-
-#: networking.c:146
-msgid "No GREEN interface assigned."
-msgstr ""
-
-#: networking.c:152
-msgid "Missing an IP address on GREEN."
-msgstr ""
-
-#: networking.c:163
-msgid "Error"
-msgstr ""
-
-#: networking.c:163
-msgid "Ignore"
-msgstr ""
-
-#: networking.c:164
-msgid "No RED interface assigned."
-msgstr ""
-
-#: networking.c:173
-msgid "Missing an IP address on RED."
-msgstr ""
-
-#: networking.c:183
-msgid "No ORANGE interface assigned."
-msgstr ""
-
-#: networking.c:189
-msgid "Missing an IP address on ORANGE."
-msgstr ""
-
-#: networking.c:199
-msgid "No BLUE interface assigned."
-msgstr ""
-
-#: networking.c:205
-msgid "Missing an IP address on BLUE."
-msgstr ""
-
-#: networking.c:217
-msgid "Misssing DNS."
-msgstr ""
-
-#: networking.c:224
-msgid "Missing Default Gateway."
-msgstr ""
-
-#: networking.c:237 networking.c:304
-msgid "Network configuration type"
-msgstr ""
-
-#: networking.c:238 networking.c:409
-msgid "Drivers and card assignments"
-msgstr ""
-
-#: networking.c:239 networking.c:640
-msgid "Address settings"
-msgstr ""
-
-#: networking.c:240 networking.c:743
-msgid "DNS and Gateway settings"
-msgstr ""
-
-#: networking.c:260
-msgid "When configuration is complete, a network restart will be required."
-msgstr ""
-
-#: networking.c:267
-#, c-format
-msgid ""
-"Current config: %s\n"
-"\n"
-"%s"
-msgstr ""
-
-#: networking.c:268
-msgid "Network configuration menu"
-msgstr ""
-
-#: networking.c:269 networking.c:520 networking.c:642
-msgid "Done"
-msgstr ""
-
-#: networking.c:300
-#, c-format
-msgid ""
-"Select the network configuration for %s. The following configuration types "
-"list those interfaces which have ethernet attached. If you change this "
-"setting, a network restart will be required, and you will have to "
-"reconfigure the network driver assignments."
-msgstr ""
-
-#: networking.c:307
-#, c-format
-msgid ""
-"Not enough netcards for your choice.\n"
-"\n"
-"Needed: %d - Available: %d\n"
-msgstr ""
-
-#: networking.c:359
-msgid ""
-"Configure network drivers, and which interface each card is assigned to. The current configuration is as follows:\n"
-"\n"
-msgstr ""
-
-#: networking.c:408
-msgid "Do you wish to change these settings?"
-msgstr ""
-
-#: networking.c:447
-msgid "Restarting non-local network..."
-msgstr ""
-
-#: networking.c:464
-msgid ""
-"Please choose the interface you wish to change.\n"
-"\n"
-msgstr ""
-
-#: networking.c:519
-msgid "Assigned Cards"
-msgstr ""
-
-#: networking.c:520
-msgid "Remove"
-msgstr ""
-
-#: networking.c:556 networking.c:649
-#, c-format
-msgid ""
-"If you change this IP address, and you are logged in remotely, your "
-"connection to the %s machine will be broken, and you will have to reconnect "
-"on the new IP. This is a risky operation, and should only be attempted if "
-"you have physical access to the machine, should something go wrong."
-msgstr ""
-
-#: networking.c:641
-msgid "Select the interface you wish to reconfigure."
-msgstr ""
-
-#: networking.c:729
-msgid "Default gateway:"
-msgstr ""
-
-#: networking.c:744
-msgid ""
-"Enter the DNS and gateway information. These settings are used only with "
-"Static IP (and DHCP if DNS set) on the RED interface."
-msgstr ""
-
-#: networking.c:773
-msgid "Default gateway"
-msgstr ""
-
-#: networking.c:780
-msgid "Secondary DNS specified without a Primary DNS"
-msgstr ""
-
-#: passwords.c:33
-msgid ""
-"Enter the 'root' user password. Login as this user for commandline access."
-msgstr ""
-
-#: passwords.c:38 passwords.c:61
-msgid "Setting password"
-msgstr ""
-
-#: passwords.c:38
-msgid "Setting 'root' password...."
-msgstr ""
-
-#: passwords.c:39
-msgid "Problem setting 'root' password."
-msgstr ""
-
-#: passwords.c:53
-#, c-format
-msgid ""
-"Enter %s 'admin' user password. This is the user to use for logging into the"
-" %s web administration pages."
-msgstr ""
-
-#: passwords.c:60
-#, c-format
-msgid "Setting %s 'admin' user password..."
-msgstr ""
-
-#: passwords.c:62
-#, c-format
-msgid "Problem setting %s 'admin' user password."
-msgstr ""
-
-#: passwords.c:76
-msgid "Password:"
-msgstr ""
-
-#: passwords.c:77
-msgid "Again:"
-msgstr ""
-
-#: passwords.c:95
-msgid "Password cannot be blank."
-msgstr ""
-
-#: passwords.c:102
-msgid "Passwords do not match."
-msgstr ""
-
-#: passwords.c:109
-msgid "Password cannot contain spaces."
-msgstr ""
-
-#: timezone.c:77
-msgid "Choose the timezone you are in from the list below."
-msgstr ""
"Project-Id-Version: IPFire Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-08-21 15:12+0000\n"
-"PO-Revision-Date: 2015-01-26 08:29+0000\n"
+"PO-Revision-Date: 2015-02-03 07:00+0000\n"
"Last-Translator: Jacques Hylkema <j.hylkema@intronics.nl>\n"
"Language-Team: Dutch (http://www.transifex.com/projects/p/ipfire/language/nl/)\n"
"MIME-Version: 1.0\n"
#: netstuff.c:396 netstuff.c:709
msgid "Unset"
-msgstr ""
+msgstr "Niet ingesteld"
#: netstuff.c:669
#, c-format
#: netstuff.c:777
msgid "Unable to load driver module."
-msgstr ""
+msgstr "Kan driver module niet laden."
#: netstuff.c:780
msgid "Module name cannot be blank."
-msgstr ""
+msgstr "Module naam mag niet leeg zijn."
#: networking.c:110
msgid "Stopping network..."
-msgstr ""
+msgstr "Bezig met stoppen van netwerk..."
#: networking.c:115
msgid "Restarting network..."
-msgstr ""
+msgstr "Bezig met herstarten van netwerk..."
#: networking.c:146
msgid "No GREEN interface assigned."
-msgstr ""
+msgstr "Geen GROENE interface toegewezen."
#: networking.c:152
msgid "Missing an IP address on GREEN."
-msgstr ""
+msgstr "Geen IP adres toegewezen aan GROEN."
#: networking.c:163
msgid "Error"
-msgstr ""
+msgstr "Fout"
#: networking.c:163
msgid "Ignore"
-msgstr ""
+msgstr "Negeer"
#: networking.c:164
msgid "No RED interface assigned."
-msgstr ""
+msgstr "Geen RODE interface toegewezen."
#: networking.c:173
msgid "Missing an IP address on RED."
-msgstr ""
+msgstr "Geen IP adres toegewezen aan ROOD."
#: networking.c:183
msgid "No ORANGE interface assigned."
-msgstr ""
+msgstr "Geen ORANJE interface toegewezen."
#: networking.c:189
msgid "Missing an IP address on ORANGE."
-msgstr ""
+msgstr "Geen IP adres toegewezen aan ORANJE"
#: networking.c:199
msgid "No BLUE interface assigned."
-msgstr ""
+msgstr "Geen BLAUWE interface toegewezen."
#: networking.c:205
msgid "Missing an IP address on BLUE."
-msgstr ""
+msgstr "Geen IP adres toegewezen aan BLAUW."
#: networking.c:217
msgid "Misssing DNS."
-msgstr ""
+msgstr "DNS gegevens ontbreken."
#: networking.c:224
msgid "Missing Default Gateway."
-msgstr ""
+msgstr "Standaard gateway ontbreekt."
#: networking.c:237 networking.c:304
msgid "Network configuration type"
-msgstr ""
+msgstr "Netwerk configuratie type"
#: networking.c:238 networking.c:409
msgid "Drivers and card assignments"
-msgstr ""
+msgstr "Drivers en kaart toewijzingen"
#: networking.c:239 networking.c:640
msgid "Address settings"
-msgstr ""
+msgstr "Adres instellingen"
#: networking.c:240 networking.c:743
msgid "DNS and Gateway settings"
-msgstr ""
+msgstr "DNS en Gateway instellingen"
#: networking.c:260
msgid "When configuration is complete, a network restart will be required."
-msgstr ""
+msgstr "Nadat de configuratie is voltooid, moet het netwerk worden herstart."
#: networking.c:267
#, c-format
"Current config: %s\n"
"\n"
"%s"
-msgstr ""
+msgstr "Huidige configuratie: %s\n\n%s"
#: networking.c:268
msgid "Network configuration menu"
-msgstr ""
+msgstr "Netwerk configuratie menu"
#: networking.c:269 networking.c:520 networking.c:642
msgid "Done"
-msgstr ""
+msgstr "Gereed"
#: networking.c:300
#, c-format
"list those interfaces which have ethernet attached. If you change this "
"setting, a network restart will be required, and you will have to "
"reconfigure the network driver assignments."
-msgstr ""
+msgstr "Selecteer de netwerk configuratie voor %s. De volgende configuratie types laten alleen de netwerkkaarten zien die op ethernet zijn aangesloten. Als je dit wijzigt, moet het netwerk worden herstart en moet je de netwerk driver toewijzingen opnieuw configureren."
#: networking.c:307
#, c-format
"Not enough netcards for your choice.\n"
"\n"
"Needed: %d - Available: %d\n"
-msgstr ""
+msgstr "Er zijn onvoldoende netwerkkaarten aanwezig voor je keuze.\n\nBenodigd: %d - Beschikbaar: %d\n"
#: networking.c:359
msgid ""
"Configure network drivers, and which interface each card is assigned to. The current configuration is as follows:\n"
"\n"
-msgstr ""
+msgstr "Configureer netwerk drivers, en welke netwerkkaart aan welke interface is toegewezen. De huidige configuratie is het volgende:\n\n"
#: networking.c:408
msgid "Do you wish to change these settings?"
-msgstr ""
+msgstr "Wil je deze instellingen wijzigen?"
#: networking.c:447
msgid "Restarting non-local network..."
-msgstr ""
+msgstr "Bezig met herstarten van het niet-lokale netwerk..."
#: networking.c:464
msgid ""
"Please choose the interface you wish to change.\n"
"\n"
-msgstr ""
+msgstr "Kies de interface die je wil wijzigen.\n\n"
#: networking.c:519
msgid "Assigned Cards"
-msgstr ""
+msgstr "Toegewezen kaarten"
#: networking.c:520
msgid "Remove"
-msgstr ""
+msgstr "Verwijder"
#: networking.c:556 networking.c:649
#, c-format
"connection to the %s machine will be broken, and you will have to reconnect "
"on the new IP. This is a risky operation, and should only be attempted if "
"you have physical access to the machine, should something go wrong."
-msgstr ""
+msgstr "Als je dit IP adres wijzigt en je bent op afstand ingelogd, dan zal je connectie naar de %s machine worden onderbroken en moet je opnieuw inloggen op het nieuwe IP adres. Dit is een risicovolle operatie die alleen zou moeten worden uitgevoerd als je fysieke toegang tot de machine hebt, mocht er iets misgaan."
#: networking.c:641
msgid "Select the interface you wish to reconfigure."
-msgstr ""
+msgstr "Selecteer de interface die je wil herconfigureren."
#: networking.c:729
msgid "Default gateway:"
-msgstr ""
+msgstr "Standaard gateway:"
#: networking.c:744
msgid ""
"Enter the DNS and gateway information. These settings are used only with "
"Static IP (and DHCP if DNS set) on the RED interface."
-msgstr ""
+msgstr "Voer de DNS en gatway informatie in. Deze instellingen worden alleen gebruikt indien een statisch IP adres (en DHCP indien DNS is ingesteld) voor de RODE interface is ingesteld."
#: networking.c:773
msgid "Default gateway"
-msgstr ""
+msgstr "Standaard gateway"
#: networking.c:780
msgid "Secondary DNS specified without a Primary DNS"
-msgstr ""
+msgstr "Er is een secundaire DNS ingesteld zonder dat een primaire DNS is ingesteld"
#: passwords.c:33
msgid ""
"Enter the 'root' user password. Login as this user for commandline access."
-msgstr ""
+msgstr "Voer het 'root' wachtwoord in. Log als deze gebruiker in voor commando regel toegang."
#: passwords.c:38 passwords.c:61
msgid "Setting password"
-msgstr ""
+msgstr "Instellen wachtwoord"
#: passwords.c:38
msgid "Setting 'root' password...."
-msgstr ""
+msgstr "Instellen 'root' wachtwoord..."
#: passwords.c:39
msgid "Problem setting 'root' password."
-msgstr ""
+msgstr "Probleem bij instellen van 'root' wachtwoord."
#: passwords.c:53
#, c-format
msgid ""
"Enter %s 'admin' user password. This is the user to use for logging into the"
" %s web administration pages."
-msgstr ""
+msgstr "Voer het %s 'admin' gebruiker wachtwoord in. Dit is de gebruiker om mee in te loggen op de %s web administratie interface."
#: passwords.c:60
#, c-format
msgid "Setting %s 'admin' user password..."
-msgstr ""
+msgstr "Instellen %s 'admin' wachtwoord..."
#: passwords.c:62
#, c-format
msgid "Problem setting %s 'admin' user password."
-msgstr ""
+msgstr "Probleem bij instellen van %s 'admin' wachtwoord."
#: passwords.c:76
msgid "Password:"
-msgstr ""
+msgstr "Wachtwoord:"
#: passwords.c:77
msgid "Again:"
-msgstr ""
+msgstr "Nogmaals:"
#: passwords.c:95
msgid "Password cannot be blank."
-msgstr ""
+msgstr "Wachtwoord mag niet leeg zijn."
#: passwords.c:102
msgid "Passwords do not match."
-msgstr ""
+msgstr "Wachtwoorden komen niet overeen,"
#: passwords.c:109
msgid "Password cannot contain spaces."
-msgstr ""
+msgstr "Wachtwoord mag geen spaties bevatten."
#: timezone.c:77
msgid "Choose the timezone you are in from the list below."
-msgstr ""
+msgstr "Kies de tijdzone waar je bent uit onderstaande lijst."
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# douglasdiasn <douglasdiasn@gmail.com>, 2015
+# Evertton de Lima <e.everttonlima@gmail.com>, 2015
# Rafael Tavares <rafael@ibinetwork.com.br>, 2015
msgid ""
msgstr ""
"Project-Id-Version: IPFire Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-08-21 15:12+0000\n"
-"PO-Revision-Date: 2015-01-22 20:19+0000\n"
-"Last-Translator: Rafael Tavares <rafael@ibinetwork.com.br>\n"
+"PO-Revision-Date: 2015-02-16 23:15+0000\n"
+"Last-Translator: Evertton de Lima <e.everttonlima@gmail.com>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/ipfire/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
msgid ""
"The following fields are invalid:\n"
"\n"
-msgstr ""
+msgstr "Os campos a seguir são inválidos: \n"
#: dhcp.c:159
msgid "Start address"
#: domainname.c:42
msgid "Enter Domain name"
-msgstr ""
+msgstr "Entre com o nome do Domínio"
#: domainname.c:48
msgid "Domain name cannot be empty."
-msgstr ""
+msgstr "O nome de Domínio não pode ser vazio."
#: domainname.c:50
msgid "Domain name cannot contain spaces."
-msgstr ""
+msgstr "O nome de Domínio não pode conter \"espaços\"."
#: domainname.c:53
msgid "Domain name may only contain letters, numbers, hyphens and periods."
-msgstr ""
+msgstr "O nome de Domínio pode conter somente letras, números, hífens e pontos."
#: hostname.c:46 main.c:69
msgid "Hostname"
#: hostname.c:46
msgid "Enter the machine's hostname."
-msgstr ""
+msgstr "Entre com o nome do host."
#: hostname.c:53
msgid "Hostname cannot be empty."
-msgstr ""
+msgstr "O nome de Host não pode ser vazio."
#: hostname.c:55
msgid "Hostname cannot contain spaces."
-msgstr ""
+msgstr "O nome de Host não pode conter \"espaços\"."
#: hostname.c:58
msgid "Hostname may only contain letters, numbers and hyphens."
-msgstr ""
+msgstr "O nome de Host pode conter somente Letras, números e hífens."
#: keymap.c:84 main.c:67
msgid "Keyboard mapping"
#: keymap.c:85
msgid "Choose the type of keyboard you are using from the list below."
-msgstr ""
+msgstr "Escolha o tipo do teclado que você esta usando a partir da lista abaixo:"
#: main.c:68 timezone.c:77
msgid "Timezone"
#: main.c:71 networking.c:110 networking.c:115 networking.c:447
msgid "Networking"
-msgstr ""
+msgstr "Rede"
#: main.c:72 misc.c:147
msgid "ISDN"
#: main.c:73
msgid "'root' password"
-msgstr "senha ´'root'"
+msgstr "senha 'ROOT'"
#: main.c:74
msgid "'admin' password"
-msgstr "senha 'admin'"
+msgstr "senha 'ADMIN'"
#: main.c:90
msgid " <Tab>/<Alt-Tab> between elements | <Space> selects"
-msgstr ""
+msgstr "<Tab>/<Alt-Tab> entre elementos | <Space> seleciona"
#: main.c:97
msgid "Section menu"
-msgstr ""
+msgstr "Menu de seleção"
#: main.c:98
msgid "Select the item you wish to configure."
msgid ""
"Initial setup was not entirely complete. You must ensure that Setup is "
"properly finished by running setup again at the shell."
-msgstr ""
+msgstr "O setup inicial não foi inteiramente completo. Você deve se certificar que o Setup foi finalizado corretamente rodando o setup novamente no shell."
#: misc.c:62
#, c-format
#: misc.c:71
msgid "Unable to open main hosts file."
-msgstr ""
+msgstr "Não foi possível abrir o arquivo de Hosts Principal"
#: misc.c:76
msgid "Unable to write /etc/hosts."
#: misc.c:136
msgid "Unable to set hostname."
-msgstr ""
+msgstr "Não foi possível aplicar o Hostname"
#: misc.c:147
msgid "Scanning and configuring ISDN devices."
-msgstr ""
+msgstr "Escaneando e configurando dispositivos ISDN."
#: misc.c:148
msgid "Unable to scan for ISDN devices."
-msgstr ""
+msgstr "Não foi possível escanear por dispositivos ISDN."
#: netstuff.c:86
#, c-format
#: netstuff.c:91
#, c-format
msgid "Enter the IP address information for the %s interface."
-msgstr ""
+msgstr "Entre com a informação do endereço IP para a interface %s."
#: netstuff.c:103
msgid "Static"
#: netstuff.c:113
msgid "DHCP Hostname:"
-msgstr ""
+msgstr "Nome do Host DHCP:"
#: netstuff.c:115
msgid "Force DHCP MTU:"
-msgstr ""
+msgstr "Forçar DHCP MTU:"
#: netstuff.c:134
msgid "IP address:"
#: netstuff.c:173 networking.c:749
msgid "The following fields are invalid:"
-msgstr ""
+msgstr "Os campos a seguir são inválidos:"
#: netstuff.c:183
msgid "IP address"
#: netstuff.c:198
msgid "DHCP hostname"
-msgstr ""
+msgstr "Nome do Host DHCP:"
#: netstuff.c:396 netstuff.c:709
msgid "Unset"
#: netstuff.c:669
#, c-format
msgid "Please choose a networkcard for the following interface - %s."
-msgstr ""
+msgstr "Favor selecionar a Placa de Rede para a interface - %s."
#: netstuff.c:672
msgid "Extended Network Menu"
-msgstr ""
+msgstr "Abrir o menu de redes"
#: netstuff.c:673 networking.c:520
msgid "Select"
#: netstuff.c:678
msgid "Device Identification"
-msgstr ""
+msgstr "Identificação do dispositivo"
#: netstuff.c:678
msgid "The lights on the selected port should flash now for 10 seconds..."
-msgstr ""
+msgstr "As luzes da porta selecionada deverão piscar por 10 segundos a partir de agora..."
#: netstuff.c:679
msgid "Identification is not supported by this interface."
-msgstr ""
+msgstr "Identificação não é suportada por esta interface."
#: netstuff.c:691
msgid "There are no unassigned interfaces on your system."
-msgstr ""
+msgstr "Não existem interfaces não associadas em seu sistema."
#: netstuff.c:732
#, c-format
msgid "Do you really want to remove the assigned %s interface?"
-msgstr ""
+msgstr "Você realmente quer remover a interface %s associada?"
#: netstuff.c:755
msgid "Select network driver"
-msgstr ""
+msgstr "Selecionar driver de rede"
#: netstuff.c:755
msgid "Set additional module parameters"
#: networking.c:260
msgid "When configuration is complete, a network restart will be required."
-msgstr ""
+msgstr "Quando a configuração estiver completa, um reinício da rede será necessário."
#: networking.c:267
#, c-format
#: networking.c:268
msgid "Network configuration menu"
-msgstr ""
+msgstr "Menu de configuração de rede"
#: networking.c:269 networking.c:520 networking.c:642
msgid "Done"
#: networking.c:408
msgid "Do you wish to change these settings?"
-msgstr ""
+msgstr "Você gostaria de alterar essas configurações?"
#: networking.c:447
msgid "Restarting non-local network..."
-msgstr ""
+msgstr "Reiniciando rede non-local..."
#: networking.c:464
msgid ""
#: networking.c:780
msgid "Secondary DNS specified without a Primary DNS"
-msgstr ""
+msgstr "DNS secundário especificado sem um DNS primário"
#: passwords.c:33
msgid ""
#
# Translators:
# Andrei Skipin <skian2007@yandex.ru>, 2014
+# ellviss <kpe1501@gmail.com>, 2015
# bubnov_pi <ipfire@bubnov.su>, 2014
msgid ""
msgstr ""
"Project-Id-Version: IPFire Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-08-21 15:12+0000\n"
-"PO-Revision-Date: 2014-12-10 10:22+0000\n"
-"Last-Translator: Andrei Skipin <skian2007@yandex.ru>\n"
+"PO-Revision-Date: 2015-02-17 19:30+0000\n"
+"Last-Translator: ellviss <kpe1501@gmail.com>\n"
"Language-Team: Russian (http://www.transifex.com/projects/p/ipfire/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
#: netstuff.c:104
msgid "DHCP"
-msgstr ""
+msgstr "DHCP-сервер"
#: netstuff.c:105
msgid "PPP DIALUP (PPPoE, modem, ATM ...)"
#: networking.c:163
msgid "Error"
-msgstr ""
+msgstr "Ошибка"
#: networking.c:163
msgid "Ignore"
-msgstr ""
+msgstr "Игнорировать"
#: networking.c:164
msgid "No RED interface assigned."
#: networking.c:239 networking.c:640
msgid "Address settings"
-msgstr ""
+msgstr "Настройки адреса"
#: networking.c:240 networking.c:743
msgid "DNS and Gateway settings"
-msgstr ""
+msgstr "Настройка DNS и Шлюза"
#: networking.c:260
msgid "When configuration is complete, a network restart will be required."
#: networking.c:408
msgid "Do you wish to change these settings?"
-msgstr ""
+msgstr "Вы уверены что хотите изменить эти настройки?"
#: networking.c:447
msgid "Restarting non-local network..."
#: networking.c:641
msgid "Select the interface you wish to reconfigure."
-msgstr ""
+msgstr "Выберете интерфейс для реконфигурации"
#: networking.c:729
msgid "Default gateway:"
#: timezone.c:77
msgid "Choose the timezone you are in from the list below."
-msgstr ""
+msgstr "Выберете временную зону в которой вы находитесь из списка ниже"
+++ /dev/null
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR The IPFire Project (www.ipfire.org)
-# This file is distributed under the same license as the PACKAGE package.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: IPFire Project\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-08-21 15:12+0000\n"
-"PO-Revision-Date: 2014-08-12 10:08+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/ipfire/language/ru_RU/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: ru_RU\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-
-#: dhcp.c:50
-msgid "Start address:"
-msgstr ""
-
-#: dhcp.c:51
-msgid "End address:"
-msgstr ""
-
-#: dhcp.c:52 networking.c:717
-msgid "Primary DNS:"
-msgstr ""
-
-#: dhcp.c:53 networking.c:723
-msgid "Secondary DNS:"
-msgstr ""
-
-#: dhcp.c:54
-msgid "Default lease (mins):"
-msgstr ""
-
-#: dhcp.c:55
-msgid "Max lease (mins):"
-msgstr ""
-
-#: dhcp.c:56
-msgid "Domain name suffix:"
-msgstr ""
-
-#: dhcp.c:86 dhcp.c:93 dhcp.c:101 domainname.c:34 hostname.c:37 keymap.c:70
-#: misc.c:40 misc.c:52 netstuff.c:377 netstuff.c:566 netstuff.c:704
-#: networking.c:134 networking.c:255 networking.c:291 networking.c:346
-#: networking.c:442 networking.c:552 networking.c:603 networking.c:610
-#: networking.c:713 timezone.c:63
-msgid "Unable to open settings file"
-msgstr ""
-
-#: dhcp.c:111
-msgid "DHCP server configuration"
-msgstr ""
-
-#: dhcp.c:116
-msgid "Configure the DHCP server by entering the settings information."
-msgstr ""
-
-#: dhcp.c:125
-msgid "Enabled"
-msgstr ""
-
-#: dhcp.c:142 domainname.c:43 hostname.c:47 keymap.c:86 main.c:99 main.c:172
-#: main.c:174 netstuff.c:157 netstuff.c:733 netstuff.c:756 networking.c:163
-#: networking.c:269 networking.c:305 networking.c:409 networking.c:560
-#: networking.c:642 networking.c:653 networking.c:746 passwords.c:89
-#: timezone.c:78
-msgid "OK"
-msgstr ""
-
-#: dhcp.c:143 domainname.c:43 hostname.c:47 keymap.c:86 netstuff.c:158
-#: netstuff.c:673 netstuff.c:733 netstuff.c:756 networking.c:305
-#: networking.c:410 networking.c:560 networking.c:653 networking.c:746
-#: passwords.c:89 timezone.c:78
-msgid "Cancel"
-msgstr ""
-
-#: dhcp.c:156
-msgid ""
-"The following fields are invalid:\n"
-"\n"
-msgstr ""
-
-#: dhcp.c:159
-msgid "Start address"
-msgstr ""
-
-#: dhcp.c:165
-msgid "End address"
-msgstr ""
-
-#: dhcp.c:173 networking.c:755
-msgid "Primary DNS"
-msgstr ""
-
-#: dhcp.c:182 networking.c:764
-msgid "Secondary DNS"
-msgstr ""
-
-#: dhcp.c:189
-msgid "Default lease time"
-msgstr ""
-
-#: dhcp.c:195
-msgid "Max. lease time"
-msgstr ""
-
-#: domainname.c:42 main.c:70
-msgid "Domain name"
-msgstr ""
-
-#: domainname.c:42
-msgid "Enter Domain name"
-msgstr ""
-
-#: domainname.c:48
-msgid "Domain name cannot be empty."
-msgstr ""
-
-#: domainname.c:50
-msgid "Domain name cannot contain spaces."
-msgstr ""
-
-#: domainname.c:53
-msgid "Domain name may only contain letters, numbers, hyphens and periods."
-msgstr ""
-
-#: hostname.c:46 main.c:69
-msgid "Hostname"
-msgstr ""
-
-#: hostname.c:46
-msgid "Enter the machine's hostname."
-msgstr ""
-
-#: hostname.c:53
-msgid "Hostname cannot be empty."
-msgstr ""
-
-#: hostname.c:55
-msgid "Hostname cannot contain spaces."
-msgstr ""
-
-#: hostname.c:58
-msgid "Hostname may only contain letters, numbers and hyphens."
-msgstr ""
-
-#: keymap.c:84 main.c:67
-msgid "Keyboard mapping"
-msgstr ""
-
-#: keymap.c:85
-msgid "Choose the type of keyboard you are using from the list below."
-msgstr ""
-
-#: main.c:68 timezone.c:77
-msgid "Timezone"
-msgstr ""
-
-#: main.c:71 networking.c:110 networking.c:115 networking.c:447
-msgid "Networking"
-msgstr ""
-
-#: main.c:72 misc.c:147
-msgid "ISDN"
-msgstr ""
-
-#: main.c:73
-msgid "'root' password"
-msgstr ""
-
-#: main.c:74
-msgid "'admin' password"
-msgstr ""
-
-#: main.c:90
-msgid " <Tab>/<Alt-Tab> between elements | <Space> selects"
-msgstr ""
-
-#: main.c:97
-msgid "Section menu"
-msgstr ""
-
-#: main.c:98
-msgid "Select the item you wish to configure."
-msgstr ""
-
-#: main.c:99
-msgid "Quit"
-msgstr ""
-
-#: main.c:172
-msgid "Setup is complete."
-msgstr ""
-
-#: main.c:174 netstuff.c:733 networking.c:560 networking.c:653
-msgid "Warning"
-msgstr ""
-
-#: main.c:175
-msgid ""
-"Initial setup was not entirely complete. You must ensure that Setup is "
-"properly finished by running setup again at the shell."
-msgstr ""
-
-#: misc.c:62
-#, c-format
-msgid "Unable to write %s/main/hostname.conf"
-msgstr ""
-
-#: misc.c:71
-msgid "Unable to open main hosts file."
-msgstr ""
-
-#: misc.c:76
-msgid "Unable to write /etc/hosts."
-msgstr ""
-
-#: misc.c:117
-msgid "Unable to write /etc/hosts.deny."
-msgstr ""
-
-#: misc.c:125
-msgid "Unable to write /etc/hosts.allow."
-msgstr ""
-
-#: misc.c:136
-msgid "Unable to set hostname."
-msgstr ""
-
-#: misc.c:147
-msgid "Scanning and configuring ISDN devices."
-msgstr ""
-
-#: misc.c:148
-msgid "Unable to scan for ISDN devices."
-msgstr ""
-
-#: netstuff.c:86
-#, c-format
-msgid "Interface - %s"
-msgstr ""
-
-#: netstuff.c:91
-#, c-format
-msgid "Enter the IP address information for the %s interface."
-msgstr ""
-
-#: netstuff.c:103
-msgid "Static"
-msgstr ""
-
-#: netstuff.c:104
-msgid "DHCP"
-msgstr ""
-
-#: netstuff.c:105
-msgid "PPP DIALUP (PPPoE, modem, ATM ...)"
-msgstr ""
-
-#: netstuff.c:113
-msgid "DHCP Hostname:"
-msgstr ""
-
-#: netstuff.c:115
-msgid "Force DHCP MTU:"
-msgstr ""
-
-#: netstuff.c:134
-msgid "IP address:"
-msgstr ""
-
-#: netstuff.c:146
-msgid "Network mask:"
-msgstr ""
-
-#: netstuff.c:173 networking.c:749
-msgid "The following fields are invalid:"
-msgstr ""
-
-#: netstuff.c:183
-msgid "IP address"
-msgstr ""
-
-#: netstuff.c:189
-msgid "Network mask"
-msgstr ""
-
-#: netstuff.c:198
-msgid "DHCP hostname"
-msgstr ""
-
-#: netstuff.c:396 netstuff.c:709
-msgid "Unset"
-msgstr ""
-
-#: netstuff.c:669
-#, c-format
-msgid "Please choose a networkcard for the following interface - %s."
-msgstr ""
-
-#: netstuff.c:672
-msgid "Extended Network Menu"
-msgstr ""
-
-#: netstuff.c:673 networking.c:520
-msgid "Select"
-msgstr ""
-
-#: netstuff.c:673
-msgid "Identify"
-msgstr ""
-
-#: netstuff.c:678
-msgid "Device Identification"
-msgstr ""
-
-#: netstuff.c:678
-msgid "The lights on the selected port should flash now for 10 seconds..."
-msgstr ""
-
-#: netstuff.c:679
-msgid "Identification is not supported by this interface."
-msgstr ""
-
-#: netstuff.c:691
-msgid "There are no unassigned interfaces on your system."
-msgstr ""
-
-#: netstuff.c:732
-#, c-format
-msgid "Do you really want to remove the assigned %s interface?"
-msgstr ""
-
-#: netstuff.c:755
-msgid "Select network driver"
-msgstr ""
-
-#: netstuff.c:755
-msgid "Set additional module parameters"
-msgstr ""
-
-#: netstuff.c:762
-msgid "Loading module..."
-msgstr ""
-
-#: netstuff.c:777
-msgid "Unable to load driver module."
-msgstr ""
-
-#: netstuff.c:780
-msgid "Module name cannot be blank."
-msgstr ""
-
-#: networking.c:110
-msgid "Stopping network..."
-msgstr ""
-
-#: networking.c:115
-msgid "Restarting network..."
-msgstr ""
-
-#: networking.c:146
-msgid "No GREEN interface assigned."
-msgstr ""
-
-#: networking.c:152
-msgid "Missing an IP address on GREEN."
-msgstr ""
-
-#: networking.c:163
-msgid "Error"
-msgstr ""
-
-#: networking.c:163
-msgid "Ignore"
-msgstr ""
-
-#: networking.c:164
-msgid "No RED interface assigned."
-msgstr ""
-
-#: networking.c:173
-msgid "Missing an IP address on RED."
-msgstr ""
-
-#: networking.c:183
-msgid "No ORANGE interface assigned."
-msgstr ""
-
-#: networking.c:189
-msgid "Missing an IP address on ORANGE."
-msgstr ""
-
-#: networking.c:199
-msgid "No BLUE interface assigned."
-msgstr ""
-
-#: networking.c:205
-msgid "Missing an IP address on BLUE."
-msgstr ""
-
-#: networking.c:217
-msgid "Misssing DNS."
-msgstr ""
-
-#: networking.c:224
-msgid "Missing Default Gateway."
-msgstr ""
-
-#: networking.c:237 networking.c:304
-msgid "Network configuration type"
-msgstr ""
-
-#: networking.c:238 networking.c:409
-msgid "Drivers and card assignments"
-msgstr ""
-
-#: networking.c:239 networking.c:640
-msgid "Address settings"
-msgstr ""
-
-#: networking.c:240 networking.c:743
-msgid "DNS and Gateway settings"
-msgstr ""
-
-#: networking.c:260
-msgid "When configuration is complete, a network restart will be required."
-msgstr ""
-
-#: networking.c:267
-#, c-format
-msgid ""
-"Current config: %s\n"
-"\n"
-"%s"
-msgstr ""
-
-#: networking.c:268
-msgid "Network configuration menu"
-msgstr ""
-
-#: networking.c:269 networking.c:520 networking.c:642
-msgid "Done"
-msgstr ""
-
-#: networking.c:300
-#, c-format
-msgid ""
-"Select the network configuration for %s. The following configuration types "
-"list those interfaces which have ethernet attached. If you change this "
-"setting, a network restart will be required, and you will have to "
-"reconfigure the network driver assignments."
-msgstr ""
-
-#: networking.c:307
-#, c-format
-msgid ""
-"Not enough netcards for your choice.\n"
-"\n"
-"Needed: %d - Available: %d\n"
-msgstr ""
-
-#: networking.c:359
-msgid ""
-"Configure network drivers, and which interface each card is assigned to. The current configuration is as follows:\n"
-"\n"
-msgstr ""
-
-#: networking.c:408
-msgid "Do you wish to change these settings?"
-msgstr ""
-
-#: networking.c:447
-msgid "Restarting non-local network..."
-msgstr ""
-
-#: networking.c:464
-msgid ""
-"Please choose the interface you wish to change.\n"
-"\n"
-msgstr ""
-
-#: networking.c:519
-msgid "Assigned Cards"
-msgstr ""
-
-#: networking.c:520
-msgid "Remove"
-msgstr ""
-
-#: networking.c:556 networking.c:649
-#, c-format
-msgid ""
-"If you change this IP address, and you are logged in remotely, your "
-"connection to the %s machine will be broken, and you will have to reconnect "
-"on the new IP. This is a risky operation, and should only be attempted if "
-"you have physical access to the machine, should something go wrong."
-msgstr ""
-
-#: networking.c:641
-msgid "Select the interface you wish to reconfigure."
-msgstr ""
-
-#: networking.c:729
-msgid "Default gateway:"
-msgstr ""
-
-#: networking.c:744
-msgid ""
-"Enter the DNS and gateway information. These settings are used only with "
-"Static IP (and DHCP if DNS set) on the RED interface."
-msgstr ""
-
-#: networking.c:773
-msgid "Default gateway"
-msgstr ""
-
-#: networking.c:780
-msgid "Secondary DNS specified without a Primary DNS"
-msgstr ""
-
-#: passwords.c:33
-msgid ""
-"Enter the 'root' user password. Login as this user for commandline access."
-msgstr ""
-
-#: passwords.c:38 passwords.c:61
-msgid "Setting password"
-msgstr ""
-
-#: passwords.c:38
-msgid "Setting 'root' password...."
-msgstr ""
-
-#: passwords.c:39
-msgid "Problem setting 'root' password."
-msgstr ""
-
-#: passwords.c:53
-#, c-format
-msgid ""
-"Enter %s 'admin' user password. This is the user to use for logging into the"
-" %s web administration pages."
-msgstr ""
-
-#: passwords.c:60
-#, c-format
-msgid "Setting %s 'admin' user password..."
-msgstr ""
-
-#: passwords.c:62
-#, c-format
-msgid "Problem setting %s 'admin' user password."
-msgstr ""
-
-#: passwords.c:76
-msgid "Password:"
-msgstr ""
-
-#: passwords.c:77
-msgid "Again:"
-msgstr ""
-
-#: passwords.c:95
-msgid "Password cannot be blank."
-msgstr ""
-
-#: passwords.c:102
-msgid "Passwords do not match."
-msgstr ""
-
-#: passwords.c:109
-msgid "Password cannot contain spaces."
-msgstr ""
-
-#: timezone.c:77
-msgid "Choose the timezone you are in from the list below."
-msgstr ""
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Ardit Dani <ardit.dani@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: IPFire Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-08-21 15:12+0000\n"
-"PO-Revision-Date: 2014-08-21 15:13+0000\n"
-"Last-Translator: Michael Tremer <michael.tremer@ipfire.org>\n"
+"PO-Revision-Date: 2015-02-02 22:35+0000\n"
+"Last-Translator: Ardit Dani <ardit.dani@gmail.com>\n"
"Language-Team: Albanian (http://www.transifex.com/projects/p/ipfire/language/sq/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
#: networking.c:410 networking.c:560 networking.c:653 networking.c:746
#: passwords.c:89 timezone.c:78
msgid "Cancel"
-msgstr ""
+msgstr "Anulo"
#: dhcp.c:156
msgid ""
#: netstuff.c:103
msgid "Static"
-msgstr ""
+msgstr "Statik"
#: netstuff.c:104
msgid "DHCP"
#: netstuff.c:673 networking.c:520
msgid "Select"
-msgstr ""
+msgstr "Përzgjedhje"
#: netstuff.c:673
msgid "Identify"
-msgstr ""
+msgstr "Identifikuesi"
#: netstuff.c:678
msgid "Device Identification"
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Ersan YILDIRIM <ersan73@gmail.com>, 2015
# Kudret Emre <kudretemre@hotmail.com.tr>, 2014
msgid ""
msgstr ""
"Project-Id-Version: IPFire Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-08-21 15:12+0000\n"
-"PO-Revision-Date: 2014-09-30 20:41+0000\n"
-"Last-Translator: Kudret Emre <kudretemre@hotmail.com.tr>\n"
+"PO-Revision-Date: 2015-02-28 22:59+0000\n"
+"Last-Translator: Ersan YILDIRIM <ersan73@gmail.com>\n"
"Language-Team: Turkish (http://www.transifex.com/projects/p/ipfire/language/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
#: dhcp.c:111
msgid "DHCP server configuration"
-msgstr "DHCP sunucu yapılandırması"
+msgstr "DHCP Sunucu Yapılandırması"
#: dhcp.c:116
msgid "Configure the DHCP server by entering the settings information."
-msgstr "Ayarlar bilgisini girerek DHCP sunucusunu yapılandırın."
+msgstr "DHCP ayar bilgilerini girerek DHCP sunucusunu yapılandırın."
#: dhcp.c:125
msgid "Enabled"
#: keymap.c:85
msgid "Choose the type of keyboard you are using from the list below."
-msgstr "Aşağıdaki listeden kullandığınız klavye tipini seçin."
+msgstr "Aşağıdaki listeden kullandığınız klavye türünü seçin."
#: main.c:68 timezone.c:77
msgid "Timezone"
#: main.c:73
msgid "'root' password"
-msgstr "'root' şifresi"
+msgstr "'root' parolası"
#: main.c:74
msgid "'admin' password"
-msgstr "'admin' şifresi"
+msgstr "'admin' parolası"
#: main.c:90
msgid " <Tab>/<Alt-Tab> between elements | <Space> selects"
#: main.c:97
msgid "Section menu"
-msgstr "Bölüm menüsü"
+msgstr "Bölüm listesi"
#: main.c:98
msgid "Select the item you wish to configure."
msgid ""
"Initial setup was not entirely complete. You must ensure that Setup is "
"properly finished by running setup again at the shell."
-msgstr "İlk kurulum tamamen yapılamadı. Kurulumun kabuktan yeniden başlatılıp düzgünce bitirildiğinden emin olmalısınız."
+msgstr "İlk kurulum tamamen yapılamadı. Kurulumun terminalden yeniden başlatılıp düzgünce bitirildiğinden emin olmalısınız."
#: misc.c:62
#, c-format
#: netstuff.c:86
#, c-format
msgid "Interface - %s"
-msgstr "Arayüz - %s"
+msgstr "Ara Birim - %s"
#: netstuff.c:91
#, c-format
msgid "Enter the IP address information for the %s interface."
-msgstr "%s arayüzü için IP adresi bilgisini girin."
+msgstr "%s ara birimi için IP adres bilgisini girin."
#: netstuff.c:103
msgid "Static"
#: netstuff.c:115
msgid "Force DHCP MTU:"
-msgstr "Force DHCP MTU:"
+msgstr "DHCP MTU zorla:"
#: netstuff.c:134
msgid "IP address:"
#: netstuff.c:396 netstuff.c:709
msgid "Unset"
-msgstr "Unset"
+msgstr "Kurulmamış"
#: netstuff.c:669
#, c-format
msgid "Please choose a networkcard for the following interface - %s."
-msgstr "Lütfen %s arayüzü için bit ağ kartı seçin."
+msgstr "Lütfen %s ara birimi için bir ağ kartı seçin."
#: netstuff.c:672
msgid "Extended Network Menu"
-msgstr "Genişletilmiş Ağ Menüsü"
+msgstr "Genişletilmiş Ağ Listesi"
#: netstuff.c:673 networking.c:520
msgid "Select"
#: netstuff.c:679
msgid "Identification is not supported by this interface."
-msgstr "Bu arayüz kimdik doğrulamayı desteklemiyor."
+msgstr "Bu ara birim kimdik doğrulamayı desteklemiyor."
#: netstuff.c:691
msgid "There are no unassigned interfaces on your system."
-msgstr "Sisteminizde atanmamış arayüz yok."
+msgstr "Sisteminizde atanmamış ara birim yok."
#: netstuff.c:732
#, c-format
msgid "Do you really want to remove the assigned %s interface?"
-msgstr "Atanmış %s arayüzü gerçekten kaldırmak istiyor musunuz?"
+msgstr "Atanmış %s ara birimini gerçekten kaldırmak istiyor musunuz?"
#: netstuff.c:755
msgid "Select network driver"
#: networking.c:146
msgid "No GREEN interface assigned."
-msgstr "Atanmış YEŞİL arayüz yok."
+msgstr "Atanmış YEŞİL ara birim yok."
#: networking.c:152
msgid "Missing an IP address on GREEN."
#: networking.c:164
msgid "No RED interface assigned."
-msgstr "Atanmış KIRMIZI arayüz yok."
+msgstr "Atanmış KIRMIZI ara birim yok."
#: networking.c:173
msgid "Missing an IP address on RED."
#: networking.c:183
msgid "No ORANGE interface assigned."
-msgstr "Atanmış TURUNCU arayüz yok."
+msgstr "Atanmış TURUNCU ara birim yok."
#: networking.c:189
msgid "Missing an IP address on ORANGE."
#: networking.c:199
msgid "No BLUE interface assigned."
-msgstr "Atanmış MAVİ arayüz yok."
+msgstr "Atanmış MAVİ ara birim yok."
#: networking.c:205
msgid "Missing an IP address on BLUE."
#: networking.c:237 networking.c:304
msgid "Network configuration type"
-msgstr "Ağ yapılandırma tipi"
+msgstr "Ağ yapılandırma türü"
#: networking.c:238 networking.c:409
msgid "Drivers and card assignments"
#: networking.c:239 networking.c:640
msgid "Address settings"
-msgstr "Adres ayarları"
+msgstr "Adres Ayarları"
#: networking.c:240 networking.c:743
msgid "DNS and Gateway settings"
-msgstr "DNS ve Ağ Geçidi ayarları"
+msgstr "DNS ve Ağ Geçidi Ayarları"
#: networking.c:260
msgid "When configuration is complete, a network restart will be required."
-msgstr "Yapılandırma tamamlandığında yeniden başlatma gerekecek."
+msgstr "Yapılandırma tamamlandığında ağı yeniden başlatmanız gerekir."
#: networking.c:267
#, c-format
#: networking.c:268
msgid "Network configuration menu"
-msgstr "Ağ yapılandırma menüsü"
+msgstr "Ağ Yapılandırma Listesi"
#: networking.c:269 networking.c:520 networking.c:642
msgid "Done"
-msgstr "Tamam"
+msgstr "Bitti"
#: networking.c:300
#, c-format
"list those interfaces which have ethernet attached. If you change this "
"setting, a network restart will be required, and you will have to "
"reconfigure the network driver assignments."
-msgstr "%s için ağ yapılandırmasını seçin. Aşağıdaki yapılandırma tipi listesi ethernet ayarı yapılmış olan arayüzleri gösterir. Eğer bu ayarları değiştirirseniz, ağın yeniden başlatılması ve ağ sürücüleri atamalarını tekrar yapılandırmanız gerekecektir."
+msgstr "%s için ağ yapılandırmasını seçin. Aşağıdaki yapılandırma türleri ethernet kartlarına atanmış arabirimleri listeler. Eğer bu ayarları değiştirirseniz, ağın yeniden başlatılması ve ağ sürücüleri atamalarını tekrar yapılandırmanız gerekecektir."
#: networking.c:307
#, c-format
msgid ""
"Configure network drivers, and which interface each card is assigned to. The current configuration is as follows:\n"
"\n"
-msgstr "Ağ sürücülerini ve her bir kart için atanmış arayüzleri yapılandırın. Geçerli yapılandırma aşağıdaki gibidir:\n\n"
+msgstr "Ağ sürücülerini ve her bir kart için atanmış ara birimleri yapılandırın. Geçerli yapılandırma aşağıdaki gibidir:\n\n"
#: networking.c:408
msgid "Do you wish to change these settings?"
msgid ""
"Please choose the interface you wish to change.\n"
"\n"
-msgstr "Lütfen değiştirmek istediğiniz arayüzü seçin.\n\n"
+msgstr "Lütfen değiştirmek istediğiniz ara birimi seçin.\n\n"
#: networking.c:519
msgid "Assigned Cards"
#: networking.c:641
msgid "Select the interface you wish to reconfigure."
-msgstr "Yeniden yapılandırmak istediğiniz arayüzü seçin."
+msgstr "Yeniden yapılandırmak istediğiniz ara birimi seçin."
#: networking.c:729
msgid "Default gateway:"
msgid ""
"Enter the DNS and gateway information. These settings are used only with "
"Static IP (and DHCP if DNS set) on the RED interface."
-msgstr "DNS ve ağ geçidi bilgisini girin. Bu ayarlar sadece KIRMIZI arayüzde Statik IP (ve eğer DNS ayarlanmışsa DHCP) ile kullanılacaktır."
+msgstr "DNS ve ağ geçidi bilgilerini girin. Bu ayarlar sadece KIRMIZI ara birim adres ayarlarında Statik seçeneği seçilmişse kullanılır. Eğer KIRMIZI ara birim adres ayarlarında DHCP seçeneğini seçtiyseniz bu alanı boş bırakabilirsiniz."
#: networking.c:773
msgid "Default gateway"
#: passwords.c:33
msgid ""
"Enter the 'root' user password. Login as this user for commandline access."
-msgstr "'root' kullanıcı şifresini girin. Komut satırına erişmek için bu kullanıcıyla oturum açın."
+msgstr "%s 'root' kullanıcı parolasını girin. Komut satırı erişimi için bu kullanıcıyla oturum açın."
#: passwords.c:38 passwords.c:61
msgid "Setting password"
-msgstr "Şifre ayarlanıyor"
+msgstr "Parola ayarlanıyor"
#: passwords.c:38
msgid "Setting 'root' password...."
-msgstr "'root' şifresi ayarlanıyor..."
+msgstr "'root' parolası ayarlanıyor..."
#: passwords.c:39
msgid "Problem setting 'root' password."
-msgstr "'root' şifresi ayarlama sorunu."
+msgstr "'root' parolası ayarlama sorunu."
#: passwords.c:53
#, c-format
msgid ""
"Enter %s 'admin' user password. This is the user to use for logging into the"
" %s web administration pages."
-msgstr "%s 'admin' kullanıcısı için şifre girin. Bu kullanıcı, %s web yönetim sayfalarını kullanmak için oturum açılacak kullanıcıdır."
+msgstr "%s 'admin' kullanıcı parolasını girin. Bu kullanıcı, %s web yönetimi sayfalarının kayıtlarına erişebilen kullanıcıdır."
#: passwords.c:60
#, c-format
msgid "Setting %s 'admin' user password..."
-msgstr "%s 'admin' kullanıcısının şifresi ayarlanıyor..."
+msgstr "%s 'admin' kullanıcısının parolası ayarlanıyor..."
#: passwords.c:62
#, c-format
msgid "Problem setting %s 'admin' user password."
-msgstr "%s 'admin' kullanıcı şifresi ayarlama sorunu."
+msgstr "%s 'admin' kullanıcı parolası ayarlama sorunu."
#: passwords.c:76
msgid "Password:"
-msgstr "Şifre:"
+msgstr "Parola:"
#: passwords.c:77
msgid "Again:"
#: passwords.c:95
msgid "Password cannot be blank."
-msgstr "Şifre boş olamaz."
+msgstr "Parola boş olamaz."
#: passwords.c:102
msgid "Passwords do not match."
-msgstr "Şifreler eşleşmiyor."
+msgstr "Parolalar eşleşmiyor."
#: passwords.c:109
msgid "Password cannot contain spaces."
-msgstr "Şifre boşluk içeremez."
+msgstr "Parola boşluk içeremez."
#: timezone.c:77
msgid "Choose the timezone you are in from the list below."
-msgstr "Aşağıdaki listeden içinde bulunduğunuz zaman dilimini seçin."
+msgstr "Aşağıdaki listeden bulunduğunuz zaman dilimini seçin."
int interfacecheck(struct keyvalue *kv, char *colour);
int rename_nics(void);
int init_knics(void);
-int create_udev(void);
int scan_network_cards(void);
int nicmenu(int colour);
int clear_card_entry(int cards);