Published stx-execpipe 0.7.0 - STX Execution Pipe C++ Library
Posted on 2010-07-18 23:31 by Timo Bingmann at Permlink with 0 Comments. Tags: #c++
The STX C++ library series has been extended today with a new installation: the STX Execution Pipe library, in short STX ExecPipe. It is the solution to an issue that I encountered in writing a small backup application. This backup tool collects some file to backup and then calls tar
and xz
followed by ncftpput
.
However, I could not find any useful C++ library that allows convenient chaining of external programs like used in everyday shell piping. This pipe line functionality is based on the system calls fork()
, exec()
and pipe()
, which are not easy to use correctly. After writing some ad-hoc functions to call one or two external programs, I decided to tackle this basic problem once and for all. The result is the stx-execpipe library.
Using the library a C++ program can build a sequence of external programs with command line parameters. These programs are connected by the library just like a shell pipe: stdout of the preceding stage goes into stdin of the next one. The input and output of the whole pipeline can be redirected to a plain fd, a file or saved in a std::string.
One very interesting feature of the library is to insert intermediate processing functions into a pipe line. The data can be intercepted and passed back to the parent process for manipulation or just inspection. This was necessary to calculate the SHA1 digest of a backup tarball simultaneously to uploading it.
For more information and the source code see the stx-execpipe web page.
The following small code snippet exemplifies the flexibility of the stx-execpipe solution:
stx::ExecPipe ep; // first stage calls tar std::vector<std::string> tarargs; tarargs.push_back("tar"); tarargs.push_back("--create"); tarargs.push_back("--verbose"); tarargs.push_back("--no-recursion"); tarargs.push_back("/path/to/some/files"); tarargs.push_back("/path/to/more/files"); ep.add_execp(&tarargs); // second stage compresses the tarball ep.add_execp("xz", "-9"); // third stage intercepts data for a SHA1 digest Sha1Function sha1tar; ep.add_function(&sha1tar); // fourth stage sends the tarball via FTP std::vector<std::string> ftpargs; ftpargs.push_back("ncftpput"); ftpargs.push_back("-c"); ftpargs.push_back("ftp.upload-to-host.net"); ftpargs.push_back("/path/to/ftpfile.tar.gz"); ep.add_execp(&ftpargs); if (ep.run().all_return_codes_zero()) { std::cout << "Backup upload complete." << std::endl } else { // error processing... }