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