+ if (filter->wait() != 0) {
+ fatal("Filter process error");
+ }
+}
+
+FileFilter::FileFilter(int raw, int wrapped, pid_t pid)
+ : fd_raw(raw), fd_wrapped(wrapped), pid(pid) { }
+
+FileFilter *FileFilter::New(int fd, const char *program)
+{
+ if (program == NULL || strlen(program) == 0) {
+ return new FileFilter(fd, fd, -1);
+ }
+
+ pid_t pid;
+ int wrapped_fd = spawn_filter(fd, program, &pid);
+ return new FileFilter(fd, wrapped_fd, pid);
+}
+
+int FileFilter::wait()
+{
+ // No filter program was launched implies no need to wait.
+ if (pid == -1)
+ return 0;
+
+ // The raw file descriptor was held open to track the output file size, but
+ // is not needed any longer.
+ close(fd_raw);
+