summaryrefslogtreecommitdiffstats
path: root/usr.sbin/kldxref/kldxref.c
diff options
context:
space:
mode:
authoriedowse <iedowse@FreeBSD.org>2004-08-27 00:51:21 +0000
committeriedowse <iedowse@FreeBSD.org>2004-08-27 00:51:21 +0000
commitca4083743c48cec21ba5c9a25cbce859b03dd5ee (patch)
treecafc6d44f1ca4971ce6a150dd1e2a3b9b970cf2c /usr.sbin/kldxref/kldxref.c
parent878483bef2ba8584138f0acac5145affaba34958 (diff)
downloadFreeBSD-src-ca4083743c48cec21ba5c9a25cbce859b03dd5ee.zip
FreeBSD-src-ca4083743c48cec21ba5c9a25cbce859b03dd5ee.tar.gz
Call the file format specific code through a table of function
pointers and remove knowledge of the file format from kldxref.c. This will make it possible to support more than one file format.
Diffstat (limited to 'usr.sbin/kldxref/kldxref.c')
-rw-r--r--usr.sbin/kldxref/kldxref.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/usr.sbin/kldxref/kldxref.c b/usr.sbin/kldxref/kldxref.c
index 0597cce..4206795 100644
--- a/usr.sbin/kldxref/kldxref.c
+++ b/usr.sbin/kldxref/kldxref.c
@@ -164,12 +164,12 @@ parse_entry(struct mod_metadata *md, const char *cval,
case MDT_DEPEND:
if (!dflag)
break;
- check(ef_seg_read(ef, data, sizeof(mdp), &mdp));
+ check(EF_SEG_READ(ef, data, sizeof(mdp), &mdp));
printf(" depends on %s.%d (%d,%d)\n", cval,
mdp.md_ver_preferred, mdp.md_ver_minimum, mdp.md_ver_maximum);
break;
case MDT_VERSION:
- check(ef_seg_read(ef, data, sizeof(mdv), &mdv));
+ check(EF_SEG_READ(ef, data, sizeof(mdv), &mdv));
record_int(MDT_VERSION);
record_string(cval);
record_int(mdv.mv_version);
@@ -202,18 +202,21 @@ read_kld(char *filename, char *kldname)
/* struct kld_info *kip;
struct mod_info *mip;*/
void **p, **orgp;
- int error, nmlen;
+ int error, eftype, nmlen;
long start, finish, entries;
- Elf_Sym *sym;
char kldmodname[MAXMODNAME + 1], cval[MAXMODNAME + 1], *cp;
if (verbose || dflag)
printf("%s\n", filename);
error = ef_open(filename, &ef, verbose);
- if (error)
+ if (error) {
+ if (verbose)
+ warnc(error, "elf_open(%s)", filename);
return error;
- if (ef.ef_type != EFT_KLD && ef.ef_type != EFT_KERNEL) {
- ef_close(&ef);
+ }
+ eftype = EF_GET_TYPE(&ef);
+ if (eftype != EFT_KLD && eftype != EFT_KERNEL) {
+ EF_CLOSE(&ef);
return 0;
}
if (!dflag) {
@@ -225,18 +228,17 @@ read_kld(char *filename, char *kldname)
/* fprintf(fxref, "%s:%s:%d\n", kldmodname, kldname, 0);*/
}
do {
- check(ef_lookup_symbol(&ef, "__start_set_" MDT_SETNAME, &sym));
- start = sym->st_value;
- check(ef_lookup_symbol(&ef, "__stop_set_" MDT_SETNAME, &sym));
- finish = sym->st_value;
- entries = (finish - start) / sizeof(void *);
- check(ef_seg_read_entry_rel(&ef, start, sizeof(*p) * entries,
+ check(EF_LOOKUP_SET(&ef, MDT_SETNAME, &start, &finish,
+ &entries));
+ check(EF_SEG_READ_ENTRY_REL(&ef, start, sizeof(*p) * entries,
(void *)&p));
orgp = p;
while(entries--) {
- check(ef_seg_read_rel(&ef, (Elf_Off)*p, sizeof(md), &md));
+ check(EF_SEG_READ_REL(&ef, (Elf_Off)*p, sizeof(md),
+ &md));
p++;
- check(ef_seg_read(&ef, (Elf_Off)md.md_cval, sizeof(cval), cval));
+ check(EF_SEG_READ(&ef, (Elf_Off)md.md_cval,
+ sizeof(cval), cval));
cval[MAXMODNAME] = '\0';
parse_entry(&md, cval, &ef, kldname);
}
@@ -244,7 +246,7 @@ read_kld(char *filename, char *kldname)
warnc(error, "error while reading %s", filename);
free(orgp);
} while(0);
- ef_close(&ef);
+ EF_CLOSE(&ef);
return error;
}
OpenPOWER on IntegriCloud