X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fextract.c;h=1d229a167922d52fcd8efac250fdf67f1d7a0710;hp=7dd957cc908cf4499ff8f054be3d4f03b269e76f;hb=b30fcd099ba7f173984605ee03885e6e0c6624ec;hpb=885632f08c75c1d7bb5d25436231c78f6ad7e0c0 diff --git a/src/extract.c b/src/extract.c index 7dd957cc..1d229a16 100644 --- a/src/extract.c +++ b/src/extract.c @@ -2,24 +2,26 @@ * 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" @@ -76,8 +78,9 @@ static int extract_regular_file(WIMStruct *w, 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 { @@ -114,8 +117,9 @@ static int extract_regular_file(WIMStruct *w, 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; } @@ -127,14 +131,14 @@ static int extract_regular_file(WIMStruct *w, 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; } @@ -145,7 +149,7 @@ static int extract_regular_file(WIMStruct *w, 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; } @@ -181,8 +185,8 @@ static int extract_directory(struct dentry *dentry, const char *output_path) 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; } } @@ -223,7 +227,7 @@ static int extract_regular_file_or_directory(struct dentry *dentry, void *arg) 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); @@ -239,20 +243,26 @@ static int extract_single_image(WIMStruct *w, int 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; @@ -260,18 +270,17 @@ static int extract_all_images(WIMStruct *w) 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) { @@ -284,33 +293,33 @@ WIMLIBAPI int wimlib_extract_image(WIMStruct *w, int image) } -/* 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);