//
// aegis - project change supervisor
// Copyright (C) 1991-1995, 1997, 1999, 2002-2006, 2008, 2012 Peter Miller
//
// 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 3 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, see
// .
//
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void
dir_walk(string_ty *path, dir_walk_callback_ty callback, void *arg)
{
trace(("dir_walk(path = %p, callback = %p, arg = %p)\n{\n",
path, callback, arg));
assert(path);
trace_string(path->str_text);
assert(callback);
dir_functor_callback compatability(callback, arg);
dir_walk(nstring(path), compatability);
trace(("}\n"));
}
void
dir_walk(const nstring &path, dir_functor &doit)
{
trace(("dir_walk(path = \"%s\", doit = %p)\n{\n", path.c_str(),
&doit));
assert(!path.empty());
struct stat st;
#if defined(S_IFLNK) || defined(S_ISLNK)
if (glue_lstat(path.c_str(), &st))
{
int errno_old = errno;
sub_context_ty sc;
sc.errno_setx(errno_old);
sc.var_set_string("File_Name", path);
sc.fatal_intl(i18n("lstat $filename: $errno"));
// NOTREACHED
}
#else
if (glue_stat(path.c_str(), &st))
{
int errno_old = errno;
sub_context_ty sc;
sc.errno_setx(errno_old);
sc.var_set_string("File_Name", path);
sc.fatal_intl(i18n("stat $filename: $errno"));
// NOTREACHED
}
#endif
switch (st.st_mode & S_IFMT)
{
case S_IFDIR:
{
doit(dir_functor::msg_dir_before, path, st);
nstring_list wl;
if (read_whole_dir__wl(path, wl))
{
int errno_old = errno;
sub_context_ty sc;
sc.errno_setx(errno_old);
sc.var_set_string("File_Name", path);
sc.fatal_intl(i18n("read $filename: $errno"));
// NOTREACHED
}
for (size_t j = 0; j < wl.size(); ++j)
{
nstring s = os_path_join(path, wl[j]);
dir_walk(s, doit);
}
doit(dir_functor::msg_dir_after, path, st);
}
break;
case S_IFREG:
doit(dir_functor::msg_file, path, st);
break;
#if defined(S_IFLNK) || defined(S_ISLNK)
case S_IFLNK:
doit(dir_functor::msg_symlink, path, st);
break;
#endif
default:
doit(dir_functor::msg_special, path, st);
break;
}
trace(("}\n"));
}
// vim: set ts=8 sw=4 et :