X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Funix_apply.c;h=6b3ede19e82778658a1af73aa8e36eed1fb66362;hp=97c1c83b2e3c0ac593184f0aa436441bfe98f3e8;hb=e8c3ca2d1d0cac3d64985b45a9f654d2029a7518;hpb=5218b1d7c83cf9e98ed6276e099844ae0d80abc2 diff --git a/src/unix_apply.c b/src/unix_apply.c index 97c1c83b..6b3ede19 100644 --- a/src/unix_apply.c +++ b/src/unix_apply.c @@ -1,8 +1,32 @@ -#include "config.h" +/* + * unix_apply.c - Code to apply files from a WIM image on UNIX. + */ + +/* + * Copyright (C) 2012, 2013 Eric Biggers + * + * This file is part of wimlib, a library for working with WIM files. + * + * wimlib is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free + * Software Foundation; either version 3 of the License, or (at your option) + * any later version. + * + * 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 General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with wimlib; if not, see http://www.gnu.org/licenses/. + */ -#ifdef HAVE_UTIME_H -# include +#ifndef __WIN32__ + +#ifdef HAVE_CONFIG_H +# include "config.h" #endif + #include #include #include @@ -10,10 +34,15 @@ #include #include #include +#ifdef HAVE_UTIME_H +# include +#endif -#include "timestamp.h" -#include "wimlib_internal.h" -#include "lookup_table.h" +#include "wimlib/apply.h" +#include "wimlib/error.h" +#include "wimlib/lookup_table.h" +#include "wimlib/reparse.h" +#include "wimlib/timestamp.h" /* Returns the number of components of @path. */ static unsigned @@ -42,10 +71,10 @@ path_next_part(const char *path) } static int -extract_regular_file_linked(struct wim_dentry *dentry, - const char *output_path, - struct apply_args *args, - struct wim_lookup_table_entry *lte) +unix_extract_regular_file_linked(struct wim_dentry *dentry, + const char *output_path, + struct apply_args *args, + struct wim_lookup_table_entry *lte) { /* This mode overrides the normal hard-link extraction and * instead either symlinks or hardlinks *all* identical files in @@ -177,10 +206,10 @@ dir_apply_unix_data(const char *dir, const struct wimlib_unix_data *unix_data, } static int -extract_regular_file_unlinked(struct wim_dentry *dentry, - struct apply_args *args, - const char *output_path, - struct wim_lookup_table_entry *lte) +unix_extract_regular_file_unlinked(struct wim_dentry *dentry, + struct apply_args *args, + const char *output_path, + struct wim_lookup_table_entry *lte) { /* Normal mode of extraction. Regular files and hard links are * extracted in the way that they appear in the WIM. */ @@ -269,9 +298,9 @@ out: } static int -extract_regular_file(struct wim_dentry *dentry, - struct apply_args *args, - const char *output_path) +unix_extract_regular_file(struct wim_dentry *dentry, + struct apply_args *args, + const char *output_path) { struct wim_lookup_table_entry *lte; const struct wim_inode *inode = dentry->d_inode; @@ -282,20 +311,22 @@ extract_regular_file(struct wim_dentry *dentry, WIMLIB_EXTRACT_FLAG_HARDLINK))) { if (lte->extracted_file) { - return extract_regular_file_linked(dentry, output_path, args, lte); + return unix_extract_regular_file_linked(dentry, + output_path, + args, lte); } else { lte->extracted_file = STRDUP(output_path); if (!lte->extracted_file) return WIMLIB_ERR_NOMEM; } } - return extract_regular_file_unlinked(dentry, args, output_path, lte); + return unix_extract_regular_file_unlinked(dentry, args, output_path, lte); } static int -extract_symlink(struct wim_dentry *dentry, - struct apply_args *args, - const char *output_path) +unix_extract_symlink(struct wim_dentry *dentry, + struct apply_args *args, + const char *output_path) { char target[4096 + args->target_realpath_len]; char *fixed_target; @@ -349,8 +380,8 @@ extract_symlink(struct wim_dentry *dentry, } static int -extract_directory(struct wim_dentry *dentry, const tchar *output_path, - int extract_flags) +unix_extract_directory(struct wim_dentry *dentry, const tchar *output_path, + int extract_flags) { int ret; struct stat stbuf; @@ -358,8 +389,6 @@ extract_directory(struct wim_dentry *dentry, const tchar *output_path, ret = tstat(output_path, &stbuf); if (ret == 0) { if (S_ISDIR(stbuf.st_mode)) { - /*if (!is_root)*/ - /*WARNING("`%s' already exists", output_path);*/ goto dir_exists; } else { ERROR("`%"TS"' is not a directory", output_path); @@ -402,11 +431,11 @@ unix_do_apply_dentry(const char *output_path, size_t output_path_len, const struct wim_inode *inode = dentry->d_inode; if (inode_is_symlink(inode)) - return extract_symlink(dentry, args, output_path); + return unix_extract_symlink(dentry, args, output_path); else if (inode_is_directory(inode)) - return extract_directory(dentry, output_path, args->extract_flags); + return unix_extract_directory(dentry, output_path, args->extract_flags); else - return extract_regular_file(dentry, args, output_path); + return unix_extract_regular_file(dentry, args, output_path); } int @@ -468,3 +497,5 @@ unix_do_apply_dentry_timestamps(const char *output_path, } return 0; } + +#endif /* !__WIN32__ */