diff --git a/usr.sbin/asf/asf.8 b/usr.sbin/asf/asf.8 index 649fac1222c1..e42a9d84f23f 100644 --- a/usr.sbin/asf/asf.8 +++ b/usr.sbin/asf/asf.8 @@ -23,7 +23,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 18, 2006 +.Dd December 20, 2006 .Os .Dt ASF 8 .Sh NAME @@ -53,16 +53,16 @@ This allows .Xr gdb 1 to load the symbols into the debugging environment. .Pp -If +An optional .Ar modules-path -is specified, -.Nm -uses it for the modules directory instead of the default -.Pa modules . -This is useful when building in a non-standard location (i.e., not -.Pa /usr/src -and -.Pa /usr/obj ) . +argument can specify a semicolon-separated list of directory pathnames +similar to the +.Va kern.module_path +sysctl. +Each directory in the list will be searched in turn for modules. +The default list consists of just one element, +.Pa modules , +which is suitable if the current directory is a kernel build directory. .Pp If .Ar outfile @@ -152,11 +152,18 @@ Clear the list of suffixes tries to append to KLD file names. Only the null suffix is left in the list. .El +.Sh EXAMPLES +To add symbol files from the system search path specified by the +.Va kern.module_path +sysctl, the following command can be used: +.Pp +.Dl asf -s `sysctl -n kern.module_path` .Sh SEE ALSO .Xr gdb 1 , .Xr kvm 3 , .Xr kld 4 , -.Xr kldstat 8 +.Xr kldstat 8 , +.Xr sysctl 8 .Sh HISTORY The .Nm diff --git a/usr.sbin/asf/asf.c b/usr.sbin/asf/asf.c index 66f57176391d..6d06990502ba 100644 --- a/usr.sbin/asf/asf.c +++ b/usr.sbin/asf/asf.c @@ -186,9 +186,8 @@ doobj(const char *path, caddr_t addr, FILE *out) } static void -findmodules(const char *modules_path, const char *sfx[], FILE *out) +findmodules(char *path_argv[], const char *sfx[], FILE *out) { - char *path_argv[2]; char *p; FTS *fts; FTSENT *ftsent; @@ -196,17 +195,12 @@ findmodules(const char *modules_path, const char *sfx[], FILE *out) int i; int sl; - /* Have to copy modules_path here because it's const */ - if ((path_argv[0] = strdup(modules_path)) == NULL) - errx(2, "out of memory"); - path_argv[1] = NULL; - /* Have to fts once per suffix to find preferred suffixes first */ do { sl = *sfx ? strlen(*sfx) : 0; /* current suffix length */ fts = fts_open(path_argv, FTS_PHYSICAL | FTS_NOCHDIR, NULL); if (fts == NULL) - err(2, "can't begin traversing path %s", modules_path); + err(2, "can't begin traversing module path"); while ((ftsent = fts_read(fts)) != NULL) { if (ftsent->fts_info == FTS_DNR || ftsent->fts_info == FTS_ERR || @@ -236,16 +230,14 @@ findmodules(const char *modules_path, const char *sfx[], FILE *out) /* Optimization: stop fts as soon as seen all loaded modules */ if (kfile_allseen()) { fts_close(fts); - goto done; + return; } } } if (ftsent == NULL && errno != 0) - err(2, "couldn't complete traversing path %s", modules_path); + err(2, "couldn't complete traversing module path"); fts_close(fts); } while (*sfx++); -done: - free(path_argv[0]); } static void @@ -270,6 +262,7 @@ usage(const char *myname) exit(2); } +#define MAXPATHS 15 #define MAXSUFFIXES 15 /* KLD file names end in this */ @@ -285,6 +278,9 @@ main(int argc, char *argv[]) { char basename[PATH_MAX]; char path[PATH_MAX]; + char *modules_argv[MAXPATHS + 1]; + char *copy, *p; + char **ap; const char *filemode = "w"; /* mode for outfile */ const char *modules_path = "modules"; /* path to kernel build directory */ const char *outfile = ".asf"; /* and where to write the output */ @@ -382,32 +378,50 @@ main(int argc, char *argv[]) return (0); } + if ((copy = strdup(modules_path)) == NULL) + errx(2, "out of memory"); + for ( + ap = modules_argv, p = copy; + (*ap = strsep(&p, ";")) != NULL && ap < &modules_argv[MAXPATHS]; + ap++ + ); + if (*ap) + errx(2, "only %d module path elements can be specified", MAXPATHS); + if (!dofind) STAILQ_FOREACH(kfp, &kfile_head, link) { - if (!nosubdir) { - /* prepare basename of KLD, w/o suffix */ - strlcpy(basename, kfp->name, sizeof(basename) - 1); - i = strlen(basename); - if (i > sl && strcmp(basename + i - sl, KLDSUFFIX) == 0) - i -= sl; - basename[i] = '/'; - basename[i + 1] = '\0'; - } - for (sfx = suffixes;; sfx++) { - snprintf(path, sizeof(path), - "%s/%s%s%s", - modules_path, - nosubdir ? "" : basename, - kfp->name, - *sfx ? *sfx : ""); - if (*sfx == NULL || stat(path, &st) == 0) { - doobj(path, kfp->addr, out); - break; + for (ap = modules_argv; *ap; ap++) { + if (!nosubdir) { + /* prepare basename of KLD, w/o suffix */ + strlcpy(basename, kfp->name, sizeof(basename) - 1); + i = strlen(basename); + if (i > sl && strcmp(basename + i - sl, KLDSUFFIX) == 0) + i -= sl; + basename[i] = '/'; + basename[i + 1] = '\0'; + } + for (sfx = suffixes;; sfx++) { + snprintf(path, sizeof(path), + "%s/%s%s%s", + *ap, + nosubdir ? "" : basename, + kfp->name, + *sfx ? *sfx : ""); + if (stat(path, &st) == 0) { + doobj(path, kfp->addr, out); + goto found; + } + if (*sfx == NULL) + break; } } + warnx("module %s not found in search path", kfp->name); +found: + ; } else - findmodules(modules_path, suffixes, out); + findmodules(modules_argv, suffixes, out); + free(copy); return (0); }