On Thu, 27 Apr 2006, Peter Hagervall wrote: > > > > To avoid appending the filename to the path before each lstat() I'd > > guess. > > Yes, that's pretty much the reason. It's a bad reason, though. For one thing, it just doesn't work. You'll have to chdir() back, and you can't use ".." in case the user has set up some symlink thing. So you end up doing other really strange things. You can do this much more efficiently with something like this: const char *obj = git_object_directory(); int len = strlen(obj); char *dir = malloc(len + 300); memcpy(dir, obj, len); if (len && obj[len-1] != '/') dir[len++] = '/'; dir[len+2] = 0; for (i = 0; i < 16; i++) { dir[len] = hexdigit[i]; for (j = 0; j < 16; j+) { dir[len+1] = hexdigit[j]; dir[len+2] = 0; DIR *d = opendir(dir); if (!d) continue; nr += count(d, dir, len+2); closedir(d); } } where the "count()" function just ends up doing something like int count(DIR *d, const char *prefix, int len) { int nr = 0; struct dirent *de; prefix[len++] = '/'; while ((de = readdir(d)) != NULL) { int fd; if (de->d_name[0] == '.') continue; strcpy(prefix + len, de->d_name); fd = open(prefix, O_RDONLY); .. check if it's ok, perhaps.. ? if (ok) nr++; close(fd); } return nr; } and you're done. Efficient, and it's easy to add the endign to the pathname, because you're passing in a buffer that is big enough, and you're telling people where they should put their suffixes.. And no, the above has never been compiled or tested, and I wrote it with one eye closed, while drinking heavily and experimenting with some funky 'shrooms. So caveat emptor. Linus - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html