Browse Source

Add placeholder for sync.

Brian Aker 11 years ago
parent
commit
d7ba0489b8
3 changed files with 90 additions and 3 deletions
  1. 1 0
      libhostile/include.am
  2. 38 0
      libhostile/sync.h
  3. 51 3
      libhostile/write.c

+ 1 - 0
libhostile/include.am

@@ -32,6 +32,7 @@ noinst_HEADERS+= libhostile/send.h
 noinst_HEADERS+= libhostile/setsockopt.h
 noinst_HEADERS+= libhostile/socket.h
 noinst_HEADERS+= libhostile/socket_server.h
+noinst_HEADERS+= libhostile/sync.h
 noinst_HEADERS+= libhostile/visibility.h
 noinst_HEADERS+= libhostile/write.h
 

+ 38 - 0
libhostile/sync.h

@@ -0,0 +1,38 @@
+/*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
+ *
+ *  Data Differential's libhostle
+ *
+ *  Copyright (C) 2014 Data Differential, http://datadifferential.com/
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are
+ *  met:
+ *
+ *      * Redistributions of source code must retain the above copyright
+ *  notice, this list of conditions and the following disclaimer.
+ *
+ *      * Redistributions in binary form must reproduce the above
+ *  copyright notice, this list of conditions and the following disclaimer
+ *  in the documentation and/or other materials provided with the
+ *  distribution.
+ *
+ *      * The names of its contributors may not be used to endorse or
+ *  promote products derived from this software without specific prior
+ *  written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#pragma once
+

+ 51 - 3
libhostile/write.c

@@ -55,6 +55,9 @@ static void set_local(void)
   __function= set_function("write", "HOSTILE_WRITE");
 }
 
+#define __WRITE_DEFAULT_ERROR ECONNRESET
+static __thread int __default_error= __WRITE_DEFAULT_ERROR;
+
 ssize_t write(int fd, const void *buf, size_t count)
 {
   hostile_initialize();
@@ -66,9 +69,54 @@ ssize_t write(int fd, const void *buf, size_t count)
     {
       if (--not_until < 0 && random() % __function.frequency)
       {
-        close(fd);
-        errno= ECONNRESET;
-        return -1;
+        int ret= -1;
+        struct stat statbuf;
+        fstat(fd, &statbuf);
+
+        if (S_ISSOCK(statbuf.st_mode))
+        {
+          switch (__default_error)
+          {
+            case EIO:
+              close(fd);
+              errno= EIO;
+              break;
+
+            case ENETDOWN:
+              close(fd);
+              errno= ENETDOWN;
+              break;
+
+            case ECONNRESET:
+            default:
+              close(fd);
+              errno= ECONNRESET;
+              break;
+          }
+        }
+        else
+        {
+          switch (__default_error)
+          {
+            case EIO:
+              errno= EIO;
+              ret= 0;
+              break;
+
+            case ENOSPC:
+              errno= ENOSPC;
+              ret= 0;
+              break;
+
+            case EFBIG:
+            default:
+              errno= EFBIG;
+              ret= 0;
+              break;
+          }
+        }
+
+        return ret;
       }
     }
   }