Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Apr 2011 15:33:30 -0700
From:      Matthew Fleming <mdf356@gmail.com>
To:        Jonathan Stuart <jstuart@adaranet.com>
Cc:        "freebsd-hackers@freebsd.org" <freebsd-hackers@freebsd.org>
Subject:   Re: Getting vnode + credentials of a file from a struct mount and UFS inode #
Message-ID:  <BANLkTi=o=60u9HhnOwCcy6VFH0hKf%2B1R3Q@mail.gmail.com>
In-Reply-To: <32AB5C9615CC494997D9ABB1DB12783C024E929FE5@SJ-EXCH-1.adaranet.com>
References:  <32AB5C9615CC494997D9ABB1DB12783C024E929F93@SJ-EXCH-1.adaranet.com> <BANLkTi=hDuVxLSaC5Y4LTwV_Hqv8nT9JDw@mail.gmail.com> <32AB5C9615CC494997D9ABB1DB12783C024E929FD0@SJ-EXCH-1.adaranet.com> <BANLkTimZagyfkPBQOr4FjsL_oAHhx6F%2B1Q@mail.gmail.com> <32AB5C9615CC494997D9ABB1DB12783C024E929FDC@SJ-EXCH-1.adaranet.com> <BANLkTinuGGsxrOkAvDgg-pqihmdapxKaig@mail.gmail.com> <32AB5C9615CC494997D9ABB1DB12783C024E929FE5@SJ-EXCH-1.adaranet.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Apr 13, 2011 at 3:25 PM, Jonathan Stuart <jstuart@adaranet.com> wro=
te:
> Hi,
>
> Yes, I am.. that was my suspicion (e.g., that it was the parameters of th=
e process which called open()/creat()/socket()/... originally). =A0What's t=
he quickest way to get back to the v/inode's uid/gid?
>

Since you have a struct mount * and an inode, it should be something like:

void
test_uidgid(struct mount *mp, ino_t ino)
{
	struct vnode *vp;
	struct inode *ip;
	int error;

	error =3D VFS_VGET(mp, ino, LK_SHARED, &vp);
	if (error !=3D 0) {
		printf("Got error %d\n", error);
		return;
	}
	ip =3D VTOI(vp);
	printf("For inode %x, uid is %d, gid is %d\n", ino, ip->i_uid, ip->i_gid);
	vput(vp);
}

> Also, calling VFS_VGET() seems to give me a lockmgr panic with unknown ty=
pe 0x0.
> What is odd is that the only way I can get a vnode for VFS_VGET is throug=
h struct file, and then shouldn't I be able to use that? =A0I tried using t=
he flipping that vnode->inode with VTOI() and it was also giving me zeros f=
or i_uid, i_gid, etc., when it shouldn't have been.
>

VFS_VGET gives you the vnode pointer; you shouldn't need getvnode() or
struct file or anything else.  There are other ways to get a vnode *,
but from an ino_t that's the easiest I know of.

Cheers,
matthew

> -----Original Message-----
> From: Matthew Fleming [mailto:mdf356@gmail.com]
> Sent: Wednesday, April 13, 2011 3:20 PM
> To: Jonathan Stuart
> Cc: freebsd-hackers@freebsd.org
> Subject: Re: Getting vnode + credentials of a file from a struct mount an=
d UFS inode #
>
> On Wed, Apr 13, 2011 at 2:37 PM, Jonathan Stuart <jstuart@adaranet.com> w=
rote:
>> Yes, however getvnode() does initialize a struct file *.. but f_cred see=
ms to not contain valid/correct entries.
>> In my last post I probably should have pointed out that I have the inode=
 stored from another operation.
>
> I haven't looked at this field before, but it looks that f_cred is set
> on falloc() to the cred of the thread creating the struct file (the
> thread that called open or socket or pipe or kqueue, etc.). =A0Are you
> running this as root/wheel?
>
> Cheers,
> matthew
>
>> -----Original Message-----
>> From: Matthew Fleming [mailto:mdf356@gmail.com]
>> Sent: Wednesday, April 13, 2011 2:35 PM
>> To: Jonathan Stuart
>> Cc: freebsd-hackers@freebsd.org
>> Subject: Re: Getting vnode + credentials of a file from a struct mount a=
nd UFS inode #
>>
>> On Wed, Apr 13, 2011 at 2:18 PM, Jonathan Stuart <jstuart@adaranet.com> =
wrote:
>>> Hi Matthew,
>>>
>>> Thanks, I'll give it a shot.. for some reason f_cred off the vnode is r=
eturning all zeros for uid/gid, and
>>> pulling the VTOI does the same thing (using getvnode()).. do these not =
get initialized properly?
>>
>> f_cred is a field in struct file, not struct vnode, so I'm confused as
>> to what you're referring to.
>>
>> Cheers,
>> matthew
>>
>>> -----Original Message-----
>>> From: Matthew Fleming [mailto:mdf356@gmail.com]
>>> Sent: Wednesday, April 13, 2011 1:48 PM
>>> To: Jonathan Stuart
>>> Cc: freebsd-hackers@freebsd.org
>>> Subject: Re: Getting vnode + credentials of a file from a struct mount =
and UFS inode #
>>>
>>> On Wed, Apr 13, 2011 at 12:31 PM, Jonathan Stuart <jstuart@adaranet.com=
> wrote:
>>>> Hi,
>>>>
>>>> I'd like to pull the owner/group ownership from a file (the informatio=
n I have about the file is it's UFS inode # and it's struct mount *). =A0I'=
m sure there's got to be a function that would return a vnode and I could V=
TOI() to get this information from the inode.. but I'm having a brainfreeze=
.
>>>>
>>>
>>> VFS_VGET(mp, ino, flags, &vp) is probably what you want.
>>>
>>> Cheers,
>>> matthew
>>>
>>
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?BANLkTi=o=60u9HhnOwCcy6VFH0hKf%2B1R3Q>