PERFORCE change 127910 for review
John Birrell
jb at FreeBSD.org
Sun Oct 21 18:20:39 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=127910
Change 127910 by jb at jb_freebsd1 on 2007/10/22 01:19:46
Implement version 2 of kld_file_stat which contains the
full path name to the module loaded. DTrace needs to get
to this to read the CTF data. Solaris uses a module
file system instead. I am not allowed to say that I don't
like that.
Affected files ...
.. //depot/projects/dtrace6/src/sys/kern/kern_linker.c#2 edit
Differences ...
==== //depot/projects/dtrace6/src/sys/kern/kern_linker.c#2 (text+ko) ====
@@ -492,6 +492,7 @@
lf->userrefs = 0;
lf->flags = 0;
lf->filename = linker_strdup(filename);
+ lf->pathname = linker_strdup(pathname);
LINKER_GET_NEXT_FILE_ID(lf->id);
lf->ndeps = 0;
lf->deps = NULL;
@@ -590,6 +591,10 @@
free(file->filename, M_LINKER);
file->filename = NULL;
}
+ if (file->pathname) {
+ free(file->pathname, M_LINKER);
+ file->pathname = NULL;
+ }
kobj_delete((kobj_t) file, M_LINKER);
out:
return (error);
@@ -972,7 +977,7 @@
{
linker_file_t lf;
int error = 0;
- int namelen, version;
+ int namelen, version, version_num;
struct kld_file_stat *stat;
#ifdef MAC
@@ -995,10 +1000,16 @@
*/
if ((error = copyin(&stat->version, &version, sizeof(version))) != 0)
goto out;
- if (version != sizeof(struct kld_file_stat)) {
+ if (version == sizeof(struct kld_file_stat_1))
+ version_num = 1;
+ else if (version == sizeof(struct kld_file_stat))
+ version_num = 2;
+ else {
error = EINVAL;
goto out;
}
+
+ /* Version 1 fields: */
namelen = strlen(lf->filename) + 1;
if (namelen > MAXPATHLEN)
namelen = MAXPATHLEN;
@@ -1013,6 +1024,15 @@
goto out;
if ((error = copyout(&lf->size, &stat->size, sizeof(size_t))) != 0)
goto out;
+ if (version_num > 1) {
+ /* Version 2 fields: */
+ namelen = strlen(lf->pathname) + 1;
+ if (namelen > MAXPATHLEN)
+ namelen = MAXPATHLEN;
+ if ((error = copyout(lf->pathname, &stat->pathname[0],
+ namelen)) != 0)
+ goto out;
+ }
td->td_retval[0] = 0;
out:
More information about the p4-projects
mailing list