* extract.c
*
* Support for extracting WIM files.
- *
+ */
+
+/*
* 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"
if (link_type == WIM_LINK_TYPE_HARD) {
if (link(lte->file_on_disk, output_path) != 0) {
- ERROR("Failed to hard link `%s' to `%s': %m\n",
- output_path, lte->file_on_disk);
+ ERROR_WITH_ERRNO("Failed to hard link "
+ "`%s' to `%s'",
+ output_path, lte->file_on_disk);
return WIMLIB_ERR_LINK;
}
} else {
p2 = path_next_part(p2, NULL);
strcpy(p, p2);
if (symlink(buf, output_path) != 0) {
- ERROR("Failed to symlink `%s' to `%s': %m\n",
- buf, lte->file_on_disk);
+ ERROR_WITH_ERRNO("Failed to symlink `%s' to "
+ "`%s'",
+ buf, lte->file_on_disk);
return WIMLIB_ERR_LINK;
}
out_fd = open(output_path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (out_fd == -1) {
- ERROR("Failed to open the file `%s' for writing: "
- "%m\n", output_path);
+ ERROR_WITH_ERRNO("Failed to open the file `%s' for writing",
+ output_path);
return WIMLIB_ERR_OPEN;
}
/* Extract empty file, with no lookup table entry... */
if (!lte) {
- DEBUG("Empty file `%s'\n", output_path);
+ DEBUG("Empty file `%s'.", output_path);
ret = 0;
goto done;
}
res_entry->original_size);
if (ret != 0) {
- ERROR("Failed to extract resource to `%s'!\n", output_path);
+ ERROR("Failed to extract resource to `%s'", output_path);
goto done;
}
itself. */
return 0;
default:
- ERROR("Cannot create directory `%s': %m\n",
- output_path);
+ ERROR_WITH_ERRNO("Cannot create directory `%s'",
+ output_path);
return WIMLIB_ERR_MKDIR;
}
}
static int extract_single_image(WIMStruct *w, int image)
{
- DEBUG("Extracting image %d\n", image);
+ DEBUG("Extracting image %d", image);
int ret;
ret = wimlib_select_image(w, image);
* subdirectories named by their image names. */
static int extract_all_images(WIMStruct *w)
{
- size_t image_name_max_len = xml_get_max_image_name_len(w);
+ size_t image_name_max_len = max(xml_get_max_image_name_len(w), 20);
size_t output_path_len = strlen(w->output_dir);
char buf[output_path_len + 1 + image_name_max_len + 1];
int ret;
int image;
+ const char *image_name;
- DEBUG("Attempting to extract all images from `%s'\n", w->filename);
+ DEBUG("Attempting to extract all images from `%s'", w->filename);
memcpy(buf, w->output_dir, output_path_len);
buf[output_path_len] = '/';
for (image = 1; image <= w->hdr.image_count; image++) {
- buf[output_path_len + 1] = '\0';
- strncat(buf + output_path_len + 1, wimlib_get_image_name(w, image),
- image_name_max_len);
+
+ image_name = wimlib_get_image_name(w, image);
+ if (*image_name) {
+ strcpy(buf + output_path_len + 1, image_name);
+ } else {
+ /* Image name is empty. Use image number instead */
+ sprintf(buf + output_path_len + 1, "%d", image);
+ }
ret = wimlib_set_output_dir(w, buf);
if (ret != 0)
goto done;
if (ret != 0)
goto done;
}
- ret = 0;
done:
+ /* Restore original output directory */
buf[output_path_len + 1] = '\0';
- wimlib_set_output_dir(w, buf);
- return ret;
+ return wimlib_set_output_dir(w, buf);
}
/* Extracts a single image or all images from a WIM file. */
WIMLIBAPI int wimlib_extract_image(WIMStruct *w, int image)
{
if (!w->output_dir) {
- ERROR("No output directory selected.\n");
+ ERROR("No output directory selected.");
return WIMLIB_ERR_NOTDIR;
}
if (image == WIM_ALL_IMAGES) {
}
-/* Set the output directory for WIM extraction. The directory is created using
- * mkdir(). Fails if directory cannot be created or already exists. */
+/* Sets and creates the directory to which files are to be extracted when
+ * extracting files from the WIM. */
WIMLIBAPI int wimlib_set_output_dir(WIMStruct *w, const char *dir)
{
char *p;
- DEBUG("Setting output directory to `%s'\n", dir);
+ DEBUG("Setting output directory to `%s'", dir);
if (!dir) {
- ERROR("Must specify a directory!\n");
+ ERROR("Must specify a directory!");
return WIMLIB_ERR_INVALID_PARAM;
}
p = STRDUP(dir);
if (!p) {
- ERROR("Out of memory!\n");
+ ERROR("Out of memory");
return WIMLIB_ERR_NOMEM;
}
if (mkdir(dir, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) != 0) {
if (errno == EEXIST) {
- DEBUG("`%s' already exists\n", dir);
+ DEBUG("`%s' already exists", dir);
goto done;
}
- ERROR("Cannot create directory `%s': %m\n", dir);
+ ERROR_WITH_ERRNO("Cannot create directory `%s'", dir);
FREE(p);
return WIMLIB_ERR_MKDIR;
} else {
- DEBUG("Created directory `%s'\n", dir);
+ DEBUG("Created directory `%s'", dir);
}
done:
FREE(w->output_dir);