Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 20 Jul 2007 21:12:09 +1000
From:      Peter Jeremy <peterjeremy@optushome.com.au>
To:        Michael B Allen <ioplex@gmail.com>
Cc:        freebsd-hackers <freebsd-hackers@freebsd.org>
Subject:   Re: Path to executable of current process?
Message-ID:  <20070720111209.GV1176@turion.vk2pj.dyndns.org>
In-Reply-To: <78c6bd860707191900g375f98ado8315603feac50247@mail.gmail.com>
References:  <78c6bd860707191725r14b8bfe3sf15c1f0e30cf82ca@mail.gmail.com> <78c6bd860707191900g375f98ado8315603feac50247@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--h31gzZEtNLTqOjlF
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On 2007-Jul-19 22:00:23 -0400, Michael B Allen <ioplex@gmail.com> wrote:
>Well I figured out how to get kvm_getargv working. Unfortunately it
>seems only root can call kvm_open so the faulting process can't
>backtrace unless it so happens to be running as root (which it's not).
>
>Is there any way to get argv[0] for the current process without being root?

I suggest you have a look at the source to ps - it does not run with
elevated privileges.

Note that argv[0] is not necessarily a full pathname - it is whatever
the program was invoked with.  Even if it _is_ a full pathname, there
is no guarantee that it points to the same object - the executable may
be in a chroot environment or that pathname may have been replaced.

The only guaranteed way to access the executable associated with a
running process is via procfs.  As you point out earlier, this is
not mounted by default on FreeBSD because none of the base system
utilities need it (apart from 'ps -e') - you will need to arrange
for it to be mounted.

On 2007-Jul-19 23:23:45 -0400, Michael B Allen <ioplex@gmail.com> wrote:
>After more digging I see sysctl seems to be the way to do this but can I=
=20
>get the full path to the executable form kinfo_proc?
>
>How does ps do this?

It uses kvm_getargv(3). If you want to do it directly via sysctl(2),
I suggest you examine /usr/src/lib/libkvm/kvm_proc.c.

>   mib[2] =3D KERN_PROC_PID;
This should be KERN_PROC_ARGS

>   len =3D sizeof(struct kinfo_proc);
>   if (sysctl(mib, 4, &ki_proc, &len, NULL, 0) =3D=3D -1)

And the buffer argument should be char[], not struct kinfo_proc.

--=20
Peter Jeremy

--h31gzZEtNLTqOjlF
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (FreeBSD)

iD8DBQFGoJiJ/opHv/APuIcRAtcpAJ9/zq/z9vLxlJgeM5Q9w1ck7KSdsACgqoqP
fGvVxElsOLM2YYC3/SHEH/0=
=7xI6
-----END PGP SIGNATURE-----

--h31gzZEtNLTqOjlF--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070720111209.GV1176>