X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fvserver-visitdir.hc;fp=src%2Fvserver-visitdir.hc;h=f599f86be6bee9aa81a7a7e302ee2273e466dc38;hb=8cf13bb177d92c93eb73dc8939777150536c2d00;hp=0000000000000000000000000000000000000000;hpb=6bf3f95de36c804c97716b2d0bdf10680c559044;p=util-vserver.git diff --git a/src/vserver-visitdir.hc b/src/vserver-visitdir.hc new file mode 100644 index 0000000..f599f86 --- /dev/null +++ b/src/vserver-visitdir.hc @@ -0,0 +1,56 @@ +// $Id: vserver-visitdir.hc,v 1.1 2004/02/18 04:42:38 ensc Exp $ --*- c -*-- + +// Copyright (C) 2004 Enrico Scholz +// +// 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; version 2 of the License. +// +// 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. + + +static uint64_t +visitDirEntry(struct dirent const *ent); + +static uint64_t +visitDir(char const *name, struct stat const *expected_stat) +{ + int fd = Eopen(".", O_RDONLY, 0); + PathInfo old_state = global_info.state; + PathInfo rhs_path = { + .d = name, + .l = strlen(name) + }; + char new_path[ENSC_PI_APPSZ(global_info.state, rhs_path)]; + DIR * dir; + uint64_t res = 0; + + PathInfo_append(&global_info.state, &rhs_path, new_path); + + if (expected_stat!=0) + EsafeChdir(name, expected_stat); + + dir = Eopendir("."); + + for (;;) { + struct dirent *ent = Ereaddir(dir); + if (ent==0) break; + + res += visitDirEntry(ent); + } + + Eclosedir(dir); + + Efchdir(fd); + Eclose(fd); + + global_info.state = old_state; + return res; +}