]> pd.if.org Git - zpackage/commitdiff
output improvements to elftype
authorNathan Wagner <nw@hydaspes.if.org>
Mon, 30 Mar 2015 18:53:09 +0000 (18:53 +0000)
committerNathan Wagner <nw@hydaspes.if.org>
Mon, 30 Mar 2015 18:53:09 +0000 (18:53 +0000)
elf/elftype.c

index 6dece5a471cef454326335f8a6b2f0ddd759f539..94e68b9306f17bff1bce062c8d2c4a8972d666d5 100644 (file)
@@ -25,11 +25,14 @@ 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, "vtnredclaqp0f:")) != -1) {
                switch (option) {
                        case 'r': want |= RELOCATABLE; break;
                        case 'e': want |= EXECUTABLE; break;
@@ -38,10 +41,14 @@ int main(int ac, char **av) {
                        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':
                                  if (optarg[0] == '-' && optarg[1] == 0) {
+                                         fprintf(stderr, "opening stdin\n");
                                          list = stdin;
                                  } else {
                                          list = fopen(optarg, "r");
@@ -52,6 +59,9 @@ int main(int ac, char **av) {
                                  break;
                }
        }
+
+       if (!want) want = (RELOCATABLE|EXECUTABLE|DYNAMIC|CORE);
+
        if (list) {
                quiet = 2;
                perr = 0;
@@ -62,8 +72,34 @@ int main(int ac, char **av) {
                        }
                }
        } 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,quiet);
+
+               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;
 }
@@ -120,9 +156,9 @@ int checkfile(char *fn, unsigned int want, int perr, int quiet) {
                return 0;
        }
        bytes = read(fd, &hdr, sizeof hdr);
+       close(fd);
        if (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 +167,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 +176,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 +186,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;
 }