summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastian Bloessl <bastian.bloessl@uibk.ac.at>2013-05-31 10:57:06 +0200
committerJohnathan Corgan <johnathan@corganlabs.com>2013-10-28 08:42:25 -0700
commit7b874636db9e214cff863e081d59c3eaa37046fc (patch)
tree60c14444473ad140e48514896ec41b7b4ed05a6a
parent883ae8e3bbcaac6402fa07ac9e6c3d37d20fd973 (diff)
blocks: add append option to file sink
-rw-r--r--gr-blocks/grc/blocks_file_sink.xml16
-rw-r--r--gr-blocks/include/gnuradio/blocks/file_sink.h4
-rw-r--r--gr-blocks/include/gnuradio/blocks/file_sink_base.h3
-rw-r--r--gr-blocks/lib/file_sink_base.cc14
-rw-r--r--gr-blocks/lib/file_sink_impl.cc8
-rw-r--r--gr-blocks/lib/file_sink_impl.h2
6 files changed, 34 insertions, 13 deletions
diff --git a/gr-blocks/grc/blocks_file_sink.xml b/gr-blocks/grc/blocks_file_sink.xml
index 75ef86a6b8..ece21fd2ae 100644
--- a/gr-blocks/grc/blocks_file_sink.xml
+++ b/gr-blocks/grc/blocks_file_sink.xml
@@ -8,7 +8,7 @@
<name>File Sink</name>
<key>blocks_file_sink</key>
<import>from gnuradio import blocks</import>
- <make>blocks.file_sink($type.size*$vlen, $file)
+ <make>blocks.file_sink($type.size*$vlen, $file, $append)
self.$(id).set_unbuffered($unbuffered)</make>
<callback>set_unbuffered($unbuffered)</callback>
<callback>open($file)</callback>
@@ -68,6 +68,20 @@ self.$(id).set_unbuffered($unbuffered)</make>
<key>True</key>
</option>
</param>
+ <param>
+ <name>Append file</name>
+ <key>append</key>
+ <value>False</value>
+ <type>bool</type>
+ <option>
+ <name>Append</name>
+ <key>True</key>
+ </option>
+ <option>
+ <name>Overwrite</name>
+ <key>False</key>
+ </option>
+ </param>
<check>$vlen &gt; 0</check>
<sink>
diff --git a/gr-blocks/include/gnuradio/blocks/file_sink.h b/gr-blocks/include/gnuradio/blocks/file_sink.h
index c1041683d3..177964682d 100644
--- a/gr-blocks/include/gnuradio/blocks/file_sink.h
+++ b/gr-blocks/include/gnuradio/blocks/file_sink.h
@@ -45,8 +45,10 @@ namespace gr {
* \brief Make a file sink.
* \param itemsize size of the input data items.
* \param filename name of the file to open and write output to.
+ * \param append if true, data is appended to the file instead of
+ * overwriting the initial content.
*/
- static sptr make(size_t itemsize, const char *filename);
+ static sptr make(size_t itemsize, const char *filename, bool append=false);
};
} /* namespace blocks */
diff --git a/gr-blocks/include/gnuradio/blocks/file_sink_base.h b/gr-blocks/include/gnuradio/blocks/file_sink_base.h
index 812da6dfae..253b5ea122 100644
--- a/gr-blocks/include/gnuradio/blocks/file_sink_base.h
+++ b/gr-blocks/include/gnuradio/blocks/file_sink_base.h
@@ -42,9 +42,10 @@ namespace gr {
bool d_is_binary;
boost::mutex d_mutex;
bool d_unbuffered;
+ bool d_append;
protected:
- file_sink_base(const char *filename, bool is_binary);
+ file_sink_base(const char *filename, bool is_binary, bool append);
public:
file_sink_base() {}
diff --git a/gr-blocks/lib/file_sink_base.cc b/gr-blocks/lib/file_sink_base.cc
index 42e2eae528..81bc94f351 100644
--- a/gr-blocks/lib/file_sink_base.cc
+++ b/gr-blocks/lib/file_sink_base.cc
@@ -53,8 +53,8 @@
namespace gr {
namespace blocks {
- file_sink_base::file_sink_base(const char *filename, bool is_binary)
- : d_fp(0), d_new_fp(0), d_updated(false), d_is_binary(is_binary)
+ file_sink_base::file_sink_base(const char *filename, bool is_binary, bool append)
+ : d_fp(0), d_new_fp(0), d_updated(false), d_is_binary(is_binary), d_append(append)
{
if (!open(filename))
throw std::runtime_error ("can't open file");
@@ -76,9 +76,13 @@ namespace gr {
// we use the open system call to get access to the O_LARGEFILE flag.
int fd;
- if((fd = ::open(filename,
- O_WRONLY|O_CREAT|O_TRUNC|OUR_O_LARGEFILE|OUR_O_BINARY,
- 0664)) < 0){
+ int flags;
+ if(d_append) {
+ flags = O_WRONLY|O_CREAT|O_APPEND|OUR_O_LARGEFILE|OUR_O_BINARY;
+ } else {
+ flags = O_WRONLY|O_CREAT|O_TRUNC|OUR_O_LARGEFILE|OUR_O_BINARY;
+ }
+ if((fd = ::open(filename, flags, 0664)) < 0){
perror(filename);
return false;
}
diff --git a/gr-blocks/lib/file_sink_impl.cc b/gr-blocks/lib/file_sink_impl.cc
index e78576e288..ab36dcd4e6 100644
--- a/gr-blocks/lib/file_sink_impl.cc
+++ b/gr-blocks/lib/file_sink_impl.cc
@@ -32,17 +32,17 @@ namespace gr {
namespace blocks {
file_sink::sptr
- file_sink::make(size_t itemsize, const char *filename)
+ file_sink::make(size_t itemsize, const char *filename, bool append)
{
return gnuradio::get_initial_sptr
- (new file_sink_impl(itemsize, filename));
+ (new file_sink_impl(itemsize, filename, append));
}
- file_sink_impl::file_sink_impl(size_t itemsize, const char *filename)
+ file_sink_impl::file_sink_impl(size_t itemsize, const char *filename, bool append)
: sync_block("file_sink",
io_signature::make(1, 1, itemsize),
io_signature::make(0, 0, 0)),
- file_sink_base(filename, true),
+ file_sink_base(filename, true, append),
d_itemsize(itemsize)
{
}
diff --git a/gr-blocks/lib/file_sink_impl.h b/gr-blocks/lib/file_sink_impl.h
index f86009419e..9e0c81569b 100644
--- a/gr-blocks/lib/file_sink_impl.h
+++ b/gr-blocks/lib/file_sink_impl.h
@@ -34,7 +34,7 @@ namespace gr {
size_t d_itemsize;
public:
- file_sink_impl(size_t itemsize, const char *filename);
+ file_sink_impl(size_t itemsize, const char *filename, bool append=false);
~file_sink_impl();
int work(int noutput_items,