X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=elf%2Felftype.c;h=717dc122743b4492b935829a418b2d939c59afe0;hb=09c80a1f8918d888063f4d1a75921a99fe5f0b5c;hp=6dece5a471cef454326335f8a6b2f0ddd759f539;hpb=3c05d0baf322f9f47b0894379509f5e3c67e492b;p=zpackage diff --git a/elf/elftype.c b/elf/elftype.c index 6dece5a..717dc12 100644 --- a/elf/elftype.c +++ b/elf/elftype.c @@ -7,7 +7,7 @@ #include #include -#include +#include "elf.h" #define RELOCATABLE 0x1 #define EXECUTABLE 0x2 @@ -16,7 +16,7 @@ #define SYMLINKS 0x10 int readline(FILE *f, char *fn); -int checkfile(char *fn, unsigned int want, int perr, int quiet); +int checkfile(char *fn, unsigned int want, int perr); int errors = 0; int zeroterm = 0; @@ -24,12 +24,14 @@ int zeroterm = 0; int main(int ac, char **av) { int option; unsigned int want = 0; - int quiet = 0; + int printtype = 0; + int printname = 0; + int verbose = 0; int perr = 0; FILE *list = 0; char fn[PATH_MAX]; - while ((option = getopt(ac, av, "redclaqp0f:")) != -1) { + while ((option = getopt(ac, av, "vtnredclap0f:")) != -1) { switch (option) { case 'r': want |= RELOCATABLE; break; case 'e': want |= EXECUTABLE; break; @@ -37,7 +39,9 @@ int main(int ac, char **av) { case 'c': want |= CORE; break; case 'l': want |= SYMLINKS; break; case 'a': want = (RELOCATABLE|EXECUTABLE|DYNAMIC|CORE); break; - case 'q': quiet++; break; + case 't': printtype++; break; + case 'n': printname++; break; + case 'v': verbose++; break; case 'p': perr++; break; case '0': zeroterm = 1; break; case 'f': @@ -52,18 +56,60 @@ int main(int ac, char **av) { break; } } + + if (!want) want = (RELOCATABLE|EXECUTABLE|DYNAMIC|CORE); + if (list) { - quiet = 2; + int type; perr = 0; while (readline(list, fn)) { - fprintf(stderr, "checking %s\n", fn); - if (checkfile(fn, want,perr,quiet)) { + if ((type = checkfile(fn, want, perr)) & want) { + if (printtype) { + switch (type) { + case RELOCATABLE: + printf("relocatable "); break; + case EXECUTABLE: + printf("executable "); break; + case DYNAMIC: + printf("dynamic "); break; + case CORE: + printf("core "); break; + default: + printf("notelf "); break; + } + } printf("%s\n", fn); } } } else { - fprintf(stderr, "checking %s\n", av[optind]); - return !checkfile(av[optind], want,perr,quiet); + int type; + char *fn; + + fn = av[optind]; + if (verbose) fprintf(stderr, "checking %s\n", av[optind]); + type = checkfile(fn,want,perr); + + if (printtype) { + switch (type) { + case RELOCATABLE: + printf("relocatable"); break; + case EXECUTABLE: + printf("executable"); break; + case DYNAMIC: + printf("dynamic"); break; + case CORE: + printf("core"); break; + default: + printf("notelf"); break; + } + } + + if (printname) { + printf("%s%s", printtype ? " " : "", fn); + } + if (printtype || printname) printf("\n"); + + return type & want ? 0 : 1; } return errors ? 1 : 0; } @@ -98,7 +144,7 @@ int readline(FILE *f, char *fn) { return 0; } -int checkfile(char *fn, unsigned int want, int perr, int quiet) { +int checkfile(char *fn, unsigned int want, int perr) { Elf64_Ehdr hdr; int fd, bytes; int endian = 0; @@ -120,9 +166,9 @@ int checkfile(char *fn, unsigned int want, int perr, int quiet) { return 0; } bytes = read(fd, &hdr, sizeof hdr); - if (bytes < sizeof hdr) { + close(fd); + if ((size_t)bytes < sizeof hdr) { if (perr) fprintf(stderr, "could not read full elf header (wanted %zu got %d bytes)\n", sizeof hdr, bytes); - close(fd); return 0; } if (hdr.e_ident[EI_MAG0] != ELFMAG0 @@ -131,7 +177,6 @@ int checkfile(char *fn, unsigned int want, int perr, int quiet) { || hdr.e_ident[EI_MAG3] != ELFMAG3 ) { if (perr) fprintf(stderr, "elf header magic wrong\n"); - close(fd); return 0; } switch (hdr.e_ident[EI_CLASS]) { @@ -141,7 +186,6 @@ int checkfile(char *fn, unsigned int want, int perr, int quiet) { break; default: if (perr) fprintf(stderr, "elf header unknown class\n"); - close(fd); return 0; } @@ -152,34 +196,19 @@ int checkfile(char *fn, unsigned int want, int perr, int quiet) { /* TODO swap endian if needed */ default: if (perr) fprintf(stderr, "elf header unknown endian\n"); - close(fd); return 0; } switch (hdr.e_type) { - case ET_REL: - if (!quiet) printf("relocatable\n"); - close(fd); - return want & RELOCATABLE ? 1 : 0; - case ET_EXEC: - if (!quiet) printf("executable\n"); - close(fd); - return want & EXECUTABLE ? 1 : 0; - case ET_DYN: - if (!quiet) printf("dynamic\n"); - close(fd); - return want & DYNAMIC ? 1 : 0; - case ET_CORE: - if (!quiet) printf("core\n"); - close(fd); - return want & CORE ? 1 : 0; + case ET_REL: return RELOCATABLE; + case ET_EXEC: return EXECUTABLE; + case ET_DYN: return DYNAMIC; + case ET_CORE: return CORE; case ET_NONE: default: - if (perr) fprintf(stderr, "unknown type\n"); - close(fd); + if (perr) fprintf(stderr, "unknown %s\n", fn); return 0; } - close(fd); return 0; }