|
Lines 9-23
Link Here
|
| 9 |
|
9 |
|
| 10 |
#ifdef APPLET_qcheck |
10 |
#ifdef APPLET_qcheck |
| 11 |
|
11 |
|
| 12 |
#define QCHECK_FLAGS "au" COMMON_FLAGS |
12 |
#define QCHECK_FLAGS "auAHT" COMMON_FLAGS |
| 13 |
static struct option const qcheck_long_opts[] = { |
13 |
static struct option const qcheck_long_opts[] = { |
| 14 |
{"all", no_argument, NULL, 'a'}, |
14 |
{"all", no_argument, NULL, 'a'}, |
| 15 |
{"update", no_argument, NULL, 'u'}, |
15 |
{"update", no_argument, NULL, 'u'}, |
|
|
16 |
{"noafk", no_argument, NULL, 'A'}, |
| 17 |
{"nohash", no_argument, NULL, 'H'}, |
| 18 |
{"nomtime", no_argument, NULL, 'T'}, |
| 16 |
COMMON_LONG_OPTS |
19 |
COMMON_LONG_OPTS |
| 17 |
}; |
20 |
}; |
| 18 |
static const char *qcheck_opts_help[] = { |
21 |
static const char *qcheck_opts_help[] = { |
| 19 |
"List all packages", |
22 |
"List all packages", |
| 20 |
"Update chksum and mtimes for packages", |
23 |
"Update missing files, chksum and mtimes for packages", |
|
|
24 |
"Ignore missing files", |
| 25 |
"Ignore differing/unknown file chksums", |
| 26 |
"Ignore differing file mtimes", |
| 21 |
COMMON_OPTS_HELP |
27 |
COMMON_OPTS_HELP |
| 22 |
}; |
28 |
}; |
| 23 |
static const char qcheck_rcsid[] = "$Id: qcheck.c,v 1.31 2006/12/25 22:30:22 vapier Exp $"; |
29 |
static const char qcheck_rcsid[] = "$Id: qcheck.c,v 1.31 2006/12/25 22:30:22 vapier Exp $"; |
|
Lines 31-38
Link Here
|
| 31 |
struct dirent *dentry, *de; |
37 |
struct dirent *dentry, *de; |
| 32 |
char search_all = 0; |
38 |
char search_all = 0; |
| 33 |
char qc_update = 0; |
39 |
char qc_update = 0; |
|
|
40 |
char chk_afk = 1; |
| 41 |
char chk_hash = 1; |
| 42 |
char chk_mtime = 1; |
| 34 |
struct stat st; |
43 |
struct stat st; |
| 35 |
size_t num_files, num_files_ok, num_files_unknown; |
44 |
size_t num_files, num_files_ok, num_files_unknown, num_files_ignored = 0; |
| 36 |
char buf[_Q_PATH_MAX], filename[_Q_PATH_MAX]; |
45 |
char buf[_Q_PATH_MAX], filename[_Q_PATH_MAX]; |
| 37 |
char buffer[_Q_PATH_MAX]; |
46 |
char buffer[_Q_PATH_MAX]; |
| 38 |
|
47 |
|
|
Lines 44-49
Link Here
|
| 44 |
COMMON_GETOPTS_CASES(qcheck) |
53 |
COMMON_GETOPTS_CASES(qcheck) |
| 45 |
case 'a': search_all = 1; break; |
54 |
case 'a': search_all = 1; break; |
| 46 |
case 'u': qc_update = 1; break; |
55 |
case 'u': qc_update = 1; break; |
|
|
56 |
case 'A': chk_afk = 0; break; |
| 57 |
case 'H': chk_hash = 0; break; |
| 58 |
case 'T': chk_mtime = 0; break; |
| 47 |
} |
59 |
} |
| 48 |
} |
60 |
} |
| 49 |
if ((argc == optind) && !search_all) |
61 |
if ((argc == optind) && !search_all) |
|
Lines 117-123
Link Here
|
| 117 |
++num_files; |
129 |
++num_files; |
| 118 |
if (lstat(e->name, &st)) { |
130 |
if (lstat(e->name, &st)) { |
| 119 |
/* make sure file exists */ |
131 |
/* make sure file exists */ |
| 120 |
printf(" %sAFK%s: %s\n", RED, NORM, e->name); |
132 |
if (chk_afk) { |
|
|
133 |
printf(" %sAFK%s: %s\n", RED, NORM, e->name); |
| 134 |
} else { |
| 135 |
--num_files; |
| 136 |
++num_files_ignored; |
| 137 |
if (qc_update) |
| 138 |
fputs(buffer, fpx); |
| 139 |
} |
| 121 |
continue; |
140 |
continue; |
| 122 |
} |
141 |
} |
| 123 |
if (e->digest && S_ISREG(st.st_mode)) { |
142 |
if (e->digest && S_ISREG(st.st_mode)) { |
|
Lines 130-137
Link Here
|
| 130 |
default: hash_algo = 0; break; |
149 |
default: hash_algo = 0; break; |
| 131 |
} |
150 |
} |
| 132 |
if (!hash_algo) { |
151 |
if (!hash_algo) { |
| 133 |
printf(" %sUNKNOWN DIGEST%s: '%s' for '%s'\n", RED, NORM, e->digest, e->name); |
152 |
if (chk_hash) { |
| 134 |
++num_files_unknown; |
153 |
printf(" %sUNKNOWN DIGEST%s: '%s' for '%s'\n", RED, NORM, e->digest, e->name); |
|
|
154 |
++num_files_unknown; |
| 155 |
} else { |
| 156 |
--num_files; |
| 157 |
++num_files_ignored; |
| 158 |
if (qc_update) |
| 159 |
fputs(buffer, fpx); |
| 160 |
} |
| 135 |
continue; |
161 |
continue; |
| 136 |
} |
162 |
} |
| 137 |
hashed_file = (char*)hash_file(e->name, hash_algo); |
163 |
hashed_file = (char*)hash_file(e->name, hash_algo); |
|
Lines 143-194
Link Here
|
| 143 |
} |
169 |
} |
| 144 |
printf(" %sPERM %4o%s: %s\n", RED, (st.st_mode & 07777), NORM, e->name); |
170 |
printf(" %sPERM %4o%s: %s\n", RED, (st.st_mode & 07777), NORM, e->name); |
| 145 |
++num_files_unknown; |
171 |
++num_files_unknown; |
|
|
172 |
free(hashed_file); |
| 146 |
continue; |
173 |
continue; |
| 147 |
} else if (strcmp(e->digest, hashed_file)) { |
174 |
} else if (strcmp(e->digest, hashed_file)) { |
| 148 |
const char *digest_disp; |
175 |
if (chk_hash) { |
| 149 |
if (qc_update) { |
176 |
const char *digest_disp; |
| 150 |
fprintf(fpx, "obj %s %s %lu\n", e->name, hashed_file, st.st_mtime); |
177 |
if (qc_update) { |
| 151 |
if (!verbose) |
178 |
fprintf(fpx, "obj %s %s %lu\n", e->name, hashed_file, st.st_mtime); |
| 152 |
goto free_and_more_hash; |
179 |
} |
|
|
180 |
switch (hash_algo) { |
| 181 |
case HASH_MD5: digest_disp = "MD5"; break; |
| 182 |
case HASH_SHA1: digest_disp = "SHA1"; break; |
| 183 |
default: digest_disp = "UNK"; break; |
| 184 |
} |
| 185 |
printf(" %s%s-DIGEST%s: %s", RED, digest_disp, NORM, e->name); |
| 186 |
if (verbose) |
| 187 |
printf(" (recorded '%s' != actual '%s')", e->digest, hashed_file); |
| 188 |
printf("\n"); |
| 189 |
} else { |
| 190 |
--num_files; |
| 191 |
++num_files_ignored; |
| 192 |
if (qc_update) |
| 193 |
fputs(buffer, fpx); |
| 153 |
} |
194 |
} |
| 154 |
switch (hash_algo) { |
|
|
| 155 |
case HASH_MD5: digest_disp = "MD5"; break; |
| 156 |
case HASH_SHA1: digest_disp = "SHA1"; break; |
| 157 |
default: digest_disp = "UNK"; break; |
| 158 |
} |
| 159 |
printf(" %s%s-DIGEST%s: %s", RED, digest_disp, NORM, e->name); |
| 160 |
if (verbose) |
| 161 |
printf(" (recorded '%s' != actual '%s')", e->digest, hashed_file); |
| 162 |
printf("\n"); |
| 163 |
free_and_more_hash: |
| 164 |
free(hashed_file); |
195 |
free(hashed_file); |
| 165 |
continue; |
196 |
continue; |
| 166 |
} else if (e->mtime && e->mtime != st.st_mtime) { |
197 |
} else if (e->mtime && e->mtime != st.st_mtime) { |
|
|
198 |
if (chk_mtime) { |
| 199 |
printf(" %sMTIME%s: %s", RED, NORM, e->name); |
| 200 |
if (verbose) |
| 201 |
printf(" (recorded '%lu' != actual '%lu')", e->mtime, (unsigned long)st.st_mtime); |
| 202 |
printf("\n"); |
| 203 |
|
| 204 |
/* This can only be an obj, dir and sym have no digest */ |
| 205 |
if (qc_update) |
| 206 |
fprintf(fpx, "obj %s %s %lu\n", e->name, e->digest, st.st_mtime); |
| 207 |
} else { |
| 208 |
--num_files; |
| 209 |
++num_files_ignored; |
| 210 |
if (qc_update) |
| 211 |
fputs(buffer, fpx); |
| 212 |
} |
| 213 |
free(hashed_file); |
| 214 |
continue; |
| 215 |
} else { |
| 216 |
if (qc_update) |
| 217 |
fputs(buffer, fpx); |
| 218 |
free(hashed_file); |
| 219 |
} |
| 220 |
} else if (e->mtime && e->mtime != st.st_mtime) { |
| 221 |
if (chk_mtime) { |
| 167 |
printf(" %sMTIME%s: %s", RED, NORM, e->name); |
222 |
printf(" %sMTIME%s: %s", RED, NORM, e->name); |
| 168 |
if (verbose) |
223 |
if (verbose) |
| 169 |
printf(" (recorded '%lu' != actual '%lu')", e->mtime, (unsigned long)st.st_mtime); |
224 |
printf(" (recorded '%lu' != actual '%lu')", e->mtime, (unsigned long)st.st_mtime); |
| 170 |
printf("\n"); |
225 |
printf("\n"); |
| 171 |
|
226 |
|
| 172 |
/* This can only be an obj, dir and sym have no digest */ |
227 |
/* This can only be a sym */ |
| 173 |
if (qc_update) |
228 |
if (qc_update) |
| 174 |
fprintf(fpx, "obj %s %s %lu\n", e->name, e->digest, st.st_mtime); |
229 |
fprintf(fpx, "sym %s -> %s %lu\n", e->name, e->sym_target, st.st_mtime); |
| 175 |
|
|
|
| 176 |
continue; |
| 177 |
} else { |
230 |
} else { |
|
|
231 |
--num_files; |
| 232 |
++num_files_ignored; |
| 178 |
if (qc_update) |
233 |
if (qc_update) |
| 179 |
fputs(buffer, fpx); |
234 |
fputs(buffer, fpx); |
| 180 |
free(hashed_file); |
|
|
| 181 |
} |
235 |
} |
| 182 |
} else if (e->mtime && e->mtime != st.st_mtime) { |
|
|
| 183 |
printf(" %sMTIME%s: %s", RED, NORM, e->name); |
| 184 |
if (verbose) |
| 185 |
printf(" (recorded '%lu' != actual '%lu')", e->mtime, (unsigned long)st.st_mtime); |
| 186 |
printf("\n"); |
| 187 |
|
| 188 |
/* This can only be a sym */ |
| 189 |
if (qc_update) |
| 190 |
fprintf(fpx, "sym %s -> %s %lu\n", e->name, e->sym_target, st.st_mtime); |
| 191 |
|
| 192 |
continue; |
236 |
continue; |
| 193 |
} else { |
237 |
} else { |
| 194 |
if (qc_update) |
238 |
if (qc_update) |
|
Lines 216-221
Link Here
|
| 216 |
printf(" %2$s*%1$s Unable to digest %3$s%4$lu%1$s file%5$s\n", |
260 |
printf(" %2$s*%1$s Unable to digest %3$s%4$lu%1$s file%5$s\n", |
| 217 |
NORM, BOLD, BLUE, (unsigned long)num_files_unknown, |
261 |
NORM, BOLD, BLUE, (unsigned long)num_files_unknown, |
| 218 |
(num_files_unknown > 1 ? "s" : "")); |
262 |
(num_files_unknown > 1 ? "s" : "")); |
|
|
263 |
if (num_files_ignored) |
| 264 |
printf(" %2$s*%1$s %3$s%4$lu%1$s file%5$s ignored\n", |
| 265 |
NORM, BOLD, BLUE, (unsigned long)num_files_ignored, |
| 266 |
(num_files_ignored > 1 ? "s were" : " was")); |
| 219 |
} |
267 |
} |
| 220 |
closedir(dirp); |
268 |
closedir(dirp); |
| 221 |
chdir(".."); |
269 |
chdir(".."); |