--- src/common.h
+++ src/common.h
@@ -42,6 +42,8 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <signal.h>
+#include <fcntl.h>
 #include <boost/shared_ptr.hpp>
 #include <boost/filesystem/operations.hpp>
 #include <boost/filesystem/convenience.hpp>

--- src/conn_pool.cpp
+++ src/conn_pool.cpp
@@ -271,11 +271,11 @@
        ++iter) {
     msgs.push_back(**iter);
   }
-  ResultCode result = TRY_LATER;
+  ResultCode::type result = ResultCode::TRY_LATER;
   try {
     result = resendClient->Log(msgs);
 
-    if (result == OK) {
+    if (result == ResultCode::OK) {
       if (g_Handler) {
         g_Handler->incrementCounter("sent", size);
       }

--- src/file.cpp
+++ src/file.cpp
@@ -74,9 +74,21 @@
 }
 
 bool StdFile::openWrite() {
+  // if file is a fifo, temporarily open it for read
+  int fd = -1;
+  struct stat st;
+  int s = stat(filename.c_str(), &st);
+  if (s != -1 && S_ISFIFO(st.st_mode))
+    fd = ::open(filename.c_str(), O_RDONLY | O_NONBLOCK);
+
   // open file for write in append mode
   ios_base::openmode mode = fstream::out | fstream::app;
-  return open(mode);
+  bool r = open(mode);
+
+  // close fifo
+  if (fd != -1)
+    ::close(fd);
+  return r;
 }
 
 bool StdFile::openTruncate() {

--- src/scribe_server.cpp
+++ src/scribe_server.cpp
@@ -55,6 +55,8 @@
     if (-1 == setrlimit(RLIMIT_NOFILE, &r_fd)) {
       LOG_OPER("setrlimit error (setting max fd size)");
     }
+    
+    signal(SIGPIPE, SIG_IGN);
 
     int next_option;
     const char* const short_options = "hp:c:";
@@ -110,7 +112,7 @@
     }
 
     TNonblockingServer server(processor, binaryProtocolFactory,
-                              g_Handler->port, thread_manager);
+                              g_Handler->host, g_Handler->port, thread_manager);
 
     LOG_OPER("Starting scribe server on port %lu", g_Handler->port);
     fflush(stderr);
@@ -409,13 +411,13 @@
 }
 
 
-ResultCode scribeHandler::Log(const vector<LogEntry>&  messages) {
-  ResultCode result;
+ResultCode::type scribeHandler::Log(const vector<LogEntry>&  messages) {
+  ResultCode::type result;
 
   scribeHandlerLock.acquireRead();
 
   if (throttleRequest(messages)) {
-    result = TRY_LATER;
+    result = ResultCode::TRY_LATER;
     goto end;
   }
 
@@ -463,7 +465,7 @@
     addMessage(*msg_iter, store_list);
   }
 
-  result = OK;
+  result = ResultCode::OK;
 
  end:
   scribeHandlerLock.release();
@@ -583,6 +585,8 @@
       throw runtime_error("No port number configured");
     }
 
+    config.getString("host", host);
+
     // check if config sets the size to use for the ThreadManager
     unsigned long int num_threads;
     if (config.getUnsigned("num_thrift_server_threads", num_threads)) {

--- src/scribe_server.h
+++ src/scribe_server.h
@@ -42,7 +42,7 @@
   void initialize();
   void reinitialize();
 
-  scribe::thrift::ResultCode Log(const std::vector<scribe::thrift::LogEntry>& messages);
+  scribe::thrift::ResultCode::type Log(const std::vector<scribe::thrift::LogEntry>& messages);
 
   void getVersion(std::string& _return) {_return = "2.2";}
   facebook::fb303::fb_status getStatus();
@@ -51,6 +51,7 @@
   void setStatusDetails(const std::string& new_status_details);
 
   unsigned long int port; // it's long because that's all I implemented in the conf class
+  std::string host;
 
   // number of threads processing new Thrift connections
   size_t numThriftServerThreads;

