diff --git a/ostree/ot-builtin-fsck.c b/ostree/ot-builtin-fsck.c index 7c87402f..e0da0dc8 100644 --- a/ostree/ot-builtin-fsck.c +++ b/ostree/ot-builtin-fsck.c @@ -35,10 +35,11 @@ static GOptionEntry options[] = { typedef struct { guint n_objects; -} HtFsckData; + gboolean had_error; +} OtFsckData; static gboolean -checksum_packed_file (HtFsckData *data, +checksum_packed_file (OtFsckData *data, const char *path, GChecksum **out_checksum, GError **error) @@ -111,7 +112,6 @@ checksum_packed_file (HtFsckData *data, g_variant_unref (xattrs); return ret; } - static void object_iter_callback (OstreeRepo *repo, @@ -119,7 +119,7 @@ object_iter_callback (OstreeRepo *repo, GFileInfo *file_info, gpointer user_data) { - HtFsckData *data = user_data; + OtFsckData *data = user_data; struct stat stbuf; GChecksum *checksum = NULL; GError *error = NULL; @@ -169,6 +169,7 @@ object_iter_callback (OstreeRepo *repo, if (strcmp (checksum_string, g_checksum_get_string (checksum)) != 0) { + data->had_error = TRUE; g_printerr ("ERROR: corrupted object '%s' expected checksum: %s\n", path, g_checksum_get_string (checksum)); } @@ -193,7 +194,7 @@ gboolean ostree_builtin_fsck (int argc, char **argv, const char *repo_path, GError **error) { GOptionContext *context; - HtFsckData data; + OtFsckData data; gboolean ret = FALSE; OstreeRepo *repo = NULL; @@ -204,6 +205,7 @@ ostree_builtin_fsck (int argc, char **argv, const char *repo_path, GError **erro goto out; data.n_objects = 0; + data.had_error = FALSE; repo = ostree_repo_new (repo_path); if (!ostree_repo_check (repo, error)) @@ -212,6 +214,12 @@ ostree_builtin_fsck (int argc, char **argv, const char *repo_path, GError **erro if (!ostree_repo_iter_objects (repo, object_iter_callback, &data, error)) goto out; + if (data.had_error) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Encountered filesystem consistency errors"); + goto out; + } if (!quiet) g_printerr ("Total Objects: %u\n", data.n_objects); diff --git a/tests/t0005-corruption.sh b/tests/t0005-corruption.sh new file mode 100755 index 00000000..afd5086c --- /dev/null +++ b/tests/t0005-corruption.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# +# Copyright (C) 2011 Colin Walters +# +# This program 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 2 of the License, or +# (at your option) any later version. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Author: Colin Walters + +set -e + +echo "1..1" + +. libtest.sh + +setup_test_repository "regular" +$OSTREE checkout test2 checkout-test2 +cd checkout-test2 +chmod o+x firstfile +$OSTREE fsck -q 2>/dev/null && (echo 1>&2 "fsck unexpectedly succeeded"; exit 1) +chmod o-x firstfile +$OSTREE fsck -q + +echo "ok chmod" diff --git a/tests/t0005-pull.sh b/tests/t0010-pull.sh similarity index 100% rename from tests/t0005-pull.sh rename to tests/t0010-pull.sh