aboutsummaryrefslogtreecommitdiff
path: root/lib/base
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2005-07-28 00:04:32 +0000
committerFelix Domke <tmbinc@elitedvb.net>2005-07-28 00:04:32 +0000
commitcb205396ae920ef813764de92bf5b686bb9d80f1 (patch)
tree42035b815af506c3755d6d7c2ae0e43bedb0fbc1 /lib/base
parent40253d1a081381a643b8841aeb2914f75211ddb9 (diff)
downloadenigma2-cb205396ae920ef813764de92bf5b686bb9d80f1.tar.gz
enigma2-cb205396ae920ef813764de92bf5b686bb9d80f1.zip
- factor out the filepusher from ts recorder
Diffstat (limited to 'lib/base')
-rw-r--r--lib/base/filepush.cpp75
-rw-r--r--lib/base/filepush.h20
2 files changed, 95 insertions, 0 deletions
diff --git a/lib/base/filepush.cpp b/lib/base/filepush.cpp
new file mode 100644
index 00000000..b85edbc1
--- /dev/null
+++ b/lib/base/filepush.cpp
@@ -0,0 +1,75 @@
+#include <lib/base/filepush.h>
+#include <lib/base/eerror.h>
+#include <errno.h>
+
+eFilePushThread::eFilePushThread()
+{
+ m_stop = 0;
+ m_buf_start = m_buf_end = 0;
+}
+
+static void signal_handler(int x)
+{
+}
+
+void eFilePushThread::thread()
+{
+ eDebug("FILEPUSH THREAD START");
+ // this is a race. FIXME.
+
+ /* we set the signal to not restart syscalls, so we can detect our signal. */
+ struct sigaction act;
+ act.sa_handler = signal_handler; // no, SIG_IGN doesn't do it. we want to receive the -EINTR
+ act.sa_flags = 0;
+ sigaction(SIGUSR1, &act, 0);
+
+ /* m_stop must be evaluated after each syscall. */
+ while (!m_stop)
+ {
+ /* first try flushing the bufptr */
+ if (m_buf_start != m_buf_end)
+ {
+ // TODO: take care of boundaries.
+ int w = write(m_fd_dest, m_buffer + m_buf_start, m_buf_end - m_buf_start);
+ if (w <= 0)
+ {
+ if (errno == -EINTR)
+ continue;
+ eDebug("eFilePushThread *write error* - not yet handled");
+ // ... we would stop the thread
+ }
+ printf("FILEPUSH: wrote %d bytes\n", w);
+ m_buf_start += w;
+ continue;
+ }
+
+ /* now fill our buffer. */
+ m_buf_start = 0;
+ m_buf_end = read(m_fd_source, m_buffer, sizeof(m_buffer));
+ if (m_buf_end < 0)
+ {
+ m_buf_end = 0;
+ if (errno == EINTR)
+ continue;
+ eDebug("eFilePushThread *read error* - not yet handled");
+ }
+ printf("FILEPUSH: read %d bytes\n", m_buf_end);
+ }
+
+ eDebug("FILEPUSH THREAD STOP");
+}
+
+void eFilePushThread::start(int fd_source, int fd_dest)
+{
+ m_fd_source = fd_source;
+ m_fd_dest = fd_dest;
+ m_stop = 0;
+ run();
+}
+
+void eFilePushThread::stop()
+{
+ m_stop = 1;
+ sendSignal(SIGUSR1);
+ kill();
+}
diff --git a/lib/base/filepush.h b/lib/base/filepush.h
new file mode 100644
index 00000000..b8d9f221
--- /dev/null
+++ b/lib/base/filepush.h
@@ -0,0 +1,20 @@
+#ifndef __lib_base_filepush_h
+#define __lib_base_filepush_h
+
+#include <lib/base/thread.h>
+
+class eFilePushThread: public eThread
+{
+public:
+ eFilePushThread();
+ void thread();
+ void stop();
+ void start(int sourcefd, int destfd);
+private:
+ int m_stop;
+ unsigned char m_buffer[65536];
+ int m_buf_start, m_buf_end;
+ int m_fd_source, m_fd_dest;
+};
+
+#endif