1#include <errno.h>2#include <stdarg.h>3#include <stdio.h>4#include <stdlib.h>5#include <string.h>67#include <scc/arg.h>8#include <scc/mach.h>910static int status;11static char tmpname[FILENAME_MAX];12static char *filename;13char *argv0;1415static void16error(char *fmt, ...)17{18 va_list va;1920 va_start(va, fmt);21 fprintf(stderr, "scc-strip: error: %s: ", filename);22 vfprintf(stderr, fmt, va);23 putc('\n', stderr);24 va_end(va);2526 status = EXIT_FAILURE;27}2829static void30doit(char *fname)31{32 int type;33 size_t r;34 FILE *src, *dst;35 Map *map;36 Obj *obj;3738 errno = 0;39 filename = fname;40 r = snprintf(tmpname, sizeof(tmpname), "%s.tmp", fname);41 if (r >= sizeof(tmpname)) {42 error("%s: name too long", fname);43 return;44 }45 if ((src = fopen(fname, "rb")) == NULL) {46 error("opening src file");47 return;48 }49 if ((type = objprobe(src, NULL)) < 0) {50 error("getting object type");51 goto err1;52 }53 if ((obj = newobj(type)) == NULL) {54 error("creating object");55 goto err1;56 }57 if (readobj(obj, src) < 0) {58 error("reading object");59 goto err2;60 }61 if ((map = loadmap(obj, src)) == NULL) {62 error("loading map");63 goto err3;64 }65 if (strip(obj) < 0) {66 error("stripping");67 goto err3;68 }69 if ((dst = fopen(tmpname, "wb")) == NULL) {70 error("opening dst");71 goto err3;72 }73 if (writeobj(obj, map, dst) < 0) {74 error("writing object");75 goto err5;76 }77 if (fclose(dst) == EOF) {78 error("closing dst");79 goto err4;80 }81 if (remove(fname) == EOF) {82 error("removing fname");83 goto err4;84 }85 if (rename(tmpname, fname) == EOF) {86 error("rename fname");87 goto err4;88 }8990 goto err3;9192err5:93 fclose(dst);94err4:95 remove(tmpname);96err3:97 delmap(map);98err2:99 delobj(obj);100err1:101 fclose(src);102}103104static void105usage(void)106{107 fputs("usage: scc-strip [file...]\n", stderr);108 exit(EXIT_FAILURE);109}110111int112main(int argc, char *argv[])113{114 ARGBEGIN {115 default:116 usage();117 } ARGEND118119 if (argc == 0) {120 doit("a.out");121 } else {122 for (; *argv; ++argv)123 doit(*argv);124 }125126 return status;127}