]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: Don't copy data around when sending and receiving 5308/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 9 May 2017 20:47:05 +0000 (22:47 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 9 May 2017 20:47:05 +0000 (22:47 +0200)
modules/remotebackend/unixconnector.cc

index c2e64ea378b64a47c4f16596493d0b405e3a5c7e..92e82a975ec7d8e3fa22aa13436f1d3737af623e 100644 (file)
@@ -65,12 +65,11 @@ int UnixsocketConnector::send_message(const Json& input) {
 }
 
 int UnixsocketConnector::recv_message(Json& output) {
-  int rv,nread;
+  int rv;
   std::string s_output,err;
 
   struct timeval t0,t;
 
-  nread = 0;
   gettimeofday(&t0, NULL);
   memcpy(&t,&t0,sizeof(t0));
   s_output = "";       
@@ -84,16 +83,11 @@ int UnixsocketConnector::recv_message(Json& output) {
       continue;
     }
 
-    std::string temp;
-    temp.clear();
-
-    rv = this->read(temp);
+    rv = this->read(s_output);
     if (rv == -1) 
       return -1;
 
     if (rv>0) {
-      nread += rv;
-      s_output.append(temp);
       // see if it can be parsed
       output = Json::parse(s_output, err);
       if (output != nullptr) return s_output.size();
@@ -128,25 +122,22 @@ ssize_t UnixsocketConnector::read(std::string &data) {
 }
 
 ssize_t UnixsocketConnector::write(const std::string &data) {
-  ssize_t nwrite, nbuf;
-  size_t pos;
-  char buf[1500];
+  size_t pos = 0;
 
   reconnect();
   if (!connected) return -1;
-  pos = 0;
-  nwrite = 0;
+
   while(pos < data.size()) {
-    nbuf = data.copy(buf, sizeof buf, pos); // copy data and write
-    nwrite = ::write(fd, buf, nbuf);
-    pos = pos + sizeof(buf);
-    if (nwrite < 1) {
+    ssize_t written = ::write(fd, &data.at(pos), data.size() - pos);
+    if (written < 1) {
       connected = false;
       close(fd);
       return -1;
+    } else {
+      pos = pos + static_cast<size_t>(written);
     }
   }
-  return nwrite;
+  return pos;
 }
 
 void UnixsocketConnector::reconnect() {