X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fwim.c;h=8422d9e10b3d5b9dec5442317106b84f48930a75;hb=69f07a55f05919a15ff1ec77b963b48f5f6a5d04;hp=6954dedaa3a0805f2590346f50db3213882b07e3;hpb=f03cd53bd986ce7b1c96dfa51cf4fbb2b9de05d5;p=wimlib diff --git a/src/wim.c b/src/wim.c index 6954deda..8422d9e1 100644 --- a/src/wim.c +++ b/src/wim.c @@ -5,20 +5,18 @@ /* * Copyright (C) 2012, 2013, 2014 Eric Biggers * - * This file is part of wimlib, a library for working with WIM files. + * This file 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 3 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 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 + * This file 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 General Public License - * along with wimlib; if not, see http://www.gnu.org/licenses/. + * You should have received a copy of the GNU Lesser General Public License + * along with this file; if not, see http://www.gnu.org/licenses/. */ #ifdef HAVE_CONFIG_H @@ -205,7 +203,6 @@ wimlib_create_new_wim(int ctype, WIMStruct **wim_ret) goto out_free_wim; } wim->lookup_table = table; - wim->refcnts_ok = 1; wim->compression_type = ctype; wim->out_compression_type = ctype; wim->chunk_size = wim->hdr.chunk_size; @@ -358,7 +355,7 @@ select_wim_image(WIMStruct *wim, int image) if (imd->root_dentry || imd->modified) { ret = 0; } else { - ret = read_metadata_resource(wim, imd); + ret = read_metadata_resource(imd); if (ret) wim->current_image = WIMLIB_NO_IMAGE; } @@ -474,14 +471,16 @@ wimlib_get_wim_info(WIMStruct *wim, struct wimlib_wim_info *info) WIMLIBAPI int wimlib_set_wim_info(WIMStruct *wim, const struct wimlib_wim_info *info, int which) { - int ret; - if (which & ~(WIMLIB_CHANGE_READONLY_FLAG | WIMLIB_CHANGE_GUID | WIMLIB_CHANGE_BOOT_INDEX | WIMLIB_CHANGE_RPFIX_FLAG)) return WIMLIB_ERR_INVALID_PARAM; + if ((which & WIMLIB_CHANGE_BOOT_INDEX) && + info->boot_index > wim->hdr.image_count) + return WIMLIB_ERR_INVALID_IMAGE; + if (which & WIMLIB_CHANGE_READONLY_FLAG) { if (info->is_marked_readonly) wim->hdr.flags |= WIM_HDR_FLAG_READONLY; @@ -489,21 +488,11 @@ wimlib_set_wim_info(WIMStruct *wim, const struct wimlib_wim_info *info, int whic wim->hdr.flags &= ~WIM_HDR_FLAG_READONLY; } - if ((which & ~WIMLIB_CHANGE_READONLY_FLAG) == 0) - return 0; - - ret = can_modify_wim(wim); - if (ret) - return ret; - if (which & WIMLIB_CHANGE_GUID) memcpy(wim->hdr.guid, info->guid, WIM_GUID_LEN); - if (which & WIMLIB_CHANGE_BOOT_INDEX) { - if (info->boot_index > wim->hdr.image_count) - return WIMLIB_ERR_INVALID_IMAGE; + if (which & WIMLIB_CHANGE_BOOT_INDEX) wim->hdr.boot_idx = info->boot_index; - } if (which & WIMLIB_CHANGE_RPFIX_FLAG) { if (info->has_rpfix) @@ -874,33 +863,6 @@ can_modify_wim(WIMStruct *wim) return 0; } -/* - * can_delete_from_wim - Check if files or images can be deleted from a given - * WIM file. - * - * This theoretically should be exactly the same as can_modify_wim(), but - * unfortunately, due to bugs in Microsoft's software that generate incorrect - * reference counts for some WIM resources, we need to run expensive - * verifications to make sure the reference counts are correct on all WIM - * resources. Otherwise we might delete a WIM resource whose reference count - * has fallen to 0, but is actually still referenced somewhere. - */ -int -can_delete_from_wim(WIMStruct *wim) -{ - int ret; - - ret = can_modify_wim(wim); - if (ret) - return ret; - if (!wim->refcnts_ok) { - ret = wim_recalculate_refcnts(wim); - if (ret) - return ret; - } - return 0; -} - /* API function documented in wimlib.h */ WIMLIBAPI void wimlib_free(WIMStruct *wim)