|
|
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.