diff options
author | Havoc Pennington <hp@redhat.com> | 2003-01-26 16:11:11 +0000 |
---|---|---|
committer | Havoc Pennington <hp@redhat.com> | 2003-01-26 16:11:11 +0000 |
commit | 9a0b07f225be10c545a8b1de8555bca2dc3a9cab (patch) | |
tree | 78da9bc242ae1b00bee13a6816ae3f619ff3a505 /dbus/dbus-sysdeps.c | |
parent | 8ca39d9925df6cce64688a2315a2a424beb7bd55 (diff) |
2003-01-26 Havoc Pennington <hp@pobox.com>
* dbus/dbus-sysdeps.c (_dbus_file_get_contents): new function
* dbus/dbus-errors.c (dbus_result_to_string): add
file errors
* dbus/dbus-message-builder.c: new file, will contain code to load
up messages from files. Not implemented yet.
Diffstat (limited to 'dbus/dbus-sysdeps.c')
-rw-r--r-- | dbus/dbus-sysdeps.c | 98 |
1 files changed, 97 insertions, 1 deletions
diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c index 45405cc2..d8b202c7 100644 --- a/dbus/dbus-sysdeps.c +++ b/dbus/dbus-sysdeps.c @@ -23,12 +23,12 @@ #include "dbus-internals.h" #include "dbus-sysdeps.h" +#include <sys/types.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdio.h> #include <errno.h> -#include <sys/types.h> #include <unistd.h> #include <fcntl.h> #include <sys/socket.h> @@ -36,6 +36,7 @@ #include <pwd.h> #include <time.h> #include <sys/time.h> +#include <sys/stat.h> #ifdef HAVE_WRITEV #include <sys/uio.h> #endif @@ -43,6 +44,10 @@ #include <sys/poll.h> #endif +#ifndef O_BINARY +#define O_BINARY 0 +#endif + /** * @addtogroup DBusInternalsUtils * @{ @@ -1004,4 +1009,95 @@ _dbus_get_current_time (long *tv_sec, *tv_usec = t.tv_usec; } +/** + * Appends the contents of the given file to the string, + * returning result code. At the moment, won't open a file + * more than a megabyte in size. + * + * @param str the string to append to + * @param filename filename to load + * @returns result + */ +DBusResultCode +_dbus_file_get_contents (DBusString *str, + const DBusString *filename) +{ + int fd; + struct stat sb; + int orig_len; + int total; + const char *filename_c; + + _dbus_string_get_const_data (filename, &filename_c); + + /* O_BINARY useful on Cygwin */ + fd = open (filename_c, O_RDONLY | O_BINARY); + if (fd < 0) + return _dbus_result_from_errno (errno); + + if (fstat (fd, &sb) < 0) + { + DBusResultCode result; + + result = _dbus_result_from_errno (errno); /* prior to close() */ + + _dbus_verbose ("fstat() failed: %s", + _dbus_strerror (errno)); + + close (fd); + + return result; + } + + if (sb.st_size > _DBUS_ONE_MEGABYTE) + { + _dbus_verbose ("File size %lu is too large.\n", + (unsigned long) sb.st_size); + close (fd); + return DBUS_RESULT_FAILED; + } + + total = 0; + orig_len = _dbus_string_get_length (str); + if (sb.st_size > 0 && S_ISREG (sb.st_mode)) + { + int bytes_read; + + while (total < (int) sb.st_size) + { + bytes_read = _dbus_read (fd, str, + sb.st_size - total); + if (bytes_read <= 0) + { + DBusResultCode result; + + result = _dbus_result_from_errno (errno); /* prior to close() */ + + _dbus_verbose ("read() failed: %s", + _dbus_strerror (errno)); + + close (fd); + _dbus_string_set_length (str, orig_len); + return result; + } + else + total += bytes_read; + } + + close (fd); + return DBUS_RESULT_SUCCESS; + } + else if (sb.st_size != 0) + { + _dbus_verbose ("Can only open regular files at the moment.\n"); + close (fd); + return DBUS_RESULT_FAILED; + } + else + { + close (fd); + return DBUS_RESULT_SUCCESS; + } +} + /** @} end of sysdeps */ |