1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
  
29
  
30
  
31
  
32
  
33
  
34
  
35
  
36
  
37
  
38
  
39
  
40
  
41
  
42
  
43
  
44
  
45
  
46
  
47
  
48
  
49
  
50
  
51
  
52
  
53
  
54
  
55
  
56
  
57
  
58
  
59
  
60
  
61
  
62
  
63
  
64
  
65
  
66
  
67
  
68
  
69
  
70
  
71
  
72
  
73
  
74
  
75
  
76
  
77
  
78
  
79
  
80
  
81
  
82
  
83
  
84
  
85
  
86
  
87
  
88
  
89
  
90
  
91
  
92
  
93
  
94
  
95
  
96
  
97
  
98
  
99
  
100
  
101
  
102
  
103
  
104
  
105
  
106
  
107
  
108
  
109
  
110
  
111
  
112
  
113
  
114
  
115
  
116
  
117
  
118
  
119
  
120
  
121
  
122
  
123
  
124
  
125
  
126
  
127
  
128
  
#!/usr/local/bin/pike 
 
object(Roxen.QuotaDB) quota_db; 
 
int du(string dir) 
{ 
  array(string) files = get_dir(dir); 
  int total; 
 
  foreach((files || ({})) - ({ ".", ".." }), string file) { 
    string path = dir + "/" + file; 
 
    mixed st = file_stat(path); 
    if (st) { 
      if (st[1] == -2) { 
        // Recurse 
        total += du(path); 
      } else if (st[1] >= 0) { 
        // Ordinary file 
        total += st[1]; 
      } else { 
        werror(sprintf("%O is not an ordinary file!\n", path)); 
      } 
    } else { 
      // Probably not reached. 
    } 
  } 
 
  werror(sprintf("du(%O) => %d\n", dir, total)); 
 
  return(total); 
} 
 
void fixdir(string dir) 
{ 
  int usage = du(dir); 
 
  object q = quota_db->lookup(dir); 
  q->set_usage(dir, usage); 
} 
 
int main(int argc, array(string) argv) 
{ 
  int create_new = 0; 
 
  array args = Getopt.find_all_options(argv, ({ 
    ({ "version", Getopt.NO_ARG, ({ "-v", "--version" }) }), 
    ({ "help", Getopt.NO_ARG, ({ "-h", "--help" }) }), 
    ({ "create", Getopt.NO_ARG, ({ "-c", "--create" }) }), 
  }), 1); 
 
  foreach(args, array arg) { 
    switch(arg[0]) { 
    case "create": 
      create_new = 1; 
      break; 
    case "help": 
      write(sprintf("Usage:\n" 
                    "\t%s [options] quotafile\n" 
                    "Options:\n" 
                    "\t-c, --create   Create database.\n" 
                    "\t-h, --help     Show usage information.\n" 
                    "\t-v, --version  Show version information.\n", 
                    argv[0])); 
      exit(0); 
      break; 
    case "version": 
      werror("$Id: fixquota.pike,v 1.2 2000/08/28 05:31:52 per Exp $\n"); 
      exit(0); 
      break; 
    } 
  } 
 
  argv = Getopt.get_args(argv, 1); 
 
  if (sizeof(argv) < 2) { 
    werror(sprintf("Too few arguments to %s\n", argv[0])); 
    exit(1); 
  } else if (sizeof(argv) > 2) { 
    werror(sprintf("Too many arguments to %s\n", argv[0])); 
    exit(1); 
  } 
 
  quota_db = Roxen.QuotaDB(argv[1], create_new); 
 
  string input = ""; 
  string in; 
 
  do { 
    in = Stdio.stdin->read(1024); 
 
    if (!sizeof(in)) { 
      if (sizeof(input) && (input[-1] != '\n')) { 
        input += "\n"; 
      } 
    } else { 
      input += in; 
      if (search(in, "\n") == -1) { 
        continue; 
      } 
    } 
 
    array a = input/"\n"; 
 
    input = a[-1]; 
    foreach(a[..sizeof(a)-2], string dir) { 
      fixdir(dir); 
    } 
  } while(sizeof(in)); 
 
  werror("Done. Rebuilding index...\n"); 
 
  werror(sprintf("Before:\n" 
                 "index:%O\n" 
                 "index_acc:%O\n", 
                 quota_db->index, 
                 quota_db->index_acc)); 
 
  quota_db->rebuild_index(); 
 
  werror(sprintf("After:\n" 
                 "index:%O\n", 
                 quota_db->index)); 
 
  exit(0); 
}