ref: 298d40ee45af86e00de6cd59f9cd27a0762e295a
parent: 9ba63804f6efd8bd11fd8b9b9a617906baeb7a1b
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Mon Mar 5 09:02:53 EST 2018
[nm] Reintroduce again archives Archives were removed when ar function were removed from the library. This patch introduces them again but it still needs more changes to be functional and check all the possible errors.
--- a/nm/main.c
+++ b/nm/main.c
@@ -21,7 +21,7 @@
static int vflag;
static int gflag;
static int uflag;
-static int archflag;
+static int arflag;
static int
object(char *fname, FILE *fp)
@@ -38,22 +38,20 @@
return 0;
}
-#if 0
static int
archive(char *fname, FILE *fp)
{
- char magic[ARMAGIC_SIZ];
+ char magic[SARMAG];
fpos_t pos;
fgetpos(fp, &pos);
- fread(magic, sizeof(magic), 1, fp);
+ fread(magic, SARMAG, 1, fp);
fsetpos(fp, &pos);
- if (!ferror(fp) && !strncmp(magic, ARMAGIC, ARMAGIC_SIZ))
+ if (!ferror(fp) && !strncmp(magic, ARMAG, SARMAG))
return 1;
return 0;
}
-#endif
static int
cmp(const void *p1, const void *p2)
@@ -107,7 +105,7 @@
return;
if (Aflag)
- printf((archflag) ? "%s[%s]: " : "%s: ", file, member);
+ printf((arflag) ? "%s[%s]: " : "%s: ", file, member);
if (Pflag) {
printf("%s %c", name, type);
if (type != 'U') {
@@ -199,37 +197,38 @@
goto free_arrays;
}
-#if 0
static void
ar(char *fname, FILE *fp)
{
- struct arhdr hdr;
- long pos;
+ struct ar_hdr hdr;
+ long pos, siz;
- archflag = 1;
- while (rdarhdr(fp, &hdr) != EOF) {
+ arflag = 1;
+ fseek(fp, sizeof(struct ar_hdr), SEEK_CUR);
+
+ while (fread(&hdr, sizeof(hdr), 1, fp) == 1) {
pos = ftell(fp);
- if (pos == -1 || pos > LONG_MAX - hdr.size) {
+ sscanf(hdr.ar_size, "%10ld", &siz);
+ if (pos == -1 || pos > LONG_MAX - siz) {
fprintf(stderr,
"nm: %s: overflow in size of archive\n",
fname);
return;
}
- pos += hdr.size;
- if (hdr.size & 1)
+ pos += siz;
+ if (siz & 1)
++pos;
if (object(fname, fp)) {
- nm(fname, hdr.name, fp);
+ nm(fname, hdr.ar_name, fp);
} else {
fprintf(stderr,
"nm: skipping member %s in archive %s\n",
- hdr.name, fname);
+ hdr.ar_name, fname);
}
fseek(fp, pos, SEEK_SET);
}
}
-#endif
void
doit(char *fname)
@@ -236,14 +235,14 @@
{
FILE *fp;
- archflag = 0;
+ arflag = 0;
if ((fp = fopen(fname, "rb")) == NULL)
goto file_error;
if (object(fname, fp))
nm(fname, fname, fp);
-// else if (archive(fname, fp))
-// ar(fname, fp);
+ else if (archive(fname, fp))
+ ar(fname, fp);
else
fprintf(stderr, "nm: %s: File format not recognized\n", fname);