Hello community,
here is the log from the commit of package pdns-recursor
checked in at Fri Feb 2 15:07:17 CET 2007.
--------
--- pdns-recursor/pdns-recursor.changes 2006-11-13 16:20:04.000000000 +0100
+++ /mounts/work_src_done/STABLE/pdns-recursor/pdns-recursor.changes 2007-01-31 10:30:53.000000000 +0100
@@ -1,0 +2,13 @@
+Tue Nov 14 13:40:12 CET 2006 - mrueckert@suse.de
+
+- update to version 3.1.4
+ This release contains two important security fixes, which should also solve
+ the very rare reports of stability problems. Additionally, a new class of
+ misconfigured domains will now always be resolved correctly, instead of
+ intermittently.
+- removed patches applied upstream:
+ pdns-recursor-3.1.3_2006-02.patch
+ pdns-recursor-3.1.3_cve-2006-4251.patch
+ pdns-recursor-3.1.3_implicit_declarations.patch
+
+-------------------------------------------------------------------
Old:
----
pdns-recursor-3.1.3_2006-02.patch
pdns-recursor-3.1.3_config.patch
pdns-recursor-3.1.3_cve-2006-4251.patch
pdns-recursor-3.1.3_implicit_declarations.patch
pdns-recursor_3.1.3_strip.patch
pdns-recursor-3.1.3.tar.bz2
New:
----
pdns-recursor-3.1.3-strip.patch
pdns-recursor-3.1.4_config.patch
pdns-recursor-3.1.4.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ pdns-recursor.spec ++++++
--- /var/tmp/diff_new_pack.kD1730/_old 2007-02-02 15:06:37.000000000 +0100
+++ /var/tmp/diff_new_pack.kD1730/_new 2007-02-02 15:06:37.000000000 +0100
@@ -1,7 +1,7 @@
#
-# spec file for package pdns-recursor (Version 3.1.3)
+# spec file for package pdns-recursor (Version 3.1.4)
#
-# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2007 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
# package are under the same license as the package itself.
#
@@ -11,9 +11,9 @@
# norootforbuild
Name: pdns-recursor
-Version: 3.1.3
-Release: 9
-%define pkg_version 3.1.3
+Version: 3.1.4
+Release: 1
+%define pkg_version 3.1.4
#
Group: Productivity/Networking/DNS/Servers
License: GNU General Public License (GPL)
@@ -29,10 +29,7 @@
Source1: pdns-recursor.init
Source2: recursor.conf
Patch: pdns-recursor-%{version}_config.patch
-Patch1: pdns-recursor_3.1.3_strip.patch
-Patch2: pdns-recursor-3.1.3_cve-2006-4251.patch
-Patch3: pdns-recursor-3.1.3_implicit_declarations.patch
-Patch4: pdns-recursor-3.1.3_2006-02.patch
+Patch1: pdns-recursor-3.1.3-strip.patch
#
Summary: Modern, advanced and high performance recursing/non authoritative nameserver
@@ -50,12 +47,9 @@
%setup -n %{name}-%{pkg_version}
%patch
%patch1
-%patch2
-%patch3
-%patch4
%build
-%{__make} OPTFLAGS="%{optflags}"
+%{__make} OPTFLAGS="%{optflags} -D_GNU_SOURCE"
%install
%{__install} -Dd -m 0755 %{buildroot}{%{home},%{_localstatedir}}
@@ -97,6 +91,16 @@
%dir %{_localstatedir}
%changelog -n pdns-recursor
+* Tue Nov 14 2006 - mrueckert@suse.de
+- update to version 3.1.4
+ This release contains two important security fixes, which should also solve
+ the very rare reports of stability problems. Additionally, a new class of
+ misconfigured domains will now always be resolved correctly, instead of
+ intermittently.
+- removed patches applied upstream:
+ pdns-recursor-3.1.3_2006-02.patch
+ pdns-recursor-3.1.3_cve-2006-4251.patch
+ pdns-recursor-3.1.3_implicit_declarations.patch
* Mon Nov 13 2006 - mrueckert@suse.de
- added pdns-recursor-3.1.3_2006-02.patch:
fix an endless recursion in CNAME handling [#219355]
++++++ pdns-recursor-3.1.3-strip.patch ++++++
--- Makefile
+++ Makefile
@@ -54,10 +54,8 @@
install: all
-mkdir -p $(DESTDIR)/$(SBINDIR)
mv pdns_recursor $(DESTDIR)/$(SBINDIR)
- strip $(DESTDIR)/$(SBINDIR)/pdns_recursor
mkdir -p $(DESTDIR)/$(BINDIR)
mv rec_control $(DESTDIR)/$(BINDIR)
- strip $(DESTDIR)/$(BINDIR)/rec_control
-mkdir -p $(DESTDIR)/$(CONFIGDIR)
$(DESTDIR)/$(SBINDIR)/pdns_recursor --config > $(DESTDIR)/$(CONFIGDIR)/recursor.conf-dist
-mkdir -p $(DESTDIR)/usr/share/man/man1
++++++ pdns-recursor-3.1.3_config.patch -> pdns-recursor-3.1.4_config.patch ++++++
--- pdns-recursor/pdns-recursor-3.1.3_config.patch 2006-10-23 18:09:33.000000000 +0200
+++ /mounts/work_src_done/STABLE/pdns-recursor/pdns-recursor-3.1.4_config.patch 2007-01-31 10:30:17.000000000 +0100
@@ -7,6 +7,6 @@
-#define LOCALSTATEDIR "/var/run/"
+#define SYSCONFDIR "/etc/pdns/"
+#define LOCALSTATEDIR "/var/run/pdns/"
- #define VERSION "3.1.3"
+ #define VERSION "3.1.4"
#define RECURSOR
#ifndef WIN32
++++++ pdns-recursor-3.1.3.tar.bz2 -> pdns-recursor-3.1.4.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pdns-recursor-3.1.3/config.h new/pdns-recursor-3.1.4/config.h
--- old/pdns-recursor-3.1.3/config.h 2006-09-12 20:21:01.000000000 +0200
+++ new/pdns-recursor-3.1.4/config.h 2006-11-12 17:56:13.000000000 +0100
@@ -1,6 +1,6 @@
#define SYSCONFDIR "/etc/powerdns/"
#define LOCALSTATEDIR "/var/run/"
-#define VERSION "3.1.3"
+#define VERSION "3.1.4"
#define RECURSOR
#ifndef WIN32
#define GCC_SKIP_LOCKING
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pdns-recursor-3.1.3/iputils.hh new/pdns-recursor-3.1.4/iputils.hh
--- old/pdns-recursor-3.1.3/iputils.hh 2006-09-12 20:21:01.000000000 +0200
+++ new/pdns-recursor-3.1.4/iputils.hh 2006-11-12 17:56:13.000000000 +0100
@@ -232,8 +232,9 @@
}
}
// still here, now match remaining bits
- uint8_t bits=bytes%8;
+ uint8_t bits= d_bits % 8;
uint8_t mask= ~(0xFF>>bits);
+
return((us[n] & mask) == (them[n] & mask));
}
return false;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pdns-recursor-3.1.3/lwres.cc new/pdns-recursor-3.1.4/lwres.cc
--- old/pdns-recursor-3.1.3/lwres.cc 2006-09-12 20:21:01.000000000 +0200
+++ new/pdns-recursor-3.1.4/lwres.cc 2006-11-12 17:56:13.000000000 +0100
@@ -1,6 +1,6 @@
/*
PowerDNS Versatile Database Driven Nameserver
- Copyright (C) 2002 - 2005 PowerDNS.COM BV
+ Copyright (C) 2002 - 2006 PowerDNS.COM BV
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as
@@ -100,7 +100,7 @@
s.setNonBlocking();
s.connect(ie);
- unsigned int len=htons(vpacket.size());
+ uint16_t len=htons(vpacket.size());
char *lenP=(char*)&len;
const char *msgP=(const char*)&*vpacket.begin();
string packet=string(lenP, lenP+2)+string(msgP, msgP+vpacket.size());
@@ -121,7 +121,8 @@
if(!(ret > 0))
return ret;
- if(len > (unsigned int)d_bufsize) {
+ if(len > d_bufsize) {
+ // cerr<<"Reallocating to "<removeReadFD(*i);
+ try {
+ g_fdm->removeReadFD(*i);
+ }
+ catch(FDMultiplexerException& e) {
+ // we sometimes return a socket that has not yet been assigned to g_fdm
+ }
Utility::closesocket(*i);
d_socks.erase(i++);
@@ -314,13 +319,17 @@
int ret=connect(*fd, (struct sockaddr*)(&toaddr), toaddr.getSocklen());
if(ret < 0) {
+ g_udpclientsocks.returnSocket(*fd);
if(errno==ENETUNREACH) // Seth "My Interfaces Are Like A Yo Yo" Arnold special
return -2;
return ret;
}
g_fdm->addReadFD(*fd, handleUDPServerResponse, pident);
- return send(*fd, data, len, 0);
+ ret=send(*fd, data, len, 0);
+ if(ret < 0)
+ g_udpclientsocks.returnSocket(*fd);
+ return ret;
}
// -1 is error, 0 is timeout, 1 is success
@@ -643,7 +652,7 @@
if(bytes==1)
conn->state=TCPConnection::BYTE1;
if(bytes==2) {
- conn->qlen=(conn->data[0]<<8)+conn->data[1];
+ conn->qlen=(((unsigned char)conn->data[0]) << 8)+ (unsigned char)conn->data[1];
conn->bytesread=0;
conn->state=TCPConnection::GETQUESTION;
}
@@ -655,10 +664,10 @@
}
}
else if(conn->state==TCPConnection::BYTE1) {
- int bytes=recv(conn->fd,conn->data+1,1,0);
+ int bytes=recv(conn->fd, conn->data+1, 1, 0);
if(bytes==1) {
conn->state=TCPConnection::GETQUESTION;
- conn->qlen=(conn->data[0]<<8)+conn->data[1];
+ conn->qlen=(((unsigned char)conn->data[0]) << 8)+ (unsigned char)conn->data[1];
conn->bytesread=0;
}
if(!bytes || bytes < 0) {
@@ -671,7 +680,7 @@
}
}
else if(conn->state==TCPConnection::GETQUESTION) {
- int bytes=recv(conn->fd,conn->data + conn->bytesread,conn->qlen - conn->bytesread, 0);
+ int bytes=recv(conn->fd, conn->data + conn->bytesread, conn->qlen - conn->bytesread, 0);
if(!bytes || bytes < 0) {
L<remote.toString() <<" disconnected while reading question body"<outMSG.c_str(), pid->outMSG.size() - pid->outPos,0);
+ int ret=send(fd, pid->outMSG.c_str() + pid->outPos, pid->outMSG.size() - pid->outPos,0);
if(ret > 0) {
pid->outPos+=ret;
if(pid->outPos==pid->outMSG.size()) {
@@ -1684,7 +1695,7 @@
::arg().set("max-negative-ttl", "maximum number of seconds to keep a negative cached entry in memory")="3600";
::arg().set("server-id", "Returned when queried for 'server.id' TXT, defaults to hostname")="";
::arg().set("remotes-ringbuffer-entries", "maximum number of packets to store statistics for")="0";
- ::arg().set("version-string", "string reported on version.pdns or version.bind")="PowerDNS Recursor "VERSION" $Id: pdns_recursor.cc 871 2006-08-13 12:58:57Z ahu $";
+ ::arg().set("version-string", "string reported on version.pdns or version.bind")="PowerDNS Recursor "VERSION" $Id: pdns_recursor.cc 917 2006-11-07 12:23:51Z ahu $";
::arg().set("allow-from", "If set, only allow these comma separated netmasks to recurse")="127.0.0.0/8, 10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, ::1/128, fe80::/10";
::arg().set("max-tcp-per-client", "If set, maximum number of TCP sessions per client (IP address)")="0";
::arg().set("fork", "If set, fork the daemon for possible double performance")="no";
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pdns-recursor-3.1.3/pdns-recursor.init.d new/pdns-recursor-3.1.4/pdns-recursor.init.d
--- old/pdns-recursor-3.1.3/pdns-recursor.init.d 2006-09-12 20:21:01.000000000 +0200
+++ new/pdns-recursor-3.1.4/pdns-recursor.init.d 2006-11-12 17:56:13.000000000 +0100
@@ -63,7 +63,7 @@
;;
force-reload | restart)
- echo -n "Restarting PowerDNS authoritative nameserver: "
+ echo -n "Restarting PowerDNS recursing nameserver: "
echo -n stopping and waiting..
doPC quit
sleep 3
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pdns-recursor-3.1.3/rec_channel_rec.cc new/pdns-recursor-3.1.4/rec_channel_rec.cc
--- old/pdns-recursor-3.1.3/rec_channel_rec.cc 2006-09-12 20:21:01.000000000 +0200
+++ new/pdns-recursor-3.1.4/rec_channel_rec.cc 2006-11-12 17:56:13.000000000 +0100
@@ -186,7 +186,10 @@
addGetStat("unexpected-packets", &g_stats.unexpectedCount);
addGetStat("spoof-prevents", &g_stats.spoofCount);
+ addGetStat("nsset-invalidations", &g_stats.nsSetInvalidations);
+
addGetStat("resource-limits", &g_stats.resourceLimits);
+ addGetStat("dlg-only-drops", &SyncRes::s_nodelegated);
addGetStat("negcache-entries", boost::bind(&SyncRes::negcache_t::size, ref(SyncRes::s_negcache)));
addGetStat("throttle-entries", boost::bind(&SyncRes::throttle_t::size, ref(SyncRes::s_throttle)));
@@ -212,7 +215,7 @@
static void doExit()
{
L<d_ttd > now)
+ if((time_t)j->d_ttd > now)
break;
if(j != ce.d_records.end()) { // we still have valid data, ignore unauth data
return;
@@ -273,11 +273,16 @@
d_cache.replace(stored, ce);
}
-int MemRecursorCache::doWipeCache(const string& name)
+int MemRecursorCache::doWipeCache(const string& name, uint16_t qtype)
{
int count=0;
d_cachecachevalid=false;
- pair range=d_cache.equal_range(tie(name));
+ pair range;
+ if(qtype==0xffff)
+ range=d_cache.equal_range(tie(name));
+ else
+ range=d_cache.equal_range(tie(name, qtype));
+
for(cache_t::const_iterator i=range.first; i != range.second; ) {
count++;
d_cache.erase(i++);
@@ -299,8 +304,13 @@
time_t now=time(0);
for(sequence_t::const_iterator i=sidx.begin(); i != sidx.end(); ++i) {
for(vector<StoredRecord>::const_iterator j=i->d_records.begin(); j != i->d_records.end(); ++j) {
- DNSResourceRecord rr=String2DNSRR(i->d_qname, QType(i->d_qtype), j->d_string, j->d_ttd - now);
- fprintf(fp, "%s %d IN %s %s\n", rr.qname.c_str(), rr.ttl, rr.qtype.getName().c_str(), rr.content.c_str());
+ try {
+ DNSResourceRecord rr=String2DNSRR(i->d_qname, QType(i->d_qtype), j->d_string, j->d_ttd - now);
+ fprintf(fp, "%s %d IN %s %s\n", rr.qname.c_str(), rr.ttl, rr.qtype.getName().c_str(), rr.content.c_str());
+ }
+ catch(...) {
+ fprintf(fp, "; error printing '%s'\n", i->d_qname.c_str());
+ }
}
}
fclose(fp);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pdns-recursor-3.1.3/recursor_cache.hh new/pdns-recursor-3.1.4/recursor_cache.hh
--- old/pdns-recursor-3.1.3/recursor_cache.hh 2006-09-12 20:21:01.000000000 +0200
+++ new/pdns-recursor-3.1.4/recursor_cache.hh 2006-11-12 17:56:13.000000000 +0100
@@ -36,7 +36,7 @@
void doPrune(void);
void doSlash(int perc);
void doDumpAndClose(int fd);
- int doWipeCache(const string& name);
+ int doWipeCache(const string& name, uint16_t qtype=0xffff);
uint64_t cacheHits, cacheMisses;
bool d_followRFC2181;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pdns-recursor-3.1.3/sstuff.hh new/pdns-recursor-3.1.4/sstuff.hh
--- old/pdns-recursor-3.1.3/sstuff.hh 2006-09-12 20:21:01.000000000 +0200
+++ new/pdns-recursor-3.1.4/sstuff.hh 2006-11-12 17:56:13.000000000 +0100
@@ -228,7 +228,7 @@
const char *ptr=data.c_str();
do {
- res=::send(d_socket,ptr,toWrite,0);
+ res=::send(d_socket, ptr, toWrite, 0);
if(res<0)
throw NetworkError("Writing to a socket: "+string(strerror(errno)));
if(!res)
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pdns-recursor-3.1.3/syncres.cc new/pdns-recursor-3.1.4/syncres.cc
--- old/pdns-recursor-3.1.3/syncres.cc 2006-09-12 20:21:01.000000000 +0200
+++ new/pdns-recursor-3.1.4/syncres.cc 2006-11-12 17:56:13.000000000 +0100
@@ -16,6 +16,7 @@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include
#include "utility.hh"
#include "syncres.hh"
#include <iostream>
@@ -238,8 +239,9 @@
string subdomain(qname);
set nsset;
+ bool flawedNSSet=false;
for(int tries=0;tries<2 && nsset.empty();++tries) {
- subdomain=getBestNSNamesFromCache(subdomain,nsset,depth, beenthere); // pass beenthere to both occasions
+ subdomain=getBestNSNamesFromCache(subdomain, nsset, &flawedNSSet, depth, beenthere); // pass beenthere to both occasions
if(nsset.empty()) { // must've lost root records
LOG< 0) {
for(set<DNSResourceRecord>::const_iterator k=ns.begin();k!=ns.end();++k) {
if(k->ttl > (unsigned int)d_now.tv_sec ) {
@@ -336,8 +339,10 @@
LOG<<", not in cache / did not look at cache"<bestns.size()<<")"<bestns.size()<<")"<& nsset, int depth, set<GetBestNSAnswer>&beenthere)
+string SyncRes::getBestNSNamesFromCache(const string &qname, set& nsset, bool* flawedNSSet, int depth, set<GetBestNSAnswer>&beenthere)
{
string subdomain(qname);
@@ -385,7 +391,7 @@
}
set<DNSResourceRecord> bestns;
- getBestNSFromCache(subdomain, bestns, depth, beenthere);
+ getBestNSFromCache(subdomain, bestns, flawedNSSet, depth, beenthere);
for(set<DNSResourceRecord>::const_iterator k=bestns.begin();k!=bestns.end();++k) {
nsset.insert(k->content);
@@ -582,7 +588,7 @@
/** returns -1 in case of no results, rcode otherwise */
-int SyncRes::doResolveAt(set nameservers, string auth, const string &qname, const QType &qtype,
+int SyncRes::doResolveAt(set nameservers, string auth, bool flawedNSSet, const string &qname, const QType &qtype,
vector<DNSResourceRecord>&ret,
int depth, set<GetBestNSAnswer>&beenthere)
{
@@ -603,7 +609,12 @@
for(vector<string>::const_iterator tns=rnameservers.begin();;++tns) {
if(tns==rnameservers.end()) {
- LOG< '"<<i->content<<"', had '"<content);
}
- else if(i->d_place==DNSResourceRecord::AUTHORITY && dottedEndsOn(qname,i->qname) && i->qtype.getCode()==QType::SOA &&
+ else if(!done && i->d_place==DNSResourceRecord::AUTHORITY && dottedEndsOn(qname,i->qname) && i->qtype.getCode()==QType::SOA &&
d_lwr.d_rcode==RCode::NoError) {
LOG<qtype.getName()+"'") < 10) {
+ LOG< nameservers, string auth, const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret,
+ int doResolveAt(set nameservers, string auth, bool flawedNSSet, const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret,
int depth, set<GetBestNSAnswer>&beenthere);
int doResolve(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret, int depth, set<GetBestNSAnswer>& beenthere);
bool doOOBResolve(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret, int depth, int &res);
domainmap_t::const_iterator getBestAuthZone(string* qname);
bool doCNAMECacheCheck(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret, int depth, int &res);
bool doCacheCheck(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret, int depth, int &res);
- void getBestNSFromCache(const string &qname, set<DNSResourceRecord>&bestns, int depth, set<GetBestNSAnswer>& beenthere);
+ void getBestNSFromCache(const string &qname, set<DNSResourceRecord>&bestns, bool* flawedNSSet, int depth, set<GetBestNSAnswer>& beenthere);
void addCruft(const string &qname, vector<DNSResourceRecord>& ret);
- string getBestNSNamesFromCache(const string &qname,set& nsset, int depth, set<GetBestNSAnswer>&beenthere);
+ string getBestNSNamesFromCache(const string &qname,set& nsset, bool* flawedNSSet, int depth, set<GetBestNSAnswer>&beenthere);
void addAuthorityRecords(const string& qname, vector<DNSResourceRecord>& ret, int depth);
inline vector<string> shuffleInSpeedOrder(set &nameservers, const string &prefix);
@@ -476,6 +476,7 @@
uint64_t resourceLimits;
uint64_t ipv6queries;
uint64_t chainResends;
+ uint64_t nsSetInvalidations;
typedef vector<ComboAddress> remotes_t;
remotes_t remotes;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pdns-recursor-3.1.3/sysdeps/Linux.inc new/pdns-recursor-3.1.4/sysdeps/Linux.inc
--- old/pdns-recursor-3.1.3/sysdeps/Linux.inc 2006-09-12 20:21:01.000000000 +0200
+++ new/pdns-recursor-3.1.4/sysdeps/Linux.inc 2006-11-12 17:56:13.000000000 +0100
@@ -4,7 +4,10 @@
ifeq ($(CC),cc)
CC:=gcc
endif
-
+
+CXXFLAGS := $(CXXFLAGS) -D_GNU_SOURCE
+CFLAGS := $(CFLAGS) -D_GNU_SOURCE
+
optional/epollmplexer.o: epollmplexer.cc
$(CXX) $(CXXFLAGS) -c $< -o $@ ; true
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pdns-recursor-3.1.3/sysdeps/Linux.inc~ new/pdns-recursor-3.1.4/sysdeps/Linux.inc~
--- old/pdns-recursor-3.1.3/sysdeps/Linux.inc~ 1970-01-01 01:00:00.000000000 +0100
+++ new/pdns-recursor-3.1.4/sysdeps/Linux.inc~ 2006-11-12 17:56:13.000000000 +0100
@@ -0,0 +1,10 @@
+OPTIONALS:=optional/epollmplexer.o
+OS_SPECIFIC_INSTALL=mkdir -p $(DESTDIR)/etc/init.d ; cp pdns-recursor.init.d $(DESTDIR)/etc/init.d/pdns-recursor
+
+ifeq ($(CC),cc)
+ CC:=gcc
+endif
+
+optional/epollmplexer.o: epollmplexer.cc
+ $(CXX) $(CXXFLAGS) -c $< -o $@ ; true
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org