|
|
1.1 ! root 1: static char sccsid[] = "@(#)file.c 4.1 10/1/80"; ! 2: /* ! 3: * file - determine type of file ! 4: */ ! 5: ! 6: #ifdef vax ! 7: #include <pagsiz.h> ! 8: #endif ! 9: #include <sys/types.h> ! 10: #include <sys/stat.h> ! 11: #include <stdio.h> ! 12: #include <ctype.h> ! 13: #include <a.out.h> ! 14: int in; ! 15: int i = 0; ! 16: char buf[BUFSIZ]; ! 17: char *troff[] = { /* new troff intermediate lang */ ! 18: "x","T","res","init","font","202","V0","p1",0}; ! 19: char *fort[] = { ! 20: "function","subroutine","common","dimension","block","integer", ! 21: "real","data","double",0}; ! 22: char *asc[] = { ! 23: "chmk","mov","tst","clr","jmp",0}; ! 24: char *c[] = { ! 25: "int","char","float","double","struct","extern",0}; ! 26: char *as[] = { ! 27: "globl","byte","align","text","data","comm",0}; ! 28: int ifile; ! 29: ! 30: main(argc, argv) ! 31: char **argv; ! 32: { ! 33: FILE *fl; ! 34: register char *p; ! 35: char ap[128]; ! 36: extern char _sobuf[]; ! 37: ! 38: if (argc>1 && argv[1][0]=='-' && argv[1][1]=='f') { ! 39: if ((fl = fopen(argv[2], "r")) == NULL) { ! 40: printf("Can't open %s\n", argv[2]); ! 41: exit(2); ! 42: } ! 43: while ((p = fgets(ap, 128, fl)) != NULL) { ! 44: int l = strlen(p); ! 45: if (l>0) ! 46: p[l-1] = '\0'; ! 47: printf("%s: ", p); ! 48: type(p); ! 49: if (ifile>=0) ! 50: close(ifile); ! 51: } ! 52: exit(1); ! 53: } ! 54: while(argc > 1) { ! 55: printf("%s: ", argv[1]); ! 56: type(argv[1]); ! 57: fflush(stdout); ! 58: argc--; ! 59: argv++; ! 60: if (ifile >= 0) ! 61: close(ifile); ! 62: } ! 63: } ! 64: ! 65: type(file) ! 66: char *file; ! 67: { ! 68: int j,nl; ! 69: char ch; ! 70: struct stat mbuf; ! 71: ! 72: ifile = -1; ! 73: if(stat(file, &mbuf) < 0) { ! 74: printf("cannot stat\n"); ! 75: return; ! 76: } ! 77: switch (mbuf.st_mode & S_IFMT) { ! 78: ! 79: case S_IFCHR: ! 80: printf("character"); ! 81: goto spcl; ! 82: ! 83: case S_IFDIR: ! 84: printf("directory\n"); ! 85: return; ! 86: ! 87: case S_IFBLK: ! 88: printf("block"); ! 89: ! 90: spcl: ! 91: printf(" special (%d/%d)\n", major(mbuf.st_rdev), minor(mbuf.st_rdev)); ! 92: return; ! 93: } ! 94: ! 95: ifile = open(file, 0); ! 96: if(ifile < 0) { ! 97: printf("cannot open\n"); ! 98: return; ! 99: } ! 100: in = read(ifile, buf, BUFSIZ); ! 101: if(in == 0){ ! 102: printf("empty\n"); ! 103: return; ! 104: } ! 105: ! 106: if(in>=64){ ! 107: ! 108: int i, bucket[8]; ! 109: float cs; ! 110: ! 111: for(i=0; i<8; i++) bucket[i] = 0; ! 112: ! 113: for(i=0; i<64; i++) bucket[(buf[i]>>5)&07] += 1; ! 114: ! 115: cs = 0.; ! 116: for(i=0; i<8; i++) cs += (bucket[i]-8)*(bucket[i]-8); ! 117: cs /= 8.; ! 118: ! 119: if(cs <= 24.322){ ! 120: ! 121: printf("encrypted\n"); ! 122: return; ! 123: } ! 124: } ! 125: ! 126: if( (((unsigned char)buf[0])==247) && (buf[1]==2) ){ ! 127: printf("tex dvi\n"); ! 128: return; ! 129: } ! 130: ! 131: switch (*(short *) buf) ! 132: { ! 133: case 070707: ! 134: cpio: ! 135: printf("cpio archive\n"); ! 136: goto out; ! 137: } ! 138: ! 139: switch(*(int *)buf) ! 140: { ! 141: case 0413: ! 142: printf("old sun2 demand paged "); ! 143: goto exec; ! 144: ! 145: case 0200413: ! 146: printf("mc68010 demand paged "); ! 147: goto exec; ! 148: ! 149: case 0400413: ! 150: printf("mc68020 demand paged "); ! 151: goto exec; ! 152: ! 153: case 0410: ! 154: printf("old sun2 pure "); ! 155: goto exec; ! 156: ! 157: case 0200410: ! 158: printf("mc68010 pure "); ! 159: goto exec; ! 160: ! 161: case 0400410: ! 162: printf("mc68020 pure "); ! 163: goto exec; ! 164: ! 165: case 0411: ! 166: printf("jfr 411 executable\n"); ! 167: return; ! 168: ! 169: case 0406: ! 170: printf ("mpx 68000 "); ! 171: goto exec; ! 172: ! 173: case 0200407: ! 174: printf("mc68010 "); ! 175: goto exec; ! 176: ! 177: case 0400407: ! 178: printf("mc68020 "); ! 179: goto exec; ! 180: ! 181: case 0407: ! 182: exec: ! 183: printf("executable"); ! 184: if(((int *)buf)[4] != 0) { ! 185: printf(" not stripped"); ! 186: if(oldo(buf)) ! 187: printf(" (old format symbol table)"); ! 188: } ! 189: printf("\n"); ! 190: goto out; ! 191: ! 192: case 0177555: ! 193: printf("very old archive\n"); ! 194: goto out; ! 195: ! 196: case 0177545: ! 197: printf("old archive\n"); ! 198: goto out; ! 199: ! 200: case 0135246: /* andrew/ehg */ ! 201: printf("view2d input file\n"); ! 202: goto out; ! 203: ! 204: case 0135256: /* andrew */ ! 205: printf("apl file\n"); ! 206: goto out; ! 207: ! 208: case 0164200: /* td */ ! 209: printf("Lucasfilm picture\n"); ! 210: goto out; ! 211: ! 212: case 0600560: ! 213: printf("mux downloadable file\n"); ! 214: goto out; ! 215: ! 216: default: ! 217: switch (*(short *) buf+1) { ! 218: case 0405: ! 219: case 0407: ! 220: case 0410: ! 221: case 0411: ! 222: printf ("pdp-11 executable\n"); ! 223: goto out; ! 224: } ! 225: } ! 226: ! 227: if(strncmp(buf, "!<arch>\n__.SYMDEF", 17) == 0 ) { ! 228: printf("archive random library\n"); ! 229: goto out; ! 230: } ! 231: if (strncmp(buf, "!<arch>\n", 8)==0) { ! 232: printf("archive\n"); ! 233: goto out; ! 234: } ! 235: if (strncmp(buf, "070707", 6) == 0) ! 236: { ! 237: printf("ascii "); ! 238: goto cpio; ! 239: } ! 240: ! 241: if(strncmp(buf, "#!/bin/echo ", 12)==0){ ! 242: printf("cyntax object file\n"); ! 243: goto out; ! 244: } ! 245: if(strncmp(buf, "TYPE=", 5)==0){ /* td */ ! 246: for(i=5;i!=in && buf[i]!='\n';i++); ! 247: printf("%.*s picture\n", i, buf); ! 248: goto out; ! 249: } ! 250: i = 0; ! 251: if(ccom() == 0)goto notc; ! 252: while(buf[i] == '#'){ ! 253: j = i; ! 254: while(buf[i++] != '\n'){ ! 255: if(i - j > 255){ ! 256: printf("data\n"); ! 257: goto out; ! 258: } ! 259: if(i >= in)goto notc; ! 260: } ! 261: if(ccom() == 0)goto notc; ! 262: } ! 263: check: ! 264: if(lookup(c) == 1){ ! 265: while((ch = buf[i++]) != ';' && ch != '{')if(i >= in)goto notc; ! 266: printf("c program text"); ! 267: goto outa; ! 268: } ! 269: nl = 0; ! 270: while(buf[i] != '('){ ! 271: if(buf[i] <= 0) ! 272: goto notas; ! 273: if(buf[i] == ';'){ ! 274: i++; ! 275: goto check; ! 276: } ! 277: if(buf[i++] == '\n') ! 278: if(nl++ > 6)goto notc; ! 279: if(i >= in)goto notc; ! 280: } ! 281: while(buf[i] != ')'){ ! 282: if(buf[i++] == '\n') ! 283: if(nl++ > 6)goto notc; ! 284: if(i >= in)goto notc; ! 285: } ! 286: while(buf[i] != '{'){ ! 287: if(buf[i++] == '\n') ! 288: if(nl++ > 6)goto notc; ! 289: if(i >= in)goto notc; ! 290: } ! 291: printf("c program text"); ! 292: goto outa; ! 293: notc: ! 294: i = 0; ! 295: while(buf[i] == 'c' || buf[i] == '#'){ ! 296: while(buf[i++] != '\n')if(i >= in)goto notfort; ! 297: } ! 298: if(lookup(fort) == 1){ ! 299: printf("fortran program text"); ! 300: goto outa; ! 301: } ! 302: notfort: ! 303: i=0; ! 304: if(ascom() == 0)goto notas; ! 305: j = i-1; ! 306: if(buf[i] == '.'){ ! 307: i++; ! 308: if(lookup(as) == 1){ ! 309: printf("assembler program text"); ! 310: goto outa; ! 311: } ! 312: else if(buf[j] == '\n' && isalpha(buf[j+2])){ ! 313: printf("roff, nroff, or eqn input text"); ! 314: goto outa; ! 315: } ! 316: } ! 317: while(lookup(asc) == 0){ ! 318: if(ascom() == 0)goto notas; ! 319: while(buf[i] != '\n' && buf[i++] != ':') ! 320: if(i >= in)goto notas; ! 321: while(buf[i] == '\n' || buf[i] == ' ' || buf[i] == '\t')if(i++ >= in)goto notas; ! 322: j = i-1; ! 323: if(buf[i] == '.'){ ! 324: i++; ! 325: if(lookup(as) == 1){ ! 326: printf("assembler program text"); ! 327: goto outa; ! 328: } ! 329: else if(buf[j] == '\n' && isalpha(buf[j+2])){ ! 330: printf("roff, nroff, or eqn input text"); ! 331: goto outa; ! 332: } ! 333: } ! 334: } ! 335: printf("assembler program text"); ! 336: goto outa; ! 337: notas: ! 338: for(i=0; i < in; i++)if(buf[i]&0200){ ! 339: if (buf[0]=='\100' && buf[1]=='\357') { ! 340: printf("troff (CAT) output\n"); ! 341: goto out; ! 342: } ! 343: if(buf[0] == 037 && buf[1] == 036){ ! 344: char *p = file; ! 345: while(*p++); ! 346: if(*(p-2) != 'z' || *(p-3) != '.') ! 347: printf("probably "); ! 348: printf("packed\n"); ! 349: goto out; ! 350: } ! 351: printf("data\n"); ! 352: goto out; ! 353: } ! 354: if (mbuf.st_mode&((S_IEXEC)|(S_IEXEC>>3)|(S_IEXEC>>6))) ! 355: printf("commands text"); ! 356: else if (troffint(buf, in)) ! 357: printf("troff intermediate output text"); ! 358: else if (english(buf, in)) ! 359: printf("English text"); ! 360: else ! 361: printf("ascii text"); ! 362: outa: ! 363: while(i < in) ! 364: if((buf[i++]&0377) > 127){ ! 365: printf(" with garbage\n"); ! 366: goto out; ! 367: } ! 368: /* if next few lines in then read whole file looking for nulls ... ! 369: while((in = read(ifile,buf,BUFSIZ)) > 0) ! 370: for(i = 0; i < in; i++) ! 371: if((buf[i]&0377) > 127){ ! 372: printf(" with garbage\n"); ! 373: goto out; ! 374: } ! 375: /*.... */ ! 376: printf("\n"); ! 377: out:; ! 378: } ! 379: ! 380: oldo(cp) ! 381: char *cp; ! 382: { ! 383: struct exec ex; ! 384: struct stat stb; ! 385: ! 386: ex = *(struct exec *)cp; ! 387: if (fstat(ifile, &stb) < 0) ! 388: return(0); ! 389: if (N_STROFF(ex)+sizeof(off_t) > stb.st_size) ! 390: return (1); ! 391: return (0); ! 392: } ! 393: ! 394: ! 395: ! 396: troffint(bp, n) ! 397: char *bp; ! 398: int n; ! 399: { ! 400: int k; ! 401: ! 402: i = 0; ! 403: for (k = 0; k < 8; k++) { ! 404: if (buf[i] == 'x' && buf[i+1] == ' ') /* x [T|init|font|...] */ ! 405: while (i < n && buf[i++] != '\n') ! 406: ; ! 407: else if ((buf[i] == 'f' || buf[i] == 's' || ! 408: buf[i] == 'p' || buf[i] == 'V' || buf[i] == 'H') ! 409: && isdigit(buf[i+1])) /* p1 | f2 | s3 | V4... */ ! 410: while (i < n && buf[i++] != '\n') ! 411: ; ! 412: else ! 413: return 0; ! 414: } ! 415: return 1; ! 416: } ! 417: ! 418: lookup(tab) ! 419: char *tab[]; ! 420: { ! 421: char r; ! 422: int k,j,l; ! 423: while(buf[i] == ' ' || buf[i] == '\t' || buf[i] == '\n')i++; ! 424: for(j=0; tab[j] != 0; j++){ ! 425: l=0; ! 426: for(k=i; ((r=tab[j][l++]) == buf[k] && r != '\0');k++); ! 427: if(r == '\0') ! 428: if(buf[k] == ' ' || buf[k] == '\n' || buf[k] == '\t' ! 429: || buf[k] == '{' || buf[k] == '/'){ ! 430: i=k; ! 431: return(1); ! 432: } ! 433: } ! 434: return(0); ! 435: } ! 436: ccom(){ ! 437: char cc; ! 438: while((cc = buf[i]) == ' ' || cc == '\t' || cc == '\n')if(i++ >= in)return(0); ! 439: if(buf[i] == '/' && buf[i+1] == '*'){ ! 440: i += 2; ! 441: while(buf[i] != '*' || buf[i+1] != '/'){ ! 442: if(buf[i] == '\\')i += 2; ! 443: else i++; ! 444: if(i >= in)return(0); ! 445: } ! 446: if((i += 2) >= in)return(0); ! 447: } ! 448: if(buf[i] == '\n')if(ccom() == 0)return(0); ! 449: return(1); ! 450: } ! 451: ascom(){ ! 452: while(buf[i] == '/'){ ! 453: i++; ! 454: while(buf[i++] != '\n')if(i >= in)return(0); ! 455: while(buf[i] == '\n')if(i++ >= in)return(0); ! 456: } ! 457: return(1); ! 458: } ! 459: ! 460: english (bp, n) ! 461: char *bp; ! 462: { ! 463: # define NASC 128 ! 464: int ct[NASC], j, vow, freq, rare; ! 465: int badpun = 0, punct = 0; ! 466: if (n<50) return(0); /* no point in statistics on squibs */ ! 467: for(j=0; j<NASC; j++) ! 468: ct[j]=0; ! 469: for(j=0; j<n; j++) ! 470: { ! 471: if (bp[j]<NASC) ! 472: ct[bp[j]|040]++; ! 473: switch (bp[j]) ! 474: { ! 475: case '.': ! 476: case ',': ! 477: case ')': ! 478: case '%': ! 479: case ';': ! 480: case ':': ! 481: case '?': ! 482: punct++; ! 483: if ( j < n-1 && ! 484: bp[j+1] != ' ' && ! 485: bp[j+1] != '\n') ! 486: badpun++; ! 487: } ! 488: } ! 489: if (badpun*5 > punct) ! 490: return(0); ! 491: vow = ct['a'] + ct['e'] + ct['i'] + ct['o'] + ct['u']; ! 492: freq = ct['e'] + ct['t'] + ct['a'] + ct['i'] + ct['o'] + ct['n']; ! 493: rare = ct['v'] + ct['j'] + ct['k'] + ct['q'] + ct['x'] + ct['z']; ! 494: if (2*ct[';'] > ct['e']) return(0); ! 495: if ( (ct['>']+ct['<']+ct['/'])>ct['e']) return(0); /* shell file test */ ! 496: return (vow*5 >= n-ct[' '] && freq >= 10*rare); ! 497: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.