merge with 0.30.213
[util-vserver.git] / src / vserver-visitdir.hc
1 // $Id: vserver-visitdir.hc 934 2004-02-18 04:42:38Z ensc $    --*- c -*--
2
3 // Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
4 //  
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; version 2 of the License.
8 //  
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //  
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
18
19 static uint64_t
20 visitDirEntry(struct dirent const *ent);
21
22 static uint64_t
23 visitDir(char const *name, struct stat const *expected_stat)
24 {
25   int           fd = Eopen(".", O_RDONLY, 0);
26   PathInfo      old_state = global_info.state;
27   PathInfo      rhs_path = {
28     .d = name,
29     .l = strlen(name)
30   };
31   char          new_path[ENSC_PI_APPSZ(global_info.state, rhs_path)];
32   DIR *         dir;
33   uint64_t      res = 0;
34
35   PathInfo_append(&global_info.state, &rhs_path, new_path);
36
37   if (expected_stat!=0)
38     EsafeChdir(name, expected_stat);
39   
40   dir = Eopendir(".");
41
42   for (;;) {
43     struct dirent               *ent = Ereaddir(dir);
44     if (ent==0) break;
45
46     res += visitDirEntry(ent);
47   }
48
49   Eclosedir(dir);
50
51   Efchdir(fd);
52   Eclose(fd);
53
54   global_info.state = old_state;
55   return res;
56 }