vector <string> v;
split(v, command, is_any_of(" "));
- const char *argv[v.size()+1];
+ std::vector<const char *>argv(v.size()+1);
argv[v.size()]=0;
for (size_t n = 0; n < v.size(); n++)
argv[n]=v[n].c_str();
// we get away with not copying since nobody resizes v
- launch(argv, timeout, infd, outfd);
+ launch(&argv.at(0), timeout, infd, outfd);
}
void CoProcess::launch(const char **argv, int timeout, int infd, int outfd)
std::vector <std::string> v;
split(v, command, is_any_of(" "));
- const char *argv[v.size()+1];
+ std::vector<const char *>argv(v.size()+1);
argv[v.size()]=0;
for (size_t n = 0; n < v.size(); n++)
// stdin & stdout are now connected, fire up our coprocess!
- if(execv(argv[0], const_cast<char * const *>(argv))<0) // now what
+ if(execv(argv[0], const_cast<char * const *>(&argv[0]))<0) // now what
exit(123);
/* not a lot we can do here. We shouldn't return because that will leave a forked process around.
int diff;
bool logDNSQueries = ::arg().mustDo("log-dns-queries");
shared_ptr<UDPNameserver> NS;
+ std::string buffer;
+ buffer.resize(DNSPacket::s_udpTruncationThreshold);
// If we have SO_REUSEPORT then create a new port for all receiver threads
// other than the first one.
}
for(;;) {
- if(!(P=NS->receive(&question))) { // receive a packet inline
+ if(!(P=NS->receive(&question, buffer))) { // receive a packet inline
continue; // packet was broken, try again
}
}
- pthread_t workers[numworkers];
+ std::vector<pthread_t> workers(numworkers);
FILE* fp;
if(!g_vm.count("file"))
L<<Logger::Error<<"Error sending reply with sendmsg (socket="<<p->getSocket()<<", dest="<<p->d_remote.toStringWithPort()<<"): "<<strerror(errno)<<endl;
}
-DNSPacket *UDPNameserver::receive(DNSPacket *prefilled)
+DNSPacket *UDPNameserver::receive(DNSPacket *prefilled, std::string& buffer)
{
ComboAddress remote;
extern StatBag S;
ssize_t len=-1;
- char mesg[DNSPacket::s_udpTruncationThreshold];
Utility::sock_t sock=-1;
struct msghdr msgh;
char cbuf[256];
remote.sin6.sin6_family=AF_INET6; // make sure it is big enough
- fillMSGHdr(&msgh, &iov, cbuf, sizeof(cbuf), mesg, sizeof(mesg), &remote);
+ fillMSGHdr(&msgh, &iov, cbuf, sizeof(cbuf), &buffer.at(0), buffer.size(), &remote);
int err;
vector<struct pollfd> rfds= d_rfds;
else
packet->d_dt.set(); // timing
- if(packet->parse(mesg, (size_t) len)<0) {
+ if(packet->parse(&buffer.at(0), (size_t) len)<0) {
S.inc("corrupt-packets");
S.ringAccount("remotes-corrupt", packet->d_remote);
{
public:
UDPNameserver( bool additional_socket = false ); //!< Opens the socket
- DNSPacket *receive(DNSPacket *prefilled=0); //!< call this in a while or for(;;) loop to get packets
+ DNSPacket *receive(DNSPacket *prefilled, std::string& buffer); //!< call this in a while or for(;;) loop to get packets
void send(DNSPacket *); //!< send a DNSPacket. Will call DNSPacket::truncate() if over 512 bytes
inline bool canReusePort() {
#ifdef SO_REUSEPORT
}
// get the actual slot ids
- CK_SLOT_ID slotIds[slots];
- err = functions->C_GetSlotList(CK_FALSE, slotIds, &slots);
+ std::vector<CK_SLOT_ID> slotIds(slots);
+ err = functions->C_GetSlotList(CK_FALSE, &slotIds.at(0), &slots);
if (err) {
L<<Logger::Warning<<"C_GetSlotList(CK_FALSE, slotIds, &slots) = " << err << std::endl;
return err;
}
size_t packetLen = lenBuf[0]*256+lenBuf[1];
- char buf[packetLen];
- recvRes = recv(sock, &buf, packetLen, 0);
+ buffer.resize(packetLen);
+ recvRes = recv(sock, &buffer.at(0), packetLen, 0);
if (recvRes < 0) {
L<<Logger::Error<<msgPrefix<<"Could not receive data (dnspacket) from master at "<<remote.toStringWithPort()<<", error:"<<stringerror()<<endl;
try {
}
try {
- MOADNSParser mdp(false, buf, static_cast<unsigned int>(recvRes));
+ MOADNSParser mdp(false, buffer.data(), static_cast<unsigned int>(recvRes));
L<<Logger::Info<<msgPrefix<<"Forward update message to "<<remote.toStringWithPort()<<", result was RCode "<<mdp.d_header.rcode<<endl;
return mdp.d_header.rcode;
}