|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <ctype.h> ! 3: #include <libc.h> ! 4: #include </usr/include/a.out.h> ! 5: ! 6: #define INF (~0UL>>1) ! 7: int minlen = 4; ! 8: int oflag; ! 9: int tflag, dflag, sflag, aflag; ! 10: ! 11: void strings(FILE*, long, long); ! 12: char *flush(char*, long); ! 13: ! 14: int ! 15: main(int argc, char **argv) ! 16: { ! 17: int i; ! 18: int errors = 0; ! 19: struct exec header; ! 20: while(argc>1 && argv[1][0]=='-') { ! 21: if(argv[1][1] == 0) /* oldthink */ ! 22: aflag++; ! 23: while(*++argv[1]) { ! 24: switch(*argv[1]) { ! 25: case 'o': ! 26: oflag++; ! 27: continue; ! 28: case 't': ! 29: tflag++; ! 30: continue; ! 31: case 'd': ! 32: dflag++; ! 33: continue; ! 34: case 's': ! 35: sflag++; ! 36: continue; ! 37: case 'a': ! 38: aflag++; ! 39: continue; ! 40: case '0':case '1':case '2':case '3':case '4': ! 41: case '5':case '6':case '7':case '8':case '9': ! 42: minlen = atoi(argv[1]); ! 43: } ! 44: break; ! 45: } ! 46: argc--; ! 47: argv++; ! 48: } ! 49: if(!(tflag|dflag|sflag|aflag)) { ! 50: tflag++; ! 51: dflag++; ! 52: } ! 53: for(i=1; i<argc; i++) { ! 54: long base = sizeof header; ! 55: FILE *f = fopen(argv[i],"r"); ! 56: if(f == 0) { ! 57: fprintf(stderr,"strings: "); ! 58: perror(argv[i]); ! 59: errors++; ! 60: continue; ! 61: } ! 62: if(argc > 2) { ! 63: if(i > 1) printf("\n"); ! 64: printf("%s:\n", argv[i]); ! 65: } ! 66: if(aflag) ! 67: goto all; ! 68: if(fread(&header,sizeof(header),1,f) != 1) goto all; ! 69: switch(header.a_magic) { ! 70: all: ! 71: default: ! 72: strings(f, 0, INF); ! 73: break; ! 74: case ZMAGIC: ! 75: base = 1024; ! 76: case OMAGIC: ! 77: case NMAGIC: ! 78: if(tflag) ! 79: strings(f, base, header.a_text); ! 80: base += header.a_text; ! 81: if(dflag) ! 82: strings(f, base, header.a_data); ! 83: base += header.a_data + header.a_syms + ! 84: header.a_trsize + header.a_drsize; ! 85: if(sflag) ! 86: strings(f, base, INF); ! 87: } ! 88: fclose(f); ! 89: } ! 90: return errors; ! 91: } ! 92: ! 93: char string[1024]; ! 94: ! 95: void ! 96: strings(FILE *f, long base, long length) ! 97: { ! 98: int c; ! 99: char *cp = string; ! 100: fseek(f, base, 0); ! 101: cp = string; ! 102: for( ; --length>=0 && (c=getc(f))!=EOF; base++) { ! 103: switch(c) { ! 104: case '\n': ! 105: case 0: ! 106: cp = flush(cp, base); ! 107: continue; ! 108: case '\t': ! 109: case '\b': ! 110: break; ! 111: default: ! 112: if(isprint(c)) ! 113: break; ! 114: cp = string; ! 115: continue; ! 116: } ! 117: *cp++ = c; ! 118: if(cp >= string + sizeof string - 2) ! 119: cp = flush(cp, base); ! 120: } ! 121: } ! 122: ! 123: char * ! 124: flush(char *cp, long base) ! 125: { ! 126: if(cp-string >= minlen) { ! 127: *cp = 0; ! 128: if(oflag) ! 129: printf("%9lo ", base - (cp-string)); ! 130: puts(string); ! 131: } ! 132: return string; ! 133: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.