vserver-visitdir.hc (1518B)
1 // $Id$ --*- 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 }