1 1.52 gutterid /* $NetBSD: cksum.c,v 1.52 2022/06/25 02:22:42 gutteridge Exp $ */ 2 1.6 glass 3 1.1 cgd /*- 4 1.3 cgd * Copyright (c) 1991, 1993 5 1.3 cgd * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * This code is derived from software contributed to Berkeley by 8 1.3 cgd * James W. Williams of NASA Goddard Space Flight Center. 9 1.1 cgd * 10 1.1 cgd * Redistribution and use in source and binary forms, with or without 11 1.1 cgd * modification, are permitted provided that the following conditions 12 1.1 cgd * are met: 13 1.1 cgd * 1. Redistributions of source code must retain the above copyright 14 1.1 cgd * notice, this list of conditions and the following disclaimer. 15 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 cgd * notice, this list of conditions and the following disclaimer in the 17 1.1 cgd * documentation and/or other materials provided with the distribution. 18 1.18 agc * 3. Neither the name of the University nor the names of its contributors 19 1.18 agc * may be used to endorse or promote products derived from this software 20 1.18 agc * without specific prior written permission. 21 1.18 agc * 22 1.18 agc * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 1.18 agc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 1.18 agc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 1.18 agc * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 1.18 agc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 1.18 agc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 1.18 agc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 1.18 agc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 1.18 agc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 1.18 agc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 1.18 agc * SUCH DAMAGE. 33 1.18 agc */ 34 1.18 agc 35 1.18 agc /*- 36 1.18 agc * Copyright (c) 1997 Jason R. Thorpe. All rights reserved. 37 1.18 agc * 38 1.18 agc * This code is derived from software contributed to Berkeley by 39 1.18 agc * James W. Williams of NASA Goddard Space Flight Center. 40 1.18 agc * 41 1.18 agc * Redistribution and use in source and binary forms, with or without 42 1.18 agc * modification, are permitted provided that the following conditions 43 1.18 agc * are met: 44 1.18 agc * 1. Redistributions of source code must retain the above copyright 45 1.18 agc * notice, this list of conditions and the following disclaimer. 46 1.18 agc * 2. Redistributions in binary form must reproduce the above copyright 47 1.18 agc * notice, this list of conditions and the following disclaimer in the 48 1.18 agc * documentation and/or other materials provided with the distribution. 49 1.1 cgd * 3. All advertising materials mentioning features or use of this software 50 1.1 cgd * must display the following acknowledgement: 51 1.1 cgd * This product includes software developed by the University of 52 1.1 cgd * California, Berkeley and its contributors. 53 1.1 cgd * 4. Neither the name of the University nor the names of its contributors 54 1.1 cgd * may be used to endorse or promote products derived from this software 55 1.1 cgd * without specific prior written permission. 56 1.1 cgd * 57 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 58 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 59 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 60 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 61 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 62 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 63 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 64 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 65 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 66 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 67 1.1 cgd * SUCH DAMAGE. 68 1.1 cgd */ 69 1.1 cgd 70 1.20 jmc #if HAVE_NBTOOL_CONFIG_H 71 1.20 jmc #include "nbtool_config.h" 72 1.20 jmc #endif 73 1.20 jmc 74 1.10 lukem #include <sys/cdefs.h> 75 1.16 bjh21 #if defined(__COPYRIGHT) && !defined(lint) 76 1.42 lukem __COPYRIGHT("@(#) Copyright (c) 1991, 1993\ 77 1.42 lukem The Regents of the University of California. All rights reserved."); 78 1.1 cgd #endif /* not lint */ 79 1.1 cgd 80 1.16 bjh21 #if defined(__RCSID) && !defined(lint) 81 1.6 glass #if 0 82 1.7 jtc static char sccsid[] = "@(#)cksum.c 8.2 (Berkeley) 4/28/95"; 83 1.6 glass #endif 84 1.52 gutterid __RCSID("$NetBSD: cksum.c,v 1.52 2022/06/25 02:22:42 gutteridge Exp $"); 85 1.1 cgd #endif /* not lint */ 86 1.1 cgd 87 1.1 cgd #include <sys/types.h> 88 1.5 mycroft 89 1.37 hubertf #include <ctype.h> 90 1.5 mycroft #include <err.h> 91 1.5 mycroft #include <errno.h> 92 1.1 cgd #include <fcntl.h> 93 1.9 kleink #include <locale.h> 94 1.44 lukem #include <md2.h> 95 1.44 lukem #include <md4.h> 96 1.8 thorpej #include <md5.h> 97 1.44 lukem #include <rmd160.h> 98 1.13 atatat #include <sha1.h> 99 1.40 christos #include <sha2.h> 100 1.1 cgd #include <stdio.h> 101 1.1 cgd #include <stdlib.h> 102 1.1 cgd #include <string.h> 103 1.5 mycroft #include <unistd.h> 104 1.5 mycroft 105 1.1 cgd #include "extern.h" 106 1.1 cgd 107 1.47 christos #define PRINT_NORMAL 0x01 108 1.47 christos #define PRINT_QUIET 0x02 109 1.47 christos 110 1.13 atatat typedef char *(*_filefunc)(const char *, char *); 111 1.13 atatat 112 1.43 lukem const struct hash { 113 1.13 atatat const char *progname; 114 1.13 atatat const char *hashname; 115 1.13 atatat void (*stringfunc)(const char *); 116 1.13 atatat void (*timetrialfunc)(void); 117 1.13 atatat void (*testsuitefunc)(void); 118 1.13 atatat void (*filterfunc)(int); 119 1.13 atatat char *(*filefunc)(const char *, char *); 120 1.13 atatat } hashes[] = { 121 1.13 atatat { "md2", "MD2", 122 1.13 atatat MD2String, MD2TimeTrial, MD2TestSuite, 123 1.13 atatat MD2Filter, MD2File }, 124 1.13 atatat { "md4", "MD4", 125 1.13 atatat MD4String, MD4TimeTrial, MD4TestSuite, 126 1.13 atatat MD4Filter, MD4File }, 127 1.13 atatat { "md5", "MD5", 128 1.13 atatat MD5String, MD5TimeTrial, MD5TestSuite, 129 1.13 atatat MD5Filter, MD5File }, 130 1.44 lukem { "rmd160", "RMD160", 131 1.44 lukem RMD160String, RMD160TimeTrial, RMD160TestSuite, 132 1.44 lukem RMD160Filter, (_filefunc) RMD160File }, 133 1.13 atatat { "sha1", "SHA1", 134 1.13 atatat SHA1String, SHA1TimeTrial, SHA1TestSuite, 135 1.13 atatat SHA1Filter, (_filefunc) SHA1File }, 136 1.27 elad { "sha256", "SHA256", 137 1.27 elad SHA256_String, SHA256_TimeTrial, SHA256_TestSuite, 138 1.27 elad SHA256_Filter, (_filefunc) SHA256_File }, 139 1.27 elad { "sha384", "SHA384", 140 1.27 elad SHA384_String, SHA384_TimeTrial, SHA384_TestSuite, 141 1.27 elad SHA384_Filter, (_filefunc) SHA384_File }, 142 1.27 elad { "sha512", "SHA512", 143 1.27 elad SHA512_String, SHA512_TimeTrial, SHA512_TestSuite, 144 1.27 elad SHA512_Filter, (_filefunc) SHA512_File }, 145 1.39 christos { .progname = NULL, }, 146 1.13 atatat }; 147 1.13 atatat 148 1.45 joerg static int hash_digest_file(char *, const struct hash *, int); 149 1.45 joerg __dead static void requirehash(const char *); 150 1.45 joerg __dead static void usage(void); 151 1.3 cgd 152 1.3 cgd int 153 1.22 xtraeme main(int argc, char **argv) 154 1.1 cgd { 155 1.46 christos int ch, fd, rval, pflag, nohashstdin; 156 1.49 cheusov uint32_t val; 157 1.19 kleink off_t len; 158 1.1 cgd char *fn; 159 1.13 atatat const char *progname; 160 1.49 cheusov int (*cfncn) (int, uint32_t *, off_t *); 161 1.49 cheusov void (*pfncn) (char *, uint32_t, off_t); 162 1.43 lukem const struct hash *hash; 163 1.47 christos int i, check_warn, do_check; 164 1.47 christos int print_flags; 165 1.1 cgd 166 1.10 lukem cfncn = NULL; 167 1.10 lukem pfncn = NULL; 168 1.46 christos pflag = nohashstdin = 0; 169 1.33 hubertf check_warn = 0; 170 1.35 hubertf do_check = 0; 171 1.47 christos print_flags = 0; 172 1.9 kleink 173 1.9 kleink setlocale(LC_ALL, ""); 174 1.8 thorpej 175 1.13 atatat progname = getprogname(); 176 1.13 atatat 177 1.13 atatat for (hash = hashes; hash->hashname != NULL; hash++) 178 1.13 atatat if (strcmp(progname, hash->progname) == 0) 179 1.13 atatat break; 180 1.13 atatat 181 1.13 atatat if (hash->hashname == NULL) { 182 1.13 atatat hash = NULL; 183 1.13 atatat 184 1.13 atatat if (!strcmp(progname, "sum")) { 185 1.13 atatat cfncn = csum1; 186 1.13 atatat pfncn = psum1; 187 1.13 atatat } else { 188 1.15 atatat cfncn = crc; 189 1.13 atatat pfncn = pcrc; 190 1.13 atatat } 191 1.5 mycroft } 192 1.5 mycroft 193 1.47 christos while ((ch = getopt(argc, argv, "a:cno:pqs:twx")) != -1) 194 1.1 cgd switch(ch) { 195 1.25 elad case 'a': 196 1.44 lukem if (hash) { 197 1.48 christos warnx("illegal use of -a option"); 198 1.25 elad usage(); 199 1.25 elad } 200 1.25 elad i = 0; 201 1.25 elad while (hashes[i].hashname != NULL) { 202 1.25 elad if (!strcasecmp(hashes[i].hashname, optarg)) { 203 1.25 elad hash = &hashes[i]; 204 1.25 elad break; 205 1.25 elad } 206 1.25 elad i++; 207 1.25 elad } 208 1.25 elad if (hash == NULL) { 209 1.25 elad if (!strcasecmp(optarg, "old1")) { 210 1.25 elad cfncn = csum1; 211 1.25 elad pfncn = psum1; 212 1.25 elad } else if (!strcasecmp(optarg, "old2")) { 213 1.25 elad cfncn = csum2; 214 1.25 elad pfncn = psum2; 215 1.25 elad } else if (!strcasecmp(optarg, "crc")) { 216 1.25 elad cfncn = crc; 217 1.25 elad pfncn = pcrc; 218 1.25 elad } else { 219 1.25 elad warnx("illegal argument to -a option"); 220 1.25 elad usage(); 221 1.25 elad } 222 1.25 elad } 223 1.25 elad break; 224 1.33 hubertf case 'c': 225 1.35 hubertf do_check = 1; 226 1.33 hubertf break; 227 1.17 atatat case 'n': 228 1.47 christos print_flags |= PRINT_NORMAL; 229 1.17 atatat break; 230 1.1 cgd case 'o': 231 1.13 atatat if (hash) { 232 1.13 atatat warnx("%s mutually exclusive with sum", 233 1.13 atatat hash->hashname); 234 1.8 thorpej usage(); 235 1.8 thorpej } 236 1.5 mycroft if (!strcmp(optarg, "1")) { 237 1.1 cgd cfncn = csum1; 238 1.1 cgd pfncn = psum1; 239 1.5 mycroft } else if (!strcmp(optarg, "2")) { 240 1.1 cgd cfncn = csum2; 241 1.1 cgd pfncn = psum2; 242 1.1 cgd } else { 243 1.5 mycroft warnx("illegal argument to -o option"); 244 1.1 cgd usage(); 245 1.1 cgd } 246 1.1 cgd break; 247 1.8 thorpej case 'p': 248 1.13 atatat if (hash == NULL) 249 1.13 atatat requirehash("-p"); 250 1.8 thorpej pflag = 1; 251 1.8 thorpej break; 252 1.47 christos case 'q': 253 1.47 christos print_flags |= PRINT_QUIET; 254 1.47 christos break; 255 1.8 thorpej case 's': 256 1.13 atatat if (hash == NULL) 257 1.13 atatat requirehash("-s"); 258 1.13 atatat nohashstdin = 1; 259 1.13 atatat hash->stringfunc(optarg); 260 1.8 thorpej break; 261 1.8 thorpej case 't': 262 1.13 atatat if (hash == NULL) 263 1.13 atatat requirehash("-t"); 264 1.13 atatat nohashstdin = 1; 265 1.13 atatat hash->timetrialfunc(); 266 1.8 thorpej break; 267 1.33 hubertf case 'w': 268 1.33 hubertf check_warn = 1; 269 1.33 hubertf break; 270 1.8 thorpej case 'x': 271 1.13 atatat if (hash == NULL) 272 1.13 atatat requirehash("-x"); 273 1.13 atatat nohashstdin = 1; 274 1.13 atatat hash->testsuitefunc(); 275 1.8 thorpej break; 276 1.1 cgd case '?': 277 1.1 cgd default: 278 1.1 cgd usage(); 279 1.1 cgd } 280 1.1 cgd argc -= optind; 281 1.1 cgd argv += optind; 282 1.1 cgd 283 1.35 hubertf if (do_check) { 284 1.33 hubertf /* 285 1.33 hubertf * Verify checksums 286 1.33 hubertf */ 287 1.33 hubertf FILE *f; 288 1.33 hubertf char buf[BUFSIZ]; 289 1.33 hubertf char *s, *p_filename, *p_cksum; 290 1.33 hubertf int l_filename, l_cksum; 291 1.33 hubertf char filename[BUFSIZ]; 292 1.33 hubertf char cksum[BUFSIZ]; 293 1.33 hubertf int ok,cnt,badcnt; 294 1.33 hubertf 295 1.33 hubertf rval = 0; 296 1.33 hubertf cnt = badcnt = 0; 297 1.35 hubertf 298 1.35 hubertf if (argc == 0) { 299 1.35 hubertf f = fdopen(STDIN_FILENO, "r"); 300 1.35 hubertf } else { 301 1.35 hubertf f = fopen(argv[0], "r"); 302 1.35 hubertf } 303 1.35 hubertf if (f == NULL) 304 1.35 hubertf err(1, "Cannot read %s", 305 1.35 hubertf argc>0?argv[0]:"stdin"); 306 1.51 rillig 307 1.33 hubertf while(fgets(buf, sizeof(buf), f) != NULL) { 308 1.48 christos s = strrchr(buf, '\n'); 309 1.33 hubertf if (s) 310 1.33 hubertf *s = '\0'; 311 1.33 hubertf 312 1.33 hubertf p_cksum = p_filename = NULL; 313 1.33 hubertf 314 1.33 hubertf p_filename = strchr(buf, '('); 315 1.33 hubertf if (p_filename) { 316 1.33 hubertf /* 317 1.33 hubertf * Assume 'normal' output if there's a '(' 318 1.33 hubertf */ 319 1.33 hubertf p_filename += 1; 320 1.47 christos print_flags &= ~(PRINT_NORMAL); 321 1.33 hubertf 322 1.33 hubertf p_cksum = strrchr(p_filename, ')'); 323 1.33 hubertf if (p_cksum == NULL) { 324 1.33 hubertf if (check_warn) 325 1.33 hubertf warnx("bogus format: %s. " 326 1.33 hubertf "Skipping...", 327 1.33 hubertf buf); 328 1.33 hubertf rval = 1; 329 1.33 hubertf continue; 330 1.33 hubertf } 331 1.33 hubertf p_cksum += 4; 332 1.33 hubertf 333 1.33 hubertf l_cksum = strlen(p_cksum); 334 1.33 hubertf l_filename = p_cksum - p_filename - 4; 335 1.51 rillig 336 1.34 hubertf /* Sanity check, and find proper hash if 337 1.34 hubertf * it's not the same as the current program 338 1.34 hubertf */ 339 1.34 hubertf if (hash == NULL || 340 1.34 hubertf strncmp(buf, hash->hashname, 341 1.33 hubertf strlen(hash->hashname)) != 0) { 342 1.34 hubertf /* 343 1.34 hubertf * Search proper hash 344 1.34 hubertf */ 345 1.43 lukem const struct hash *nhash; 346 1.51 rillig 347 1.34 hubertf for (nhash = hashes ; 348 1.34 hubertf nhash->hashname != NULL; 349 1.34 hubertf nhash++) 350 1.34 hubertf if (strncmp(buf, 351 1.34 hubertf nhash->hashname, 352 1.34 hubertf strlen(nhash->hashname)) == 0) 353 1.34 hubertf break; 354 1.51 rillig 355 1.51 rillig 356 1.34 hubertf if (nhash->hashname == NULL) { 357 1.34 hubertf if (check_warn) 358 1.34 hubertf warnx("unknown hash: %s", 359 1.34 hubertf buf); 360 1.34 hubertf rval = 1; 361 1.34 hubertf continue; 362 1.34 hubertf } else { 363 1.34 hubertf hash = nhash; 364 1.34 hubertf } 365 1.33 hubertf } 366 1.33 hubertf 367 1.33 hubertf } else { 368 1.33 hubertf if (hash) { 369 1.37 hubertf int nspaces; 370 1.37 hubertf 371 1.33 hubertf /* 372 1.33 hubertf * 'normal' output, no (ck)sum 373 1.33 hubertf */ 374 1.47 christos print_flags |= PRINT_NORMAL; 375 1.37 hubertf nspaces = 1; 376 1.51 rillig 377 1.33 hubertf p_cksum = buf; 378 1.33 hubertf p_filename = strchr(buf, ' '); 379 1.33 hubertf if (p_filename == NULL) { 380 1.33 hubertf if (check_warn) 381 1.33 hubertf warnx("no filename in %s? " 382 1.33 hubertf "Skipping...", buf); 383 1.33 hubertf rval = 1; 384 1.33 hubertf continue; 385 1.33 hubertf } 386 1.50 rillig while (isspace((unsigned char)*++p_filename)) 387 1.37 hubertf nspaces++; 388 1.33 hubertf l_filename = strlen(p_filename); 389 1.37 hubertf l_cksum = p_filename - buf - nspaces; 390 1.33 hubertf } else { 391 1.33 hubertf /* 392 1.33 hubertf * sum/cksum output format 393 1.33 hubertf */ 394 1.33 hubertf p_cksum = buf; 395 1.33 hubertf s=strchr(p_cksum, ' '); 396 1.33 hubertf if (s == NULL) { 397 1.33 hubertf if (check_warn) 398 1.33 hubertf warnx("bogus format: %s." 399 1.33 hubertf " Skipping...", 400 1.33 hubertf buf); 401 1.33 hubertf rval = 1; 402 1.33 hubertf continue; 403 1.33 hubertf } 404 1.33 hubertf l_cksum = s - p_cksum; 405 1.33 hubertf 406 1.33 hubertf p_filename = strrchr(buf, ' '); 407 1.33 hubertf if (p_filename == NULL) { 408 1.33 hubertf if (check_warn) 409 1.33 hubertf warnx("no filename in %s?" 410 1.33 hubertf " Skipping...", 411 1.33 hubertf buf); 412 1.33 hubertf rval = 1; 413 1.33 hubertf continue; 414 1.33 hubertf } 415 1.33 hubertf p_filename++; 416 1.33 hubertf l_filename = strlen(p_filename); 417 1.33 hubertf } 418 1.33 hubertf } 419 1.33 hubertf 420 1.33 hubertf strlcpy(filename, p_filename, l_filename+1); 421 1.33 hubertf strlcpy(cksum, p_cksum, l_cksum+1); 422 1.33 hubertf 423 1.33 hubertf if (hash) { 424 1.52 gutterid char *h; 425 1.52 gutterid 426 1.33 hubertf if (access(filename, R_OK) == 0 427 1.52 gutterid && (h = hash->filefunc(filename, NULL)) != NULL 428 1.52 gutterid && strcmp(cksum, h) == 0) 429 1.33 hubertf ok = 1; 430 1.33 hubertf else 431 1.33 hubertf ok = 0; 432 1.33 hubertf } else { 433 1.33 hubertf if ((fd = open(filename, O_RDONLY, 0)) < 0) { 434 1.33 hubertf if (check_warn) 435 1.33 hubertf warn("%s", filename); 436 1.8 thorpej rval = 1; 437 1.33 hubertf ok = 0; 438 1.33 hubertf } else { 439 1.51 rillig if (cfncn(fd, &val, &len)) 440 1.33 hubertf ok = 0; 441 1.33 hubertf else { 442 1.49 cheusov uint32_t should_val; 443 1.51 rillig 444 1.33 hubertf should_val = 445 1.33 hubertf strtoul(cksum, NULL, 10); 446 1.33 hubertf if (val == should_val) 447 1.33 hubertf ok = 1; 448 1.33 hubertf else 449 1.33 hubertf ok = 0; 450 1.33 hubertf } 451 1.38 elad close(fd); 452 1.8 thorpej } 453 1.8 thorpej } 454 1.33 hubertf 455 1.34 hubertf if (! ok) { 456 1.34 hubertf if (hash) 457 1.34 hubertf printf("(%s) ", hash->hashname); 458 1.33 hubertf printf("%s: FAILED\n", filename); 459 1.33 hubertf badcnt++; 460 1.1 cgd } 461 1.33 hubertf cnt++; 462 1.33 hubertf 463 1.13 atatat } 464 1.33 hubertf fclose(f); 465 1.8 thorpej 466 1.51 rillig if (badcnt > 0) 467 1.34 hubertf rval = 1; 468 1.51 rillig 469 1.33 hubertf } else { 470 1.33 hubertf /* 471 1.33 hubertf * Calculate checksums 472 1.33 hubertf */ 473 1.33 hubertf 474 1.33 hubertf fd = STDIN_FILENO; 475 1.33 hubertf fn = NULL; 476 1.33 hubertf rval = 0; 477 1.33 hubertf do { 478 1.33 hubertf if (*argv) { 479 1.33 hubertf fn = *argv++; 480 1.33 hubertf if (hash != NULL) { 481 1.47 christos if (hash_digest_file(fn, hash, print_flags)) { 482 1.33 hubertf warn("%s", fn); 483 1.33 hubertf rval = 1; 484 1.33 hubertf } 485 1.33 hubertf continue; 486 1.33 hubertf } 487 1.33 hubertf if ((fd = open(fn, O_RDONLY, 0)) < 0) { 488 1.33 hubertf warn("%s", fn); 489 1.33 hubertf rval = 1; 490 1.33 hubertf continue; 491 1.33 hubertf } 492 1.33 hubertf } else if (hash && !nohashstdin) { 493 1.33 hubertf hash->filterfunc(pflag); 494 1.33 hubertf } 495 1.51 rillig 496 1.33 hubertf if (hash == NULL) { 497 1.33 hubertf if (cfncn(fd, &val, &len)) { 498 1.33 hubertf warn("%s", fn ? fn : "stdin"); 499 1.33 hubertf rval = 1; 500 1.33 hubertf } else 501 1.33 hubertf pfncn(fn, val, len); 502 1.33 hubertf (void)close(fd); 503 1.33 hubertf } 504 1.33 hubertf } while (*argv); 505 1.33 hubertf } 506 1.1 cgd exit(rval); 507 1.1 cgd } 508 1.1 cgd 509 1.45 joerg static int 510 1.47 christos hash_digest_file(char *fn, const struct hash *hash, int flags) 511 1.8 thorpej { 512 1.30 elad char *cp; 513 1.8 thorpej 514 1.30 elad cp = hash->filefunc(fn, NULL); 515 1.8 thorpej if (cp == NULL) 516 1.22 xtraeme return 1; 517 1.8 thorpej 518 1.47 christos if (flags & PRINT_QUIET) 519 1.47 christos printf("%s\n", cp); 520 1.47 christos else if (flags & PRINT_NORMAL) 521 1.17 atatat printf("%s %s\n", cp, fn); 522 1.17 atatat else 523 1.17 atatat printf("%s (%s) = %s\n", hash->hashname, fn, cp); 524 1.30 elad 525 1.30 elad free(cp); 526 1.30 elad 527 1.22 xtraeme return 0; 528 1.8 thorpej } 529 1.8 thorpej 530 1.45 joerg static void 531 1.22 xtraeme requirehash(const char *flg) 532 1.8 thorpej { 533 1.44 lukem warnx("%s flag requires `-a algorithm'", flg); 534 1.8 thorpej usage(); 535 1.8 thorpej } 536 1.8 thorpej 537 1.45 joerg static void 538 1.22 xtraeme usage(void) 539 1.1 cgd { 540 1.44 lukem const char fileargs[] = "[file ... | -c [-w] [sumfile]]"; 541 1.44 lukem const char sumargs[] = "[-n] [-a algorithm [-ptx] [-s string]] [-o 1|2]"; 542 1.44 lukem const char hashargs[] = "[-nptx] [-s string]"; 543 1.44 lukem 544 1.44 lukem (void)fprintf(stderr, "usage: cksum %s\n %s\n", 545 1.44 lukem sumargs, fileargs); 546 1.44 lukem (void)fprintf(stderr, " sum %s\n %s\n", 547 1.44 lukem sumargs, fileargs); 548 1.44 lukem (void)fprintf(stderr, " md2 %s %s\n", hashargs, fileargs); 549 1.44 lukem (void)fprintf(stderr, " md4 %s %s\n", hashargs, fileargs); 550 1.44 lukem (void)fprintf(stderr, " md5 %s %s\n", hashargs, fileargs); 551 1.44 lukem (void)fprintf(stderr, " rmd160 %s %s\n", hashargs, fileargs); 552 1.44 lukem (void)fprintf(stderr, " sha1 %s %s\n", hashargs, fileargs); 553 1.1 cgd exit(1); 554 1.1 cgd } 555