]> wimlib.net Git - wimlib/blobdiff - src/util.c
Some preparations for supporting NTFS capture and apply.
[wimlib] / src / util.c
index de5eec5b38e2616c87fa3812c36fbd5261fa3e96..47b76a828bc534ac8cb91c8d3d825bdfe07bebe3 100644 (file)
@@ -1,23 +1,25 @@
 /*
  * util.c
- *
+ */
+
+/*
  * Copyright (C) 2010 Carl Thijssen
  * Copyright (C) 2012 Eric Biggers
  *
- * wimlib - Library for working with WIM files 
+ * This file is part of wimlib, a library for working with WIM files.
  *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option) any
- * later version.
+ * wimlib is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
  *
- * This library is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ * wimlib is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
  *
- * You should have received a copy of the GNU Lesser General Public License along
- * with this library; if not, write to the Free Software Foundation, Inc., 59
- * Temple Place, Suite 330, Boston, MA 02111-1307 USA 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with wimlib; if not, see http://www.gnu.org/licenses/.
  */
 
 #include "wimlib_internal.h"
@@ -33,8 +35,8 @@
 #include <unistd.h>
 #include <errno.h>
 
-/* True if WIMLIB is to print an informational message when an error occurs.
- * This can be turned off by calling wimlib_set_error_messages(false). */
+/* True if wimlib is to print an informational message when an error occurs.
+ * This can be turned off by calling wimlib_set_print_errors(false). */
 #ifdef ENABLE_ERROR_MESSAGES
 #include <stdarg.h>
 bool __wimlib_print_errors = false;
@@ -49,6 +51,23 @@ void wimlib_error(const char *format, ...)
                errno_save = errno;
                fputs("ERROR: ", stderr);
                vfprintf(stderr, format, va);
+               putc('\n', stderr);
+               errno = errno_save;
+               va_end(va);
+       }
+}
+
+void wimlib_error_with_errno(const char *format, ...)
+{
+       if (__wimlib_print_errors) {
+               va_list va;
+               int errno_save;
+
+               va_start(va, format);
+               errno_save = errno;
+               fputs("ERROR: ", stderr);
+               vfprintf(stderr, format, va);
+               fprintf(stderr, ": %s\n", strerror(errno_save));
                errno = errno_save;
                va_end(va);
        }
@@ -64,6 +83,7 @@ void wimlib_warning(const char *format, ...)
                errno_save = errno;
                fputs("WARNING: ", stderr);
                vfprintf(stderr, format, va);
+               putc('\n', stderr);
                errno = errno_save;
                va_end(va);
        }
@@ -139,6 +159,8 @@ static const char *error_strings[] = {
                        "identify a WIM file",
        [WIMLIB_ERR_NO_FILENAME] 
                = "The WIM is not identified with a filename",
+       [WIMLIB_ERR_NTFS_3G]
+               = "NTFS-3g encountered an error (check errno)",
        [WIMLIB_ERR_OPEN] 
                = "Failed to open a file",
        [WIMLIB_ERR_OPENDIR] 
@@ -176,8 +198,8 @@ WIMLIBAPI const char *wimlib_get_error_string(enum wimlib_error_code code)
 
 
 #ifdef ENABLE_CUSTOM_MEMORY_ALLOCATOR
-void *(*wimlib_malloc_func)(size_t) = malloc;
-void (*wimlib_free_func)(void *) = free;
+void *(*wimlib_malloc_func) (size_t)        = malloc;
+void  (*wimlib_free_func)   (void *)        = free;
 void *(*wimlib_realloc_func)(void *, size_t) = realloc;
 
 void *wimlib_calloc(size_t nmemb, size_t size)
@@ -217,10 +239,11 @@ WIMLIBAPI int wimlib_set_memory_allocator(void *(*malloc_func)(size_t),
 
        xml_set_memory_allocator(wimlib_malloc_func, wimlib_free_func, 
                                 wimlib_realloc_func);
+       return 0;
 #else
-       ERROR("Cannot set custom memory allocator functions:\n");
-       ERROR("wimlib was compiled with the "
-                       "--without-custom-memory-allocator flag\n");
+       ERROR("Cannot set custom memory allocator functions:");
+       ERROR("wimlib was compiled with the --without-custom-memory-allocator "
+             "flag");
        return WIMLIB_ERR_UNSUPPORTED;
 #endif
 }
@@ -237,8 +260,8 @@ char *utf16_to_utf8(const char *utf16_str, size_t utf16_len,
        if (cd_utf16_to_utf8 == (iconv_t)(-1)) {
                cd_utf16_to_utf8 = iconv_open("UTF-8", "UTF-16LE");
                if (cd_utf16_to_utf8 == (iconv_t)-1) {
-                       ERROR("Failed to get conversion descriptor for "
-                                       "converting UTF-16LE to UTF-8: %m\n");
+                       ERROR_WITH_ERRNO("Failed to get conversion descriptor "
+                                        "for converting UTF-16LE to UTF-8");
                        return NULL;
                }
        }
@@ -255,8 +278,8 @@ char *utf16_to_utf8(const char *utf16_str, size_t utf16_len,
                        &utf16_bytes_left, &utf8_str, &utf8_bytes_left);
 
        if (num_chars_converted == (size_t)(-1)) {
-               ERROR("Failed to convert UTF-16LE string to UTF-8 string: "
-                               "%m\n");
+               ERROR_WITH_ERRNO("Failed to convert UTF-16LE string to UTF-8 "
+                                "string");
                FREE(orig_utf8_str);
                return NULL;
        }
@@ -278,8 +301,8 @@ char *utf8_to_utf16(const char *utf8_str, size_t utf8_len,
        if (cd_utf8_to_utf16 == (iconv_t)(-1)) {
                cd_utf8_to_utf16 = iconv_open("UTF-16LE", "UTF-8");
                if (cd_utf8_to_utf16 == (iconv_t)-1) {
-                       ERROR("Failed to get conversion descriptor for "
-                                       "converting UTF-8 to UTF-16LE: %m\n");
+                       ERROR_WITH_ERRNO("Failed to get conversion descriptor "
+                                        "for converting UTF-8 to UTF-16LE");
                        return NULL;
                }
        }
@@ -298,11 +321,8 @@ char *utf8_to_utf16(const char *utf8_str, size_t utf8_len,
                        &utf8_bytes_left, &utf16_str, &utf16_bytes_left);
 
        if (num_chars_converted == (size_t)(-1)) {
-               ERROR("Failed to convert UTF-8 string to UTF-16LE string: "
-                               "%s\n", 
-                               (errno == E2BIG) ? 
-                                       "Not enough room in output buffer" : 
-                                       strerror(errno));
+               ERROR_WITH_ERRNO("Failed to convert UTF-8 string to UTF-16LE "
+                                "string");
                FREE(orig_utf16_str);
                return NULL;
        }
@@ -467,22 +487,3 @@ void print_string(const void *string, size_t len)
                p++;
        }
 }
-
-/* Calculates the SHA1 message digest given the name of a file.
- * @buf must point to a buffer of length 20 bytes into which the message digest
- * is written.
- */
-int sha1sum(const char *filename, void *buf)
-{
-       FILE *fp;
-       int ret;
-
-       fp = fopen(filename, "rb");
-       if (!fp) {
-               ERROR("Cannot open the file `%s' for reading: %m\n", filename);
-               return WIMLIB_ERR_OPEN;
-       }
-       ret = sha1_stream(fp, buf);
-       fclose(fp);
-       return ret;
-}