Add API to write raw data to child processes.
authorRobin Gareus <robin@gareus.org>
Mon, 19 Nov 2018 01:26:43 +0000 (02:26 +0100)
committerRobin Gareus <robin@gareus.org>
Mon, 19 Nov 2018 01:26:43 +0000 (02:26 +0100)
libs/pbd/pbd/system_exec.h
libs/pbd/system_exec.cc

index a8a30ba18dc0b6af05faac7aacc5f68cd4f1b76b..c5fb58315284e52a015821e66d1eaad88e19206f 100644 (file)
@@ -164,12 +164,19 @@ class LIBPBD_API SystemExec
                 */
                void close_stdin ();
                /** write into child-program's STDIN
-                * @param d data to write
+                * @param d text to write
                 * @param len length of data to write, if it is 0 (zero), d.length() is
                 * used to determine the number of bytes to transmit.
                 * @return number of bytes written.
                 */
-               int write_to_stdin (std::string d, size_t len=0);
+               size_t write_to_stdin (std::string const& d, size_t len=0);
+
+               /** write into child-program's STDIN
+                * @param data data to write
+                * @param bytes length of data to write
+                * @return number of bytes written.
+                */
+               size_t write_to_stdin (const void* d, size_t bytes=0);
 
                /** The ReadStdout signal is emitted when the application writes to STDOUT.
                 * it passes the written data and its length in bytes as arguments to the bound
index 351e4ee066ae118f2f69e0e64de6cf2b90715f42..ed36c507ff49bbe4a0273a06de33eb51f2e642c1 100644 (file)
@@ -351,6 +351,16 @@ SystemExec::to_s () const
 #endif
 }
 
+size_t
+SystemExec::write_to_stdin (std::string const& d, size_t len)
+{
+       const char *data = d.c_str();
+       if (len == 0) {
+               len = d.length();
+       }
+       return write_to_stdin ((const void*)data, len);
+}
+
 #ifdef PLATFORM_WINDOWS /* Windows Process */
 
 /* HELPER FUNCTIONS */
@@ -582,21 +592,16 @@ SystemExec::close_stdin()
        destroy_pipe(stdinP);
 }
 
-int
-SystemExec::write_to_stdin(std::string d, size_t len)
+size_t
+SystemExec::write_to_stdin(const void* data, size_t bytes)
 {
-       const char *data;
        DWORD r,c;
 
        ::pthread_mutex_lock(&write_lock);
 
-       data=d.c_str();
-       if (len == 0) {
-               len=(d.length());
-       }
        c=0;
-       while (c < len) {
-               if (!WriteFile(stdinP[1], data+c, len-c, &r, NULL)) {
+       while (c < bytes) {
+               if (!WriteFile(stdinP[1], data+c, bytes-c, &r, NULL)) {
                        if (GetLastError() == 0xE8 /*NT_STATUS_INVALID_USER_BUFFER*/) {
                                Sleep(100);
                                continue;
@@ -950,27 +955,22 @@ SystemExec::close_stdin()
        close_fd(pout[1]);
 }
 
-int
-SystemExec::write_to_stdin(std::string d, size_t len)
+size_t
+SystemExec::write_to_stdin(const void* data, size_t bytes)
 {
-       const char *data;
        ssize_t r;
        size_t c;
        ::pthread_mutex_lock(&write_lock);
 
-       data=d.c_str();
-       if (len == 0) {
-               len=(d.length());
-       }
        c=0;
-       while (c < len) {
+       while (c < bytes) {
                for (;;) {
-                       r=::write(pin[1], data+c, len-c);
+                       r=::write(pin[1], data+c, bytes-c);
                        if (r < 0 && (errno == EINTR || errno == EAGAIN)) {
                                sleep(1);
                                continue;
                        }
-                       if ((size_t) r != (len-c)) {
+                       if ((size_t) r != (bytes-c)) {
                                ::pthread_mutex_unlock(&write_lock);
                                return c;
                        }