core: Actually return an error from fsck

And add some tests that fsck reports an error.
This commit is contained in:
Colin Walters 2011-11-09 08:27:47 -05:00
parent fab085dcaf
commit 1d23e4b8e8
3 changed files with 48 additions and 5 deletions

View File

@ -35,10 +35,11 @@ static GOptionEntry options[] = {
typedef struct { typedef struct {
guint n_objects; guint n_objects;
} HtFsckData; gboolean had_error;
} OtFsckData;
static gboolean static gboolean
checksum_packed_file (HtFsckData *data, checksum_packed_file (OtFsckData *data,
const char *path, const char *path,
GChecksum **out_checksum, GChecksum **out_checksum,
GError **error) GError **error)
@ -112,14 +113,13 @@ checksum_packed_file (HtFsckData *data,
return ret; return ret;
} }
static void static void
object_iter_callback (OstreeRepo *repo, object_iter_callback (OstreeRepo *repo,
const char *path, const char *path,
GFileInfo *file_info, GFileInfo *file_info,
gpointer user_data) gpointer user_data)
{ {
HtFsckData *data = user_data; OtFsckData *data = user_data;
struct stat stbuf; struct stat stbuf;
GChecksum *checksum = NULL; GChecksum *checksum = NULL;
GError *error = NULL; GError *error = NULL;
@ -169,6 +169,7 @@ object_iter_callback (OstreeRepo *repo,
if (strcmp (checksum_string, g_checksum_get_string (checksum)) != 0) if (strcmp (checksum_string, g_checksum_get_string (checksum)) != 0)
{ {
data->had_error = TRUE;
g_printerr ("ERROR: corrupted object '%s' expected checksum: %s\n", g_printerr ("ERROR: corrupted object '%s' expected checksum: %s\n",
path, g_checksum_get_string (checksum)); path, g_checksum_get_string (checksum));
} }
@ -193,7 +194,7 @@ gboolean
ostree_builtin_fsck (int argc, char **argv, const char *repo_path, GError **error) ostree_builtin_fsck (int argc, char **argv, const char *repo_path, GError **error)
{ {
GOptionContext *context; GOptionContext *context;
HtFsckData data; OtFsckData data;
gboolean ret = FALSE; gboolean ret = FALSE;
OstreeRepo *repo = NULL; OstreeRepo *repo = NULL;
@ -204,6 +205,7 @@ ostree_builtin_fsck (int argc, char **argv, const char *repo_path, GError **erro
goto out; goto out;
data.n_objects = 0; data.n_objects = 0;
data.had_error = FALSE;
repo = ostree_repo_new (repo_path); repo = ostree_repo_new (repo_path);
if (!ostree_repo_check (repo, error)) 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)) if (!ostree_repo_iter_objects (repo, object_iter_callback, &data, error))
goto out; 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) if (!quiet)
g_printerr ("Total Objects: %u\n", data.n_objects); g_printerr ("Total Objects: %u\n", data.n_objects);

35
tests/t0005-corruption.sh Executable file
View File

@ -0,0 +1,35 @@
#!/bin/bash
#
# Copyright (C) 2011 Colin Walters <walters@verbum.org>
#
# 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 <walters@verbum.org>
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"