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