Posted with author's authorization.
---------- Forwarded message ----------
Date: Mon, 6 Dec 1999 10:15:16 -0500
From: Serge E. Hallyn <[EMAIL PROTECTED]>
To: Marc SCHAEFER <[EMAIL PROTECTED]>
Subject: Re: d_path or way to get full pathname
Just a note: It looks like you're not following mount points. I'm assuming
this must be what you want since I'm sure you would have noticed :)
Since you originally asked for code, (and since its always fun to see other
people's code) my version (which I began before you posted, but didn't bother
to fix until now) is attached. You can tell I didn't want to spend the time
shifting the buffer, so instead I limited myself to a 100-element pathname....
(quick-and-dirty)
good day,
-serge
void dte_getfullname(struct dentry *d, char *dest, int destlen) {
struct dentry *tmp_dentry;
struct qstr *p[100];
int len, np, i;
dest[0]='\0'; dest[1]='\0';
*(dest+1)='\0';
if (!d) return;
tmp_dentry=d; np=0;
*dest='/'; len=1;
while (tmp_dentry) {
if (tmp_dentry->d_name.len) {
if (!(tmp_dentry->d_name.len==1&&tmp_dentry->d_name.name[0]=='/')) {
len+=tmp_dentry->d_name.len+1;
p[np++]=&tmp_dentry->d_name;
if (len>=destlen || np>99)
return;
}
}
if (tmp_dentry==tmp_dentry->d_parent)
if (tmp_dentry==tmp_dentry->d_covers) tmp_dentry=NULL;
else tmp_dentry = tmp_dentry->d_covers;
else tmp_dentry = tmp_dentry->d_parent;
}
while (np--) {
*dest++='/';
for (i=0;i<p[np]->len;i++) *dest++=p[np]->name[i];
*dest='\0';
}
}