blob: 05758ce2b554d00839514751b2669e1b7b9b7505 [file] [log] [blame]
/****************************************************************************
| (C) Copyright 2008 Novell, Inc. All Rights Reserved.
|
| GPLv2: This program is free software; you can redistribute it
| and/or modify it under the terms of version 2 of the GNU General
| Public License as published by the Free Software Foundation.
|
| 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.
+-------------------------------------------------------------------------*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <style.h>
#include <mystdlib.h>
#include <puny.h>
/*
* turning on htrees: tune2fs -O dir_index /dev/what_ever_device
*/
enum { MAX_NAME = 20 };
char *gen_name (void)
{
static char file_name_char[] = "abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"_0123456789";
static char name[MAX_NAME + 2];
char *c;
unsigned len;
len = MAX_NAME;
for (c = name; len; c++, len--) {
*c = file_name_char[urand(sizeof(file_name_char) - 1)];
}
*c = '\0';
return name;
}
void build_dir (int n)
{
int i;
int fd;
char *name;
for (i = 0; i < n; i++) {
name = gen_name();
fd = open(gen_name(), O_RDWR | O_CREAT, 0666);
if (fd == -1) {
perror(name);
} else {
close(fd);
}
}
}
void tst_telldir (void)
{
struct dirent *de;
struct dirent old_de;
DIR *dir;
off_t offset;
off_t old_offset;
old_offset = 0;
dir = opendir(".");
if (!dir) {
perror("\".\"");
}
for (;;) {
de = readdir(dir);
if (!de) break;
offset = telldir(dir);
if (offset == old_offset) {
#ifdef __APPLE__
printf("%llx %llx %s\n",
(u64)old_de.d_seekoff, (u64)offset,
old_de.d_name);
printf("%llx %llx %s\n\n",
(u64)de->d_seekoff, (u64)offset, de->d_name);
#else
printf("%llx %llx %s\n",
(u64)old_de.d_off, (u64)offset,
old_de.d_name);
printf("%llx %llx %s\n\n",
(u64)de->d_off, (u64)offset, de->d_name);
#endif
}
old_offset = offset;
old_de = *de;
}
closedir(dir);
}
int main (int argc, char *argv[])
{
char *dir;
int rc;
punyopt(argc, argv, NULL, NULL);
dir = Option.dir;
rc = chdir(dir);
if (rc) {
perror(dir);
exit(2);
}
build_dir(300000);
tst_telldir();
return 0;
}