aboutsummaryrefslogtreecommitdiffstats
path: root/src/libmdsserver
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-05-08 04:46:13 +0200
committerMattias Andrée <maandree@operamail.com>2014-05-08 04:46:13 +0200
commitcc7a3bd8b297f44089658719f0c8992f321f2cd7 (patch)
treef6b8ae9070e1c1c3bf2f985b90ebc06be77afeef /src/libmdsserver
parentuse the data structure marshallers (diff)
downloadmds-cc7a3bd8b297f44089658719f0c8992f321f2cd7.tar.gz
mds-cc7a3bd8b297f44089658719f0c8992f321f2cd7.tar.bz2
mds-cc7a3bd8b297f44089658719f0c8992f321f2cd7.tar.xz
m + add full_write and add full_read
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src/libmdsserver')
-rw-r--r--src/libmdsserver/util.c72
-rw-r--r--src/libmdsserver/util.h18
2 files changed, 90 insertions, 0 deletions
diff --git a/src/libmdsserver/util.c b/src/libmdsserver/util.c
index 9eb88fe..a3a1867 100644
--- a/src/libmdsserver/util.c
+++ b/src/libmdsserver/util.c
@@ -172,3 +172,75 @@ int strict_atoi(const char* str, int* value, int min, int max)
return 0;
}
+
+/**
+ * Send a buffer into a file and ignore interruptions
+ *
+ * @param fd The file descriptor
+ * @param buffer The buffer
+ * @param length The length of the buffer
+ * @return Zero on success, -1 on error
+ */
+int full_write(int fd, const char* buffer, size_t length)
+{
+ ssize_t wrote;
+ while (length > 0)
+ {
+ errno = 0;
+ wrote = write(fd, buffer, length);
+ if (errno && (errno != EINTR))
+ return -1;
+ length -= (size_t)max(wrote, 0);
+ buffer += (size_t)max(wrote, 0);
+ }
+ return 0;
+}
+
+
+/**
+ * Read a file completly and ignore interruptions
+ *
+ * @param fd The file descriptor
+ * @return The content of the file, you will need to free it. `NULL` on error.
+ */
+char* full_read(int fd)
+{
+ size_t state_buf_size = 8 << 10;
+ size_t state_buf_ptr = 0;
+ char* state_buf;
+ ssize_t got;
+
+ /* Allocate buffer for data. */
+ if (xmalloc(state_buf, state_buf_size, char))
+ return NULL;
+
+ /* Read the file. */
+ for (;;)
+ {
+ /* Grow buffer if it is too small. */
+ if (state_buf_size == state_buf_ptr)
+ {
+ char* old_buf = state_buf;
+ state_buf = realloc(state_buf, (state_buf_size <<= 1) * sizeof(char));
+ if (state_buf == NULL)
+ {
+ free(old_buf);
+ return NULL;
+ }
+ }
+
+ /* Read from the file into the buffer. */
+ got = read(fd, state_buf + state_buf_ptr, state_buf_size - state_buf_ptr);
+ if ((got < 0) && (errno != EINTR))
+ {
+ free(state_buf);
+ return NULL;
+ }
+ if (got == 0)
+ break;
+ state_buf_ptr += (size_t)got;
+ }
+
+ return state_buf;
+}
+
diff --git a/src/libmdsserver/util.h b/src/libmdsserver/util.h
index 3de6f02..da2cb9f 100644
--- a/src/libmdsserver/util.h
+++ b/src/libmdsserver/util.h
@@ -74,6 +74,24 @@ size_t send_message(int socket, const char* message, size_t length);
*/
int strict_atoi(const char* str, int* value, int min, int max);
+/**
+ * Send a buffer into a file and ignore interruptions
+ *
+ * @param fd The file descriptor
+ * @param buffer The buffer
+ * @param length The length of the buffer
+ * @return Zero on success, -1 on error
+ */
+int full_write(int fd, const char* buffer, size_t length);
+
+/**
+ * Read a file completly and ignore interruptions
+ *
+ * @param fd The file descriptor
+ * @return The content of the file, you will need to free it. `NULL` on error.
+ */
+char* full_read(int fd);
+
#endif